Skip to the content.

No babysitting: nobody watches a healthy fleet

Status: concept note + doctrine. Nothing new ships from this note; it binds programs that already exist (guard/policy floor, DOS witnesses, lanes/leases, resume watchdog, loop ledger LONG-RUNNING-AGENT-LOOPS, perpetual sessions #1860, automatic context #2198, turntax #1147, operator brief/heaviness) to one falsifiable product property, and names the rungs that are missing between them. It is the umbrella over CONCEPT-AUTOMATIC-CONTEXT: manual context management was one species of babysitting; this note is the genus.

The operator’s ask

fak should be good at helping operators, agents, users etc not have to “babysit” agents and fleets. Deeply think about this. Of course it can’t do everything. Expect models, harnesses, our harness etc to keep getting better. But even on that slope, think about things.

The thesis

Babysitting is polling. An operator who glances at a terminal every twenty minutes, re-reads a transcript to see if the worker is stuck, spot-checks a “done” message against the diff, or keeps a dashboard open “just in case” is a human running a busy-wait loop over a system that has no interrupt controller. Every mature computing layer killed its version of this: the OS turned device polling into interrupts, memory overlays into page faults, process-watching into SIGCHLD and supervisors. The agent era is still in the polling stage, and the poll is running on the most expensive, least scalable component in the system — human attention.

So the doctrine, in its falsifiable form:

Nobody watches a healthy fleet. A human touch whose trigger the kernel could have decided from structure — a crash, a stale or unwitnessed claim, a collision, budget burn without evidence, a question the policy floor already answers — is a defect. Count the touches per witnessed unit of shipped work. The count is a ratchet that only goes down.

The general cure is the same three-step every time, and it is the move fak has already made twice (security: structure over recognition; context: cells over knobs):

  1. Name the condition in a closed vocabulary (a token, not prose).
  2. Attach a witness that decides it mechanically (evidence, not self-report).
  3. Route the interrupt as a typed packet with a safe default (a decision, not a firefight).

Babysitting persists wherever one of those three is missing. It is a symptom of a missing witness, never a duty.

The seven watches (what a babysitter actually does)

“Babysitting” bundles seven distinguishable jobs. They have different mechanics, different owners, and — the important part — different fates on the model-quality slope.

# Watch The human poll it replaces The kernel mechanism
W1 Liveness “is it still moving, or hung/crashed/looping?” heartbeats, watchdog, resume, loop ledger stuck_age
W2 Truth “did it really do what it said?” witnesses: dos verify, commit-audit, ship stamps, claim-check
W3 Safety “will it do something terrible while I’m away?” capability floor, gitgate, quarantine, decision journal
W4 Collision “are they stepping on each other?” lanes/leases, dos arbitrate, COLLISION_RISK, sweep
W5 Budget “is it burning money without progress?” budgets, turntax envelopes, burn-without-evidence
W6 Unblock “is it waiting on me and not saying so?” closed refusal vocabulary, ESCALATE disposition, fak notify
W7 Quality/goal-fit “is the work actually good — and what I wanted?” dos review residual bands; the rest is human on purpose

Two symmetries worth naming. First, the goal says operators, agents, users: an orchestrator babysitting its subagents runs the same seven polls one level down, which is why every mechanism above must be agent-consumable (the MCP dos_* verbs; dos_status returning no claimed field by construction is the fail-closed A2A form). Second, each watch is the same shape: a condition the operator polls for because nothing will interrupt them with evidence when it becomes true.

The slope: what better models retire, and what they intensify

The instruction says to assume models, harnesses, and our harness keep improving. Take that seriously and the watches split cleanly.

The slope retires (fak should not build here):

The slope intensifies (fak’s durable seat):

The economics underneath all of it: fan-out outruns attention. Better models make competent work cheaper, so fleets grow; the operator’s attention budget does not. Total babysitting cost is Σ events × P(needs human | event) × cost(handling). The slope grows the event count; fak’s leverage is the other two factors — drive P(needs human) down with structure (W1–W5) and drive cost(handling) down with packets (W6). An operator’s touches should scale like O(log fleet), not O(fleet). This is the SRE toil argument, ported: babysitting is toil, and the kernel is the toil-elimination layer.

One more slope effect, from the harness direction: as harnesses absorb autonomy features (auto-compaction, background tasks, auto-resume, hooks), each new feature is another manager on the wire — the compactcohere lesson generalizes. The kernel’s seat survives harness improvement precisely because it sits below all 41-of-47 harnesses at the wire and beside the evidence (git, ledgers), which is where every watch’s witness lives. Harness autonomy features change who acts; they do not change what must be witnessed.

What exists at HEAD (the honest map)

Per-watch, from a repo survey (maturity per CLAIMS.md; details and paths in the source files named):

The doctrine

The babysitting counter (the doctrine’s witness)

Like the manual-overlay counter in #2198, the doctrine is checkable only if the labor is counted. Four KPIs, all derivable from ledgers that already exist or are named rungs:

KPI Definition Source
touches_per_witnessed_unit human interventions ÷ witnessed-done runs (or stamped commits), each touch classified W1–W7 loop ledger + operator brief
silent_hours Σ time a stuck/dead member sat undetected liveness rungs vs ledger end rows
mttr_sessions detection → witnessed-resumed, p50/p95 resume watchdog ledger
escalation_handling_p50 packet emitted → human decision recorded notify/ack contract

The first is the headline ratchet. Today it is not measurable — which is itself the finding: fak can count kernel decisions per session (131 decisions — 121 allowed…) but cannot yet count human touches per unit of shipped work. You cannot retire what you cannot count.

The rungs (new here, not duplicating #1860 / #2198 / the loop note)

Filed 2026-07-02 as epic #2269: R1 #2270 · R2 #2271 · R3 #2272 · R4 #2273 (doubly parented in #1146, whose “launched ≠ took” gap it closes) · R5 #2274 · R6 #2275, plus two gap leaves — #2276 (loop_budget_burn_without_evidence emission) and #2277 (fak loop recover pid-liveness probe). The duplicate sweep that preceded filing found the adjacent homes, and the epic references rather than duplicates them: agent-OS mechanics #748, witnessed two-heartbeat liveness #750, crash/resume visibility #1146, fleet-status consolidation #2038/#2040.

What not to build (the slope will eat it)

Honesty fences

Next checkable step

Build R1 (#2270, the counter) first — like #2198-R1, it is the cheapest rung and the doctrine’s own witness; R4 (#2273, filed P0) is the live fire to point it at, since the fleet is CRITICAL there today. Check: gh issue view 2270 / gh issue view 2273; then the four KPIs appear in an operator-readable report with a dated baseline, and the 2026-07-01 bottleneck map’s 18 stuck workers become the first measured silent_hours / mttr_sessions datapoints.