Phase 10: deviation reconciliation — the checklist, the drained inbound list and the release register - #104
Conversation
Status maps every three-place code with #standard? for the protocol range (HTTP-10); Protocol admits HTTP/1.0 (HTTP-33); URL.parse! wraps every URI error and refuses a host-less http URL (HTTP-47); Model.own drops a default proc; the HeaderSyntax predicates are total; a closed stream is refused at Body.stream; the NaN and Complex duration guards; the configuration chain no longer nests per configure (CFG-13); the async logging step stops counting the caller's continuation; the proxy warning's credential belt is unanchored (OBS-11, CFG-22). Every shipped signature gains the SPDX header (NFR-13). The runtime manifest gains Protocol::HTTP_1_0 and Status#standard?; the pins the repairs invalidated move with them.
Both ResponseMappers now hand HTTP/1.0 and any three-place status to the model (TRANSPORT-24); their YARD says so, and net_http's stray @decode_content tag is backticked. The adapter pins that used HTTP/1.0 as the unmappable head now use HTTP/1.2. Every shipped signature in the four adapter gems gains the SPDX header (NFR-13).
TransportSuite.run delegates to Runner.run, tearing its fresh cases down through the around wrapper so Runner is not widened. The default gem-name rule in PackagingCase reaches all six namespaces: -core is the root and http/json are acronyms (NFR-15). The NFR-13 pin over this repository's own signatures now expects :passed.
Twenty-four blocking gates, the three new ones in DEFAULT_GATES and in CI's gates job, each with a fixture workspace that turns it red. The require allowlist refuses a dexpace/ path with a dot segment, and the rubocop gate runs with --ignore-parent-exclusion.
A requirement ID attributed to a product-spec chapter that does not carry it, read clause by clause, with ranges expanded and negations skipped.
All nineteen rows carry a verdict citing gems/ paths and defined constants, and the amendment set is C1-C18. It rides here because gates:ledger_audit reads it at run time.
Review round 0 of phase 10 found four code-layer defects. R0-4: the proxy warning belt stopped at the first '/', '?' or '#', so a password holding one leaked its prefix into Kernel#warn and the config sink. ProxyResolution now scrubs the raw value from the authority's start through the LAST '@' before the redactor runs. R0-5: Status.of still threw outside 0..999, narrower than HTTP-10's "any code MUST return a Status". Construction is now total over Integer; #standard? stays the protocol range. R0-6: docs/deviations.md row 10 cited send(:new) as the bypass, but it runs the validating #initialize. The row is now "confirmed, narrower" (allocate and duck typing remain) with amendment C19. R0-8: the chapters check listed "appears in" as a negation, blinding it to the usual positive attribution. An ID run followed by that phrase now binds forward to the chapter it introduces.
The one rubocop:disable phase 10 added in tools/ledger_audit.rb
carried no reason; it now says why the row check threads the root
and the resolver (review round 1, R1-3).
The chapters check's forward "appears in" binding turned a negative
sentence ("SEAM-13 does not appear in <chapter>") into a positive
attribution. NEGATION gains "not appear in", "does not appear" and
"do not appear" (R1-4).
Review round 2 (R2-2) found two more negated spellings of 'appears in' that bound forward and would fire as a wrong attribution: 'never appears in' and 'doesn't appear in'. Add 'never appear' and "n't appear" to the chapters check's NEGATION union; 'appears nowhere' was already there.
One failing-first test per repair, each run red on the untouched base; a fiber race under a real reactor proving BearerStamper and AsyncBearerStamper fetch once (XCUT-12, AUTH-34, AUTH-37); five interleaving- or environment-dependent tests made deterministic, with PinnedCeiling holding the materialisation ceiling at its default. Each new gate is tested through its module and through its rake task against a fixture workspace, and the chapters check keeps the two phase-8 pre-correction lines as regression fixtures.
Seven proxy spellings whose password holds '/', '?', '#' or a second '@' now assert that neither Kernel#warn nor the config sink carries the username or any password prefix (review round 0, R0-4). Two chapters cases prove an "appears in" attribution binds forward: a wrong one fires, a right one does not, and the phase-5 two-run shape no longer binds its second run to the first run's chapter (R0-8).
Three proxy spellings put an '@' inside the password ahead of a reserved character; a scrub through the first '@' leaves c/, b# and y/ in the warning, and the committed case now fails on that mutant on 4.0.6 and 3.2.11 (review round 1, R1-1). A chapters case drives "does not appear in", "do not appear in" and "did not appear in" through the probe and expects no finding (R1-4).
The chapters check's negated-verb case now also drives 'never appears in', "doesn't appear in", "don't appear in" and 'appears nowhere in' (review round 2, R2-2). Removing 'never appear' or "n't appear" from NEGATION turns the case red on the spelling it covers.
The checklist (203 requirement rows, the 65 inbound bullets, the repairs and the guards run red); the design's as-built addendum P10-21 to P10-36; every inbound bullet dated and dispositioned on the roadmap with the phase-10 status note; docs/first-release.md narrowed and extended; earlier phases' records corrected by dated brackets; CLAUDE.md, the READMEs, the gate page and the housekeeping skill brought to twenty-four gates and nine probe checks.
R0-1: seven own rows carried a verdict copied from 3a that was false for their ID; SEAM-6 to SEAM-9 now cite phase 2's Registry and IO-30, IO-31 and IO-39 say retired apparatus. R0-9: SEAM-22 takes phase 2's "mechanism retired, surviving clause" mark; the tally moves to 107/11. R0-2: four sdk-documentation passages describe the as-built Protocol (http/1.0) and Status (total over Integer, #standard?). R0-3, R0-12: CLAUDE.md names net_http's YARD and test changes and C14's origin. R0-4, R0-5, R0-6, R0-8 are recorded: repairs 27-29, guards 32-35, P10-27 and P10-31 amended, P10-37 and P10-38 added, and C19 carried through first-release.md, the roadmap and CLAUDE.md. R0-7 routes the 5c probe-claims and 7b sse.md items to first-release.md's residues. R0-10, R0-11: brackets moved to sentence ends and a struck trigger's old body struck too.
HTTP-19 and BODY-9, carried by lib repairs 6 and 7, gain cross-reference rows, so the added set is 17 and the checklist holds 205 requirement rows; CLAUDE.md and the roadmap's status note move with it (review round 1, R1-2). The CFG-22 row and the Guards table record the last-@ pin and the negated chapters verb (R1-1, R1-4). The dexpace-async-async entry in docs/first-release.md stops pointing at the closed XCUT-12 trigger as live (R1-5).
Review round 2 (R2-1): docs/first-release.md's RBS-baseline entry still said NFR-4 stays pending until a v* tag exists, against P10-35 and the checklist's NFR-4 row. The entry now says it is design §9's release-tag mechanism, that NFR-4 is met through the surface snapshot, and that gates:sig_diff is what waits for a tag. The checklist gains a Review round 2 section and Guards 38 for the chapters check's two new negations (R2-2).
Review record for the phase 10 stack (#102 → #103 → #104)4 independent reviews, each by a fresh agent with no memory of the previous one, each re-running every gate itself on every tip (4.0.6 every gate individually at the code tip and the full
Nothing was skipped. Round 0 → fixed in round 1
Round 1 → fixed in round 2
Round 2 → fixed in round 3
Round 3 (final) — approve, no findingsWhat the final reviewer verified by experiment, both interpreters
Tips reviewed at the final round: code Before the push, run by the maintainerIn a detached worktree at the docs tip: full Before the review started, a read-only cross-check read the phase-10 plan (written 2026-09-13, before phase 3 existed as code) against the tree and fed 35 as-built points plus the maintainer's eight decisions into the implementer's brief — among them dropping Task 8 (its defect is absent), turning Task 9 into a verification, the "small repairs" task, and repairing phase 5b's live proxy credential leak rather than filing it. |
Closes #34. Third and last PR of phase 10's stack — the documentation and the phase record. 34 files, +1,190 / −179. With it, all eleven phases of the v1 roadmap are on
main. Nothing is published: every gem stays at0.0.0, no tag is cut.What lands
docs/first-release.mdunsatisfied-MUSTs entry) plus 81 cross-reference rows, and two tables phase 9's did not need — the repairs (each with its failing test) and the inbound list, dispositioned.docs/first-release.md(thirteen of them the amendment set) · 1 withdrawn — none carried forward. The ~30 reviewer leftovers from the per-phase notes that had been routed nowhere are dispositioned in their own table.docs/first-release.mdwalked line by line: the frozen-chapter amendment blocker now namesC1–C19and the consolidation of every phase's ledger rows into design §10 (a human's act — the trees are frozen); a new blocker enumerates the one-time surface choices phases 4–8 said to "decide before the first tag"; port readings, post-release residues and the closedXCUT-12trigger.P10-21–P10-38) and its datedR1widening; dated bracketed corrections in eighteen earlier-phase documents (placement only, no rewrites); the roadmap's phase-10 status note.docs/README.md,docs/sdk-documentation/(quality-gates page's three new rows;Protocol/Status/URLbehaviour on the http, transport and serde pages), and the housekeeping skill's nine checks.One process-rule change for the maintainer to confirm: CLAUDE.md's routing rule now says the inbound list was drained on 2026-09-25 and audit-or-repair work found from here goes to
docs/first-release.md.Verification
Four independent reviews by fresh agents, a fix round between each: round 0 1 blocking / 8 / 3 → round 1 0 / 3 / 2 → round 2 0 / 1 / 1 → round 3 approve, 0 / 0 / 0. 89 mutations across the rounds, 86 caught, every survivor accounted for. The review record is in the comment below. At this tip, run by the maintainer: full
bundle exec rake(24 gates) green on 4.0.6, honest RuboCop over 784 files clean, the probe clean with nine checks, the knowledge verifier OK; 3.2.11 and 3.3.12 matrix sets green; frozen trees untouched.Known follow-ups
None from the final review. What this phase did not repair is now a dated
docs/first-release.mdline with its pick-up condition — there is no later phase.