Agentic Workforce Company
Agent Infrastructure · Reliability

I ran the automation layer that kept an agent fleet alive.

Keepalives, cross-machine watchdogs, a git-backed memory sync, and recurring briefing jobs — the scheduled plumbing under a three-machine fleet. Then I audited it hard enough to prove a local LLM couldn’t hold a production cron, and routed that work back to a model that could.

IteratedROLE Owner-operatorSCOPE 3 Mac minisPERIOD Apr–May 2026
CategoryAgent infrastructure
SchedulersOpenClaw cron · Paperclip · LaunchAgent
Fleet3 Mac minis (M4) · OpenClaw + Hermes
TimeframeApr–May 2026 · fleet buildout
StatusIterated · audited · re-routed
The Problem

An autonomous fleet doesn't stay healthy on its own.

Browser sessions expire. Gateways crash. Memory drifts. Status has to be reported on a cadence.

All of it repetitive, all of it time-sensitive — the kind of maintenance that quietly rots a system if nothing owns it.

I needed a scheduled layer that did this maintenance automatically across three Mac minis — and a way to prove each job was actually running, not silently failing behind a green checkmark.

And when cost pressure pushed me to move jobs onto a cheaper local model, I refused to move first and verify later. I wanted a reliability standard a job had to clear before I’d trust it in production.

The Approach

Two schedulers, one reliability bar.

I ran OpenClaw crons for machine-level automation and Paperclip routines for recurring agent work, with macOS LaunchAgents handling OS-level sync and tunnels.

Every job had a defined schedule, an owner, and an output target — a Slack alert, a vault commit, or a notifications post. Roughly two dozen scheduled things ran across the fleet.

The discipline was the real work. When I migrated crons to a local model to cut cost, I ran a side-by-side audit instead of trusting the checkmarks: deterministic jobs could go local, judgment-heavy and Slack-facing jobs stayed hosted until individually proven, and the browser keepalive got a deterministic wrapper so its success never depended on an LLM improvising.

I didn't ship automation to save money. I proved a local model couldn't hold a production cron — with a root cause — and made the routing call accordingly.

— Reliability doctrine · prove, don't assume
Architecture & Stack

The schedule topology.

Three schedulers feed a three-machine fleet. Deterministic jobs route to a local LLM; judgment and Slack-facing jobs stay on a hosted model; the keepalive runs through a deterministic wrapper. Outputs land in Slack, GitHub, and the notifications channel.

Fig.01 — Fleet Schedule & Model-Routing LanesScheduled-automation layer and model-routing lanes across three Mac minisThree schedulers on the left — OpenClaw crons, Paperclip routines, and macOS LaunchAgents — feed a fleet of three Mac minis in the center. From the fleet, jobs split into two routing lanes: deterministic jobs flow on an accent path to a local LLM host running Ollama, and judgment or Slack-facing jobs flow to a hosted model. The browser keepalive runs through a deterministic wrapper shown in amber. Outputs feed Slack alerts, a git-backed GitHub vault, and a notifications channel at the bottom.SCHEDULERSOpenClaw cronjobs.json · 5 cronsPaperclip10 recurring routinesLaunchAgentsvault-sync · tunnelFLEET · 3 MAC MINISAgent runtimemini-01 · OpenClaw / MCmini-02 · Ops / Hermesmini-03 · local-LLM hostkeepalive · watchdog · heartbeatPM2 · launchd supervisionMODEL-ROUTING LANESDETERMINISTIC → LOCALLocal LLM · Ollama hostqwen3.5-instruct:4bJUDGMENT / SLACK → HOSTEDHosted modelGPT-5.x / CodexKEEPALIVE → WRAPPERDeterministic wrapper90s timeout · no LLM in loopOUTPUTSlack alertsGIT-BACKEDGitHub vault syncSAFE · AUTOWRAPPED · NO LLM

Three schedulers — OpenClaw crons, Paperclip routines, and macOS LaunchAgents — feed a three-machine fleet. From there, jobs split by reliability class: deterministic work flows to a local Ollama-hosted model, judgment and Slack-facing work stays on a hosted model, and the browser keepalive runs through a deterministic wrapper with no LLM in the loop. Outputs land in Slack, a git-backed GitHub vault, and the notifications channel.

Schedulers

OpenClaw cronjobs.jsonPaperclip routinesmacOS LaunchAgent

Runtime

3× Mac mini (M4)OpenClawHermesKernelPM2

Models

GPT-5.x / Codex (hosted)qwen3.5-instruct:4b (local)Ollama

Job Types

browser keepalivegateway watchdogagent heartbeatswiki-compile

Sync / Tunnel

vault-sync.pushGitHubollama-tunnel (SSH)

