Context
2026-08-09 10:53Z, first-party falsification from @neo-opus-ada (A2A MESSAGE:ed1ede58-de5b-4822-86f1-f37b3b0cc257, related #16682 / #16707 / PR #16709): WARM_WINDOWS.claude in ai/scripts/diagnostics/seatCostReport.mjs encodes the wrong Anthropic branch — plus two adjacent gaps. Two gaps land as code here; the third is a framing comment on #16682.
Live latest-open sweep: checked the latest 20 open issues at 2026-08-09T12:35Z — no equivalent. A2A in-flight claim sweep (same window): no seat-cost claims. KB semantic sweep: #16707 (delivered parent) and #16682 (context-budget gate) only.
The Problem
GAP 1 — the claude window encodes the OVERAGE branch as the baseline. The docblock names all three Anthropic branches (documented default 5min; extended 1h at 2× write cost; drops to 5min in subscription overage) but the table operationalizes 5 * 60 * 1000. Ada's first-party harness read (her Claude Code seat, 2026-08-09): 1h is the normal regime; the 5min drop arrives only inside usage overage. The error direction is what matters: it INVERTS the safeguard. Kimi's failure mode is idling past the cliff into a full re-bill; a claude seat judged cold at 6 minutes gets sunset ~12× too aggressively and PAYS the 60–150k fresh-boot cost to dodge a re-bill that was not coming. Same table, opposite harm.
GAP 2 — a missing ledger reader renders identically to a missing measurement. gpt: null renders unmeasured — a visible hole. But no ledger reader exists at all for Claude Code/Desktop or Codex (only kimi-code wire.jsonl + the opencode sqlite are read), so those seats produce no rows and are simply absent from the output. A missing family value announces itself; a missing SOURCE does not — and the two look identical to whoever reads the table.
GAP 3 — not code. The 1h extended TTL is a purchasable lever (2× writes vs a full re-bill) for seats whose real pattern is 30–60min gaps between wakes — exactly the regime the operator flagged as expensive. That reframes "how long before we sunset" as "which TTL do we buy for this seat's cadence". Lands as a comment on #16682.
The Architectural Reality
ai/scripts/diagnostics/seatCostReport.mjs — deliberately graphless diagnostics CLI (no AiConfig import; the boundary mirrors ai/daemons/wake/). WARM_WINDOWS (line ~61) keys warm windows by provider family; buildSeat() resolves the window from the classified family only; main() hardcodes the two ledger-known seats (iris/phoebe).
- Spec:
test/playwright/unit/ai/scripts/diagnostics/seatCostReport.spec.mjs — deterministic synthetic fixtures; the falsifier tests live here.
- Adjacent surface, explicitly out of scope: the wake receiver's per-seat
contextGate (ai/daemons/wake/receiver.mjs:110, config-driven via adapterConfig.contextGate) consumes the same warm-window concept from seat config, not from this reporter. Auditing each seat's configured claude window is seat-config business — named so this fix does not pretend to cover it.
The Fix
WARM_WINDOWS.claude → 60 * 60 * 1000; docblock rewritten to carry all three branches, which branch the table operationalizes and WHY (the inversion argument), the source stamp (Ada's harness read, her seat, 2026-08-09), and the per-harness qualifier: the read is first-party for that one Claude Code configuration; Claude Desktop stays unmeasured until its own reading lands — and since no claude ledger reader exists, no claude seat renders until a reader lands, at which moment the per-harness reading is required.
- New exported
LEDGER_READERS registry (harness → reader availability); renderReport appends a ledger-coverage line naming every reader-less harness, computed from the registry — never a hardcoded string.
- Spec assertions: the claude baseline value; the coverage line naming
claude-code, claude-desktop, codex.
Contract Ledger
| Surface |
Today |
After |
Consumers |
Evidence |
WARM_WINDOWS.claude (exported const) |
5 * 60 * 1000 (overage branch) |
60 * 60 * 1000 (normal-regime branch, source-stamped) |
bucketByDay via buildSeat; spec |
Ada's first-party harness read, A2A 2026-08-09 |
LEDGER_READERS (new exported const) |
absent |
harness → reader-availability registry |
renderReport coverage line; spec |
this ticket |
renderReport output |
needle footnote only |
+ ledger-coverage line naming reader-less harnesses |
operator + fleet agents reading cost reports |
spec assertion |
CLI flags / USAGE |
unchanged |
unchanged |
— |
— |
Decision Record impact
none.
Acceptance Criteria
Out of Scope
- Per-harness claude warm-window rows (Claude Desktop reads when a reader exists — its own seat's measurement, not preemptive).
- The wake receiver's per-seat
contextGate config audit (adjacent consumer, config-driven).
- Any AiConfig / config wiring — the CLI stays graphless.
Avoided Traps
- Preemptive family × harness matrix — Ada bounded her read to her own seat; the family axis holds until a second claude harness is measured. Inventing rows = invented numbers, the exact discipline
gpt: null keeps.
- Rendering a fleet roster — the reporter reports LEDGER coverage, not seats; seat discovery is not its business.
Related
#16707 · #16682 · PR #16709 · falsification source MESSAGE:ed1ede58-de5b-4822-86f1-f37b3b0cc257
Origin Session ID: 6df9925c-e527-496d-9fbf-0a277c175d59
Retrieval Hint: "seatCostReport WARM_WINDOWS claude overage branch ledger reader coverage"
Context
2026-08-09 10:53Z, first-party falsification from @neo-opus-ada (A2A
MESSAGE:ed1ede58-de5b-4822-86f1-f37b3b0cc257, related#16682/#16707/ PR#16709):WARM_WINDOWS.claudeinai/scripts/diagnostics/seatCostReport.mjsencodes the wrong Anthropic branch — plus two adjacent gaps. Two gaps land as code here; the third is a framing comment on #16682.Live latest-open sweep: checked the latest 20 open issues at 2026-08-09T12:35Z — no equivalent. A2A in-flight claim sweep (same window): no seat-cost claims. KB semantic sweep:
#16707(delivered parent) and#16682(context-budget gate) only.The Problem
GAP 1 — the claude window encodes the OVERAGE branch as the baseline. The docblock names all three Anthropic branches (documented default 5min; extended 1h at 2× write cost; drops to 5min in subscription overage) but the table operationalizes
5 * 60 * 1000. Ada's first-party harness read (her Claude Code seat, 2026-08-09): 1h is the normal regime; the 5min drop arrives only inside usage overage. The error direction is what matters: it INVERTS the safeguard. Kimi's failure mode is idling past the cliff into a full re-bill; a claude seat judged cold at 6 minutes gets sunset ~12× too aggressively and PAYS the 60–150k fresh-boot cost to dodge a re-bill that was not coming. Same table, opposite harm.GAP 2 — a missing ledger reader renders identically to a missing measurement.
gpt: nullrendersunmeasured— a visible hole. But no ledger reader exists at all for Claude Code/Desktop or Codex (only kimi-codewire.jsonl+ the opencode sqlite are read), so those seats produce no rows and are simply absent from the output. A missing family value announces itself; a missing SOURCE does not — and the two look identical to whoever reads the table.GAP 3 — not code. The 1h extended TTL is a purchasable lever (2× writes vs a full re-bill) for seats whose real pattern is 30–60min gaps between wakes — exactly the regime the operator flagged as expensive. That reframes "how long before we sunset" as "which TTL do we buy for this seat's cadence". Lands as a comment on #16682.
The Architectural Reality
ai/scripts/diagnostics/seatCostReport.mjs— deliberately graphless diagnostics CLI (no AiConfig import; the boundary mirrorsai/daemons/wake/).WARM_WINDOWS(line ~61) keys warm windows by provider family;buildSeat()resolves the window from the classified family only;main()hardcodes the two ledger-known seats (iris/phoebe).test/playwright/unit/ai/scripts/diagnostics/seatCostReport.spec.mjs— deterministic synthetic fixtures; the falsifier tests live here.contextGate(ai/daemons/wake/receiver.mjs:110, config-driven viaadapterConfig.contextGate) consumes the same warm-window concept from seat config, not from this reporter. Auditing each seat's configured claude window is seat-config business — named so this fix does not pretend to cover it.The Fix
WARM_WINDOWS.claude→60 * 60 * 1000; docblock rewritten to carry all three branches, which branch the table operationalizes and WHY (the inversion argument), the source stamp (Ada's harness read, her seat, 2026-08-09), and the per-harness qualifier: the read is first-party for that one Claude Code configuration; Claude Desktop stays unmeasured until its own reading lands — and since no claude ledger reader exists, no claude seat renders until a reader lands, at which moment the per-harness reading is required.LEDGER_READERSregistry (harness → reader availability);renderReportappends a ledger-coverage line naming every reader-less harness, computed from the registry — never a hardcoded string.claude-code,claude-desktop,codex.Contract Ledger
WARM_WINDOWS.claude(exported const)5 * 60 * 1000(overage branch)60 * 60 * 1000(normal-regime branch, source-stamped)bucketByDayviabuildSeat; specLEDGER_READERS(new exported const)renderReportcoverage line; specrenderReportoutputUSAGEDecision Record impact
none.
Acceptance Criteria
WARM_WINDOWS.claudeencodes the 1h normal-regime branch; the docblock carries all three Anthropic branches, the inversion argument, the source stamp, and the per-harness qualifier.LEDGER_READERS.seatCostReport.spec.mjsgreen.Out of Scope
contextGateconfig audit (adjacent consumer, config-driven).Avoided Traps
gpt: nullkeeps.Related
#16707 · #16682 · PR #16709 · falsification source
MESSAGE:ed1ede58-de5b-4822-86f1-f37b3b0cc257Origin Session ID: 6df9925c-e527-496d-9fbf-0a277c175d59
Retrieval Hint: "seatCostReport WARM_WINDOWS claude overage branch ledger reader coverage"