An orchestrator running unattended waves against metered backends will eventually launch
into an exhausted quota. That failure is expensive in a specific way: the wave's worktrees are
already created, its nodes already fenced, and the work partially done — so the loss is not one
call but a whole wave's setup plus whatever half-finished commits have to be judged. Holding
before a wave costs nothing by comparison.
The mechanism is asymmetric across backends and the design must be honest about that
rather than paper over it, because pretending to know headroom you cannot observe is worse
than admitting ignorance.
Backend
What is observable
What follows
One CLI backend
A structured rate-limit event on its machine-readable stream carrying utilisation, a
reset timestamp, a limit type, and a threshold status.
Predictive hold is buildable: headroom and reset time are both known.
The other CLI backend
Per-turn token usage — input, output, cached, reasoning — but no headroom, and no
query command for it. Its interactive status line displays rolling and weekly limits, so
the information exists somewhere off the non-interactive path.
Only cumulative spend tracking plus reactive detection from a failed run. An
investigation node should establish whether the app-server path exposes headroom.
The in-harness backend
Whatever the host harness exposes to itself, which may be nothing.
Treated as unknown unless the harness reference documents otherwise.
So the contract is fail-safe in one direction only: unknown headroom never blocks a
dispatch, and recorded exhaustion always does. Guessing exhaustion from silence would
make the whole system refuse to work for the wrong reason.
✓ landed 2026-08-12
§2 — Deliverables
Built reckon/budget.py plus reckon crew preflight, the hold in
crew.dispatch/resume_plan, three thresholds in flight config, a
budget view on the read tool, and two quarantined
references/orchestrator-harness/ files. Ten declared measures produced
evidence and passed; 29 new tests, suite green at 1,657. A held wave scheduled its own
resumption and fired: 86 s elapsed, resumed pre-flight clear.
Full record: §2 landed
(commit 6a0e3c9).
✓ landed 2026-08-12
§3 — Evidence gates
All ten declared measures produced evidence and passed: headroom recovered from a recorded
run stream and a live account read (0.0%, resets 2026-08-19T06:07:08Z); unknown
opens the wave on four paths; 100.0% holds with no worktree and the node still dispatchable;
one backend held while the other dispatched; 97.0% holds a dispatch at the 95.0% effective
ceiling but not a resume; the pre-flight returns its hold with both subprocess entry points
replaced by an assertion; the quarantine grep is clean across two host files; a held wave
resumed itself in 86 s; and the investigation is answered positively — the
backend thought to publish no headroom does publish it, by a read that runs no model.
Full record: §3 landed
(commit 6a0e3c9).
§ Evidence gates
Headroom parsed where it exists
A recorded budget state from the backend that emits rate-limit data, showing utilisation and reset time recovered from a real run's stream — not a fixture.
A budget state reading unknown for the backend with no headroom signal, and a test proving a wave still opens on it. No test may show absence treated as exhaustion.
A simulated exhausted state holds a wave with no worktree created, records the backend, utilisation and reset time, and leaves the nodes ready rather than failed.
A test proving the configured reserve prevents a dispatch that would leave insufficient headroom to answer a NEEDS-HELP: report and resume its session.
The pre-flight consumes no backend tokens — asserted by showing it reads only ledger records and any genuine status command, with the token cost of a hold decision recorded as zero.
A grep proving no harness-local command or self-scheduling primitive appears in SKILL.md or the process references — only in orchestrator-harness/. A second harness file exists, even if it only records which capabilities are absent.
A recorded finding on whether the headroom-less backend exposes limits off its non-interactive path. A negative answer is a valid outcome and closes the question.
A run promoted from a pointer whose agent block is absent is still matched to its backend afterwards, shown by reading the same headroom before and after promotion.
The two unattributed known readings in this repository's ledger resolve to a backend through the reader, without editing the committed records by hand.
Attribution never depends on where the orchestrator ran
A recovered attribution is derived from evidence the producing backend left — its recorded stream, its argv, or a field written at promotion — never from the delivery path. Shown by a test in which the same reading, reached through a path naming a different harness, still attributes to the backend that produced it. A path component can carry the host's own runtime directory name, so matching on it tracks the orchestrator's environment rather than the signal's origin, and is right only by coincidence.
A record that genuinely cannot be attributed reports a reason that a caller can tell apart from nothing-was-recorded; no path reports a mislaid signal as silence.
A test proving the read-only tool surface leaves the ledger version and the hold list untouched across a check that would open a hold — the write belongs to the command that decides to open a wave, not to whatever inspects the decision. A reader that records invents history simply by looking at it, and a tool documented as never mutating must not be the exception.
§6 — A recorded signal must stay attributable to its backend
Promotion now writes the backend as a first-class ledger field, and the reader walks
record → agent → budget → member, recovering a legacy record from the normalised evidence its
stream interpreter produced. Both previously-lost readings resolve to their producing backend
(utilisation 1.02%, attribution: budget-evidence) with no committed
record hand-edited; a delivery path naming a different harness does not change the answer;
ambiguity stays unattributed and reports unattributed-ledger, distinct from
nothing-recorded. The first attempt matched the manifest path and was right only by
coincidence — it tracked the host's own runtime directory — which is why the fourth gate
exists. 7 new tests, suite green at 1,698.
Full record: §6 landed
(commits 7c5f54d, 4593f96).
The reader matches a recorded budget block to a backend through the run record's agent block.
A record promoted without one carries its headroom into durable storage and loses the only thing
that makes it readable. Measured on this repository's own ledger: of seventeen records, six have
no agent.backend, and both records carrying a genuinely known
reading — utilisation 1.02%, resetting 2026-09-01 — are among them. Every real headroom signal
the project has ever recorded is currently invisible to the mechanism built to read it.
The loss is provably caused by promotion rather than by absence. The same reading was
attributed while its run was in flight, reported from the live pointer with a source and an
observation time; a recovery pass then promoted those pointers, and the identical read now
returns nothing for that backend. Durability cost the number its meaning.
This sits under the locked read-source decision, not beside it. That decision
chose the ledger over a probe precisely because the ledger already holds what each backend
emitted. If promotion can strip the attribution, the foundation of the free pre-flight is
unsound, and no amount of correct threshold logic above it matters.
The failure mode is the one the fail-safe posture was built to prevent, arriving by
another route.unknown must keep meaning "nothing was recorded". Here it
means "something was recorded and could not be matched" — indistinguishable to every caller, and
silently wrong in the direction that opens waves it should hold. A backend that publishes nothing
and a backend whose signal was mislaid must not read the same.
§4 — Constraints
No provider name, concrete model identifier or account-specific figure enters reckon
source, the schema or this plan's prose. Observed utilisation is user data recorded in a
ledger, never a constant.
A hold is never silent and never destructive. It creates no worktree, cancels no ready
node, and always reports. An orchestrator that cannot schedule its own resumption reports the
reset time for a human instead — degraded, not broken.
✓ landed 2026-08-12
§5 — Holds are measurable
Holds now live in crew.json beside the runs: one record per continuous window,
opened by the command that decides to open a wave and closed with the measured wall-clock.
A test hold closed at 137 s measured against a 600 s predicted reset — the
gap is the point, since it is what shows whether a resumption fired late. Seven gates passed,
including the one added mid-flight after the audit found a read-only tool writing history
(ledger v1→v2 on a read; now v1→v1). Two runs, 783 s and 498 s of worker-time, 8 new tests,
suite green at 1,668.
Full record: §5 landed
(commits 9bc21da, 49bc41c).
A hold leaves no trace. It creates no run, so nothing in the committed ledger records that a
wave was held, on which backend, for how long, or whether the scheduled resumption fired — which
loses the one measurement the mechanism generates: what holding actually costs in wall-clock,
against what a burned wave would have cost. That figure cannot be reconstructed afterwards, so
it has to be captured at the moment it is knowable.
A hold record, beside the run records rather than among them. A hold has no
worktree, no commit, no gate and no worker-time, so writing it into the run list would feed
empty measurements to the effort report that averages over it. A hold opens when a wave is held
and closes when a later pre-flight finds that backend clear, carrying the measured wait.
Repeated pre-flights inside one window are one hold, not many. An
orchestrator that checks every few minutes must not multiply records for the same window, or the
count stops meaning "how often were we held" and starts meaning "how often did we look".
Closing is what makes it a measurement. An open hold records a decision; a
closed one records a duration. The wait is measured against the wall clock rather than assumed
from the reported reset, because the two differ whenever a resumption fires late — and the
difference is exactly what tells a reader whether self-scheduled resumption is working.
§ Decisions
How is unobservable budget headroom treated?
One CLI backend publishes structured headroom; the other publishes only token counts and has no query command for limits.
Inferring exhaustion from silence would make the system refuse to work for the wrong reason, on the backend that happens to publish less. Fail-safe here means erring toward dispatching, because the reactive failure — a rejected call — is cheap and self-announcing, while a false hold is invisible and stalls everything.
Does the pre-flight make a call to learn budget state?
A probe spends the very resource it is measuring, and does so most often exactly when headroom is scarcest. The ledger already captures what each backend emits, so the pre-flight is free and gets more accurate as history accumulates.
Where do harness-local capabilities such as self-scheduling live?
Naming a harness-local command in the process spine silently couples the skill to one host and breaks the portability the single-skill decision exists to preserve. The worker side already solved this by quarantining launch mechanics per backend; the orchestrator side takes the identical shape, and the same grep-able ownership test applies.
§ Followups
Hold waves on exhausted budget and resume without a human
Land the per-backend budget reader over ledger records, the free pre-flight hold with per-backend granularity and an escape-hatch reserve, the policy thresholds in flight config, and the quarantined orchestrator-harness reference carrying self-scheduled resume. Answer the open question of whether the headroom-less backend exposes limits off its non-interactive path.
/reckon-ship budget-aware-dispatch
Landed — commit 6a0e3c9. Per-backend budget reader over the ledger and live pointers, the free pre-flight hold with per-backend granularity and a 5-point escape-hatch reserve, three thresholds in flight config, and two quarantined orchestrator-harness references. All ten gates passed: 100.0% holds a dispatch with no worktree created and the node still dispatchable; 97.0% holds a dispatch at the 95.0% effective ceiling but not a resume; unknown never holds; the pre-flight returns its hold with both subprocess entry points replaced by an assertion; a held wave scheduled its own resumption and fired in 86 s, resuming clear. 29 new tests, suite green at 1,657. The open investigation is answered POSITIVELY: the backend believed to publish no headroom answers an account-limits read over its app server, giving used percentage and reset time by a call that runs no model — so the asymmetry is in the run stream, not the harness. That is now an opt-in per-backend reader (budget_check), leaving the ledger as the free base case and the locked decision intact.
Record held waves so a hold is visible to calibration
A hold currently leaves no trace in the committed ledger: it creates no run, so nothing records that a wave was held, on which backend, for how long, or whether the scheduled resumption fired. That makes the one measurement the mechanism generates — how much wall-clock holding actually costs, against how much a burned wave would have — unavailable to any later reader, and it is exactly the class of measurement that cannot be reconstructed after the fact.
Out of scope for the five deliverables that just landed, hence additive rather than unfinished. Sizing note for whoever picks it up: the shape is a hold record beside the run records, not a run record with a held flag, since a hold has no worktree, no commit and no gate.
/reckon-ship budget-aware-dispatch
Landed as §5 — commits 9bc21da and 49bc41c. A hold opens one record per continuous window carrying backend, utilisation, reset and purpose, and closes with wall-clock held_seconds measured rather than assumed: a test hold closed at 137 s against a 600 s predicted reset, which is the gap that reveals a late resumption. Holds sit beside runs, so the run count and effort report are provably unchanged. The audit added a seventh gate mid-flight: recording had been wired into the shared pre-flight, so the read-only tool opened a hold and took the ledger v1→v2 just by being asked — a reader inventing history by looking at it. Recording now belongs to the commands that decide to open a wave, the read is v1→v1, and resumption_fired is an explicit input rather than inferred from a stuck-worker check that shares the same ceiling. 8 new tests, suite green at 1,668; 783 s and 498 s of measured worker-time. Chain closes here — done, no followup.
Attribute a recorded headroom signal whose run has no agent block
A real headroom reading is present in the ledger and the budget view cannot see it. flight-check-b and scope-fence both carry utilisation_pct: 1.02 with resets_at: 2026-09-01, yet crew(view="budget") reports the claude backend as headroom: unknown, source: none - nothing recorded for this backend. The cause is attribution: those two records have agent.backend: null, as do 6 of the 17 records in this ledger, so a signal that exists cannot be matched to the backend that produced it.
The loss is demonstrable rather than theoretical, because the signal was attributed until it was promoted. A pre-flight run at 15:35 reported claude at utilisation 1.02% ... source: live-run, observed_at 08:50:49, reading it from the live pointer. Those pointers were then promoted into the ledger by a recovery pass, and the same read now returns nothing for that backend. Promotion moved the number into durable storage and cost it its meaning.
The decision this plan locked - read the budget signal from recorded runs rather than probing - depends on those records staying attributable, so the gap sits squarely in its foundation. Either carry the backend forward at promotion for records that lack an agent block, or have the reader fall back to whatever identifies the backend on the record itself, and add a test that a promoted run's headroom is still attributed after the pointer is gone. Unknown must keep meaning nothing was recorded, never that something was recorded and could not be matched.
/reckon-ship budget-aware-dispatch
Verified against the live ledger and promoted into §6 rather than left as a followup. The claim understated it: of 17 records 6 carry no agent.backend, and BOTH records holding a genuinely known reading (utilisation 1.02%, resets 2026-09-01) are among them — so every real headroom signal this project has recorded is invisible to the reader, which reports source: none for that backend. A followup on a plan at shipped/1.0 would have been unreachable from roadmap; a section keeps the plan active and the work visible.
attribution-from-evidence landed — commit 4593f96, merged; gate §6 passed on all four measures; measure 1,698 tests pass with 3 new, 597 s worker-time, 102 lines in scope. Verified independently against the live ledger rather than from the manifest: claude resolves at utilisation 1.02% with attribution budget-evidence. No foldable followup remains against this plan, so it closes — done, no followup.