Status: Living Last updated: 2026-10-18
- Related: README.md, phases/phase-2.5-cli-consolidation.md, phases/phase-2.5.5-hardening-and-remediation.md, phases/phase-2-cli.md, deferred-tasks.md, ../project-structure.md, ../tech-stack.md
Authority (until Phase 2.5.5 and Phase 2.6 close): This file is canonical for live progress and execution order; the phase documents stay canonical for scope and acceptance. Ordering differences between the two are deliberate.
current.mdmay override recommended ordering — it may not redefine a security boundary, a scope line, or a milestone acceptance criterion.
This page tracks what is active right now and the immediate next concrete actions.
The full phase plan and the global milestone spine are in README.md.
Phase 2.5 (CLI Consolidation) is complete (milestone M2.5-4, PR #69, 2026-07-08) — its
breakdown, now historical, is in
phases/phase-2.5-cli-consolidation.md.
A 2026-07-19 full-project code review then opened Phase 2.5.5 (Hardening and Remediation), an
interstitial phase holding the review's verified findings against the pre-2.6 codebase; it runs
concurrently with Phase 2.6, not before it — see
phases/phase-2.5.5-hardening-and-remediation.md
and Active now.
Phase 2.6 — Conversational Authoring and the First-Class CLI is in progress (re-scoped
2026-07-08); its plan is in
phases/phase-2.6-conversational-authoring.md.
Workstream 2.6.F (platform floor + the full-screen TUI renderer) is merged to main
(PR #74, 2026-07-11), and so is 2.6.C (the reseat transcript-carry + the /cost per-model breakdown,
PR #75, 2026-07-13) — see Active now. 2.6.Q (dynamic model-catalog
enrichment) is no longer blocked: ADR-0071
and ADR-0072 are both
Accepted, resolving the six open maintainer questions the phase file had cited, and the P1–P5
implementation steps are merged to main (PR #76, 2026-07-26). P6 and the /settings → /models
visibility toggle remain open; the bundled offline snapshot was regenerated in PR #79 after the D3
price ruling.
The unified build order across both phases is in
Execution order — Phase 2.5.5 + Phase 2.6 below — a
temporary section, deleted when both phases close. Its baseline step is discharged (PRs #76 and #77 merged)
and Wave 0 is merged (PR #82), as is Wave 1 (PR #83). The interlude's W2 (core reliability, six items) is
merged too (PR #85, 2026-08-28).
W7 merged to
main, 2026-10-10 (PR #90,46a6a701): all twelve steps, five genuine overflow records, production request ownership and consolidated host lifetimes have independent acceptance. All six W7 items are closed; Phase 2.6.5 stood at 47/51 at that merge. The closing register joins per-item causal controls, both final review rounds and every submitted systematic finding. PR #90 merged at 13:57:47 UTC. W8 was still open at that checkpoint; it subsequently merged in PR #92. Approved deferrals remain. No implementation, user decision, credential, billing or provider capture is pending for W7.
Post-closure corrections accepted, 2026-10-10: the new correction register joins every new report disposition. Core, CLI/DB and tooling/docs each have two NEW complete clean cumulative review rounds. Fresh unchanged-production coverage passes 447 files / 9,512 cases / eleven existing capability/key-gated LLM skips. Published-head checks are reported in PR #90. W7 has no implementation, provider, credential, billing or user-decision prerequisite left. The corrections merged with PR #90; W8 subsequently merged in PR #92. Existing approved limits remain.
Publication tool corrections accepted, 2026-10-10: two NEW complete clean cumulative rounds independently verify all four Sonar-label dispositions, preserved UTF-16 ordering and OS-owned Git dispatch with PATH-trap causal controls. Shipping production/tests remain unchanged. Final local CI and exact published-head GitHub/Sonar checks are reported in PR #90; the prior failed analysis stays recorded. W7 has no implementation, capture, credential, billing or user-decision prerequisite left.
W8 merged to main on 2026-10-11 as PR #92,
merge commit ef0ffa54. Phase 2.6.5 is complete with approved deferrals: 49/51 items closed.
The merge checkpoint
joins final publication evidence and all seven phase exit criteria. All seven W8 steps,
CR-81, CR-82 and ADR-0087 §1 are complete on main; no W8 implementation, review,
publication, provider, billing, credential or user-decision gate remains.
- Consumption: explicit run/session modes preserve iterated delivery from construction; subscribe-only handles retain no primary buffer and reject iteration with a typed error.
- Conformance: strict expected exchanges and the 24-case actual installed-SDK HTTP matrix detect production-lowering regressions.
- Usage uncertainty: complete/partial/missing observations, pending ACK before invocation, once-only settlement and late receipts, sticky old-writer uncertainty and qualified human/JSON totals preserve the distinction between unknown usage and actual zero.
The original closing register
preserves its source acceptance and two NEW complete whole-wave reviews. The
maintainer correction register
joins all report dispositions and two NEW independent complete clean cumulative rounds per
correction increment. Final reviewed head 3d4491df passed both seven-job PR/push CI
workflows and the SonarCloud quality gate. Published ordinary/enforced-coverage inventories
are 511 files / 11,026 passing tests / 12 established skips; four wire and 23 usage
mechanisms retain 427 permanent cases and 69 joined native children. Fresh full local
CI and bare/enforced coverage at 6139563e remain separately attributed evidence.
No merge-commit execution, live-provider invoice or unsupported-platform result is inferred.
Two nonblocking Sonar complexity suggestions remain visible. Detailed review records stay
local and ignored; historical citations remain commit-pinned.
What remains: CR-70 (cross-turn tool-history carrying) and CR-93 (tenant-scoped mutable state) are approved deferrals. The 49/51 count includes CR-95's short-term fail-closed fix; its long continuation and existing exact-capacity/scoped residuals remain in deferred-tasks.md, with their existing severity, trigger and narrowed claim. ADR-0087 §1 is outside the denominator. Phase closure does not claim 51 fully implemented items or an empty debt backlog. Phase 2.5.5 and Phase 2.6 remain in progress. Earlier dated pending checkpoints in this page and the phase register are historical.
Wave 2 merged to main on 2026-10-15 as PR #94,
merge commit ab08209e. All eight steps and the maintainer corrections are complete.
The merge checkpoint
joins the forty item dispositions, four new security sittings plus W4 revalidation,
original whole-wave acceptance and all subsequent correction scopes. Existing incoming
navigation anchors are retained; dated implementation checkpoints remain historical.
Completed work covers invocation-authorized filesystem boundaries and scratch-policy composition; bounded secret stdin, early admission and private bridge diagnostics; faithful-snapshot warnings, structural session privacy and export completion; verified bounded media/CAS/native lifecycles; and the interim provider-header gate. Maintainer corrections include runner-level error rejection, valid Opus/Vorbis publication, FLAC structural consistency, generated-result streaming and finite pin-error provenance.
Final reviewed correction source 4cdfe011 has two NEW independent complete clean
cumulative rounds covering all 67 correction paths / 188 hunks / 24 complete new files.
These scoped rounds do not claim a new review of every original PR path. Full local
CI, ordinary/enforced coverage and all nine jobs in each PR/push CI workflow pass;
SonarCloud and selected native Windows/Node-floor controls pass. Local coverage records
588 files / 12,983 passing tests / 20 explicit skips; CI records 12,982 / 21 with its
established extra CI-only skip. Complete physical controls are independently inspected.
The merge tree matches the reviewed source; no new merge-commit execution is inferred.
Satisfied on main: Phase 2.5.5 exit criteria 1–3 and sub-stream D acceptance.
Still open: M2.5.5-2's I half, whole Phase 2.5.5/2.6, M/N production lifecycle,
future live headers and existing approved residuals. Wave 2 has no remaining implementation,
review, publication, ADR approval, provider capture, credential, billing or user-decision gate.
The deferred register retains its existing limits; closure adds no deferral.
Wave 3 implementation is in progress on development; Steps 1–8 have scoped
independent acceptance. The initial publication checkpoint is
PR #95. A second maintainer systematic
review at a5a5d45e reopened corrective work; its
current correction register
owns dispositions and remaining gates. Corrective source reviews are complete;
the two later native test-fixture increments have separate scoped acceptance.
Final pushed-head publication checks remain required, with their live results on
PR #95. Steps 9–19 have not started; check the PR status before extending its scope
with Step 9. See the Wave 3 queue.
Dated W7 checkpoints throughout this page retain their original pending states. The closing checkpoint above and its later post-closure and merge checkpoints control current W7 status; historical pending/draft wording describes the checkpoint when it was written.
Prior complete composition review: host-closure round 5 finds no new confirmed actionable issue across all 126 paths / 364 hunks. This is the first clean complete cumulative round; one further fresh complete clean round remains required. Step 8 and final Step 12 remain open, with no user/provider blocker.
Complete composition review: host-closure round 4 confirms public stream exit can skip underlying cleanup on retirement failure. Parent adds twelve paired permanent cases and guarantees cleanup while preserving the original throw. Two fresh complete clean rounds, Step 8 and final Step 12 remain required; no user input is pending.
Complete composition review: host-closure round 3 confirms two retirement-boundary Highs: mutable returned output/usage and failed cleanup suppressing accounting/acknowledgement. Parent corrections add thirty-two permanent cases. Fresh complete review remains required; Step 8/12 remain open, with no user/provider blocker.
Complete composition review: host-closure round 2 confirms due-budget departure starvation and provider entry after synchronous cancellation. Parent corrections add nineteen permanent cases and fix adjacent canonical-documentation drift. Fresh complete review is required; Step 8/12 remain open. No user/provider blocker exists.
Complete composition review: host-closure round 1 confirms three lifecycle High findings (post-pause receipt cursor, rejected activation joining, post-unmount Ink visibility) and a required shipping-registry acceptance gap. Parent corrections add eighteen permanent cases and strengthen native output assertions. Fresh complete review of the corrected composition remains required before acceptance; Step 8/12 are still open.
W7 live status, 2026-10-09: all five immutable provider records and Step 7's four-round acceptance remain complete. Two fresh adapter/chain round-3 reviews accept all 24 cumulative paths/78 hunks through
0c3c185b; exact-head required CI, coverage, Node 22, Windows, peers and Sonar pass. Core measured-round reuse is implemented at99e78e55; both independent round-1 reviews clear all 13 paths/47 hunks. Two fresh round-2 reviews accept all 19 cumulative paths/53 hunks throughf1281214; exact-head CI passes. ADR-0103 append/receipt integration is implemented ata35739a4; both complete round-1 reviews clear all 17 paths/57 hunks. Two fresh cumulative round-2 reviews accept all 23 paths/63 hunks through01115050. Raw provider/iterator/media and native child lifetime integration is implemented atfde3ca0c; both complete round-1 reviews verify a public-return High, corrected with two regressions (28 permanent cases total). Two fresh cumulative round-2 reviews accept all 20 paths/41 hunks through1172d247after complete report/artifact/freeze audits; nested Corepack reviewer violations get no proof credit. The HTTP descendant increment now has 23 new permanent cases, 16 compiled negative controls and a passing cache-qualified root CI; both complete round-1 reviews clear all 22 paths/38 hunks throughdb02b83cafter Parent's complete artifact/freeze audits. Two fresh cumulative round-2 reviews accept all 24 paths/40 hunks through6e620556after Parent's complete evidence and 645,606-entry freeze audits. Invocation-local provider/raw-poll integration adds 57 permanent cases; complete round-1 reviews verify a method-receiver defect and separately strengthen a weak Promise test. Both complete round-2 reviews verify one getter-acquisition defect. Its correction passes root CI (404 files / 9,030 cases / 12 existing skips); both NEW complete cumulative round-3 reviews and Parent's complete artifact/645,743-entry freeze audits accept all 28 paths/67 hunks throughf9a8ff37, with no new confirmed finding. Exact-head required CI, coverage and Sonar pass. MCP transport/handler descendants now have 77 new permanent cases. Rounds 1–3 corrected queued-reservation, deadline, disposer, coverage, empty-start stdio and callback failures. Complete round-4 reviews and Parent evidence/freeze audits verify completed control-lane reference retention. Correction37220a95releases only fully acknowledged lanes and passes actual root CI; seven new causal regressions and fresh enforced private coverage pass (412 files / 9,107 cases / 12 skips; MCP branches 90.68%). Two NEW complete cumulative round-5 reviews and Parent's complete source/artifact audits accept all 38 paths/70 hunks through99c46bbd, with no new confirmed finding and 268 independently passing cases per reviewer. The full shared-tree audit has zero file/link changes and one qualified.gitdirectory mtime change. Fresh startup registers its complete continuation. Two complete first-round reviews and Parent audits verify reentrant clock/timer cancellation; three permanent regressions cover the correction. Two NEW complete cumulative round-2 reviews and Parent's exact-source/physical-artifact/647,041-entry freeze audits accept all ten paths/sixteen hunks through5d44b13b, with zero new confirmed findings and 2,850 core cases per reviewer. Both complete scheduler readiness round-1 reviews verify a secondary readiness-diagnostic failure. Its correction has twelve causal readiness regressions and 2,862 passing private core cases. Two NEW complete cumulative round-2 reviews and Parent's source/artifact/647,245-entry unchanged freeze audit accept all nine paths/ten hunks through95f3923a, with zero new readiness findings. Both inherited dispatch Highs (post-start-append cancellation admission and unsafe detached failure formatting) are corrected in1918690d, with six new permanent cases and passing exact-input root CI. Both complete dispatch-correction round-1 reviews and Parent's artifact/647,355-entry unchanged freeze audits accept the eight-path/ seventeen-hunk scope with zero confirmed findings. Both complete cumulative second-round reviews verify an inherited retry-start cancellation High. Its correction and a subsequent Parent-discovered synchronous attempt-entry correction add ten permanent cases; final-source causal controls pass. NEW complete cumulative reviews are required before scoped closure; complete scheduler/dispatch roots stay open. Complete cumulative round-3 reviews verify a retry/deadline duplicate-terminal High. Parent confirms and corrects it, with a new permanent causal regression; fresh cumulative review remains required. Complete cumulative round-4 reviews verify two paths of one attempt-correlation High. Parent corrects explicit failure forwarding and first-start reset with five permanent cases; NEW cumulative review is required. Complete cumulative round-5 reviews verify a pre-start readiness attempt-correlation High. Parent corrects its latest-entered-attempt forwarding with two paired permanent cases; NEW cumulative review is required. Complete cumulative round 6 finds no new confirmed issue. The NEW complete round 7 verifies a differing-order grace High: an unstarted claim can receive a failure. Parent corrects explicit claim/start tracking, with three permanent causal cases; NEW complete cumulative reviews remain required. A broader private actor prototype exposed CLI closure/lease-handoff failures in root CI. Complete scheduler/dispatch/resume registration must land with shipping host departure; original failures and assertions are retained, and that integration stays required in W7. Complete MCP startup/all-actor retirement, custom-provider descendants and remaining host departure work and Step 8 atomic compaction/recovery remain open. The ownership/lifecycle Highs, Step 12, final whole-wave CI/coverage/Sonar and all six W7 register items remain open. Draft PR #90 is unmerged; no further paid call, credential or ADR approval is needed. Earlier progress statements below describe their publication checkpoints.
W7 implementation, 2026-10-02: the documentation review is closed. The maintainer approved ADR-0099, ADR-0100 and the twelve-step W7 plan. Work remains on
development; each step closes with two fresh independent Codex review rounds and verified fixes. Step 1's implementation and first review corrections passpnpm run ciandpnpm coverage; round 1 verified seven findings; round 2 verified a cleanup race in its fix. Round 3 verified a passing/starting race; cleanup now retains shared parents and deletes only owned probes. All corrections pass the gates; Round 4 cleared probe ownership and found a capture pathname-cleanup race. The runner now closes its descriptor without deleting a failed destination. Round 5 cleared the complete step and final corrections; step 1 is closed. Step 2's structural store boundary and durable effect-turn allocator pass the required checks and root coverage (289 suites, 6,367 passing tests, 11 skipped); full CI passed at1927daa1. Round 1 verified nested-transaction key reuse and unsafe session media metadata. Both are corrected; checks and coverage pass (289 suites, 6,374 passing tests, 11 skipped), with full CI passing atc96eb9b5. Round 2 cleared the complete step and both fixes, including real lock contention and process-crash checks. Step 2 is closed; step 3 implementation now connects structural completed turns, atomic persistence, empty-final resume/export and per-call effect ids across the CLI hosts. Required checks and coverage pass; Round 1 verified a deep-JSON metadata failure and a lost policy-denial classification. Both corrections pass the required checks and coverage (291 suites, 6,406 passing tests, 11 skipped); full CI passes at4045272c. Round 2 verified a cached-command durability bypass and a missing tool name on recovered filesystem denial. Both corrections pass checks and coverage (291 suites, 6,410 passing tests, 11 skipped); full CI passes ate95a6010. Round 3 independently verified an unjournaled-tool durability bypass and a stale export introduction. Dispatch admission now checks the live latch after approval/preparation for every actual tool call and releases a proven non-dispatch claim. Both corrections pass checks and coverage (291 suites, 6,415 passing tests, 11 skipped); full CI passes atdd50738c. Round 4 cleared dispatch admission and verified loss of nontrailing pre-W7 empty-final user text from resume/reseat and export prompts. Legacy context and boundary slots now preserve the old read behaviour without fabricating terminals or completed counts. Required checks and coverage pass (291 suites, 6,422 passing tests, 11 skipped); full CI passes at6d5b3f0b. Round 5 cleared the complete step and all earlier corrections, including independent mixed-history projection, YAML, real SQLite boundary and process-crash probes. Step 3 is closed; step 4 proceeds automatically with session-result privacy, full-history disclosure snapshots and exact committed-row retention. Step 4's first acceptance round independently reproduced pre-mount Ink resume/reseat deletion. The verified correction separates opening from committed-mount activation and carries driver activity through disclosure and teardown; Round 2 reproduced activation before passive Ink input setup and before disclosure was drawn. Activation now awaits usable setup and disclosure render acknowledgement, observes renderer exit/error and keeps input gated; actual Ink and Home tests verify the display boundary. Required checks and coverage pass (297 suites, 6,487 passing tests, 11 skipped); a third fresh corrective acceptance round was required before step 4 closes. Round 3 verified incomplete-call attribution and flush acknowledgement of unwritable output. Completion now uses the shared structural projector; rendered disclosure checks the actual Ink output and its lifetime. Required checks, build and coverage pass (297 suites, 6,497 passing tests, 11 skipped); a fourth fresh acceptance round is required. Round 4 verified headless stderr enqueueing mistaken for delivery and inline disclosure lost during Ctrl-Z suspension. Native stderr callbacks now acknowledge delivery; notice publication and render acknowledgement share terminal ownership with suspension. Nine focused suites pass 217 tests, including delayed native delivery and independent real STOP/CONT controls. Required workspace checks, build and coverage pass (298 suites, 6,514 tests, 11 skipped). Full CI passed atb9d52d76; round 5 required two more corrections. Round 5 independently reproduced blocked native stderr holding Ctrl-C teardown and late Home acknowledgement deleting evidence during canceled-session MCP close. Headless activation now races an owned interrupt; Home activation requires a running session outside teardown. Eight focused suites pass 310 tests; native pipe/FIFO before/after controls and late callbacks after actual database close pass. Workspace checks, build and coverage pass (298 suites, 6,520 tests, 11 skipped). Full CI passed ate753beb7. Round 6 accepted the complete step and every correction with no new material findings. Parent native/privacy controls pass; compiled-entry process-exit delay under queued stdio also reproduces on the exact pre-step baseline and is explicitly qualified. Step 4 is closed; step 5 proceeds automatically. All six W7 register items remain open. Step 5's memory implementation and canonical docs are checked: one pure request projection, frozen policy, completed-turn spans and engine/CLI history refusals; actual request, workflow-node and SQLite resume/reseat controls pass. Workspace checks, build and coverage pass (299 suites, 6,567 passing tests, 11 skipped). Later measured pre-send/recovery and revised compaction outcomes remain staged. Clean-tree full CI passed atecdcc395. Step 5 round 1 accepted the implementation: both reviewers passed 347 focused tests; parent-rerun controls passed 390 state/history cases and 86 actual CLI/SQLite cases. Matched source-head operational controls pass; exact pre-step engine controls fail as expected. Adjacent working-context/durable-history wording is corrected. Step 5 round 2 accepted the complete step: both fresh reviewers passed 347 tests; the parent reproduced 1,536 state/history and 86 CLI/Home/SQLite cases, plus exact-source positive/negative controls. Steps 1–5 are closed; all six W7 items remain open. Step 6's independently reviewed Accepted ADR-0101 resolves a newly identified configured-estimate/native-cap precedence gap. The maintainer approved the complete revised decision on 2026-10-02; dated forward notes are landed and step 6 proceeds; ADR revision round 1 records the maintainer's verified transport/pricing findings and the corrected measurement-to-attempt handoff. Fresh draft round 2 accepted the complete corrected proposal with no actionable findings; full CI passed at2b628e1a. The acceptance and runtime obligations remain distinct: runtime acceptance is now complete. Step 6 round 8 accepts the complete step and seven corrections. Both fresh reviewers reported no verified new findings; parent replays pass 120 contract and 54 financial controls. Steps 1–6 are closed; all six W7 register items remain open. Step 9's quote/debit foundation is implemented, with candidate preflight and parent causal controls. Full CI/coverage pass after the round 3 correction (315 test files, 7,152 passing tests, 11 existing skips). Round 1 verified and corrected two caller settlement findings; Round 2 verified and corrected the async consumer and cancellation teardown; Round 3 verified and corrected park/poll host admission loss and the reentrant durable-total race. Fresh round 4 accepts the complete foundation with no new findings; both sealed inventories and 70 parent-rerun fresh cases are verified. Its corrected native-loader evidence and prior harness isolation exception are recorded explicitly. Step 9 is closed; approved Step 10 proceeds automatically with durable workflow activation and replay. Step 10 round 1 reproduced and corrected passive-resume lease expiry and unbound predecessor CJS/peer/optional edges. Exact-fence renewal and an owned, versioned dependency closure pass causal controls, full CI and coverage (320 suites, 7,318 passing tests, 11 existing skips), including seventy actual-runner cases, twelve real predecessor refusals, two legacy controls and seven permanent graph/runtime controls. Step 10 round 2 verified and corrected terminal conservative-money ordering, historical budget input compatibility, companion amount symmetry and pinned runtime edges. Full CI/coverage pass (320 suites, 7,340 passing tests, 11 existing skips); 78 native runner cases, thirteen graph controls and actual historical-input replay pass causal checks. Step 10 round 3 verifies and corrects authority-witnessed optional-amount duplicate compatibility, preserving strict money conflicts, genuine output and unrelated pending work. Eighteen permanent regressions and 300 native selected cases pass. Full CI/coverage pass (320 suites, 7,358 tests, 11 existing skips); fresh full-Step-10 round 4 precedes closure. All six register items remain open. Step 10 round 4 corrects lease cleanup rejection replacing primary typed refusals or an already-terminal no-op. Eighteen native regressions cover all six guards and successor takeover; full CI/coverage pass (320 suites, 7,376 tests, 11 existing skips). Fresh whole-Step-10 round 5 precedes closure; no residual is deferred. Step 10 round 5 corrects inherited parallel gate publication handing off and then reclaiming a waiting-only lease. Ten permanent regressions cover held pause ACKs, actual SQLite fresh-owner resume and immediate human-decision media preparation. Async final-ACK limits are explicit; no new clock/timeout policy is chosen. Full CI/coverage pass (320 suites, 7,386 tests, 11 existing skips). Fresh whole-Step-10 round 6 precedes closure. Step 10 round 6 corrects inherited ordinary decision media completion after cancellation, deadline or fenced closure. Twelve permanent Core/actual SQLite-CAS regressions prevent late subscriber success and renewed run references; guard removal/restoration confirms the failure. Full CI/coverage pass (321 suites, 7,398 tests, 11 existing skips). Fresh full-Step-10 round 7 precedes closure. Step 10 round 7 corrects inherited media references written before a stale event fence is refused. Produced handles now follow append acknowledgement; owned uncertain-terminal media remains retained for the outbox. Seven permanent successor/terminal controls and independently verified sealed evidence pass, with full CI and sequential coverage (323 files, 7,405 tests, 11 existing skips). Fresh full-Step-10 round 8 precedes closure. Step 10 round 8 accepts the full 74-file step with no new verified findings. Both fresh reviewers pass 857 permanent tests and separate five/six fresh probes; complete reports and every sealed inventory entry are parent-verified. Step 10 is closed; approved Step 11 proceeds automatically with the safe CLI surface, permanent compiled-process smoke coverage and fresh independent reviews. Step 11 implementation now passes full CI and sequential coverage (327 files, 7,506 tests, 11 existing skips), including permanent compiled CLI refusal/status/abort/MCP-interruption smokes and raw-triple display regressions. Step 11 round 1 independently verifies native approval-write cancellation, the no-MCP signal guard and stale identified-companion display cleanup. The parent fixes all three, adds passive Core cancellation/fence controls and corrects the ownership wording. Full CI and sequential coverage pass after the corrections (327 files, 7,519 passing tests, 11 existing skips; global line/branch/function 95.88%/92.63%/96.73%). Step 11 round 2 verifies two further High findings: a successful native busy wait can conceal OS SIGINT until after egress, and terminal write uncertainty was misreported as takeover. The CLI host yields across a poll turn before decision acknowledgement; terminal uncertainty retains exit 5, while actual successor fencing still refuses without a false claim that an earlier approval is absent. Seven new permanent controls pass; both complete sealed reports and every inventory entry are parent-verified. Full CI and sequential coverage pass (327 files, 7,526 tests, 11 existing skips; 95.88%/92.63%/96.73%). Fresh full-Step-11 round 3 follows the correction commits; the step remains open. Fresh Step 11 round 3 is clean in both complete independent reviews: 452 permanent tests each plus separately reported fresh native, passive and compiled-process controls. Both reports and every sealed inventory entry are verified. Interrupted earlier round-3 runs contribute no acceptance. Step 11 is closed. Independent Step 12 document preflight verifies and corrects usage/pricing and fixture-coverage prose; connected at-rest/event claims, guides and moved follow-up status are reconciled. This independent maintenance proceeds through repository checks and fresh post-commit review; Step 12's whole-wave acceptance remains open. Committed maintenance round 1 independently verifies one Medium reservation-existence qualification and one Low inherited event-table guarantee. Both are parent-verified and corrected in four text/comment locations. Complete reports and all 2,687 sealed entries are verified; 81 fresh reviewer DB tests and a real-writer reference-corruption/restoration control pass. Fresh complete maintenance round 2 follows the correction commits; whole Step 12 remains open. Committed maintenance round 2 is clean across all 26 paths/37 hunks in both fresh reviews. Both complete reports and all 2,574 sealed entries/source pins are verified; fresh 81-test DB/strict checks and real-writer causal controls pass. The independent maintenance subset is closed; whole Step 12 and all six W7 items remain open. Draft PR #90 is open ondevelopment. Required Linux CI revealed an actual-Ink test-context mismatch. Further controlled checks found undisplayed disclosure under the existing CI opt-outs and Home's inline reseat Static cursor; corrections pass two fresh independent review rounds. Prior scoped acceptance does not waive other findings. All five required actual overflow records (Anthropic input rejection and native context stop, OpenAI, DeepSeek and Gemini) are now preserved in the fixture index. The separate Anthropic native context-stop response was captured on 2026-10-08; the evidence prerequisite is satisfied. Step 7 classification, Step 8 and whole-wave acceptance remain open. Step 1 repaired collection without deleting private artifacts and provides the maintainer-run live overflow capture procedure. Classification must replay the preserved live fixtures. The six W7 items stay open.
PR 90 systematic follow-up — 2026-10-04. Two maintainer reports against
95137c34register 35 deduplicated findings, with qualified independent triage. Step 6's request-ownership guarantee is reopened; adjacent session/CLI, replay-tool and documentation obligations require correction and fresh acceptance. The first committed rendering review reproduces notice loss after a supported chat resizes and CI route/ownership drift. Its corrections are accepted by fresh round 2. The rendering corrective group is closed. Previous step closure records remain historical evidence, not current whole-wave acceptance. All ten GitHub workflow checks pass atd4e4fa9c; SonarCloud and remaining findings stay separately under examination. No finding is deferred at intake. Steps 7–8, whole Step 12 and all six W7 register items remain open.
Request-ownership decision preflight — 2026-10-04. Proposed ADR-0102 would close the measured-to-sent alias gap through one owned inert construction and existing candidate cap authority. It deliberately narrows non-cap opaque inputs and requires maintainer approval before dependent implementation. Draft round 1 corrects SDK shared-reference parity and incoming measured-plan ordering. Fresh complete round 2 receives no new material proposal findings; maintainer approval remains required before dependent implementation. Independent corrective work continues. The ownership HIGH remains open.
Systematic group 2a, round 1 — 2026-10-04. Two complete independent reviews verify the cap/structural repairs but reproduce a new successful-tool observer regression: real session usage is lost and the hard turn cap can be bypassed. Corrections retain classified engagement/usage and fix the normalizer comment. Forced root checks and build pass; fresh complete round 2 precedes group closure. Ownership, remaining groups and W7 acceptance stay open.
Systematic group 2a, round 2 — 2026-10-04. Both complete reviews verify the successful observer correction but reproduce an inherited failed-tool observer High.
41a3ef9aretains real usage/engagement for invalid-argument and read-failure notifications, including EA7 abort, without broadening registry recovery. Eight new regressions fail before repair; forced root checks/build pass afterward. Fresh complete round 3 precedes closure. Ownership, other groups and whole W7 acceptance remain open.
Temporary section — delete it when both phases close. It owns ordering only. Every item's definition, size, file list and finding ids live in its phase file — phase-2.5.5 (176 work items, sub-streams A–I) and phase-2.6 (15 open workstreams) — and nothing below restates them. Items are cited as
<sub-stream> · <the bullet's bold lead-in> (<finding ids>), which greps directly against the phase file.Derived 2026-07-26 from a full pass over both phase files, their own sequencing sections, and the live tree. Where it departs from a phase file's own prose, see Departures.
The plan opened on a divergence neither phase file modelled: Phase 2.5.5's whole backlog is written against
f88b0e8, which existed only on development behind PR #76, so every file:line citation in it resolved
against a tree nobody was branching from. PR #76 and #77 are both merged — f88b0e8 is on origin/main,
origin/development and origin/main held identical trees with no open PRs as of 2026-07-26. Every
citation in this plan now resolves. (PR #79 and PR #80 have opened since.)
One consequence survives and is worth keeping until the phases close:
Branch from
origin/development, never from a localmain. A long-liveddevelopmentmerged intomainby merge commit leaves a stale localmainbehind after every PR, silently and without conflict. Rungit fetchand cut fromorigin/development.
Also settled while discharging this: main now carries branch protection (PR required, lint · typecheck · test required, force-push and deletion blocked) and a v* tag ruleset restricting tag creation to the
maintain/admin roles — closing the Phase-0 obligation that made ci.yml's own "REQUIRED status check"
comment untrue. release.yml asserts its ref is reachable from main before pack, so 2.5.5.H's G26
is closed ahead of Wave 0.
- Irreversibility — a defect whose damage a later fix cannot undo jumps every queue. That is Wave 1:
a credential already written into a durable
--json-visible row, a billed turn lost after the reply rendered, model-controlled ANSI inside the consent card, and the states where the cost cap is silently off. - File ownership — whoever edits a file next inherits everyone else's rebase. Every god-file decomposition and naming/convention ruling lands before the 2.6 workstream that piles onto it, and eleven items are pulled across the phase line because they edit the exact function another item restructures.
- Certification — a wave that discharges a phase obligation certifies it while the evidence is fresh, which is why 2.5.5's exit criteria 1–3 close in Wave 2 rather than at the end.
Waves are readable single-branch sequences. Concurrency is expressed as "these queues are file-disjoint, any order" — never as headcount.
flowchart TD
W0["Wave 0 — One true baseline<br/>baseline ✅ · CI truth · numbers"]
W1["Wave 1 — Stop the bleeding ✅<br/>3 CRITICALs · cost cap · ADR-0074"]
LEDGER["#W15-1 — realized-cost ledger ✅<br/>ADR-0076 + ADR-0077"]
P265["Phase 2.6.5 — Core reliability<br/>51 CR items · 8 P0 blockers behind ADR-0078–0084<br/>W0–W8 complete · W3 blocker closed in W8<br/>W4 merged — the hostile-MCP class, ADR-0088<br/>W5 merged — media correctness, ADR-0089+0090<br/>W6 merged — authoring correctness, ADR-0091–0094<br/>W7 merged — PR #90 · W8 merged — PR #92<br/>49/51 closed · approved deferrals retained"]
W2["Wave 2 — Shut the doors ✅<br/>PR #94 merged · fs jail · secrets · config trust<br/>2.5.5 EXIT 1–3 satisfied"]
W3["Wave 3 — Clear the ground<br/>god-file decomposition · CLI net"]
W4a["Wave 4a — The spine<br/>2.6.A/D/H/K + 2 ADRs"]
W4b["Wave 4b — Money floor & close-out<br/>2.5.5.B/C/F/H drain · v0.2.0"]
W5a["Wave 5a — Paint before you build<br/>render-v2 · theme · config"]
W5b["Wave 5b — Home becomes the product<br/>2.6.G/I/J · then i18n sweep"]
W6["Wave 6 — Hands, voice, lineage<br/>2.6.M/B/E + 2.6.N foundation"]
W7["Wave 7 — Orchestration & the gate<br/>2.6.O/P · go/no-go → Phase 3"]
W0 --> W1 --> LEDGER --> P265 --> W2 --> W3 --> W4a --> W5a --> W5b --> W6 --> W7
W3 --> W4b
W4b -.->|v0.2.0 release| W7
W4a -.->|file-disjoint lanes| W4b
Collapse the divergence, make the required gate execute the artifact it ships, and fix the review checklists before ~30 security-gated PRs are reviewed against them.
- ✅ Merge PR #76 (2.6.Q P1–P5, ADR-0071/0072, the three picker bugs, the param self-heal) — done
2026-07-26, along with #77 (this plan + the Phase-2.5.5 opening +
release.yml'sG26ancestry gate). - ✅ Reserve numbers — done, recorded here: migrations end at
0012and ADRs at0072(verified), so0013= ADR-0074 §4's conservative money columns (agent_sessions.total_conservative_microcents+session_costs.conservative_microcents) — the number was freed when D8 ruled against the approval-preview scrub and is RE-USED here rather than left as a hole ·0014= 2.5.5.C's enum CHECKs (#101) ·0015= 2.6.H ·0016= 2.6.G's pins ·0017= 2.6.N lineage; ADR-0075+ for the nine unwritten 2.6 ADRs (0073= the history.db migration lock,0074= durable conservative budget commitments — both landed in Wave 1). - ✅ One
ci.yml/turbo.json/tsup.config.tsPR — done 2026-07-29 (PR #80), all eight items: 2.5.5.H · the required gate never runs the compiled binary + undeclareddrizzleoutput (#294, #315) → localpnpm run civsci.ymldivergence (#312 — andpnpm ciis shadowed by a pnpm builtin, so the script was unreachable by the name everyone types) → the coverage-floor ruling and its implementation (#296, #152) → the(advisory)labels (#320) →THIRD_PARTY_EXTERNAL(G27, #248) → bundle-closure single-chunk assert (#314) →sync:models:check(#317). (release.yml's ancestry check,G26, landed in #77; its tag-protection half is configured.) The PR also closed the four blockers from the 2026-07-29 roadmap review, and its own CI caught two real defects in it — a TS4111 thatturbo run typecheckdoes not cover, andpnpm cibeing unreachable because pnpm reservescias a builtin. - ✅ 2.5.5.F · three skills' hardcoded foreign-project paths (#162) — done 2026-07-29. Filed as docs,
actually a functional bug: they pointed at
/Users/dev/…/Agent-Organizer/, soadd-package'smkdir -pwould have created a tree outside the repo. All three now anchor on$(git rev-parse --show-toplevel). - ✅ One markdown PR — done 2026-07-29:
packages/mcpadded to all five inventory sites (#128, #129, #153, #163, #254), the reviewer agent's secrets item extended to the shipped CLI floor (#164), the security-review skill's SSRF step now requires reusing the shared guard rather than re-deriving one (#167), and the i18n clause settled by the D5 ruling (#74, #260, #134). - ✅ The locale-bar amendment (D5,
en+tr) and the snapshot regen (D3) — done, propagated to all seven locale sites and merged as PR #79 (two price rises taken, nine retirements accepted).
✅ Wave 0 is COMPLETE (2026-07-29). The required gate now executes the binary it ships,
apps/cli/drizzle/**is a declared turbo output, andlint · typecheck · test+engine coverage floor (llm, mcp)are both required checks under branch protection. In phase terms this closes 8 of 2.5.5.H's 14 tasks and 3 of 2.5.5.F's 20. Wave 1 followed and is also complete (2026-07-30, PR #81) — see below; Wave 2 is next.
All three CRITICALs, plus the states where max_cost_microcents is silently not a cap. Four file-disjoint
lanes, any order between them, plus the money hole they left open.
✅ Wave 1 is COMPLETE — lanes (a)–(d) on 2026-07-30 (PR #81), lane (e) on 2026-08-09 (#W15-3).
Superseded 2026-08-09 — kept because the correction is the record. Lane (e) closed with
#W15-3:/cost --releasemakes §1's escape hatch reachable, and/costrenders the durability state. The retraction below was accurate when written and is no longer; it stays so the history of the false completion claim is not quietly erased.Retraction (2026-07-30). This section previously said Wave 1 was complete and ADR-0074 fully implemented. That was wrong on lane (e) and I am correcting it rather than leaving it: §1's release escape hatch is exposed on
GovernorWiringbut reachable from no command, REPL action or Home affordance, and/costnever rendersconservativeDurabilityBroken. §1 names this exact state as forbidden — "a single usage-less response would permanently shrink a long-lived chat's cap with no way out" — and this PR REMOVED the accidental escape a restart used to provide. A section whose compensating bound is unreachable is not implemented, and marking it done made four other documents inherit the error. Two independent reviews flagged it; both were right.Lane (e)'s remaining work, and two defects it exposed that ADR-0074 does not cover, are tracked in PR #81's closing list below. Every lane below is verified against the shipped code, not against its own task text — the check for each is stated inline. Two gaps are recorded rather than closed; both are named in their lane and marked in the source, and neither is a shipped defect:
- the engine-level composition test for ADR-0074 §3's abort-breakable media-job hold (
engine.ts, at the abort listener) — the governor's own state machine is mutation-verified, the composition with#countRunning's termination gate is not; - the CLI-layer test that
restoreConservativeCostis wired throughbuildSessionRuntime→GovernorWiring(session-host.test.ts) —AgentSession.resumecalling the hook IS mutation-verified inpackages/core; only the spread that supplies it is unproven.
-
✅ (a)
registry.ts— 2.5.5.A · redact tool-approval previews likesanitizeInput()already does (#91). (The originally-planned migration 0013 scrubbing already-persisted previews was ruled OUT — see D8.) Closed:previewFor()now scrubs the DISPLAY copy whilerawPreviewFor()keeps anunredactedPreviewfor in-process classification — splitting the two uses, because a whole-string scrub flipped the protected-path decision and a per-segment one reopened the leak. Verified:registry.tsandtools/types.tsboth carryunredactedPreview. -
✅ (b)
packages/dbchain, strict — 2.5.5.C ·SQLITE_BUSY_SNAPSHOT(#100) → async backoff replacing the blockingAtomics.wait(#226) → the chat-persister safety net (#228, CRITICAL) → serializerunMigrations(#99) co-landed with the unconditional 0600 self-heal (#28, #33) →createClienttyped error + PRAGMA docstring (#104, #105).deprecationDatecrash guard (G1) is a standalone one-liner, droppable anywhere. -
✅ (c) render/signals — 2.5.5.I · terminal-control sanitization to the four boundaries it never reached (G34, G44, #56, #57, CRITICAL — one PR at the shared helper, its own security review) →
SIGTSTP/SIGCONT+ onboarding signal-registration ordering (G0, #50). Closed at all four boundaries the register names, verified by call count:RunApp.tsx(#56) 9,final-summary.ts(#57) 6,render-error.ts(G34) 4,clack-prompter.ts(G44) 4. G0's run/gateSIGTSTP/SIGCONTisrender/run-job-control.ts; #50 is closed by ordering —drive-home.tsxsubscribes signals at:808, beforerunOnboardingWizardat:855. -
✅ (d) money, split across two PRs —
budget-governor.tsonly: 2.5.5.A · reservation ledger undermax_parallel(G38) → re-armedbudget:warning+ projectedthresholdPct(G39, G47, G49) → 2.6.Q's strict-cap half. Thenfallback-chain.ts/cost-tracker.tsonly: 2.5.5.B ·maxRetries: 0+ jitter +Retry-After(#276, #279) → narrowed#emitSuccesscatch +CostTrackerbounds (#194, #198) + 2.6.Q's realized-cost half. -
🔶 (e) ADR-0074 — durable conservative budget commitments (§2–§5 shipped; §1 INCOMPLETE) · the money hole the other four lanes leave open: a bounded estimate retained when a provider may already have billed but returned no trustworthy usage was kept only in memory, so a crash or a resume reopened a strict cap against money that may already be owed. §5 (a forward-compatible stored-event READ, the precondition for emitting anything new) → §2 (the
budget:estimate_committedcontract, the governor's durability barrier, the checkpoint fold and the resume restore) → §3 (freeze an async media job's accepted units + price) → §4 (the session's conservative aggregate + per-model attribution + migration + transactional persister write).
2.6.Q's cost-cap item is split: its task text spans both
budget-governor.tsandfallback-chain.ts's#emitSuccess— the same catch 2.5.5.B narrows. The two halves join two different PRs, not one. Closes M2.5.5-1.Outstanding inside lane (e) — restated at close, because §4 changed the facts. ADR-0074 §1 ties a commitment's release to the surface that renders it.
Rendering: done on all three surfaces. The run TUI and
relavium logsshipped with §2;/costshipped with §4's fold and reads estimated, possibly billed, with(no completed call)for a model that has one without a completed call. All three are mutation-verified.Release: reachable, as of
#W15-3(2026-08-09)./cost --releaseon the chat surface — the one that renders the amount, which is what §1 ties it to — clears the durable per-model and aggregate columns first and the live governor second, so a released commitment does not return on the nextchat-resume./costalso renders the durability state. This note previously said no affordance called it; that was true and no longer is.The reserved
budget:estimate_releasedevent stays reserved and unemitted, and that is a decision, not an omission: the session path restores its conservative total from COLUMNS rather than by replaying events, so zeroing them is what makes the release durable there. The event is needed only by a workflow-run release surface, which does not exist — a run is not long-lived, andon_exceed: pause_for_approval's per-node bypass or raising the YAML cap are §1's own analogy. §1's dated note in ADR-0074 carries the same statement.
Two independent adversarial reviews of PR #81 (2026-07-30) found that the cap's core safety claim does not yet hold across a process boundary.
Almost all of this belongs to PR #81 itself, not to a later wave — a first framing filed it as one, which
was wrong. The test is simple: this PR either ADDED the code a finding is in (background-failure.ts), or
claimed to have closed the area it sits in (the terminal-safety boundaries, ADR-0074 §1), or REMOVED a
protection without replacing it (§1's escape hatch, which a restart used to provide). Shipping a regression and
deferring its fix is not a schedule decision.
Only §A is genuinely separable. Both of its items need an append-only ADR before any code — one changes what "spent" means across a crash, the other supersedes a decision ADR-0074 §5 already recorded. Those earn their own PRs. Everything from §B down is #81's to close.
Ordered by whether the repo currently states something untrue, then by blast radius.
Every item names the check that would close it, not just the defect.
Status — 24 of 24 closed and MERGED, across two PRs. Everything marked ✅ below is fixed and break-verified with the mutation confirmed applied; the two PRs are recorded separately because the closure dates differ:
- 23 items merged to
mainvia PR #81 (2026-08-09).#W15-1, the last one, closed 2026-08-10 behind ADR-0076 + ADR-0077 (see §A) and merged tomainvia PR #82 (2026-08-11), together with the first Phase 2.6.5 batch.§E's six coverage gaps are all closed —
#W15-16's composition test fails by TIMING OUT when the abort listener is removed, which is the unkillable run reproduced exactly rather than an assertion standing in for it.
#W15-2closed 2026-08-09 as ADR-0075, amending ADR-0074 §5: a read that feeds a REPLAY refuses when any row was skipped, a read that feeds a DISPLAY stays tolerant. It landed first on purpose —#W15-1adds a new durable event type, and an older binary reading it falls straight into §5's skip path, so this decision governs how that event degrades.One gap this closing deliberately left open, named here rather than implied: ADR-0075's refusal is pinned at
gate.ts's own catch (where the blocker was) and attoUserFacing, but NOT throughdispatch.ts/specs.tsto the process exit. A re-wrappingtry/catchadded in either layer reproduces the same blocker and leaves both tests green. Closing it needs arun(argv, io)drive with a redirected HOME and a seeded on-diskhistory.db; no such harness exists forgateyet, and the marker sits at the test it concerns.
#W15-1is what remains, and its DECISION is now made: ADR-0076 (Accepted 2026-08-09) — an additive durable run event recording one settled provider attempt, emitted through ADR-0074 §2's barrier and folded into arun_costsrow at persist time. It landed after ADR-0075 on purpose: a new durable event type is exactly the input that decision governs.The implementation is staged, and starts here. In order, because each step is a precondition for the next:
packages/shared/src/run-event.ts—cost:attempt_settled's schema, its union arm, andparseStoredRunEvent. Until this lands nothing else compiles.docs/reference/contracts/sse-event-schema.md— the canonical shape + which of the two cost events is authoritative (ADR-0076's last Negative names that drift risk).packages/db/src/run-history-store.ts— theapplyDerivedarm writing therun_costsrow in the SAME transaction as its event. Thenode:completeddelta then telescopes to zero on its own; a test must pin thatSUM(run_costs) == runs.total_cost_microcentsstill holds, since that is the invariant carrying the no-double-count claim.- The attempt boundary and its barriers — corrected by ADR-0077. ADR-0076 §1 asked for an
awaitat the settle point; there is noawaitto be had there. The seam's observer isonAttempt?: (record) => void— synchronous, void — and BOTH money events are emitted from that one callback a few lines apart, whichbudget-governor.tsalready states outright ("which cannot await"). So the ledger takes ADR-0074 §2's shape: start the write at the settle instant on a chained in-flight promise, join it at three barriers — before the next egress admission, before tool dispatch (agent-turn.ts'sawait dispatchToolCalls(...), the barrier this adds beyond §2), and at the turn/node terminal. Every barrier awaits AND observes the failure, because#emitDurableis total for store faults and resolves.packages/core/src/engine/checkpoint.ts— corrected during implementation. The instruction here was "fold it as a SUM of deltas", borrowing ADR-0074 §2's reasoning, and the wrong half of that cost two rewrites. Summing into the realized total double-counts (a node terminal's snapshot already contains its attempts); summing into a separate accumulator and maxing the two families UNDER-counts (a media node writes a snapshot and emits no attempt row, so every attempt after the last boundary vanishes). What is correct is the fold already two arms above it:Math.maxover every durable ABSOLUTE total. §2's rejection ofMath.maxdoes not carry — it was rejected there only because a release can DECREASE a conservative total, and realized spend is monotonic.STATUS: all five steps are landed (
8d7ffcf…50c60bd), each with an Opus and a Sonnet round folded. The break-verify that matters most was step 4's ordering, and it now holds: with the tests draining to quiescence before asserting, deleting B2 reddens the tool-dispatch test and deleting B3 reddens the node- terminal test. B1 is masked by B2 on the current fixture (the second egress only comes after the tool), so it is covered by construction rather than by a red — named rather than implied.This is now the prerequisite of Phase 2.6.5, not a parallel track. Its five steps touch the same four files
CR-10(ordered append tail) andCR-12(effect journal) restructure, so it lands first — see the 2.6.5 section below.What ADR-0076 explicitly does NOT close, so it is not read as more than it is: the cost of a TOOL EFFECT. A resumed run can still re-execute an
http_requestPOST, arun_commandor an MCP mutation — the duplicate EFFECT is the harm, and no cost bookkeeping prevents it. That needs a durable effect journal with a prepare/receipt pair, which is a different decision about a different failure and earns its own ADR. It is the natural next one after this chain (forward-compatibility → conservative commitment → realized cost).Two decisions inside the closed set are worth surfacing here rather than leaving in a commit message.
#W15-4changed a previously-tested behaviour: #228 pinned that a session survives a failed durable write and the next turn is clean; it now stops instead, because continuing to spend above a transcript that has fallen behind is the defect. And#W15-23is scoped torun-history-storeonly — the otherpackages/dbstores share the same outer-db-inside-a-transaction convention, which remains open, is stated here rather than implied closed, and has its own PR queued after this one.
- ✅
#W15-1(blocker) — a workflow's REALIZED cost is not durable at the provider-attempt boundary. Closed 2026-08-10 by ADR-0076 + ADR-0077 and the five staged steps; the barrier is a chain-and-join, not the inline await ADR-0076 §1 first specified. See the staged plan below for what each step landed and the three carried-forward gaps.engine.tsfoldscost:updatedinto memory and streams it; the store documents that it is never persisted, and the checkpoint can only recover cost from a LATERnode:completed/gate snapshot. So: a paid call succeeds → the model asks for a tool → the process dies during the tool → the realized cost is gone and the resumed node re-runs the same paid call, against a cap that has forgotten the first one. ADR-0074 makes only the CONSERVATIVE commitment durable; a call that returned trustworthy usage has no equivalent barrier. Needs an ADR: an idempotent per-attempt durable ledger, written before the next tool side-effect, the next egress and the turn/node terminal. Not a local fix — it changes what "spent" means across a crash. - ✅
#W15-2(blocker) — a tolerant read is fail-OPEN on the resume path. ADR-0074 §5 drops an event whosetypean older binary does not know, andcheckpointer.tsbuilds resumable state from what remains. An older binary cannot know whether the dropped row was a node terminal, a job submission, a gate decision or a cost commitment — so it may re-run completed or already-submitted work. Preserving the sequence high-water mark prevents a UNIQUE collision; it does not restore lost state. Tolerance is right forlogs/status(read-only); it is wrong for a replay that changes the world. Needs a superseding ADR (§5 is append-only): fail closed on the resume path with "a newer Relavium is required" when any row was skipped, while read-only surfaces stay tolerant — or classify events as state-bearing vs not, and tolerate only the latter.
- ✅
#W15-3(blocker) — the release is exposed but unreachable, and nothing rendersdurabilityBroken.GovernorWiring.releaseConservativeCommitmentsandconservativeState()exist and are tested; no command, REPL action or Home affordance calls either. §1 requires the surface that RENDERS the amount to also expose clearing it, and this PR removed the accidental escape a restart used to provide. Closed by/cost --release:/costrenders the durability state, and the release clears the per-model AND aggregate columns before the live governor, so it surviveschat-resume. The durablebudget:estimate_releasednamed here was NOT needed — the session path restores from columns, not from an event replay — so it stays reserved; see the lane-(e) note above.
- ✅
#W15-4(blocker) — session persistence failures are invisible to the producer.RunEventBusisolates listener errors by design, so a persister that cannot write still lets the turn complete. Two consequences:persister.tsadvances the in-memory cost total BEFORE the DB write, so a failedrecordSessionCostleaves the durable total low and a resume restores a cap that has forgotten real spend; and a failedcommitTurnleaves the staged turn uncleared, so the nextbeginUserTurnoverwrites the previous user message and the durable transcript loses an exchange the in-memory session still has. Closes when: cost and transcript persistence move to an awaited durability port (UI subscribers may stay passive), and a persistent write failure puts the session in a durability-degraded state that refuses new egress rather than reporting success. - ✅
#W15-5(high) — stored payloads are not checked against the authoritative columns.readEventLogselectsseq/event_typealongside the payload but never compares them to the parsed event's ownrunId,sequenceNumberandtype. A row withseq = 2carryingsequenceNumber: 1is accepted, leaving the high-water mark wrong and the resume colliding on the next write. Closes when: every denormalized projection is compared after parse and any mismatch is aCorruptRunEventError. - ✅
#W15-6(high) — terminal cost snapshots on failed/cancelled runs are dropped by the read models.node:failed,run:failedandrun:cancelledall carry cost in the shared schema, but the store folds none of them, the checkpoint folds none, and the run TUI's summary ignores the terminal figure. A sibling's paid media cleanup after a root failure exists ONLY onrun:failed.cumulativeCostMicrocents, so replay and history lose it. Pre-dates this PR, but the PR touches all three files and claims cost safety. - ✅
#W15-7(medium) —media_job:submittedaccepts a half-frozen basis.unitsandacceptedCostMicrocentsare independently optional, so a row with a frozen cost and no frozen units resumes with the old reservation and a re-derived volume. The invariant is not "both or neither" (the approved-bypass case legitimately has units only) butacceptedCostMicrocentspresent ⇒unitsrequired.
- ✅
#W15-8(high) — the new failure-reporting paths can leak credentials.background-failure.tsprints an arbitrary rejection message and, underRELAVIUM_DEBUG, a raw stack;sanitize.tsstrips ANSI/control/bidi but performs no secret redaction. Same class in the session listener notice,render-error.ts's verbose stack andindex.ts's fatal debug stack. The rejection can be an MCP error, a provider response body or a tool result — all of which carry keys,Bearerheaders or credentialed URLs. Existing tests plant ANSI, never a secret. Closes when: the shared secret-shape redactor runs BEFORE terminal sanitization on every one of those paths (stacks included), with tests plantingsk-*,Bearer,Basic, credentialed URLs, query tokens and PEM. - ✅
#W15-9(high) — the stream path can throw out of a contract that says it never throws.#runStreamAttemptcalls#emitSuccessOUTSIDE its try/catch (thegenerate()path has it inside), so a provider returning non-integer usage makesassertAccountableUsagethrow raw out of the async generator — andstreamOneTurn'sfor awaithas no try/catch, so it crashes the turn unclassified, AFTER the content was produced and paid for. - ✅
#W15-10(high) —--jsonoutput is not sanitized.status --json/gate list --jsoncarry model-controlled text;JSON.stringifydoes not escape Unicode bidi overrides (CVE-2021-42574). The human render path is sanitized; the JSON branch is not.createJsonRendereris the same gap on the NDJSON path. - ✅
#W15-11(high) —createPlainRenderersanitizes AFTER splitting on newlines, so an embedded newline still forges a line. Every other boundary this PR touched sanitizes first;renderer.tsis the exception. - ✅
#W15-12(high) —isBlankPreviewtreats a fully-redacted preview as informative (chat-mode.ts), so a user pressing "always" onApprove write to [redacted]?auto-approves everywrite_file/run_command/http_requestfor the session, having been shown nothing. - ✅
#W15-13(medium) — the config reader chmods PROJECT configs to 0600.reassertOwnerOnlyruns on every layer, butconfig-spec.mdsays project files are committed and shared. Reading a config mutates repo file permissions, andstatSync/chmodSyncfollow symlinks. Self-heal belongs to the canonical global config only. - ✅
#W15-14(medium) — a providerRetry-Aftersleep is not abort-aware.fallback-chain.tspasses the delay straight to an injectedsleepwith no signal, and the real hosts use a plainsetTimeout. A cancel during a 60 s clamped wait hangs until the timer fires. The existing abort test resolvessleepimmediately, so the window is untested. The docblock also says an oversized value becomesundefined; the code clamps. - ✅
#W15-15(medium) — corruption is reported to a multi-run view as "no data".readPerRunOrDegradereturns only the fallback, sogate listcan print "No pending human gates." for a run whose gates were lost to corruption. It must return the degradation alongside the value, with a warning in human output and a machine-readable marker under--json.
All six are now CLOSED and their in-source markers removed. None had been a shipped defect — each had
mutation-verified coverage one layer down — but closing them surfaced one that was: onLegacyMediaJobHold
reached WorkflowEngine from a real gate.ts sentence and the constructor never read it, so ADR-0074 §3's
hold notice was dead and a relavium gate resume of a legacy parked media job stalled silently. Found by
the review of #W15-16, fixed with it, and now the signal that test drives.
- ✅
#W15-16— the engine-level composition test for §3's abort-breakable media-job hold; deleting the abort listener leaves the whole suite green. - ✅
#W15-17— the CLI-layer test thatrestoreConservativeCostis wired throughbuildSessionRuntime. - ✅
#W15-18— thecoalescebackfill ofsession_costs.model_catalog_id(needs amodel_catalogFK row the block does not seed). - ✅
#W15-19— that a chat turn's terminal is emitted only AFTERflushBudgetCommitmentsresolves. - ✅
#W15-20— the H3 approved-bypassacceptedCostMicrocentsomission; reverting it leaves the suite green. - ✅
#W15-21—agent-run.ts'sattachConservativeWriter; deleting it silently breaks every cappedagent run.
- ✅
#W15-22(low) — the PR's "no unsafeas" conformance claim is false. Two assertions in new production code:shared.ts'sreadRetryAftercasts an arbitraryheaders.get, andopenai.ts'smapOpenAiApiErrorcasts aheadersfield back onto a parameter type that lacks it. A structuralheaders?:plus runtime narrowing removes both. - ✅
#W15-23(medium) —persistEvent'sapplyDeriveduses the outerdb, not the transaction handle. Harmless underbetter-sqlite3, but it breaks ADR-0005's Postgres-portability promise on the highest-volume money write. - ✅
#W15-24(low) — canonical docs describe code that was not shipped.tool-registry.mdsays path redaction is per-segment (it is whole-string, and the same file says so correctly three paragraphs later);llm-provider-seam.mdstill claims model-discovery/media-poll keep a small SDK retry; ADR-0028's amendment note still says ADR-0074 §2–§5 have not landed. Each could send a future reader back toward a #91-class hole.
Three independent core reviews of the post-Wave-1 tree converged — independently — on the same seven blocking gaps: effect journal, stdio MCP consent-before-spawn, run lease, compaction trust elevation, stream grammar, input admission, event-log ordering. Three separate reviews landing on the same seven points is not opinion.
The full, self-contained work list is
phase-2.6.5-core-reliability-remediation.md — 51 items (CR-01…CR-98; CR-96 and CR-97 were opened 2026-09-14 from the W7 ADR reviews, CR-98 on 2026-09-18) with evidence, fix, acceptance criteria and a decision/ADR/gate register, written so the work
can be done from that document alone. An adversarial plan review on 2026-08-10 corrected the phase boundary,
the exit rule and the execution order, and added two items (CR-17 resume identity, CR-63 input_schema
docs-only); CR-64 came from the Batch 1 triage, CR-21b from ADR-0082 §10 and CR-21c from the W2
document review on 2026-08-25, which is why the total has moved since the list was first written.
**Historical phase checkpoint — 41 of 51 closed (updated 2026-09-18; at W6's merge it was 39 of 48 — see the register for why not 43: W5 was counted twice).
W0–W2merged clean;W3merged 2026-08-30 (PR #86) with one reproduced BLOCKER and nine verified findings open — see theW3residuals in deferred-tasks.md.W4MERGED 2026-09-01 (PR #87) behind ADR-0088: a systematic review of the branch found five merge blockers — an orphaned MCP child on a signal, an optional validatedfetch, a bypassable transport byte bound, discovery paging past its budget, and two cloud-metadata endpoints reachable through the local opt-in — all reproduced and fixed before it merged.W5MERGED 2026-09-02 (PR #88) behind ADR-0089 + ADR-0090: all six ofCR-50–CR-55closed, two of them for one half of a two-part obligation and saying so in their own headings. A systematic maintainer review of the branch returned six merge blockers — the async media-job result bypassing the first-resolution pin, a run-scoped re-host ceiling that reset on resume, a capability gate keyed on the model id alone (breaking custombase_url), a negative DB media rate buying strict-cap headroom, a load-bearing migration backfill with no upgrade test, and a drifted canonical AgentRunner spec — all reproduced and fixed before it merged.
W6— authoring correctness — MERGED 2026-09-04 (PR #89) —CR-60–CR-64behind ADR-0091–ADR-0094, 32 commits — 27 of work over seven internal review rounds, then five folding four maintainer rounds on PR #89:firstmeans first DECLARED and the plan stops claiming otherwise; a tool grant is refused when the plan is built rather than mid-run; an expression sees only its transitive closure and a literal out-of-closure read is refused at parse; anoutput_schemais compiled at parse in an allowlist-strict mode and enforced at run time — with no new dependency, because the compiler the deferral said we needed already existed one package away.What the wave is actually worth recording for is that most of what the review rounds found were defects in the FIXES, not in the code they repaired. The branch-order search was wrong three times in three rounds, each time in the mirror of the previous error. The expression scan's central soundness claim — that it never produces a false refusal, which is the entire justification for a regex over a parser — was asserted in three documents and false in EIGHT distinct ways — the eighth, a Unicode identifier escape, found after the wave was declared complete. One stand-down gate, added to prevent a false refusal, silently removed the whole check it was protecting. Every one is a dated correction inside its own ADR rather than a quiet rewrite, because the shape of the error is the reusable part.
The maintainer review then found two merge blockers, and both broke a headline claim of the wave. Deep validation did not enforce
requiredwhen the property's schema constrained nothing —{ properties: { status: {} }, required: ['status'] }accepted{}, because an unconstrained property compiles toz.unknown(), which is optional inside az.object, and presence was checked only for names ABSENT fromproperties. And the expression scanner's regex was quadratic and synchronous: 514 ms at 32 K of whitespace, on a parser that accepts 2 MiB, with plan build synchronous so no deadline or cancel could interrupt it. Both reproduced and fixed before the merge, with eight further High findings — among them a crash on{ type: 'string', format: 'email', maxLength: 254 }, which is the exact shape the new canonical subset document tells authors to write, caused by anas unknown ascast that CLAUDE.md rule 1 forbids precisely because it turns a type error into a runtime one.Eleven residuals are recorded in deferred-tasks.md — ten under the four
W6residual headings plus ADR-0091's zero-branch-merge question, filed with the fan-in items. Two await a maintainer ruling.The
W4-waits-for-the-W3-blocker gate was lifted deliberately on 2026-09-01, by the maintainer, and it is recorded here rather than left to be inferred from the commit order. The reasoning: the blocker is aBoundedEventStreamdrop on a stream nobody iterates, its fix is ADR-0087 §1 — a decision that was still Proposed and unapproved — andW4touches a disjoint surface (the MCP boundary). Blocking a whole wave on an unapproved ADR would have stalled the phase rather than protected it. The blocker stays open and stays first in theW3residuals; nothing here closes it or reduces its severity. Updated 2026-09-04: ADR-0087 is now Accepted, with nine dated corrections written into it after a review refused acceptance. That removes the "unapproved ADR" half of this gate — §1 is now a settled decision — but §1 remains unimplemented and the blocker is unchanged. Its Correction 1 records what §1 must settle before it can be built: the two factories §1 names are not symmetric — a host callscreateSessionHandledirectly, but aRunHandleis only ever produced insideWorkflowEngine.start()/resumeFromCheckpoint(), so the run half needs the mode plumbed onto an engine entry point before it can be passed at all. Asubscribe-onlyhandle must also not present a silently-empty iterable.
Batch 1, merged 2026-08-11 (PR #82) — the prerequisite (
#W15-1), the oracle (CR-90,CR-91) and all ofW0(CR-01–CR-03).CR-64was added in the same batch and shipped 2026-09-02 withW6.Batch 2, merged 2026-08-24 (PR #83) — all of
W1: the eight P0 blockers plusCR-92, behind ADR-0078…ADR-0084. A comprehensive review of the assembled PR found seven further defects, six of them in the W1 code itself; all seven were fixed and mutation-verified before merge.Batch 3, merged 2026-08-28 (PR #85) —
W2, liveness and deadlines, behind ADR-0085. All six items closed; the wave's own closing register is in the phase document. The assembled PR drew a Request changes verdict with fourteen findings, five of them blockers, plus a later round of eight; all were verified against the code before being acted on, and the register records which were fixed and which were declined with the reason. The five blockers had one root cause — an ownership decision taken at a point in time, guarding work that spans an await. Its document review moved the count twice, and the two moves cancel:CR-21turns out to have shipped withCR-14in PR #83 (ADR-0082 decides both, and the execution graph above already scheduled them together) and only its heading was stale, whileCR-21c— an unbounded individualpollMediaJobcall — was found during the same review and added.W2was therefore still five open items out of six, not four; the phase total moved 47 → 48, not the wave. All five then closed on 2026-08-27 —CR-22,CR-21b,CR-21c, and finallyCR-20andCR-23together, which ADR-0085 decides as one because they are one mechanism at one place.Not to be confused with the 2.5.5 remediation's own
W2("Shut the doors", in the graph above). Same label, different phase: this one is 2.6.5's liveness wave.Per-item history, the seven post-review findings and the carried-forward gaps live in the phase document.
Pre-
W7close-out, 2026-09-06. (Superseded in part on 2026-09-14:CR-96andCR-97reopened exit criterion 1, the count is 41 of 51, andCR-94is decided and scheduled intoW7— see the next block.) The last two non-deferrable items closed, so exit criterion 1 is met and the phase count is 41 of 48 (40 ✅ headings plusCR-95's short-term half; the arithmetic is shown because it has been wrong twice here).CR-73:invoke_agentwas advertised to every model granted it while its delegate is wired nowhere in the tree, so the advertise-filter now reads a tool's declaredrequiresDelegateand not only itsToolHostarm —read_mediais dropped for the same reason, which isCR-50's own argument for leaving it unwired.CR-80: a rejected custombase_urlwas caught and the DEFAULT adapter left standing, which is the official API; it now installs a refusing adapter that names the URL's shape and never its credentials. Criteria 5 and 7 also closed: the three missing security sittings (prompt/trust provenance, hostile MCP, provider/config trust) and theW5andW6closing registers are written, each stating that it was written after its wave merged rather than with it. Criterion 6 passes on both halves, read from the exit code —pnpm run ci | tailreportstail's status and produced one false green in this session. Still open: criterion 2 (CR-94has no deferral record, and that is a maintainer's call) and criterion 4 (theW3live blocker keeps the gap-free stream promise wider than the code). (Criteria 2 and 4 have both moved on:CR-94was decided 2026-09-13 and its remainder now has a deferral record, and ADR-0087 §1 — criterion 4's blocker — is scheduled intoW8. Criterion 5, called closed above, REOPENED on 2026-09-18 with a fifth sitting,history.dbat rest.)
W7decisions made and accepted, 2026-09-14.What was decided. The maintainer settled
CR-70–CR-72andCR-94on 2026-09-12 and 2026-09-13. Four ADRs were accepted on 2026-09-14, with their implementation staged inW7:
- ADR-0095 decides that tool history is persisted as structure, never content; that carrying it into the model's context is deferred; and that
memoryis implemented.memorystays inert untilW7lands.- ADR-0096 decides that a request is measured before it is sent, that a context overflow is classified and recovered only before any tool runs, and that input is priced. Until
W7lands, the estimate still prices output only.- ADR-0097 decides that a budget approval is a dispatch-owned allowance, shown before it is granted. Until
W7lands, an approved step still runs uncapped.- ADR-0098 decides that a session's effect row holds no result and never replays.
What the reviews found. The first six review rounds shaped the ADRs; a seventh, on 2026-09-18, reviewed them against the tree before any code (see the block below). The six surfaced two shipping defects, now register items
CR-96andCR-97. Both meet the phase's non-deferrable definition, so exit criterion 1 is open again, and the count is 41 of 51.What
W7now covers:CR-71,CR-72,CR-98(ADR-0096's prerequisites, opened as an item 2026-09-18),CR-94,CR-96andCR-97, plusrelavium budget resume, which moves here from 2.6.K because ADR-0097's shown-amount guarantee otherwise has no non-TTY surface. Five canonical claims that were already false are narrowed ahead of the code:
- the session spec's tool history and export
toolsunion;memory's default;- the uncapped approved budget step;
- the SSE schema's "user/assistant/tool messages are persisted" sentence (2026-09-18);
- the chat reference's "full transcript" in the export (2026-09-18).
(This
W7is Phase 2.6.5's seventh wave. It is not the remediation's "Wave 7 — Orchestration & the gate" in the graph at the top of this file, exactly asW2is not Wave 2.)
W7document review, 2026-09-18 — before any code. Eight dimensions reviewed the four ADRs, the register, the deferrals and every canonical document they touch against the tree; each finding was verified by an independent adversarial pass. 113 findings held, and the maintainer settled seventeen decisions the same day. Every ADR carries a dated note; the register carries a per-document landing checklist. Three document defects mattered most, and all three would have been discovered mid-implementation:
- ADR-0098's join does not exist. It says the effect journal already records the tool-call id; every session surface writes a wiring constant instead, so
W7must thread an engine-assigned id through the dispatch port.- ADR-0098's monotonic turn key could not be derived from the journal, because the sweep deletes the rows the high-water mark would be read from. It becomes a durable column on the session row.
- ADR-0096 §1's per-part floor would have charged an inline image megabytes of tokens, contradicting the per-modality media ceiling in the same section.
Two of the seventeen decisions change what ships beyond those ADRs:
history.dbopens withPRAGMA secure_delete = ON, so "no tool result at rest" is true of the file's bytes and not only of the row; and a pre-content HTTP 4xx now releases its admission instead of committing an input-sized estimate, which keeps a rate-limit burst from exhausting a session's cap once input is priced. ADR-0087 §1 — theW3live blocker that belonged to no wave — is scheduled intoW8.
This is the corrected execution order, and it is what the graph above shows:
#W15-1first. Its five staged steps touchrun-event.ts,engine.ts,checkpoint.tsandrun-history-store.ts— the same four filesCR-10andCR-12restructure. Landing it after the durability spine means writing its barrier against a persistence path that is about to change.- Then Phase 2.6.5, closing before Wave 2 opens. Which is only true if the work Wave 2 would block on
lives there — so the hostile-MCP threat class moves into 2.6.5:
CR-16(consent before a stdio spawn) plusCR-40–CR-42(transport cancellation, DNS/redirect SSRF, ingress bounds). Wave 2's queue item 2 is executed as 2.6.5'sW4; the 2.5.5 finding ids keep their home in the 2.5.5 phase doc and certify from there. Wave 2 keeps the MCP name-collision/tool-poisoning trust items, the fs jail, the secrets layer, persistence-security and the certification. - Within 2.6.5, the oracle comes before the spine.
CR-90/CR-91(crash + durable-truth harness) land first because they are the instrumentCR-10 → CR-11 → CR-92 → CR-12is proven with;CR-92moved out of the harness group into the spine, since an API returningcompletedwhile history saysfailedis a runtime defect, not a test concern.
Two rules that changed with the plan review:
- Nineteen items are non-deferrable — every W0/W1 item plus
CR-50,CR-55,CR-73,CR-80,CR-92,CR-95's short-term fix, and (added 2026-09-14)CR-96andCR-97. Each has a cheap fail-closed option (refuse, remove, narrow the claim), so "too big to fix now" argues for the cheap option, never for deferral. The previous exit criterion permitted deferring all 43 items and declaring the phase complete. - The gate is
pnpm run ciANDpnpm coverage.coverageis a separate required CI check and is not inside theciscript; this phase editspackages/coreheavily, and the CI coverage job does not block oncore.
CR-01–CR-03 were half-closed by Wave 1 and finished right after the oracle — all three are closed as of
2026-08-11 (PR #82). CR-03 was a propagation gap from #W15-10's own fix: the finding named three --json
paths that never got the safe serializer, and closing it found five, which is why the call-site half is now
an ESLint selector rather than a list.
Complete on main, 2026-10-15, merged as PR #94 (ab08209e). The merge checkpoint joins all forty queue IDs, the exit/D sign-off and final correction evidence. Hostile-MCP work is reused from W4/PR #87; the remaining filesystem, secrets/config, persistence and media work is complete within its recorded limits. The queue below preserves scope and traceability.
- ✅ Completed in W4/PR #87: 2.5.5.D · project-layer MCP name collision redirecting a global secret (G19) and MCP tool-definition poisoning (#202); see the W4 closing register.
- MCP queue, strict — EXECUTED AS PHASE 2.6.5
W4, and COMPLETE there (2026-09-01, ADR-0088). The queue below landed in five steps, plus#202andG19from step 1 of this wave and the MCP half of#21from 2.5.5.E — all the same threat class and the same security sitting, so splitting them would have booked the reviewer twice. Certify the 2.5.5 ids from theW4closing register in phases/phase-2.6.5-core-reliability-remediation.md. The original queue, for the record: Connect-phase timeouts on every transport (#35, G32, #205) → transport/discovery/result size bounds against a hostile server (G33, #201, #209, #288) → structuredserverId/reasondiscriminants (#203, #204) → the two fail-loud violations (#206, #207) → per-file transport-adapter tests (#297) →CLIENT_INFO.version(#208). These finding ids keep their home in phases/phase-2.5.5-hardening-and-remediation.md and certify from there in step 6 below; the work happens in 2.6.5 alongsideCR-16(consent before a stdio spawn) andCR-41(the DNS/redirect SSRF hole), because they are the same code and the same security sitting. Splitting them across two phases would book the hostile-MCP reviewer twice. - ✅ The fs jail, ONE reviewed change set — complete on
main, PR #94 — 2.5.5.D · sensitive-credential floor for.kube/.azure/gcloud (#36, #39) → extractdeepestExistingRealtopackages/shared(#235) → 2.6.M'sproject-tierextraRootsand 2.6.N's fs-floor home-anchoring, both pulled forward.~/.relavium/tmp/(G21) is resolved under the same general predicate (decision D12) — otherwisefs.tstakes two security reviews. - ✅
discoverCatalogrealpath containment (#1, accepted in Step 2); the secrets-layer test pair — OS-keychain bridge (#27) andreadSecretFromStdin+ stdin cap (#31, #293); secret-typedrun --inputrejection (#25); the unredacted workflow-snapshot doc + lint (#30); 2.5.5.B ·scrubSecretsparam-name broadening (#196). - ✅ Persistence-security: 2.5.5.C ·
assertRelativePath's Windows drive-relative form (#113), media-store hardening (#111, #108, #112), mediamimeTypeverification (#107, #109, #110), and certification of W7's structural session/tool-content controls (#115, Wave D15). 2.5.5.A · chat-export continuity/slug completion and existing tool-content exclusion (#80, #81, #83, D14), plusanalyzeSecretTaint's context sites (G22). 2.5.5.D · the dormantdefault_headersadmission/custody gate (G20, D13). - ✅ Phase 2.5.5 exit criteria 1, 2 and 3 and sub-stream D acceptance are satisfied on
mainby PR #94. The D half of M2.5.5-2 is complete; the I half remains open.
Book four security-review sittings by threat class (fs/path-jail · secrets-at-rest · secrets-input · config-trust), not ~30 per-PR passes. The hostile-MCP sitting moved to Phase 2.6.5 with the queue-2 work; it covers
CR-16andCR-40–CR-42there. Reviewer availability, not code, is this wave's critical path.
Implementation in progress — 2026-10-18. ADR-0110–0113, their linked
contracts and the nineteen-increment plan were approved on 2026-10-16.
Steps 1–8 are independently accepted
on development, with whole Step 8 reviewed at c83c8575. The phase register
owns each increment's source, tests, cumulative review rounds, security sittings
and platform/publication evidence, including historical NONCLEAN R1–R24 records.
This live page links that history instead of repeating its superseded pending states.
The maintainer authorized the initial completed-Steps-1–8 publication checkpoint,
PR #95. The
previous corrective review completion
remains attributed to ba14b1bd; it does not certify later changes. The second
maintainer systematic report reviews a5a5d45e and opens further corrections.
The second correction register
is canonical for that work. The
second corrective source-review completion
accepts corrections at ec0f3e10 after two NEW complete cumulative clean rounds
and a NEW separate clean security sitting. Current source-bound PR/push CI,
coverage, SonarCloud, same-archive consumers and physical control artifacts remain
required publication criteria; PR #95 owns their live result. Source review does
not imply merge or whole-wave acceptance. The later
native Windows admission preparation
retains the failed advisory attempt and separate test-preparation review scope;
production runtime is unchanged. The later supplemental fixture acceptance
records both owned-preparation and native-concurrency review scopes, including
both failed Windows attempts. PR #95 owns final pushed-head publication results.
Steps 9–19 have NOT STARTED and whole-wave acceptance remains Step 19. Check PR #95 before later implementation commits,
which extend its review scope. No new decision, credential, billing or provider
capture gate is introduced.
Decompose, guard and normalize every hot file a 2.6 workstream is about to land on. The multi-file queue is Step 1 and runs first. The approved nineteen-increment execution plan owns the full order and review gates: finish each increment and its fresh reviews before advancing; no parallel edits of shared hot files.
The groups below retain the original scope inventory and within-file dependency arrows, not independent scheduling permission or current completion claims. The source-corrected preflight dispositions own whether/how each original finding needs implementation or preservation.
Two orderings here are not this plan's invention — they are the intra-phase serializations
2.5.5 records under Positioning: E before I
on home-controller.ts/chat-ink.tsx (the decomposition moves already-guarded code), and C before E on
packages/db/src/client.ts (C types the error path in Wave 1; E's openLocalDb rewrite lands last, here).
- ✅ Multi-file Step 1 accepted — 2026-10-16 (evidence) — 2.5.5.E ·
closeQuietly()to its four siblings (#22) →displayPathdiscipline toresolve.ts/catalog.ts/chat-export.ts(#4, G11) →const exhaustive: neveracross the six sites (#300, #301, G3, which also makesrelavium runrenderagent:reasoning). chat.ts(strict) — 2.5.5.G · the four money/token reimplementations (#236, #237, #242, #307) →swapAgentModel→reseatAgentModel(#218) → 2.5.5.E · SIGINT actually callingsession.abort()(#21, #23) →budgetWarningText→ 2.5.5.I · decomposechat.ts(#220, #244). Then 2.6.M'sallowedDomainschat gap (G30), pulled forward intosession-host.ts.home-controller.ts(strict) — 2.5.5.E ·selectGatePromptertest (G37) → the swallowed palette rejection (#281) → 2.5.5.I · decomposecreateHomeController+ the overlay discriminated union (#215, #243) → 2.5.5.G · theCapability/Portvocabulary split (#217, #222). Settle #125/D26 before decomposition: the approved preflight certifies the planned scope of the real in-Home-chat cost path and retaining chat-only scope. If a new bare-Home cost surface is selected, wire its explicit session target before decomposition.chat-ink.tsx— 1,906 lines at preflight (the original queue recorded 1,795), decomposed by neither phase doc. Recommendation: decline a new decomposition (decision D18); take only the exhaustiveness guard and the min-terminal-size guard (#63), and hand restructuring to 2.6.M's render-v2 in Wave 5a.- Viewport (strict) — 2.5.5.I · share the ADR-0069 grapheme segmenter (#58, #62, G40, G51) → 2.5.5.G · tab expansion before width measurement (#65) → per-cluster width cache + resize debounce (#64, #66), refined to frame coalescing in the proposed plan. Alt-screen word-wrap (#61) retains the approved Wave 5a ownership; it is not an unapproved Wave 3 prerequisite.
packages/shared(strict) — the.coderuling (G50, D10) →findDuplicates/superRefineimplementation or preservation at the schema dispositions (#89, #90, G16, G17, G18, #210, #211, #212) →BaseEventSchemadisposition (#213) → theRelaviumErrorbase class (#219). The ruling must precede the base class, or it is baked in permanently.registry.ts/builtins.ts/engine.ts— declared-source context repair and honest unsupported-mapping disposition (#92/Accepted ADR-0113) →ctx.fsScope(#93) →ok/success(#216, #221) → identifier-sortlocaleComparepinning (#258, #259) → thegit_commitdenial copy (#308); then the four schema length caps (#95), thellmVisibleParamsrewrite (#96, #98), stale doc comments (#78, #97, #214); then#armRunTimeout(#75),#dispatchdead branch (#79),AbortSignalintoresolvePrompt+ the human-gate recheck (#76, G9).- Process/CLI boundary (strict head) — the revised plan serializes pure flag/descriptor/owner substrate → lazy guarded runtime graph → native crash integration → map/archive custody → command behaviour. It covers 2.5.5.E · the five crash/signal net gaps (#40, #41, #42, #224,
#269), the
--help/--versionhistorical ~400 ms tax (#43, #44, #271), and the flag-system ruling (#45, #264, #265, #268), the exit-code and--help --jsonrulings (G35, #13), durable-only logs preservation (G15 refuted), the--inputnamespace ruling (#18, #310).openLocalDbwrap-and-redact (#278, #280) lands LAST — it touches 8+ call sites the other queues are still moving. - The numbered plan assigns the remaining 2.5.5.A/E/G/I tails and keeps the central DB refactor last before whole-wave acceptance. Step 19 owns sub-stream A, E and G sign-offs, the reconciled EXIT:4 reading (D22), and M2.5.5-3 closure. Full I acceptance remains in Wave 5a.
The four Day-1-independent 2.6 workstreams everything downstream sits on — and nothing else.
- ADR-0058 and ADR-0060 flipped Proposed → Accepted (0060 with its mandatory security review); ADR row 6 drafted when 2.6.H starts, not when 2.6.G starts as the doc says — H must land before G.
- 2.6.A ·
nodeCatalogIssuenever resolves the agent's own model (#88) — ungated pre-existing bug, first. - 2.6.K — the shared resume core (security review) → the gate-decision/
gateTypecross-check (#0) → 2.6.G'sengine.reconcile()wiring (#229), pulled forward to where its only dependency resolves → secret re-provide (mandatory security review — it relaxes a fail-closed guarantee) →gate-timeout re-arm(closed early in 2.6.5CR-22) → therun:pausedpark distinction. - 2.6.H — the
applyDerivedexhaustiveness guard (#114) co-landed with resilient per-row parse (#277, #282) → step attribution → exact per-node cost + failed/cancelled totals (#118, #232) → batchedloadRunEvents(G12, #273) → the bounded tool trace → gate uniqueness → idempotency. Its chat-persister atomicity sub-part is STRUCK — already owned by Wave 1 (#228). Then 2.5.5.C · per-row isolation (#117) as pure propagation of H's skip-and-report ruling. - 2.6.A (package extraction,
validateAuthoredWorkflowback-port, the run-path tool pre-flight #37/G29, direct unit tests #6) and 2.6.D. 2.6.A'smax_tokenspre-flight moves to Wave 4b — it has a hard dependency on 2.6.Q'slimit.output. Closes M2.6-2. (M2.6-3 also needs 2.6.B, which lands in Wave 6.)
A lane genuinely file-disjoint from the spine. Drain Phase 2.5.5 to its acceptance paragraphs, harden the adapter/catalog money floor, cut the release 2.6.Q P6 is gated on.
- Lane 1 (
packages/llm) — wire the live-nightly conformance lane before 2.5.5.B's seven-gap adapter-parity sweep (#168, #170, #173, #174, #175, #186, #192), which is where those gaps came from → 2.6.Q's capability matrix + clamp, landing on the parity floor → 2.6.A'smax_tokenspre-flight → the four money-guard blind spots (G6, #177, #178, #181) → Anthropic prompt caching (#172) → the rest of 2.5.5.B.CATALOG_SHA256(G6) strictly after Wave 0's snapshot regen. The Sora 2 shutdown (2026-09-24) is a hard external date — pull it out of wave order if the calendar demands. - Lane 2 (
packages/db, CI, docs) — 2.5.5.C's remaining 12 bullets (retention after decision D33; session-resume liveness #227; pagination #272; enum CHECKs #101; DDL coverage #102/#103; the seeded-then-migrated harness #291; …) · 2.5.5.H's remainder (engine-deps allowlist #313/#318/#285; the docs-style checker #316; the logging-standard ruling #266/#267/#270;fast-checkpilot #299) · 2.5.5.F's 20-site not-yet-built hedge sweep (#122 …) rebased onto Wave 0's edits, not reverting them. - Sub-stream B, C and H acceptance sign-offs, then cut and publish v0.2.0. Closes M2.5.5-4.
Restructure the render layer and settle the theme/config substrate once, before ~24 new screens and a
an en+tr string catalog land on it.
- ADR row 10 (i18n + theming) is this wave's first gate — ahead of rows 7 and 8. 2.6.L's palette work is a render-layer freeze and must not open against an undecided contract.
- 2.6.M's render-v2 leads, before 2.6.L's palette sweep — including the pull-in row approval-consent-line
zero-width hardening · shared
[c]reducer, which no 2.6.M task bullet currently covers and would otherwise be silently dropped. Its security review reverses the 2.5 never-render-args posture and cites Wave 1's sanitization and redaction work as its own technical preconditions. - 2.6.L theme system → one ADR-0063 amendment covering both 2.6.I's structured
[[mcp_servers]]writes and 2.6.L's preference keys → themodels_in_useruling (owned by I, consumed by L) →/settings→ the ADR-0072/settings→/modelsvisibility toggle → 2.5.5.I's picker truncation indicator (#60). - Sub-stream I acceptance sign-off — completes M2.5.5-2.
Exit criterion 2: no routine task requires a shell subcommand.
- ADR rows 7 and 8 drafted and Accepted; confirm rows 4, 5 and 15 are already discharged by ADR-0067/0068/0069 and ADR-0071/0072 and close them in the table.
- 2.6.G end to end — tab bar → the three browsers → run detail → node detail. Its config-writing permissions step lands last in G, behind a security review.
- 2.6.I and 2.6.J. I's durable tool-list cache must not precede Wave 2's tool-definition fix,
or a poisoned description becomes persistent. 2.6.M's
web_searchfollows I's search-provider config surface. - 2.6.L's locale catalog lands LAST, after the ~24 new screens exist — landing it earlier makes its own acceptance uncertifiable at its landing point and guarantees a second sweep. Closes M2.6-4.
Phase-2.6 go/no-go criteria 3 and 4, plus the child-session foundation — so the riskiest wave does not also carry its lineage work.
- ADR row 9 (toolbelt + tool-render/approval-preview contract +
ask_user's mid-turn engine pause) with its mandatory security review → 2.6.M end to end. Settle thecurl/wgetdefault-grant question (D49) before the default grant is finalized. - 2.6.B — the
AgentParseErrordesign ruling first (its self-correct loop depends on those diagnostics being visible), then the wizard/authoring loop, the import consent gate, the/exporthint. - 2.6.E — its cheat sheet lands last in E, enumerating every command and keybinding the phase added.
/rewind-vs-child-sessions moves to Wave 7 (it gates on 2.6.N). - ADR row 12 (child-session foundation) → 2.6.N's foundation: lineage, standardized I/O, the injected artifact-store port, catalog spawn, the depth-3/concurrency-5 guardrails.
- Certify Phase-2.6 go/no-go criteria 3 and 4 here, not in Wave 7 —
invoke_agentgates only on 2.6.N, which lands here.
Ship the riskiest surface last, on a fully reviewed codebase.
- One pass over
packages/shared/src/run-event.tssettling 2.6.N'schildRunIdand 2.6.P's nested-run namespace together — recommend an additiveparentRunIddiscriminator over a new namespace that would change every existing--jsonconsumer's shape. - 2.6.N's remainder → ADR row 14 → 2.6.P (
subworkflow+schema_version1.1; dynamicinvoke_workflowformally deferred past the phase) → ADR row 13 + its dedicated generation security review as a hard ship-gate → 2.6.O. - 2.6.Q P6 after v0.2.0 has been on
mainthrough one release. - The
deferred-tasks.md+ traceability recording pass for every re-deferral and decline this plan makes — it is the only thing that makes 2.5.5 exit criterion 5 certifiable — then 2.5.5's last docs items and the sub-stream F sign-off. - Certify 2.5.5 exit criteria 4–8, and Phase-2.6 go/no-go criteria 1, 2, 5, 6, 7 and 8. Criteria 3 and 4 were certified in Wave 6 and are only re-verified here as a release prerequisite, not certified again — each go/no-go criterion has exactly one certifying wave. Closes M2.5.5-5, M2.6-5, M2.6-6, M2.6-7 → Phase 3 may open.
Roughly 60 open decisions sit across both phases: the ~14 that 2.5.5 flags blocked inline (Dependencies), the nine unwritten 2.6 ADRs (Required ADRs), and a long tail that is decision-shaped without being labelled. The table below is only the subset that stalls a wave if unanswered; the remainder sit inline in their own phase-file bullet.
| # | Wave | Decision | Recommendation |
|---|---|---|---|
| D1 | 0 | Mark the ci job a required check (open since Phase 0) |
Yes — every CI item here is advisory until it flips |
| D2 | 0 | Coverage floor: promote to required, or soften testing.md? |
Promote, and implement in the same PR — a checked-in run already shows 92–97% margin |
| D3 | 0 | Accept the upstream price changes the ADR-0071 §9 guard is refusing? | ✅ Ruled + executed 2026-07-26: take current prices. Verified: gemini-flash-latest moved $0.30→$1.50 in / $2.50→$9.00 out (the shipped floor under-priced by 5×) and gemini-flash-lite-latest $0.10→$0.25 / $0.40→$1.50. The nine upstream retirements were accepted in the same ruling; snapshot regenerated and merged in PR #79. Nothing outstanding |
| D4 | 0 | Confirm the number reservation (0013–0017, ADR-0073+) |
As listed — one item per number, in landing order |
| D5 | 0 | The binding locale bar | ✅ Ruled + propagated 2026-07-26: ship en + tr, catalog architected for n locales, es/fr/de staged. Amended at all seven sites |
| D7 | 0 | Publish v0.1.1 as-is, or supersede with v0.2.0? | v0.2.0 — ADR-0067's Node >=22 bump is breaking for 0.x |
| D8 | 1 | Do already-persisted approval previews need a scrub? | ✅ Ruled 2026-07-30: NO scrub migration. The recommendation had been "yes, migration 0013, same PR"; the ruling went the other way, so 0013 was left free by this ruling and is now taken by ADR-0074 §4's conservative money columns; the reservation ledger above shifts nothing — 0014 (#101) keeps its number. The forward fix shipped (#91: previewFor scrubs the display copy, unredactedPreview carries the in-process classification copy), so no NEW row can carry an unscrubbed preview; historical rows in a local history.db keep theirs. Recorded here because the shipped state contradicted this table for four days |
| D10 | 1 | BudgetExceededError/BudgetPauseError: adopt .code? |
✅ Ruled + executed 2026-07-30: adopt. Both carry a stable code (budget_exceeded / budget_paused), with exported isBudgetExceededError / isBudgetPauseError guards — because instanceof is unsafe from a surface (the CLI bundles the engine, so two realizations of a class coexist and instanceof answers false at the boundary that must catch it). Same shape as isCorruptRunEventError. Precedes Wave 3's RelaviumError migration as required |
| D12 | 2 | ~/.relavium/tmp/: tmp-specific rule or the general home-anchored predicate? |
General predicate accepted in ADR-0105, with invocation authority and removal of unused tmp provisioning; approved 2026-10-12; implementation accepted in Step 2. Full child/scratch lifecycle remains with Phase 2.6.N. |
| D13 | 2 | default_headers: keychain-ref indirection vs shape check? |
ADR-0108 accepts keychain custody plus an interim nonempty-map refusal. Live header activation remains outside this phase and prohibited pending its custody/migration prerequisites; approved 2026-10-12; interim gate accepted in Step 7. |
| D14 | 2 | chat-export tool_result: warn vs redact vs full discipline? |
Reconciled 2026-10-12: Accepted ADR-0095 requires content-free structure, superseding the old raw-result opt-in recommendation. No --include-tool-results. Continuity/slug residuals and retained user text are recorded in the Wave 2 plan. |
| D15 | 2 | What masking guarantee does the session fixture (#115) certify? | Reconciled 2026-10-12: ADR-0095/0098 supply structural refusal, not universal masking. Certify the actual producer/SQLite/export fixtures and retained-content limits. This repairs the missing Wave 2 decision row; it is unrelated to historical media D15. |
| D17 | 2 | Book security reviews by threat class, not per PR? | Accepted 2026-10-13: four new sittings (filesystem, secret input, secrets at rest, config trust), plus W4 hostile-MCP sitting/current regression revalidation. Closing evidence. |
| D18 | 3 | chat-ink.tsx (1,795 lines, in neither doc): decompose or decline? |
Decline — hand it to 2.6.M's render-v2 in Wave 5a, where the palette sweep then runs once |
| D19 | 3 | --quiet/--verbose/RELAVIUM_DEBUG precedence |
Approved ADR-0110, 2026-10-16: quiet+verbose remains a conflict; either explicit flag overrides exact DEBUG=1. This replaces the old precedence ladder. JSON remains independent; implementation is staged. |
| D20 | 3 | --input's four-way collision: rename or document? |
Approved ADR-0110, 2026-10-16: rename pricing flags to --input-price/--output-price, retaining deprecated aliases and refusing conflicting spellings before normalization. Other command-scoped input meanings stay documented. |
| D22 | 3 | Read EXIT:4 as "no breaking change"? | Approved ADR-0110, 2026-10-16: its enumerated compatibility scope replaces the old two-exception recommendation. Phase exit criterion 4/E wording and ADR-0049/0056 forward notes are reconciled before dependent code. |
| D26 | 3 | Which session would bare Home's showCost target? |
Approved disposition, 2026-10-16: keep /cost chat-only; certify both live chat surfaces. Bare Home currently cannot invoke the no-op. Past-session selection remains 2.6.G; no implicit cost release. See the Wave 3 plan. |
| D28/D29 | 4a | Flip ADR-0058 and ADR-0060 to Accepted | Yes; 0060's taint model is the cited precedent for Wave 7's generation-security ADR |
| D31 | 4a | Strike 2.6.H's chat-persister atomicity sub-part as a duplicate? | Yes — owned by Wave 1; record the closure |
| D33 | 4b | Retention policy (the phase's largest single item) | Default bound 50 + --limit/--tail; ship chat delete writing the dead deleted_at columns; never auto-hard-delete |
| D34 | 4b | Logging standard: build the injected-logger seam, or amend the standard? | Amend — building it adds a port to packages/core, needs its own ADR, breaks 2.5.5 exit criterion 8, and collides with 2.6.N's artifact-store port |
| D37 | 4b | Provision CI provider keys for the live-nightly lane? | Yes, nightly-only, wired before the parity sweep |
| D50 | 6 | ADR row 11: adopt ink-syntax-highlight, or build in-house? |
Decline the dependency per CLAUDE.md rule 2 — the markdown renderer is already in-house and untrimmed highlight.js is the phase's own named bundle risk |
| D52 | 6 | Draft ADR row 12 in Wave 6, not Wave 7 | Yes — settle the lineage event shape once, covering both 2.6.N and 2.6.P |
| D57 | 7 | Dynamic runtime sub-workflow selection? | Defer past the phase — it is exactly the unauthored composition the authored surface == executable surface invariant exists to prevent |
This ordering is compatible with both phase files' stated dependencies. It departs from their prose in six places, each deliberate:
- A baseline step neither file has. Both treated
f88b0e8as the working tree while it was not yet onmain. Discharged 2026-07-26; kept here because it is why Wave 0 exists at all. - 2.5.5's recommended order is A+C → D+I → E → B+H → F+G. This keeps its risk instinct but re-cuts the batches by file, because ~40 files are edited by both a 2.5.5 item and a 2.6 item. Sub-stream letters are filing conventions, not batching units — every split above is declared.
- Eleven items are pulled across the phase line (2.6.M's
extraRootsandallowedDomains, 2.6.N's fs-floor anchoring, 2.6.G'sengine.reconcile, 2.6.Q's cost-cap halves, …) because they edit the exact function or file a 2.5.5 item is restructuring. - 2.6's ADR row 6 is drafted when 2.6.H starts, not when 2.6.G starts as the table says — H must land first.
- 2.5.5's own eight exit criteria are certified nowhere in either file. Criteria 1–3 are attached to Wave 2 and 4–8 to Wave 7; per-sub-stream acceptance sign-offs are attached to the last wave touching each.
chat-ink.tsxis decomposed by neither file despite being the largest TUI file. Raised as decision D18.
Phase 1 — Engine and LLM is COMPLETE (milestone M2 reached, PR #27, 2026-06-16;
all workstreams 1.A–1.AH merged through PR #38, 2026-06-21). The engine runs end-to-end:
YAML parse → DAG → run loop → node execution (agent + the six non-agent handlers) →
checkpoint/resume → node retry → provider failover, with per-attempt cost tracking and a
gap-free sequenceNumber. The @relavium/llm seam is frozen and proven behind a
provider-agnostic LLMProvider interface with all three adapters (Anthropic,
OpenAI/DeepSeek, Gemini) and the FallbackChain runner. Two additive sub-spines also
completed: the agent-first entry point (AgentSession multi-turn + session persistence +
export-to-workflow, Lane C / 1.m5, 1.V–1.AA) and multimodal I/O (media input + engine
plumbing + inline & async output generation + generative adapters, 1.m6, 1.AD–1.AH). See
Phase 1 detail, the decision index,
and the reference specs.
Repository checkpoint (recorded 2026-07-26; publication status corrected 2026-10-13): (1) The CI
cijob became a required check undermainbranch protection, alongside av*tag ruleset limiting tag creation to maintain/admin. The optionalTURBO_TOKEN/TURBO_TEAMsecrets for cross-runner remote cache were recorded as unset at that checkpoint; this does not assert their current configuration. (2) The former v0.1.1 publish-pending note was stale: the npm registry recordsrelavium@0.1.1published on 2026-06-28. This resolves the package-publication status, without asserting the currentNPM_TOKEN, npm 2FA or GitHub release-workflow state. The release procedure remains ADR-0051 / release-a-surface.md.
A multi-agent code review of the whole tree at HEAD f88b0e8 ran while the toolchain was green
throughout (lint, typecheck, and all 226 test files passing) — every finding is a defect a green
build cannot catch. 377 findings went through two-lens adversarial verification (one agent trying
to refute each finding against the code, one auditing its materiality); 373 survived and were
triaged into 205 work items. The review's central conclusion: the gap to first-class is a gap in
propagation, not competence — the correct pattern almost always already exists in the repo and
fails to reach the next site (a redaction helper not called twenty lines away, terminal
sanitization built for chat and never carried to relavium run, withBusyRetry applied to every
writer but the three oldest, cancel-wins implemented in four node handlers and omitted in the
fifth). That makes the remediation cheap and low-risk: the reference implementation is already
in-tree.
Disposition: 176 work items opened the new Phase 2.5.5 — Hardening and Remediation (engine/LLM/persistence hardening, MCP/secrets, the CLI operator-safety net, TUI terminal safety, docs accuracy, CI/test-infrastructure, and hygiene), running concurrently with Phase 2.6, not before it (327 findings); 27 findings (16 work items) were folded directly into the charter of an already-open 2.6 workstream; 16 findings (10 work items) were already tracked in deferred-tasks.md and were re-confirmed rather than duplicated; 3 needed no action per the finding's own argument. Severity of the 373 triaged findings: 3 critical, 48 high, 134 medium, 155 low, 33 polish.
The three critical findings, visible here so they aren't buried in the phase file:
- A tool-approval preview that is not secret-redacted (
packages/core/src/tools/registry.ts) — the persisted,--json-visibleToolActionPreviewechoes a command/path verbatim instead of going through the same redaction its sibling input-sanitizer already applies. - A transient
history.dbwrite failure silently drops a chat turn, then crashes the session (apps/cli/src/chat/persister.ts) — an async write failure surfaces after the reply was already shown to the user, as an unhandled rejection. - Missing terminal-output sanitization on the
relavium runTUI (apps/cli/src/render/tui/RunApp.tsx) —stripTerminalControls/sanitizeInlineis applied at nearly every other dynamic-text display boundary but never reaches this one, leaving an ANSI/OSC/Trojan-Source injection hole.
The first 2.6 workstream. Behind ADR-0067
(Node >=22 published floor, >=22.13.0 dev-install floor; better-sqlite3 re-affirmed),
ADR-0068 (ink 7 + a hand-built alternate-screen
renderer + the ink-testing-library harness), and
ADR-0069 (string-width for display width — Accepted
on the PR #74 merge, the CLAUDE.md rule-2 approval it gated).
Shipped: ink 6→7 and the component-render harness; the alt-screen lifecycle with restore nets on every
termination path; a hand-built transcript viewport (grapheme-aware wrapping, windowing, scroll + auto-follow, a
per-entry wrap cache) and the inter-session alt-buffer hoist; the /scrollback, /edit and /copy
copy-and-search hatches over a suspendFullScreen primitive; in-app mouse text selection with copy-on-select over
OSC 52 on both surfaces, with edge auto-scroll, a frozen auto-follow and a transient ✓ Copied toast so the
otherwise-silent copy is confirmed; --no-mouse /
[preferences].{alt_screen,mouse,copy_on_select,show_banner}; a branded Home banner; and DEC-2026 synchronized
output — which ink 7 turned out to already emit, so the step pins it rather than building the planned
stdout Proxy.
The full-screen renderer is now the default on a TTY; --no-alt-screen and a machine / non-TTY / --json / CI
path stay on the byte-identical inline renderer.
Two adversarial review rounds (one per step, one over the whole phase) drove the last third of the work. The
whole-phase round found that the caps-lift ADR-0068 exists to deliver was never implemented — a name collision
with the Step-4b-3 wrap cache — so a >4000-character answer was still clipped in the very viewport built to scroll
it; that displayWidth under-counted 8 539 code points against ink's own width function; and that a keyboard
Ctrl-C during a Home hatch stranded mouse reporting on the user's shell. All folded, each with a break-verified
regression test.
Phase 2.6.C — reseat transcript-carry + the /cost per-model breakdown (merged to main, PR #75, 2026-07-13)
Driven by two maintainer manual-test findings. F1: a mid-session /models reseat blanked the alt-screen
viewport — the reseat builds a fresh view store, and on the full-screen renderer (the TTY default since 2.6.F, with
no native scrollback behind it) that store is the scrollback, so the whole conversation vanished the moment a user
switched models. The durable transcript and the new model's context were never at risk; the loss was the view. The
reseat now carries the rendered conversation, gated to full-screen (a seeded inline store would re-print the
conversation over the copy ink's <Static> already put in the terminal's scrollback), and the switch notice lands
beneath it as an inline ⇄ model changed <old> → <new> marker, keeping ADR-0059's bound disclosure clause.
/cost now shows where the money went, behind a new
ADR-0070: a durable session_costs table with the
invariant SUM(rows) == agent_sessions.total_cost_microcents, true by construction. ADR-0059 had planned to
derive the breakdown from the per-message model_id, which cannot work — one row holds one model, but a turn
whose tool loop fails over bills two. Along the way it closed a live bug: total_cost_microcents was being SET
blindly by five writers, so two chat-resume processes could permanently corrupt a session's total. It now has a
single owner. session_messages' never-written token/cost columns were dropped rather than left as a second, wrong,
zero-valued source.
Four adversarial review rounds ran over the work and each found something real — including that a tripwire I shipped
was armed in production and swallowed by ink (so it could never fail), that a perf harness measured a
pointer assignment while its ADR note claimed it verified an O(n) bound, and that the /cost DB read — the
step's central change — had zero test coverage at any layer. All folded, each with a break-verified regression.
Open obligations carried out of 2.6.C:
chat-resumeopens on an empty viewport — it has never repainted prior turns, in any mode or version (nothing projectssession_messagesinto rendered entries). Not a 2.6.F regression; tracked in deferred-tasks.md.- Reported spend is a systematic under-estimate of the provider's invoice — an egress that streamed content but ended without a usage chunk, and a mid-stream failure, are recorded as 0 on both sides of the invariant. That is a usage-capture gap in the seam, filed against 2.6.Q (ADR-0070 §3).
- Cross-turn tool-call memory — a "the reseat forgets tool calls" report turned out to be an engine property,
not a reseat one: tool pairs never cross any turn boundary (ADR-0062 §6). Deferred behind a default-off toggle,
but three already-live bugs gate it (no pre-egress context-window check; overflow is a fatal, non-retryable
bad_request; the budget gate prices only output tokens) — see deferred-tasks.md. - The CLI e2e suite migrates the developer's real
~/.relavium/history.db— verified, and it is what let a broken migration reach real data while staying invisible to CI. Tracked in deferred-tasks.md.
Open obligations carried out of 2.6.F:
- The Home landing can overflow a short terminal — a populated "Attention required" section pushes the top off, and the alt buffer has no scrollback to recover it. Predates 2.6.F (the strip is 2.5.B); 2.6.G's management browsers replace the strip wholesale, which is the right place to fix it.
relavium run's TUI stays inline (a deliberate 2.6.F scope cut); its retained-scrollable-history is tracked.- Themes (beyond colour /
NO_COLOR) are deferred to 2.6.L, per the maintainer's Step-5 decision. - Real-TTY signal paths (double-Ctrl-C,
kill -TERM/-HUP/-QUIT, a hatch undertmux) remain a manual PR-time check — the unit tests pin the orchestration around injected seams, not the kernel.
Phase 2 — CLI (milestone M3) is feature-complete (every in-phase workstream 2.A–2.S merged; published as
v0.1.1). The CLI is the first real
@relavium/core consumer and doubles as the engine's regression harness — validating the
engine API ergonomics before the desktop and VS Code surfaces. Landed: the CLI skeleton +
process contract (2.A) and the two-level config-resolution loader (2.B), both ✅ Done
(PR #40, 2026-06-22) behind ADR-0047
(commander/ink/@clack) and ADR-0048 (smol-toml); and
2.D (relavium run wired to @relavium/core — the M3 keystone and first real engine
consumer), ✅ Done (PR #41, 2026-06-22), which also adds the defaultProviders() seam registry;
and 2.F (the --json CI machine-output contract — pure-NDJSON stdout, diagnostics → stderr),
✅ Done (PR #42, 2026-06-22) behind ADR-0049;
and 2.K (the engine regression harness, now the engine's CI regression gate), ✅ Done
(PR #43, 2026-06-23) — reaching global milestone M3; and 2.H (durable local run history via
@relavium/db — the RunStore writer + read API the gate-resume/list/logs/status surfaces consume),
✅ Done (PR #44, 2026-06-23) behind ADR-0050;
and 2.C (the relavium provider commands — a provider registry + API keys in the OS keychain via
@napi-rs/keyring, resolved keychain → RELAVIUM_<PROVIDER>_API_KEY env var → error), ✅ Done
(PR #45, 2026-06-23) behind ADR-0019 +
ADR-0006 (no new ADR — secrets.enc deferred past v1.0);
and 2.E (the ink streaming TUI — the third RunRenderer over the one event bus: live per-node status
- spinners, the active node's streaming tokens, a running cost footer, a persistent final summary; cooperative
Ctrl-C cancel), ✅ Done (PR #46, 2026-06-24) behind ADR-0047
(ink + React 19, confined to
apps/cli; no new ADR); and 2.G (the interactive human-gate prompt — a@clack/promptscard duringrun— plus the out-of-bandrelavium gate <runId>cross-process resume: reload snapshot → reconstruct checkpoint →resumeFromCheckpoint, idempotent, secret-input fail-closed), ✅ Done (PR #47, 2026-06-24) behind ADR-0047 (@clack/prompts; Node floor 20.11→20.12; no new ADR) — fully closing 2.K's deferred gate-resume half; and 2.I (the read commandslist/logs/status/gate listover durable history — go/no-go #2, the read side; surfaces the pendinggateIds the 2.Ggatecommand points at), ✅ Done (PR #48, 2026-06-24) (no new ADR — an additive workflow-agnostic@relavium/dbread seam + a@relavium/coreparseAgent); and 2.L (packaging, distribution & install verification — go/no-go #7, the last gate-closing spine PR: thetsupengine-inlined ESM bundle, the bundle-closure drift guard, and the tag-triggered cross-OS install-smokeRelease CLIworkflow), ✅ Done (PR #49, 2026-06-24) behind ADR-0051 — closing go/no-go #7, so the Phase-2 spine is complete and all seven Phase-3 exit criteria now hold (Phase 3 may start). Also landed — the first additive lane: 2.S (media host-wiring — the surface half of the multimodal sub-spine: themodel_catalogreader →resolveMediaSurfacerouting + the D15 catalog load-check shared byrun/gate, the content-addressedMediaStorede-inline to amedia://handle, the SSRF-validatedEgressCapability.fetchegress, the containment-checkedsave_towrite port, durable fail-cost on the terminal events, the produced-media render surface, and the best-effort run-end host media GC), ✅ Done (PR #52, 2026-06-25) behind ADR-0042–ADR-0046 (no new ADR). Also landed — the first user-facingAgentSessionsurface: 2.M (relavium chat— the agent-first interactive REPL overAgentSession: streaming tokens, tool-call annotations, the FS-scope tier +allowedCommandsallowlist honored,git_commitdenied;/exit//cancel/ an input-stream EOF / raw-mode Ctrl-C all end the session with exit code 4 — over ONE framework-free command core driving both aninkTTY app and a plain non-TTY line loop; a built-in default agent over[chat].default_modelfor a zero-config first run; durable per-turn persistence to the sharedhistory.dbthat round-trips viareconstructSessionState; the ADR-0028 cost cap wired; model output + pasted input sanitized of terminal control sequences at the display boundary), ✅ Done (PR #54, 2026-06-26) — no new ADR (covered by ADR-0024, ADR-0047, ADR-0028, ADR-0050, ADR-0029).read_mediainput access (D12) — which 2.S had pointed at 2.M — was split into a dedicated, security-reviewed follow-up (maintainer-approved); the 2.M REPL shipped without it (tracked in deferred-tasks.md). Also landed — the rest of the agent-first chat family: 2.N (relavium chat-resume— reload + continue a persisted session over a shared REPL), 2.O (chat-list— over a new additiveSessionStore.listSessionsread seam), 2.P (chat-export+ the in-REPL/export— session →.relavium.yamlscaffold, ADR-0026), and 2.Q (chat --json— a headlessSessionEventNDJSON driver — + the one-shotrelavium agent runwith a minimal in-house--fixturecassette for deterministic offline replay), all ✅ Done (PR #55, 2026-06-26) — no new ADR — completing the agent-first CLI lane. (agent run --inputis reserved/rejected until session{{ctx.*}}prompt interpolation lands — a tracked engine follow-up in deferred-tasks.md.) Also landed — 2.R (the inbound MCP client): agents now consume external MCP servers' tools acrosschat,run, and one-shotagent run. The@relavium/mcpfoundation (the SDK-fenced package, the dependency-free JSON-Schema→Zod compiler, the fail-loud connect-all manager, themcp_{server}_{tool}namespacing) is ✅ Done (PR #56, 2026-06-26), and the host wiring (chat/run/agent-run), the network transports (http/sse/websocket) behind the SSRF pre-connect floor + the per-serverallow_local_endpointopt-in, named secrets via the isolatedmcp-secret:*keychain namespace, the by-namerefregistration form, and the real-spawn e2e are ✅ Done (PR #57, 2026-06-27) — behind ADR-0034, ADR-0052, and ADR-0053. It was off the M3 critical path and the Phase-3 go/no-go (capability without gating). Residual MCP hardening — the connect-by-validated-IP dialer, network header-auth, tool-list caching, mid-call abort propagation — is tracked in deferred-tasks.md. The stdio spawn is gated as of 2.6.5CR-16(ADR-0084): consent per machine and per resolved declaration, on every path that can open an MCP-bearing artifact. The "import-trust" framing is retired — agit pullchanges a committed artifact with no import step — and only thenpxversion/integrity pinning half remains deferred. Also landed — 2.J (the YAML-authoring lifecycle), the last in-phase lane:relavium create(a@clack/promptswizard scaffolding an agent or a minimal single-agent workflow, validated against the kind-appropriate@relavium/sharedschema before write, dual-TTY-gated),relavium import <path>(schema- validated copy-in with project-global id uniqueness), andrelavium export <id>(a portable copy re-serialized from the validated AST — canonical, comment-free, no provider key by construction), sharing oneassertSlugAvailablecross-catalog guard, ✅ Done (PR #58, 2026-06-28) — no new ADR (covered by ADR-0026/ADR-0047).
Phase 2 — CLI is feature-complete. Every in-phase workstream (2.A–2.S) is merged and the published CLI is cut as v0.1.1; M3 was reached at 2.K and the Phase-3 go/no-go held from 2.L. See the Phase 2 workstreams and the sequencing plan. The full status-aware history is the Remaining build order section (its queue is now empty).
Phase 2.5 — CLI Consolidation & Conversational Home has started. 2.5.A (the spine's secure base — a
shared assembleToolEnv({ profile, fsScopeTier, workspaceDir }) factory wired into both the chat and
workflow-run paths, the host-side fs (realpath+commonpath jail, read-only chat fail-close, single-fd
O_NOFOLLOW/O_NONBLOCK reads) and process arms, the advertise-filter, EA1 tool_unavailable, and EA2
real failed-turn usage) is ✅ Done (PR #60, 2026-06-28), behind
ADR-0055 — reaching milestone
M2.5-1 (secure base). The egress/os arms, the project-tier extraRoots allowlist, and a write-capable
chat are deferred to 2.5.E/ADR-0057 (tracked in
deferred-tasks.md). 2.5.B (the bare-invocation Home) is ✅ Done
(PR #61, 2026-06-29), behind ADR-0054 (Accepted): the
TTY-gated bare relavium opens a read-only management strip (recent sessions/runs/agents + an "Attention
required" section of pending human gates / failed runs) over a bounded, indexed history.db read seam, sitting
above a live prompt that graduates into an in-process chat; rendered as a single ink tree (one useInput owner)
with one SIGINT/SIGTERM lifecycle (clean Home exit 0; an external signal → the conventional 128+signo, 130/143;
the in-Home chat's exit-4 consumed, never leaked) and bracketed paste (DECSET 2004), all while every
non-interactive path keeps the byte-for-byte help + exit-0 meta-op (ADR-0049).
Canonically homed in home.md. 2.5.C (the in-app command system) is ✅ Done
(PR #62, 2026-06-30), behind ADR-0056
(Accepted): a curated two-registry model (the shell COMMAND_MANIFEST driving commander + --help --json
- the
executeCommanddispatch, vs the in-REPLREPL_COMMANDSdriving a filterable/palette + slash commands in both the chat and the bare Home — no command in both);/help, thenoticeoutput channel,/workflows,/cost, and/doctor(fast tier: keychain/config/wired-tools;--deep: a redacted provider-key probe + a read-only MCP-status report — a security-review decision: it reports the live session's already-connected servers, never a fresh connect/spawn); plus thename + argsslash dispatch and a context-aware footer hint-bar surfacing/ for commands. Canonically homed in commands.md + chat-session.md. 2.5.E (chat modes + per-tool approval + mid-turn abort) is ✅ Done (PR #63, 2026-07-03), behind ADR-0057 (Accepted after the mandatory security review): the reseat-less mode system (ask / plan / accept-edits / auto onShift+Tab+/mode), the fail-closed per-toolconfirmActionfloor ([y]/[a]/[n]+ a session once/always cache), theEscmid-turn abort (EA7), and the host arms closing the 2.5.A deferral — a write-capablefstier + protected paths (refused in every mode incl.auto), the SSRF-hardenedegressarm (shared with media), and theosarm (now a governed action class). Wired live intorelavium chat, one-shotagent run, and the Home (each activates the regime before its first turn). Every step passed the mandated opus + Sonnet 5 loop plus the dedicated holistic security review (~50 findings fixed, 4 HIGH). A same-PR chat-UX follow-up also landed: a host tool EXECUTION failure on the interactive surface (a file-not-found READ) is fed back to the model to recover (recoverToolFailures, scoped to IDEMPOTENT tools via a stampedToolExecutionError.recoverable; a governed / side-effecting failure stays fail-fast) plus a static secret-freetool_failedhint. With 2.5.E the CLI Consolidation spine (2.5.A → C, E) is complete. 2.5.D (chat input ergonomics) is ✅ Done (PR #64, merged 2026-07-03) — the first experience-arm workstream: the pure-ergonomics half (Ctrl+Jmultiline,↑/↓history +Ctrl+Rreverse-search, readline motions, a shared cursor-bearingEditorState) plus the two data-moving affordances behind ADR-0061 (Accepted after a two-round maintainer security review):@-mention (dir-navigable file completion that reads through the SAMEFsCapabilityread_fileuses — jail + the expanded sensitive-read confidentiality floor - listing-gate + binary/size guards — and injects as UNTRUSTED, nonce-fenced, byte+line-bounded context) and
!-shell (the additiveAgentSession.runUserCommand— EA8 — routing!commandthrough the onerun_commandboundary:enforcePolicy([chat].allowed_commands)BEFORE the mode-awareconfirmAction→spawn/shell:false; empty-default allowlist ⇒!inert, secure-by-default, with an actionable deny hint). Each of the 5 steps passed the mandated opus + sonnet adversarial-review loop, and the ADR-0061 mandatory security pass ran inside the step-4/5 loops (14 findings fixed across the two@-mention rounds; on the!-shell the opus + security pass confirmed 0 defects after adversarial verification, and the sonnet second pass caught a HIGH — a!-command in flight left no host-visible busy signal, so a message typed mid-command could crash the session — now fixed with ashellBusyinput gate, plus a LOW type-hygiene fix). A post-implementation comprehensive review then refined the@/!presentation to a pending-attachment (chip) model (an inline@pathmarker + a read-only!-output preview, expanded into the SAME UNTRUSTED nonce-fenced frame only at submit — byte-identical model context, a clean prompt), and two follow-up review passes hardened the[chat]allowlist resolution (exact + glob arrays are now a coupled unit) and fixed a Backspace regression (ink reports the Unix physical Backspace askey.delete); all recorded in the ADR-0061 "Refined at implementation" append. 2.5.F (the ADR-0062 context commands) is ✅ Done (PR #65, merged 2026-07-05) behind ADR-0062:/clear(a host-level fresh-session swap acrosschat/chat-resume/Home, TTY-interactive only), thesession:compacting"Summarizing…" moment event (amending ADR-0036), and the footer context-fullness indicator — completing compaction alongside the earlier/compact+/trim+ automatic compaction. 2.5.G (onboarding wizard + Home/models+ the live model catalog) is ✅ Done (PR #66, 2026-07-07) — its scope expanded to Option A: a live model catalog (per-key provider discovery + a DB cache + refresh + a static/live merge) and a complete model-pricing story (user-supplied pricing that governs cost), behind three ADRs (ADR-0063 config-write · ADR-0064 live catalog · ADR-0065 provider economics), across 12 reviewed steps (all landed); with it milestone M2.5-2 is reached. The additive lane 2.5.H (reasoning render + live-turn feedback + an actionable error taxonomy) is ✅ Done (PR #67, 2026-07-07) — behind EA6 (a new dual-envelopeagent:reasoningstream event that amends ADR-0036; no new top-level ADR): a host-emit of the reasoning the@relavium/llmseam already carries (ADR-0030), a collapsible "thinking" panel (/thinking/Ctrl+T), theThinking…/Working… {elapsed}s · Esc to stoptimer, a visible…elision marker (fixing the silent live-buffer head-drop), per-attemptvia {model}failover attribution, and a static, secret-free per-ErrorCoderecovery hint (session-survives; a context-overflow message heuristic →/compact·/trim). Four steps, each opus + Sonnet reviewed (3 HIGH fixed: a run-path silent-drop, a frozen Home timer, a scrollback elision loss; + a one-shotagent runhint-leak). With 2.5.E this reaches milestone M2.5-3. The consolidation lanes 2.5.I (regression harness + DB concurrency hardening —loadFullread-txn snapshot,BEGIN IMMEDIATEwrites with a deterministicSQLITE_BUSYretry, the concurrent chat+run + cassette-chain + perf-budget e2es, an advisory Windows CI lane) and 2.5.J (docs-debt: the accurate unencrypted-history posture per ADR-0050, andNO_COLOR/FORCE_COLOR/--colorresolution) are ✅ Done (2.5-close-out, PR #69, 2026-07-08) — reaching milestone M2.5-4, so Phase 2.5 is complete, merged tomain— landed alongside the doable-now Batch A–E backlog (test-hardening; 2.5.H TUI polish;AgentParseErrorline/col; the ADR-0057 approval/security batch —[c]reject-with-reason, non-TTY policy, SCOPE-denial recovery, Ctrl+T-in-approval, the Trojan-Source bidi floor, behind an append-only ADR-0057 amendment; the profile-aware advertise-filter + the in-house.gitignorematcher), each implement → Opus → Sonnet with a security-review pass on the approval batch. Twogate.ts-resume items (relavium budget resume+ secret re-provide) are deferred to a focused follow-up, and the session{{ctx.*}}interpolation stays with the Proposed ADR-0060 (Phase-2.6); all tracked in deferred-tasks.md. See the Phase 2.5 workstreams. A post-2.5.G model-UX follow-up (from six maintainer questions on model/provider/wizard behavior) then landed as a sequenced plan:/modelskey-awareness, the onboarding-wizard live key-validation + retry UX, wizard-dynamic provider docs, mid-session model switching (the/modelsreseat acrossrelavium chat+ the in-Home chat — ADR-0059, now Accepted), and normalized reasoning-effort control (ADR-0066, now Accepted, merged 2026-07-07): a provider-agnostic effort tier (off/low/medium/high/max) authored in agent YAML or the[chat].reasoning_effortconfig default, each adapter mapping it to its provider's native tier — all four providers, DeepSeek-v4'sthinkingparam included (doc-verified against api-docs.deepseek.com) — gated per-model by a host-injected capability resolver (plus a conservative id heuristic for a live-discovered model). It is changed interactively:/effortopens a keyboard-owning tier-selector overlay inrelavium chat+ the in-Home chat (§6), and the/modelspicker's effort sub-step either applies a per-turn session override in a live chat (no reseat, §5) or — in the bare Home — writes the model + effort as the next session's config defaults (a new global[preferences].reasoning_effortkey), the active tier shown in the footer. Two multi-agent review passes hardened it: the first caught the picker (wrongly) routing effort through a full model reseat — the P0 fix rebuilt it as the ADR-mandated session-level setter; the second caught the bare-Home effort default not being re-read for a same-process next chat — fixed to mirror the model's fresh per-chat re-read.
Carry-over hardening is tracked in deferred-tasks.md — Phase 2 picks items up as it first touches each file. Notable inheritances: 1.AH's host-wiring half (distributed across Phases 2–6), the media-egress host-side SSRF mechanism, and the keychain no-raw-key IPC test.
The rest of Phase 2.6 — Conversational Authoring and the First-Class CLI
(phase-2.6-conversational-authoring.md, in progress —
2.6.F is done,
unblocked by the 2.5 close and re-scoped 2026-07-08 from maintainer UX findings + a competitor
research pass + the deferred-tasks triage): a full-screen, Home-managed CLI (browsers for
workflows/runs/agents, provider + MCP + settings management, onboarding v2 with the Relavium-account
stub), competitor-breadth tools under the governance floor, settings/theming/en+tr localization,
the run-ops resume follow-up — plus the original spine: the shared @relavium/authoring package and
a chat that authors standards-valid .relavium.yaml. Then the surfaces and the cloud —
everything after the engine critical path: the desktop app (Phase 3) and the VS Code extension (Phase 4), then Product Phase 2 — first managed
inference (phase-5-managed-inference.md, the opt-in
managed gateway, engine still local), then the cloud execution layer and web portal
(phase-6-cloud-execution-portal.md), the two
decoupled per Option B. See the phase index and the
milestone spine (M3 onward).
Systematic group 2a, round 3 — 2026-10-04. Two complete independent reviews
verify all four tool notifications, then reproduce an inherited raw-callback usage/hard-cap gap and
skipped realized recording. e7973031 preserves original error identity while carrying canonical
accounting and starts mandatory recording after authoritative cost aggregation despite delivery failure.
Original baseline: 40 failing/13 passing; corrected root: 7,625 passing/12 skipped across 331 files,
23 forced tasks and six forced builds. Every sealed report/entry is verified before Original resumes.
Fresh complete round 4 is required; group 2a, ownership, remaining groups, Steps 7–8/12, Sonar and PR remain open.
Systematic group 2a, round 4 — 2026-10-04. Both fresh complete reviews
reproduce frozen classified errors defeating the carrier, proven pre-provider refusals consuming
slots without a governor, and classified success-flush errors losing usage or counting twice.
ecf0b209 separates canonical accounting from throwable mutation/classification and records
actual chain-owned provider invocation; untyped chain diagnostics are fixed. Original baseline:
34 failing/243 passing; corrected focused run: 451 passing. Forced root checks pass all 23 tasks,
332 files, 7,665 tests/12 skips, six builds and test isolation. Both full reports and every one of
3,524 sealed entries/pins are independently verified before Original resumes. Fresh complete
round 5 is required; group 2a, ownership, remaining groups, Steps 7–8/12, Sonar and PR remain open.
Systematic group 2a, round 5 — 2026-10-04. Both fresh complete reviews
reproduce hostile error presentation replacing the original throwable/suppressing its terminal,
method lookup counted as invocation, and valid generated usage lost on pricing failure.
902737eb guards presentation, resolves receiver-bound methods before invocation and retains
safe-integer validated usage without inventing a cost. Original baseline: 19 failing/287 passing;
corrected focused run: 417 passing. Final forced root checks pass 23 tasks, 332 files,
7,694 tests/12 skips, six builds and test isolation. Both complete reports and every one of
3,589 sealed entries/pins are independently verified before Original resumes. Fresh complete
round 6 is required; group 2a, ownership, remaining groups, Steps 7–8/12, Sonar and PR remain open.
Systematic group 2a, round 6 — 2026-10-04. Both fresh complete reviews
verify existing protections and reproduce six overlapping price/quantity/invocation/diagnostic families.
b4134e99 owns validated returned usage, marks unknown prices unpriced, guards nested/cause inspection,
keeps admission ownership through discharge and rechecks lookup cancellation. Exact-head baseline:
25 failing/19 passing; corrected focus: 461 passing. Final forced root passes 23 tasks, 333 files,
7,738 tests/12 skips, six builds, formatting and test isolation. Both complete reports and all
3,922 sealed entries/source/link/bootstrap pins are independently verified before Original resumes.
Fresh complete round 7 is required; group 2a, ownership, remaining groups, Steps 7–8/12, Sonar and PR remain open.
Systematic group 2a, round 7 — 2026-10-04. The complete contracts review and incomplete runtime observations
reproduce generated observer errors causing paid retries/private public diagnostics and second tool-round
reflection replacing callback failures. dd9d5a7d retains exact attempt-observer provenance and guards
budget inspection. Original permanent baseline: 7 failing/24 passing; corrected focus: 200 passing.
Final forced root passes 23 tasks, 335 files, 7,769 tests/12 skips, six builds and test isolation.
Both entire reports and all 4,140 sealed entries/source/link/bootstrap pins are independently verified
before Original resumes. Runtime's platform-interrupted review is explicitly incomplete, with no
restored runtime certification. Fresh complete round 8 is required; group 2a, ADR-0102 approval,
remaining groups, Steps 7–8/12, Sonar and PR remain open.
Systematic group 2a, round 8 — 2026-10-05. Both complete independent reviews verify held terminal mutation before confirming EOF, mutable attempt diagnostics and typed paid observer failures granting unintended workflow retry/budget authority. Corrections own the held terminal, freeze diagnostic copies and carry exact external observer origin separately from internal admission faults. Session classified delivery and actual money failure ownership remain intact. The 51 new terminal controls reproduce 31 failures before repair; final forced Original checks pass 23 tasks, 336 files, 7,831 tests / 12 existing skips, six builds and test isolation. Both complete reports and all 4,175 physical entries/pins/links are verified before Original resumes, with prior outer-launcher gaps qualified. Fresh complete round 9 is required; group 2a, ADR-0102 approval, remaining systematic groups, Steps 7–8/12, current Sonar and PR remain open.
Systematic group 2a, round 9 — 2026-10-05. Both complete independent reviews
verify unsafe cause authority, generated result access after paid observation, compaction/later-tool
callback origin and false money-writer attribution. Verified corrections 1b23ff82 / 22d9df14 and
119 additional permanent controls pass forced full lint/typecheck/test (23 tasks, 339 files,
7,950 tests / 12 existing skips), forced build and isolation. Both complete reports and all 3,784
physical entries/source/link/bootstrap pins verify before Original resumes; actual-price/unpriced
and early startup limits remain explicit. Fresh complete round 10 is required; group 2a,
ADR-0102 approval, remaining groups, Steps 7–8/12, Sonar, W7 and PR #90 remain open.
Systematic group 2a, round 10 — 2026-10-05. Both complete independent reviews
verify lifecycle setup/provenance and nested generated-content authority gaps. Corrections
639d1ace / c6749597 add 94 controls and pass forced full lint/typecheck/test (23 tasks,
343 files, 8,044 tests / 12 existing skips), six builds and isolation. Both complete reports and
all 3,741 actual physical entries/source/link/bootstrap pins are audited; Contracts' three post-audit
cache files and one directory discrepancy explicitly qualify its seal claim. Fresh complete
round 11 is required; group 2a, ADR-0102 approval, remaining groups, Steps 7–8/12, Sonar, W7 and
PR #90 remain open.
Systematic group 2a, round 11 — 2026-10-05. Both complete independent reviews verify terminal cancellation after successful durability, custom controller reentrancy and deadline cleanup losing known price or acquiring control authority. Scoped repairs preserve canonical usage, EA7 late abort and genuine money controls; 101 new core controls plus three shared disposal controls pass. Forced Original checks pass 23 tasks, 351 files, 8,148 tests / 12 existing skips, build six and isolation. Both exact final seals are independently audited; early evidence gaps remain qualified. Fresh complete round 12 is required; group 2a, ADR-0102 approval, remaining groups, Steps 7–8/12, Sonar, W7 and draft PR #90 remain open. No additional paid generation is authorised.
Systematic group 2a, round 12 — 2026-10-06. Qualified recovery and corrections record two interrupted reviews without full-scope acceptance. Cold reconstructed compaction preserves terminal cancellation; generated typed output is owned before host pricing while known quantities remain chargeable on projection failure. Thirty-one controls pass; forced Original lint/typecheck/test passes 23 tasks, 355 files, 8,179 tests / 12 existing skips, six builds and isolation. Both complete recovery reports and all 3,534 physical entries are audited. Fresh complete round 13 is required; group 2a, remaining groups, Steps 7–8/12, Sonar, W7 and draft PR #90 remain open.
ADR-0102 maintainer clarifications — 2026-10-06. Two fresh qualified static reviews
verify all six submitted clarifications at 1f7c353e; no new material draft finding. SDK HTTP acceptance
is still required during implementation. ADR-0102 stays Proposed, pending maintainer approval.
No dependent ownership implementation or additional paid generation is authorized.
Systematic group 2a, round 13 — 2026-10-06. Both complete independent reviews
reproduce a cold provider resolver starting a real nested turn, after which compaction overwrites
its controller. 9f35173a rechecks existing idle ownership before arming compaction; cold cancel,
idle abort and warm memoization remain intact. The Original regression fails before correction;
final forced lint/typecheck/test passes 23 tasks, 357 files, 8,195 tests / 12 existing skips,
six build tasks and isolation. Both reports, the complete Runtime static supplement and all
3,526 physical entries are audited, with early launch/read/preparation gaps retained.
Fresh complete round 14 is required; group 2a, Proposed ADR-0102 approval/implementation,
remaining groups, live-fixture-gated Steps 7–8, final Step 12, Sonar, W7 and draft PR #90 remain open.
Systematic group 2a, round 14 — 2026-10-06. Both complete independent qualified reviews
accept the 66-path scope at 207b2716: cold operation ownership, generated projection/pricing
precedence and actual money durability joins retain their guarantees. Contracts passes 955 tests;
Runtime passes 934, with fresh builds and strict fixtures. Both reports, the stopped static supplement,
all 3,553 actual physical entries and 153 external artifact tuples are independently audited before
Original resumes; initial launch/read/preparation gaps stay qualified. Group 2a is accepted within
this scope. Proposed ADR-0102 approval/implementation, remaining Groups 3–6, live-fixture-gated
Steps 7–8, final Step 12, current Sonar, whole W7 and draft PR #90 remain open.
Systematic group 3, round 1 — 2026-10-06. Both complete independent reviews
verify two High acknowledgement races: late timeout refusal overrides a claimed budget decision;
invalid inline approval closes native SQLite before the aggregate pause append is acknowledged.
a78f859a preserves the synchronous decision claim, and 7ceae889 drains the actual durable pause
or terminal before resource release. Nineteen independent regressions are promoted; the old-code
baseline has seven expected failures among 24 cases, and the correction passes all 24. Forced
Original checks pass 23 tasks, 362 files, 8,239 tests and 12 existing skips, plus six builds and
isolation. Both complete reports, all 3,802 actual entries and 362 external artifact tuples are
independently audited with timestamp, inherited-read and exercised-guard qualifications retained.
Fresh complete round 2 is required; Group 3, Proposed ADR-0102, remaining Groups 4–6, Steps 7–8/12,
current Sonar, W7 and draft PR #90 remain open.
Systematic group 3, round 2 — 2026-10-06. Both complete fresh reviews
verify one High: after an invalid inline approval, SIGINT during a held native pause append loses
cancellation to the paused exit. 350f7152 retains cancellation through the acknowledged terminal;
eleven permanent native controls include held cancellation writes and actual authorization claims.
The independent 25-case baseline has three expected failures; its one-guard correction and all
prepared controls pass. Original checks pass 23 forced tasks, 364 files, 8,250 tests and 12 existing
skips, with six forced builds, isolation and format. Both complete reports, all 3,635 actual entries
and 862 external artifact tuples are audited with inherited-read, environment and exercised-guard
qualifications retained. Fresh complete round 3 is required; Group 3, Proposed ADR-0102,
remaining Groups 4–6, Steps 7–8/12, current Sonar, W7 and draft PR #90 remain open.
Systematic group 3, round 3 — 2026-10-06. Both complete fresh reviews
verify two Highs: cancellation re-enters queued cards, and cancellation during paused renderer
finalization loses its subscription, native terminal write and truthful Ink summary. 94948cd4
latches cancellation, suppresses later cards and retains the iterator through a summary settlement
barrier and fallback resource drain. Eleven promoted regressions have seven causal old-code
failures; the corrected independent combined 61-case focus passes. Original passes 23 forced
tasks, 366 files, 8,261 tests / 12 existing skips, six builds, isolation and format. All 3,797
actual sealed entries and 3,349 external artifact tuples are independently audited with complete
reports, changed-case reads and preparation/guard/platform qualifications retained. Fresh
complete round 4 is required; Group 3, Proposed ADR-0102, Groups 4–6, Steps 7–8/12, current Sonar,
W7 and draft PR #90 remain open.
Systematic group 3, round 4 — 2026-10-06. Both complete fresh reviews
verify two High UI-lifetime defects: genuine budget rejection opens a surplus queued card;
cancellation or acknowledged terminal during suspension or an open card retains stale input.
9a62d665 follows emitted rejection/terminal authority, aborts scoped Clack input and preserves
the primary terminal/durability stream. A losing idempotent rejection leaves genuine later gates
usable; ordinary rejection still continues. Twenty-five permanent controls have 16 causal
old-code failures, then all pass; the corrected combined 135-case focus passes. Original passes
23 forced tasks, 369 files, 8,286 tests / 12 existing skips, six builds, isolation and format.
Both complete reports and all 3,745 actual sealed entries / 3,260 external regular tuples are
independently audited, with helper-guard, timer-seam, SDK/platform and preparation qualifications
retained. Fresh complete round 5 is required; Group 3, Proposed ADR-0102, Groups 4–6,
Steps 7–8/12, current Sonar, W7 and draft PR #90 remain open.
Systematic group 3, round 5 — 2026-10-06. Both complete fresh reviews
retain one verified High: authored gate timeout/autoapproval during voluntary paused finalization
can misreport the terminal, and an unpublished node/terminal append can outlive SQLite closure.
Parent independently reproduces four failures among five real native controls; a stable pause
passes. ADR-0103 is being drafted/reviewed and no dependent lifecycle implementation is approved.
fa884a92 separately corrects the CI completion-phase oracle and the safe status JSON contract;
26 lifecycle/Clack and 22 JSON/status cases pass in independent parent preparation. Original passes
23 forced tasks, 369 files, 8,292 tests / 12 existing skips, isolation, format and diff checks.
Both complete reports/child supplements and all 3,565 sealed entries / 3,077 regular tuples are
independently audited before Original resumes. Group 3 remains changes requested. Fresh narrow
correction reviews and the High's approved implementation are required; ADR-0102, Groups 4–6,
Steps 7–8/12, current Sonar, W7 and draft PR #90 remain open. Independent Groups 4–6 may advance
through their own checks and review while the new lifecycle decision is pending.
Two fresh independent static/runtime rounds accept the nine-path test/documentation correction
through 8e241377. Runtime focuses pass 98 and 96 cases, with fresh ordered builds, strict inclusion
and causal cleanup/JSON controls. Parent independently audits every recorded actual artifact field
and all 1,154 source/Original receipts before releasing both freezes. The qualified review record
retains all preparation/read/guard/platform bounds. Full Group 3 remains changes requested: the
voluntary paused-departure High is open, ADR-0103 remains an unapproved draft and ADR-0102 remains
Proposed. Independent Groups 4–6 may proceed under the existing plan; no W7/merge acceptance is granted.
Both complete independent reviews verify one High: acknowledged activation can delete isolated corrupt identity evidence, then reissue an old effect-turn key. The correction preserves the canonical legacy floor inside the same deletion transaction, or refuses deletion and allocation with evidence intact. Parent focus passes 585 tests; removing only the preservation call fails seven controls, and exact restoration passes all 51 cases. Original passes 23 forced tasks, 371 files, 8,316 tests / 12 existing skips and six forced builds. Both reports and all 3,067 actual sealed entries / 2,704 regular artifacts are independently audited before Original resumes, with preparation, register and native-helper qualifications retained. Group 4 remains changes requested; fresh complete round 2 is required. Group 3's High, Proposed ADR-0102, unapproved ADR-0103, Groups 5–6, Steps 7–8/12, current CI/Sonar, W7 and draft PR #90 remain open. No additional paid generation is authorised.
Both complete independent reviews verify a High: a known SQLite suspension column with an unknown payload discriminator could be skipped, letting reconciliation invent an interruption terminal. The correction checks raw type equality before tolerant parsing and refuses without leases, terminal writes or changes to either run. Thirteen new native regressions pass; removing only the guard fails eight required-refusal controls while five genuine/matching-unknown controls pass. Original passes 23 forced tasks, 373 files, 8,329 tests / 12 existing skips, six forced builds and isolation. Parent audits all 3,082 actual sealed entries / 2,719 regular artifacts and actual native-child proof closure before Original resumes, preserving read/preparation/checkJs limits. Group 4 remains changes requested; fresh complete round 3 is required. Group 3, Proposed ADR-0102, unapproved ADR-0103, Groups 5–6, Steps 7–8/12, final CI/coverage/Sonar, W7 and draft PR #90 remain open.
Both independent reports verify a High: discovery and the state reader could trust a streaming SQL label before validating a genuine suspension payload. Actual native reconciliation then invented an internal failure terminal. The correction validates every stored row through the existing parser before excluding genuine streaming events from the returned fold; persisted-history validation includes their parsing cost. The two permanent native files pass 81 cases; with existing run-history tests, 164 pass. Separate causal removals fail 19 discovery and 11 state-read controls; exact restoration passes. Original passes 23 forced tasks, 373 files, 8,397 tests / 12 existing skips, six forced builds and isolation. Parent audits all 3,126 sealed physical entries / 2,763 regular artifacts, full actual self bindings, registers and child provenance before Original resumes. The runtime report is interrupted and its wrong store/reader API attempt is not counted as state-refusal evidence; the complete static report and independent Parent actual-reader regressions establish that surface. Group 4 remains changes requested; fresh complete round 4 is required. Group 3, Proposed ADR-0102, unapproved ADR-0103, Groups 5–6, Steps 7–8/12, final CI/coverage/Sonar, W7 and draft PR #90 remain open.
Both fresh reviews cover all 33 corrected paths / 61 hunks and ten complete test files / 5,108 lines. No new material implementation finding remains. Three literal newline escapes in the preceding review prose are corrected without changing its historical result. Independent runtime passes 29 files / 753 tests, five fresh builds and strict fixture/setup/config inclusion. Discovery-only and state-only removals fail 43 and 31 controls; exact restoration passes. Parent audits both complete reports, all 3,145 physical entries / 2,781 regular files, source receipts, self bindings, registers and eight actual native-child proof closures before Original resumes. Read ordering, 18 historical Own-evidence revisions, capture/format repairs and increased parsing cost remain explicit qualifications. Group 4 is accepted within scope. Group 3's High, Proposed ADR-0102, unapproved ADR-0103, Groups 5–6, Steps 7–8/12, final CI/coverage/Sonar, W7 and draft PR #90 remain open. No additional paid capture or ADR-dependent implementation is authorised.
The budget replay harness now runs in the mandatory GitHub CI job. Its predecessor portable bytes are shipped independently of live installed dependencies, and all 143 source files are checked against the actual pinned Git baseline. Native SQLite remains the documented, invocation-hashed ABI exception. Completed evidence is bounded to three invocations; active, interrupted, foreign and redirected evidence is preserved. Seven provenance, 17 closure and eight retention controls pass, with seven additional finalization cases in three result groups. The isolation probe uses explicit file-marker readiness raced against child closure instead of elapsed-time assumptions. Turbo is pinned exactly to the cooled 2.11.4 release, with its installed local schema and unchanged task definitions.
Forced Original pnpm run ci passes: 23 lint/typecheck/test tasks, 373 test files, 8,397 passing
cases / 12 existing skips, six builds, formatting, migration sync, fences and all three offline
smokes. Initial tool-lint and formatting failures are retained; neither is presented as a passing
CI run. typecheck:tools covers its configured TypeScript programme, not every MJS helper.
Group 5 is implemented and awaits fresh independent reviews; it is not accepted. Group 3's
High, Proposed ADR-0102, unapproved ADR-0103, Group 6, Steps 7–8/12, final coverage/Sonar, W7
and draft PR #90 remain open. No additional paid capture or ADR-dependent implementation is
authorised.
The first independent systematic Group 5 review corroborates secondary-evidence failure masking, asynchronous closed-stderr errors, native failed-spawn completion before close, a same-user stale retirement pathname, and two IPC wording mistakes. Actual callers now preserve failure precedence, join real close and write fixed diagnostics synchronously. Retirement claims and validates physical identity plus exact records, preserving unexpected claims for inspection. Fourteen permanent caller controls and five causal removals pass their intended positive/negative outcomes. Forced full CI passes 23 tasks, 373 files / 8,397 passing tests / 12 skips and six builds after an initial retained DB-timeout failure and a clean isolated 522-test DB run. This is an implementation correction; fresh Group 5 round 2, Group 6, ADR approvals, provider captures and final whole-wave acceptance remain open.
Two fresh complete reviews and independent Parent audits accept all 22 Group 5 paths / 47 textual hunks and the immutable archive at ab8c5138. The actual harness closes all three workers and passes twelve predecessor refusals / two positive controls; fourteen caller controls, five grouped causal removals with exact restoration, 33 independent writer cases, six preparation cases and the real 45-second watchdog pass. Both full reports, physical inventories, source/Git pins and command/read/native evidence are verified before the Root freeze is released. Retirement compares directory identity and complete parsed records by semantic equality; it does not attest exact raw record bytes or record inodes. Application-isolation, transport/read-capture, historical release-date and initial CI-failure qualifications remain in the review record. Group 5 is accepted within scope. Group 6, Group 3's High, Proposed ADR-0102, unapproved ADR-0103, provider captures, Steps 7–8/12, final CI/coverage/Sonar, W7 and draft PR #90 remain open.
ADR-0103 is published with the exact eighth reviewed candidate bytes, after two complete static reviews and qualified Parent audits. It proposes engine-owned safe paused-host departure, narrow late-receipt authority, truthful money/effect disposition and CLI exit 8. It remains Proposed; no dependent implementation is authorised before maintainer approval. ADR-0102 also remains Proposed. Independent Group 6 work continues; the lifecycle High, provider captures, Steps 7–8/12 and final W7/PR acceptance remain open.
The remaining review-document discrepancies are corrected: 51-item diagram, five recorded security sittings, MCP consent flags, expression anchor, disclosure-reader docblock and review EOF whitespace. Behaviour-preserving leaf changes make streaming membership a Set after full persisted-row validation, flatten the replay capture-cut selector, preserve exact generated loader bytes with raw literals, spell the bounded overflow close observation inside the loop, extract the budget detail label and retain primitive-only cold-request assertion formatting. The native signal fixture also receives its explicit string parameter annotation.
Forced full Root pnpm run ci passes 373 files / 8,397 tests / 12 skips, 23 initial tasks including build dependencies, six package build targets, seven build/format tasks and all offline smokes. Explicit strict/checkJs inclusion of the changed native fixture passes separately. Sixty-three synthetic loader cases generate identical bytes and parse; 32 event/state cases keep the exact capture cuts. These are implementation checks, not independent Group 6 acceptance. Fresh independent rounds and individual adjudication of the current 180 Sonar labels remain required. ADR-0102/0103, provider captures, Steps 7–8/12 and final W7/PR acceptance remain open. No additional paid call or ADR-dependent implementation occurred.
Two complete independent reviews of c6c55b3b..bbe01091 verify one new MCP-consent documentation discrepancy and two pre-existing overflow-smoke error/close-join failures. After both full Parent physical and semantic audits, the narrow correction observes native errors immediately, joins close on every failure and limits the documented no-MCP guarantee to budget abort. Actual offline overflow smoke, tools lint and configured tools typecheck pass. Review/capture/guard qualifications and the historical 180/current 170 Sonar boundary remain explicit in the round-1 record. Fresh round 2 is required; Group 6, both Proposed decisions, live captures, Steps 7–8/12 and final W7 acceptance remain open.
Two fresh independent reviews and complete qualified Parent audits verify missing permanent native failure regressions and the unregistered budget abort spelling. The actual smoke now shares its private runner with five native failure controls; separately reverting error observation or final close joining fails the mandatory smoke, and exact restoration passes. The canonical command is corrected to budget resume <runId> --abort. Interrupted prior evidence is not counted as a completed round. Tools lint, configured typecheck and offline smoke pass; required CI at 7c29c462 passes separately. Fresh round 3 is required. Group 6, Proposed ADR-0102/0103 approval and dependent implementation, Group 3's High, provider evidence, Steps 7–8/12, Sonar and final W7/PR acceptance remain open.
Two complete cumulative reviews and a fresh current Sonar adjudication cover all 17 paths / 27 hunks through 82acfcac and all 175 current keys. Parent verifies all three complete reports, physical self bindings and source/native evidence before releasing the freeze. The actual mandatory smoke passes at head/restoration and under CI=true; separate error-observation and close-join removals fail its permanent controls. Generated loader/body bytes are unchanged. Root full CI passes 373 files / 8,398 tests / eleven skips; exact-head GitHub required CI and coverage pass separately. No new material implementation finding remains. Group 6 is accepted within scope. Sonar remains failed pending three caller-scoped security dispositions; the complete keyed registry and proposed texts are linked from the review. Proposed ADR-0102/0103 approval and dependent implementation, Group 3's lifecycle High, Gemini/Anthropic missing provider evidence, Steps 7–8/12 and final W7/PR acceptance remain open. No additional paid call or ADR-dependent implementation occurred.
Round 1 checks the eight maintainer items and verifies a reachable Gemini SDK prototype-key merge conflict. The corrected Proposed ADR-0102 explicitly narrows non-cap data to refuse own __proto__ keys; it preserves the cap exception and unchanged measured subset. Proposed ADR-0103 now specifies real primary publication/delivery observation, gap/abandonment refusal and the terminal-free local-stream qualification. Two fresh complete round-2 reviews find no further material decision-level issue. Both ADRs remain Proposed; the additional compatibility narrowing and lifecycle/CLI decision require maintainer approval before dependent code. No runtime acceptance or new provider result is claimed. The supplied Gemini 3.1 Flash Lite Free Tier quota is 250K input TPM, below its 1,048,576-token window; the capture access/authorization gate remains open. Ownership/lifecycle implementation Highs, Steps 7–8/12, Sonar and W7/PR acceptance remain open.
The maintainer approves the latest ADR-0102
and ADR-0103,
including their 2026-10-08 clarifications. Both are Accepted. Dependent implementation is
authorised on development; earlier approval restrictions remain historical records.
Complete the remaining work in these reviewable increments:
- Own request data and candidate cap projections at invocation; prove actual SDK generate/stream parity and typed refusals, then reuse the measured construction through core/media handoffs.
- Implement engine departure, primary delivery observation, structured receipt authority and retained exact-fence writer lifetimes; preserve bounded terminal publication.
- Derive parked-node deadlines and integrate acknowledged CLI input/host departure, final receipt disposition, exit 8 and the canonical diagnostic contract.
- Obtain the two missing genuine provider records, complete Step 7 classification and Step 8 compaction/recovery, and close Step 12 through whole-wave acceptance and document updates.
Each increment receives an implementation commit, fresh independent review, confirmed fixes and another fresh review before acceptance. These are implementation subdivisions of the approved work, not replacement W7 step numbers. The maintainer authorises paid Gemini access and necessary new provider work with a 2 USD test-call limit. Billing setup requiring a separate legal agreement or a larger minimum prepayment remains an explicit account-setup action; no new provider request has been made under this authorisation yet. Implementation, provider evidence, final CI/coverage/Sonar and all six remaining W7 register items remain open until their actual acceptance evidence lands.
The maintainer completed Gemini billing; the selected Gemini 3.5 Flash-Lite model has paid
Tier 1 access and a 4M input-TPM quota. The existing OS-keychain account was used through stdin,
without exposing its key. One authorised Gemini request returned the genuine HTTP 400
INVALID_ARGUMENT input-overflow body; its exact v1 artifact is preserved in the
fixture index. Four of five genuine records now exist. Only Anthropic's native
model_context_window_exceeded response is missing. The earlier approval sequence's
no-new-call/two-missing statements describe its publication checkpoint, not the present state.
One free Anthropic token-count request calibrated 199,762 input tokens. One accepted Haiku 4.5
probe ended with end_turn, so it is retained privately and does not establish native overflow.
Its reported 199,762 input / 1,505 output tokens imply 0.207287 USD at the published rates; this
is usage-priced evidence, not an invoice. The Gemini overflow was an unsuccessful 400 request;
no successful token usage or invoice was returned. The bounded next Anthropic probe, available
only through explicit capture purpose selection, remains subject to the maintainer's 2 USD
limit and independent capture-tool review. No automated paid retry is authorised or introduced.
Fresh ownership foundation round 2 accepts only the internal inert-graph helper after descriptor/native-brand fixes and separate mutable-alias controls. Full request/cap associations, actual SDK handoffs and core measured-round reuse are not implemented or accepted by that record. ADR-0102/0103 implementation, the remaining provider record, Steps 7–8/12, final CI/coverage/Sonar and all six W7 register items remain open.