Fleet Throughput Contract — cumulative execution record

One anchor per landed node. Each entry records the commit, the gate measure as executed, the tests, and anything negative found on the way. The evergreen plan holds the design; this record holds what actually happened.

Contract changes (rolling refill, narrowed freeze, one fleet-size table, preamble diet)

Commit 36e668a (2026-08-17, worker codex-b, wall 562 s, 134 insertions / 60 deletions over skills/reckon-ship/SKILL.md, two reference files and tests/test_skill_contracts.py; merged at 0bb4fa5).

Tests: 4 contract tests added; tests/test_skill_contracts.py 33 passed, 0 failed. Wave-1 integration gate: full suite 1915 passed, 0 failed at 35d4cf3. Logs: ~/.config/reckon/crew/runs/r-20260817T140138256599-ftc-contract/.

Cheap observation reads (ledger record filters, version-only plan read)

Commit 43ebf37 (2026-08-17, worker codex-c, wall 434 s, 578 insertions / 152 deletions over reckon/ledger.py, reckon/mcp.py, reckon/mcp_views.py, reckon/_mcp_tools.py and four test files; merged at 35d4cf3).

Tests: 4 added; focused suites 190 + 34 passed, 0 failed; ruff clean. Wave-1 integration gate: full suite 1915 passed, 0 failed at 35d4cf3. Logs: ~/.config/reckon/crew/runs/r-20260817T140140956251-ftc-mcp-obs/.

Skill/CLI reconciliation (surface parity pinned by test)

Commit 372c243 (2026-08-17, worker codex-b, wall 596 s, 234 insertions / 52 deletions over skills/reckon-ship/SKILL.md, two reference files, AGENTS.md and tests/test_skill_contracts.py; merged at a7de6fd).

Tests: 5 added; tests/test_skill_contracts.py 38 passed, 0 failed. Wave-4 integration gate: full suite 1934 passed, 0 failed, 0 skipped at 0f85988 in 84.70 s. Logs: ~/.config/reckon/crew/runs/r-20260817T160556706684-ftc-reconcile/ and ~/.config/reckon/crew/runs/r-20260817T161942885073-w4-verify/.

Filterable runs and complete role routing

Commit 864fc0c (2026-08-17, worker codex-c, wall 325 s, 86 insertions / 7 deletions over reckon/cli.py, reckon/crew.py, reckon/schema/flight-defaults.yaml and two test files; fast-forwarded).

Tests: 5 added; focused suites 189 passed, 0 failed; ruff clean. Role resolution recorded at ~/.config/reckon/crew/runs/r-20260817T163347537041-ftc-roles/resolved-roles.json.

Time budgets (measured per-role defaults, overrun watchdog, retired concurrency key)

Commit d5d3c35 (2026-08-17, worker codex-d, 311 insertions / 70 deletions over reckon/schema/flight.yaml and its two generated artifacts, reckon/flight.py, reckon/crew.py, reckon/schema/flight-defaults.yaml and two test files; merged at fa14abc). Scope was widened mid-flight, so the run is recorded scope_changed and excluded from effort calibration.

Defaults derived from the committed ledger, with the provenance of each figure stated rather than implied:

RoleMeasured p75SampleShipped defaultBasis
implement457.0 s (7.62 m)n=798 mmeasured, rounded up
review189.3 s (3.15 m)n=104 mmeasured, rounded up
cleanup906.5 s (15.11 m)n=225 mdocumented fallback — sample too thin to claim derivation
investigaten=04 mdocumented review-class fallback

Tests: 4 added; focused suites 186 passed, 0 failed; ruff clean; schema regeneration exit 0. Logs: ~/.config/reckon/crew/runs/r-20260817T161940557547-ftc-budgets/.

Negative finding: an exclusive scope can be exclusive and still insufficient. The node was first dispatched owning the generated reckon/_flight_schema.py but not its source reckon/schema/flight.yaml nor the published docs/_shared/flight.schema.json. It stopped without writing anything rather than hand-edit a generated artifact, and was correct to: the repository enforces regeneration parity under test. The scoped pre-dispatch property checks that no two nodes share a path, not that the named paths can carry the goal — so only the coordinator can catch this, and a generated file must never be scoped without its source.

Sandbox tier follows execution capability

Commit 9747555 (2026-08-17, worker codex-c, wall 343 s, 82 insertions / 13 deletions over reckon/schema/flight.yaml and its two generated artifacts, reckon/flight.py, reckon/schema/flight-defaults.yaml and tests/test_flight.py; fast-forwarded).

Found by using the role the previous node had just added. The final suite gate was dispatched under the new test role and could not run: the role resolved read-only, so uv had no writable cache and no network to resolve build requirements, and pytest collected 0 tests. The gate was recorded not-run with that reason rather than passed or failed — an absence of evidence is neither.

RoleExecution capableSandbox beforeSandbox after
testyesread-onlyworktree-full
cleanupyesworktree-fullworktree-full
documentationyesworktree-fullworktree-full
implementyesworktree-fullworktree-full
investigatenoread-onlyread-only
reviewnoread-onlyread-only

Why the §5 parity test did not catch it. That test asserts every role the contract instructs resolves, which this role did. Resolving and being able to do the work are different properties, and only the second one matters to a worker — which is why the new invariant is written against capability rather than against the list of names.

Final sprint gate, and the fix demonstrating itself. The gate was re-dispatched under the corrected test role, resolving worktree-full: full suite 1941 passed, 0 failed, 0 skipped at 3e017f0 in 74.39 s, exit 0. The same node that could not collect a single test before the fix wrote both its cache and its manifest after it. Log: ~/.config/reckon/crew/runs/r-20260817T165120105364-s11-gate/full-pytest.log.