I/O

Slack alerts#paperclip-notificationsbriefing / debrief / triage
By the Numbers

Roughly two dozen scheduled things.

Inventory snapshot & audit · verified from the Slack record.

Paperclip routines
10
active recurring agent-work jobs (snapshot)
OpenClaw crons
5
machine-level crons in jobs.json
Keepalive timeout
90s
deterministic wrapper · no LLM in loop
Dr. Berg crons removed
0left
client-separation cleanup · verified in jobs.json
Local → hosted
deterministic crons kept local; judgment / Slack-facing jobs held on the hosted model until each was individually proven
0.21.1 → 0.23.0
outdated Ollama version identified and bumped as part of the reliability root cause
2 machines
gateway cross-monitor watchdog running across the MC and Ops minis; false-alert path disabled after cleanup

Prove-don’t-assume over green checkmarks: the standout was the local-LLM reliability audit — intermittent cron failures root-caused to the 4b model’s inconsistent tool execution, plus Ollama’s single-lane concurrency (OLLAMA_NUM_PARALLEL:1) and an outdated version. A 9b model timed out (>120s) on both cron and direct tests. The routing call followed the evidence, not the cost pressure.

The Audit · Results

What it produced — and what it honestly is.

A scheduled maintenance layer that kept an autonomous fleet running unattended, plus a documented reliability standard that survived a real cost-driven migration. This is iterated infrastructure, not a frozen product.

● What the layer produced · verified

An unattended fleet that stayed alive.

  • Sessions held via keepalives; gateways watched by a cross-machine watchdog.
  • Memory vault synced to GitHub on a cadence via vault-sync.push on both machines.
  • Briefing / debrief / triage / health-sweep jobs firing on schedule.
  • Local-model cron failures root-caused to model determinism + Ollama single-lane concurrency + an outdated version.
  • Deterministic jobs routed local; judgment / Slack-facing jobs held hosted until proven.
  • Residual client crons removed and verified — zero matching entries left in jobs.json.
▲ Honest status · iterated, not static

Continuously migrated and re-verified.

  • The layer was re-worked across the period — Qwen migration, Ollama version bumps, watchdog cleanup, client-cron removal.
  • Parts stayed on the hosted model precisely because the audit said the local one wasn’t ready.
  • The exact total is honestly “roughly two dozen” scheduled things, not a confirmed fixed count.

The highlight here is judgment, not flawless uptime: a reliability audit that produced a root cause and drove a routing decision — the opposite of shipping unreliable automation to save money.

Before / After

Two calls, at a glance.

Local model on a production cron
BeforeFlakyintermittent failures behind green checkmarks
AfterHeldrouted to a model that holds; root cause logged
Residual client crons
BeforePresentDr. Berg jobs still in jobs.json
After0removed & verified on both machines
The Reliability Decision

How a cheap migration got audited.

Step 1 · Migrate
Move crons onto a local model

Cost pressure pushed the OpenClaw crons onto a local qwen3.5-instruct:4b model. The migration verified “green” — all five crons routed local.

Step 2 · Don't trust it
Run a side-by-side audit

Instead of accepting the checkmarks, I ran the same jobs against local and hosted models in parallel — and caught the local model failing production crons intermittently.

Step 3 · Root-cause
Find the real cause

Failures traced to the 4b model’s inconsistent tool execution, Ollama’s single-lane concurrency (OLLAMA_NUM_PARALLEL:1), and an outdated Ollama version. A 9b model timed out over 120s.

Step 4 · Route by class
Deterministic local, judgment hosted

Deterministic jobs stayed local; judgment and Slack-facing jobs held on the hosted model until individually proven. The keepalive got a deterministic wrapper so it never depended on the LLM.

Step 5 · Separate clients
Clean up and verify

Removed residual client crons and verified zero matching entries remained in jobs.json on either machine.

My Role

I set the schedule and the reliability bar.

I owned the automation layer end to end — I directed the cron inventory, set the migration policy, and ran the audit that caught the local model failing.

I made the routing decision, required the deterministic keepalive wrapper so a maintenance job didn’t depend on an LLM’s mood, and directed the client-separation cleanup with verification. The agents executed the jobs; I designed the schedule, set the standard, and made the call.

Skills Demonstrated

What this took.

Scheduled automation / cron orchestrationAgent-fleet reliability engineeringWatchdog & keepalive designGit-backed memory sync (LaunchAgent + GitHub)LLM cost / routing decisionsRoot-cause analysis (Ollama concurrency, determinism)Deterministic-wrapper designmacOS LaunchAgent / PM2 opsVerification discipline (prove-don't-assume)

Want an operator who audits the machine — not just runs it?