Fleet cleanup plan
October 10, 2026. Before any driver is restarted. Built from three read-only audits run on the Mac mini (wakers, helper scripts, logging), the October 2–9 pool-drain report, and separate rulings from Fable and Astra.
The short version
- In the last day, about 880 automatic wakes went into Claude sessions, and about 548 of them (60%) went to drivers that were already paused. Three systems never check the pause switch: the Supervisor, the GitHub review notifier, and fleet-medic.
- The usage came from keeping long sessions alive and poking them, not from the work. Each poke re-reads a history of up to ~450k tokens.
- Fable and Astra, asked separately, both chose the same plan: no always-on drivers. A cheap script, with no AI in it, turns real events into short single-job sessions that close when done, plus a scheduled sweep that looks for problems. An earlier decision (ADR-0017) had already said a watching agent is the wrong shape.
- No outside harness fits. DeepSeek Harness is a preview that replaces Claude Code instead of running it. We build the small piece on
claude -pand Temporal, which we already run.
Full plan: Gera's decisions, the five steps, what to delete, and what else was found
What Gera decided (in chat, October 10)
- Unattended work is for: finishing board items (and checking that the board work is right and everyone is aligned), and scheduled sweeps that look for problems. PR upkeep and ops alerts belong to CI/CD and our other systems.
- Accounts: no cap, but no waste.
- No coordinator. Each job does one item. Gera opens an attended session when he wants a big-picture push.
- Decisions go on the decisions page, answered in a daily batch. An answer starts the next job.
Step 1: stop the waste now (small, reversible)
| Change | Wakes saved per day | How |
|---|---|---|
| Supervisor checks the pause file before idle and mail wakes, and stops re-waking every 10 minutes over the same unread mail | ~286 | It already checks for stand-down on exit asks; reuse that |
| The GitHub review notifier skips paused sessions | ≥71 (the most expensive: into a session at 96% context) | One check before it types |
| fleet-medic skips paused sessions, for both nudges and account moves | ~81 | One check. 52 of its 53 other nudges hit sessions already waiting on a person |
| nudge and its hourly timer check the pause file, not only the stand-down file | ~120 | One stand-down was undone 71 seconds after a pause |
| Turn off the "not done, keep driving" stop gate while drivers are off | ~1,500 refused stops | Keep the finisher count as a report |
Step 2: delete or merge helpers that earn nothing
| Helper | Measured | Verdict |
|---|---|---|
| branch-updater | Updates the same stuck PRs ~100 times each; every update runs CI | Delete |
| pr-cleaner | 305 runs, 0 PRs ever closed | Delete |
| matrix-watcher | 556 runs, never changed anything; its schedule isn't installed | Delete |
| session-cap "reap" | Never switched on | Delete (keep "expire") |
| decider-sweep (every 20 min) | Asks the decider the same questions the puller asks | Merge into the puller |
| cleaner-jobs | 19 lock files a week | Merge into worker-cleaner |
| red-main fixer | 0 runs in 24h. Gera wants it machine-wide | Replace with one event: main goes red, start one fix job |
| Supervisor, nudge, fleet-medic, watcher-doctor | The wakers | Retire when the job-starter is in |
| decider (fable-decide) | 79 calls a day; the only path that answers without a person | Keep |
| updater, slack-poster, worker-cleaner (48.7 GB freed in 7 days), blocked / decisions page, puller, dock-finisher (as a report) | Cheap scripts | Keep |
Step 3: review once
The PR reviewer is the biggest single AI cost after the drivers: 333–938 reviews a day, because it re-runs on every push. Change it to review when a PR is marked ready, and once more only if the code changes after a review. Astra's caution: a later push must not merge on an old approval. The existing exact-head rule already stops that.
Step 4: daily cost table (logging)
Every Claude Code transcript already records each reply's usage: fresh input, cached re-reads, cache writes and output. Nothing adds it up. One small script, fleet-usage-daily, about 300 lines:
- It reads only the new part of the transcripts each day.
- It labels each turn's source from the tag on the poke:
[msg],[fleet-medic],[webhook], Stop hook, or a person typing. - It joins the account from the switcher log.
- It publishes a daily table here by day, source, session, account and token kind, plus the reviewer's run count.
Waste then shows up the day it starts. Also give every waker a "target session plus reason" log line. The review notifier logs a lane id, not the session, and the stop gate logs nothing.
Step 5: the job-starter (replaces the drivers)
- Events in: a board row becomes ready, a decision is answered, main goes red, a scheduled sweep time arrives. A periodic catch-up sweep finds any events that were missed.
- A cheap script decides. No AI. One Temporal workflow per item id, so the same item never runs twice; worker slots cap how many run at once. It writes a one-page brief from the row, the linked rulings and the last receipt.
- One short session (
claude -p) does the item, records its receipt on the row, and exits. If it gets blocked, it saves its place, raises the question on the decisions page, and exits. The answer re-starts it. - Sweep: a fresh security and alignment sweep on a schedule. It files what it finds and checks that board work matches the design.
- Start small: a few board rows as a trial, measured with the daily cost table, before turning it on widely.
Also found
- The main code checkout on the mini was stuck for about 3 days (846 refused pulls in a week), with no alarm.
- The board refresher had 90 rejected publishes in a day, because three tools write the same docs repo.
- The Systems tab (propflowai.co/agents → Systems, source
agentflow/SYSTEMS.md) is wrong or silent about 8 helpers. For example, it shows slack-poster as dead while it runs every 10 minutes.
Order
- Steps 1 and 2: cleanup, small PRs, no drivers running.
- Steps 3 and 4: review-once and the daily cost table.
- Write the decision (a new ADR that replaces the standing-coordinator one).
- Step 5: build the job-starter and trial it on a few rows.
- Then restart work on the board.
Sources: audit-wakers.md, audit-scripts.md, audit-logging.md and specialists-inventory.md in the coordinator's scratchpad; Fable ruling f9a8613b6; Astra ruling ff13e77c6; claude-pool-drain-2026-10-09.