← all features · evolve-loop explainers

Fleet width

How the fleet delivers exactly N concurrent loops — and keeps delivering them through quota walls, benches, and operator changes.

How it works today

Width is policy, not a flag: .evolve/policy.json carries a fleet block with count (requested lanes per wave) and min_lanes (a floor the width may never sink below). The supervisor (evolve loop) dispatches lanes in waves: N isolated cycles, each in its own git worktree with its own LLM session, then the next N when all finish.

policy.jsoncount:3 · min_lanes:3
control-plane preflightfile must be COMMITTED
quota-aware sizingQuotaAwareCount()
wave dispatchN lanes, N worktrees

Before each wave, two guards run. The control-plane preflight refuses to dispatch if policy files have uncommitted changes — rules must be versioned before play resumes. Then quota-aware sizing (go/internal/fleet/quota.go) shrinks the wave by one lane per quota-benched CLI family — but never below min_lanes. Setting min_lanes == count is the operator idiom for "hold the width regardless": the floor absorbs every bench and the log says capacity held at N by fleet.min_lanes floor, while benched-CLI phases fall back to healthy families.

Since cycle 739, the supervisor re-reads the fleet block at every wave boundary — a committed width change takes effect at the next wave, no restart. And since cycle 740, if every CLI family is quota-walled at once, a cycle checkpoints and defers instead of dying, resuming after the quota window resets.

How it got built — the cycles

Cycle(s)ChangeProvoked by
#303 eramin_lanes floor + bench absorptionFleet width shaved to sequential under benches — width is a commitment, not a hint
739, 744, 746 PASSHot-reload of the fleet block at wave boundaries (cmd_loop_wave.go, commit 327cd9c1)2026-07-12: operator committed width 10 mid-batch; the snapshot ignored it; honoring it cost a supervisor bounce that orphaned nine lanes
740 PASSAll-families-exhausted → checkpoint + defer (quota_exhaustion.go, commit a6c0fb40)The same night’s "burn all tokens" directive: quota walls must be pauses, not lane deaths
The incident that taught it — during the width-10 window, an uncommitted policy edit sat dirty for three minutes; a lane reached ship, failed the control-plane precondition, and its rollback deleted the shared binary, cascading SELF_SHA_IO failures to every sibling. Every rule above (commit-before-dispatch, wave-boundary reload, floors) exists because some version of that evening happened.

Width economics, observed: at width 10 the waves scored 3/10 and 2/10 ok (ten concurrent retro REPLs starved each other); at width 3 the same pipeline cruised at 2/3–3/3. Concurrency amplifies contention along with throughput — the machinery on this page is what keeps the trade honest.

Generated by /evo:explain · sources: loop logs, cycle dossiers, ship commits, campaign plans.