Skip to content

release(v0.62.0): "Reach is part of correctness" — 9 artifacts, 8 implemented - #1158

Merged
avrabe merged 4 commits into
mainfrom
release/v0.62.0
Sep 6, 2026
Merged

release(v0.62.0): "Reach is part of correctness" — 9 artifacts, 8 implemented#1158
avrabe merged 4 commits into
mainfrom
release/v0.62.0

Conversation

@avrabe

@avrabe avrabe commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

v0.62.0 — "Reach is part of correctness"

Release assembly: version bump, pin sweep, and the [0.62.0] CHANGELOG entry.

9 artifacts, 8 implemented. RQ-62-REACH stays proposed deliberately —
its done-when names an 805-module census, this release delivered a 243-module
reachable subset, and the artifact records the gap rather than claiming the
status.

What this PR contains

  • 0.61.00.62.0 across Cargo.toml (workspace + 10 path-dep pins),
    MODULE.bazel, npm/package.json, artifacts/status.json, Cargo.lock
  • CHANGELOG.md [0.62.0]
  • docs/status/FEATURE_MATRIX.md + artifacts/status.json regenerated via
    claim_check.py claims.yaml --emit-status

Notes derivation

Written against merged code and claims.yaml on the tree, not PR bodies —
the v0.57 cold review found four errors in same-author release prose derived the
other way. Every load-bearing number was re-derived in this session, including
four that came from commit prose and were checked against the shipped scripts:
MIN_DERIVED_SLOTS = 4, MIN_ONLINE = 2, 30 loop-conformance unit tests, and
runs-on: [self-hosted, linux, x64, light].

Two things the notes say that the release would rather not

  1. It subtracted nothing. 6,871 insertions against 22 deletions.
  2. The subtraction ratchet moved the wrong way. selector_lines_code
    19,213 → 19,227 (+14), waived, bound to the exact value, reason printed in
    claims.yaml. The +14 is the Multi-memory phase 2: per-memory MPU isolation is unreachable — --safety-bounds mpu and multi-memory have disjoint paths #1145 decline stating its root cause at the
    decline site; nothing could be deleted in exchange, because the decline is
    the only handling that class has. Every other pin is flat.

A reach-and-gates release should look like one in the metric that exists to
detect it. Recorded rather than smoothed over.

Gate state

  • claim gate 58/58
  • pin sweep OK — path-dep pins + MODULE.bazel + Cargo.lock + npm all at 0.62.0
  • loop-conformance step 0 (release identity) cleared by this bump
  • loop-conformance step 7 (clean-room review) is being run now; its record lands
    in docs/reviews/v0.62-cold-review.md before the tag

Refs #242, #1017, #1062, #1102, #1131, #1132, #1133, #1136, #1143, #1145

…from merged code

Theme: "Reach is part of correctness."

Version 0.61.0 -> 0.62.0 across Cargo.toml (workspace + 10 path-dep pins),
MODULE.bazel, npm/package.json, artifacts/status.json and Cargo.lock. Pin
sweep green.

CHANGELOG [0.62.0] written against MERGED CODE and claims.yaml ON THE TREE,
not against PR bodies — the v0.57 cold review found four errors in
same-author release prose derived the other way. Every load-bearing number
re-derived in this session:

  - census table + ranked blockers: artifacts/release-v0.62/RQ-62-REACH.yaml
  - ratchet deltas: claims.yaml at v0.61.0 tag vs HEAD (selector_lines_code
    19213 -> 19227, +14, one new waiver bound to the exact value; every
    other pin flat)
  - 630 Qed / 2 Admitted: coq/STATUS.md
  - 324,646 emulations / 158 wired scripts: oracle_wiring_check.py
  - MIN_DERIVED_SLOTS=4, MIN_ONLINE=2, 30 loop-conformance unit tests,
    `runs-on: [self-hosted, linux, x64, light]`: read out of the shipped
    scripts and ci.yml, not from the commit prose that claimed them

The notes state two things the release would rather not say: it SUBTRACTED
NOTHING (6,871 insertions / 22 deletions) and the subtraction ratchet moved
the wrong way, waived, with the reason printed. A reach-and-gates release
should look like one in the metric that exists to detect it.

docs/status/FEATURE_MATRIX.md + artifacts/status.json regenerated via
`claim_check.py claims.yaml --emit-status`; claim gate 58/58.

Refs #242, #1017, #1062, #1102, #1131, #1132, #1133, #1136, #1143, #1145

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
@avrabe

avrabe commented Sep 6, 2026

Copy link
Copy Markdown
Contributor Author

Release-review finding, fixed in b9450a66: the emulation floor had 1,892 of slack

Found while cutting this release, on this release's own new oracle.

The #910 ratchet's stated purpose is to catch "an oracle lost execution". It
enforced --min-emulation-floor 322754 against a declared total of 324640
at v0.61.0 and 324646 here. That slack is larger than most single oracles
declare — so an oracle could stay wired, stay referenced, and drop to zero
executions while the gate built to notice that stayed green.

Demonstrated in an isolated worktree rather than reasoned about:

mutation before the bump why
delete mem_isolation_red_1145.py whole exit 1 caught by the dangling-CI-reference check, not the floor — total only fell to 324,640, still above 322,754
oracle stays wired, declares emulations >= 0 exit 0 — green the ratchet's own failure mode, invisible
same mutation, after the bump exit 1 RATCHET BROKEN: 324640 < 324646

Control (unmutated tree, tightened floor) stays exit 0, so the new floor is not
merely stricter — it's correct.

Two mechanisms guard this oracle set and they catch different things:
referential integrity catches deletion; the floor is supposed to catch
execution loss. Only the second is the ratchet's job, and it was the one
that couldn't fire.

The slack was inherited, not introduced here — it had simply never been
tightened when oracles landed. The fix pins the floor equal to the declared
total, so there is no slack to hide in, with the invariant written at the step:
a landing oracle bumps both in the same PR.

claims.yaml's SYNTH-ORACLE-CHECK-FLOORS-910-CI verbatim pin caught the edit
(57/58) before it could ship silently — the pin working exactly as designed.
58/58 after.

Note for the cold review record

The independent review was dispatched against 0a8c1e1f and will name that
commit. b9450a66 landed after it started and contains only this floor fix
plus its CHANGELOG entry and pin update. The review record will say so rather
than silently claiming to have covered it.

avrabe and others added 2 commits September 6, 2026 07:58
…ced 1,892 below what it declared

Found while cutting v0.62, on THIS RELEASE'S OWN NEW ORACLE, and confirmed
independently by the release's cold review.

THE DEFECT. `oracle_wiring_check.py --min-emulation-floor N` is the #910
ratchet; its own failure text states its purpose — "An oracle lost
execution, or a floor was lowered." It enforced 322754 against a DECLARED
total of 324640 at v0.61.0 and 324646 here: 1,892 emulations of slack,
more than most single oracles declare. So an oracle could stay present,
stay wired, stay referenced, and drop to ZERO executions while the gate
built to notice exactly that reported green.

DEMONSTRATED in an isolated worktree, not reasoned about:

  mutation 1  delete mem_isolation_red_1145.py whole
              -> exit 1, but by the DANGLING-CI-REFERENCE check, NOT the
                 floor (total fell only to 324640, still above 322754).
                 Two mechanisms, two different failures; only one is the
                 ratchet's job and it was the one that could not fire.
  mutation 2  oracle stays wired, declares `emulations >= 0`
              -> exit 0. GREEN. The ratchet's stated failure mode, blind.
  after fix   same mutation -> exit 1, "RATCHET BROKEN: summed floors
                 324640 < recorded minimum 324646"; unmutated tree exit 0,
                 so the floor is CORRECT, not merely stricter.

This is #1113 one level up: that was INTRA-oracle (a decline half
contributing zero to its own floor, fixed per-oracle in #1112); this is
INTER-oracle (the summed ratchet below the summed declarations). Same
sentence — the floor cannot see part of what it asserts — at two scales,
one release apart. The per-oracle fix was correct and did not imply the
aggregate was tight; nobody checked, because every gate reporting on this
floor reports it PRESENT AND WIRED, never TIGHT.

The slack was INHERITED, never introduced — so the fix is an INVARIANT,
not a number: enforced floor EQUALS declared total, pinned verbatim, a
landing oracle bumps both in the same PR. claims.yaml's
SYNTH-ORACLE-CHECK-FLOORS-910-CI pin caught the edit at 57/58 before it
could ship silently.

ALSO IN THIS COMMIT — two cold-review corrections:

1. A FALSE CLAIM I WROTE, propagated to three files. Release prose said
   the dynamic index in the #1102-residual fixture was load-bearing
   because "a constant index devirtualizes and the table never
   materializes." FALSE. Compiling a const-index call_indirect on ARM
   --relocatable emits `movw r2, #0` / bounds check / `ldr.w ip, [fp, ip]`
   / `blx ip` — a runtime table load and an indirect call, same shape as
   the dynamic case; synth has NO devirtualization pass at all (verified
   against emitted bytes, and no such code exists in the tree). The guard
   is index-insensitive and refuses the const-index dangling shape too, so
   the fix and its red-first evidence are UNAFFECTED — what was wrong is
   the RATIONALE, which is what a future contributor reasons from.
   Corrected in CHANGELOG.md, RQ-62-TABLEDANGLE.yaml and
   tabledangle_1102_elem.rs, each stating the correction rather than
   quietly deleting the sentence.

2. R10 ATTRIBUTION. The floor fix first landed with no artifact or issue
   anchor in its subject, and status_evidence_check R10 — the gate added
   in #1124 for exactly this — failed it: "delivery-shaped commit in the
   release window is attributable to NO release artifact." It was right.
   Fixed properly rather than by loosening: RQ-62-FLOORTIGHT is now a real
   v0.62 artifact carrying the finding, and this subject names it.

Refs #910, #1102, #1113, #1124, #1145

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
… and apply its four prose corrections

The clean-room review record loop_conformance_check step 7 requires, written
by an independent reviewer with no inherited framing, dispatched against
0a8c1e1. Its text is committed UNEDITED; the disposition table is additive.

WHAT IT FOUND: 1 MUST-FIX, 1 SHOULD-FIX, 5 NOTEs, 4 unverifiable-as-stated,
~20 claims independently verified by execution — including a full re-run of
the acceptance census from a freshly built binary (27/243, 40/243, 46/243
and every ranked blocker reproduced exactly), and a rebuild of the PRE-FIX
compiler at 858ff8d^ to reproduce the #1102-residual hole end-to-end
(object ships exit 0, links clean, zero UNDEF symbols).

BOTH ACTIONABLE FINDINGS WERE MINE, AND BOTH ARE FIXED:

  MUST-FIX 1  the tip failed its own required Claim Check (R10, the rule
              added in #1124 for exactly this shape). Fixed by giving the
              work the artifact it deserved — RQ-62-FLOORTIGHT — not by
              loosening the rule. Now exit 0, 2 delivery commits, 2
              attributed.

  SHOULD-FIX 1  a FALSE claim I wrote, propagated to three files: that a
              constant call_indirect index devirtualizes so the table never
              materializes. Re-verified against emitted bytes before acting
              rather than taking the review's word — `movw r2,#0` / bounds
              check / `ldr.w ip,[fp,ip]` / `blx ip`. It does not
              devirtualize; synth has no such pass. Corrected in all three
              places AS A STATED CORRECTION, so the wrong rationale cannot
              be re-derived from history. The fix and its red-first evidence
              are unaffected — only the rationale was wrong, which is the
              dangerous shape: a correct artifact resting on a reason a
              future contributor would reason from.

NOTES 1, 3, 4 applied to the CHANGELOG, each narrowing a sentence that
claimed more than the code or the data supports:
  - the diff-stat's scope is now stated (feature merges; release commit
    +213/-51 named separately)
  - the 81%->11% comparison now says the denominator differs (307 vs 243),
    that the subcounts come from the v0.59 artifact rather than this
    release, that per-module records were not preserved, and that the two
    subcounts may overlap
  - "fail-closed on unknown mnemonics" now says what the code does:
    undecodable instructions and zero-instruction scans always refuse; an
    unknown MNEMONIC refuses only when its operand text names a reserved
    register

NOTE 5 (census hex-immediate collapse) is deliberately NOT fixed here and
the disposition says why: no number in the release is wrong, and changing a
measurement script mid-cut, under the oracle it feeds, risks the census for
no gain. Carried to v0.63, where re-measurement is increment 1.

Step 8's PR-head-vs-merge attestation slot is stubbed in the record with
its rationale; it is filled at merge time. The gate labels it ATTESTED in
both modes, so filling it is a deliberate act — an attestation with nothing
behind it is the vacuity this release spent its scope finding.

Refs #910, #1102, #1124, #1136

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
@avrabe

avrabe commented Sep 6, 2026

Copy link
Copy Markdown
Contributor Author

Independent cold review complete — and both actionable findings were mine

Record committed at docs/reviews/v0.62-cold-review.md (reviewer's text
unedited; a disposition table is additive). Dispatched with no inherited
framing against 0a8c1e1f.

1 MUST-FIX · 1 SHOULD-FIX · 5 NOTEs · 4 unverifiable-as-stated · ~20 claims
verified by execution.

What it did to verify, rather than read

Both actionable findings, fixed — not waived

MUST-FIX — the tip failed its own required Claim Check. My floor-fix commit
was delivery-shaped with no artifact or issue anchor, so R10 refused it — the
rule added in #1124 for exactly this shape, firing on its author.
Fixed by
giving the work the artifact it deserved (RQ-62-FLOORTIGHT, carrying the
finding and its red-first evidence) rather than loosening the rule or bolting a
landed: onto an unrelated artifact. Now exit 0, 2 delivery commits — 2 attributed.

SHOULD-FIX — a false claim I wrote, in three files. Release prose said the
dynamic index was load-bearing because "a constant index devirtualizes and the
table never materializes."
I re-verified against emitted bytes before acting
rather than taking the review's word:

movw  r2, #0          ; the constant, materialized
cmp   r4, ip / bcc    ; bounds check still emitted
ldr.w ip, [fp, ip]    ; RUNTIME TABLE LOAD
blx   ip              ; INDIRECT CALL

It does not devirtualize — synth has no such pass at all. Corrected in
CHANGELOG.md, RQ-62-TABLEDANGLE.yaml and tabledangle_1102_elem.rs, each
as a stated correction so the wrong rationale can't be re-derived from
history. The fix, its red-first evidence, and the dynamic-index fixture are
unaffected — only the rationale was wrong. That's the dangerous shape: a
correct artifact resting on a plausible reason nobody checked, and the reason is
what the next contributor reasons from.

NOTEs 1, 3, 4 applied — each narrowing a sentence that claimed too much

  • diff-stat scope now stated (feature merges; release commit +213/−51 named)
  • the 81%→11% comparison now says the denominator differs (307 vs 243), that
    the subcounts come from the v0.59 artifact rather than this release, that
    per-module records weren't preserved, and that the 125 and 77 may overlap
  • "fail-closed on unknown mnemonics" now says what the code does: undecodable
    instructions and zero-instruction scans always refuse; an unknown mnemonic
    refuses only when its operand text names a reserved register

NOTE 5 (census hex-immediate collapse) is deliberately not fixed here,
and the disposition says why: no number in the release is wrong, and changing a
measurement script mid-cut under the oracle it feeds risks the census for no
gain. Carried to v0.63, where re-measurement is increment 1.

Branch anchor re-cut

The two mid-review commits were collapsed into one attributed commit. Tree hash
captured before and after — identical (24d0c109…), so the rewrite lost
nothing.

Gate state

status_evidence_check 0 · claim_check 58/58 · oracle_wiring_check
0 at the tightened floor · loop-conformance step 7 DERIVED-PASS, one slot
left (MC/DC on commit, waiting on CI).

…, and make the NOTE 5 carry a reference

Two consistency fixes, both prompted by the cold review's "unverifiable as
stated" section rather than by a finding.

1. THE 17-HOUR FIGURE. The review correctly listed "the federated-graph job
   validated nothing for 17 hours" as a CI-history claim not derivable from
   the repo. I went looking: ci.yml run history shows the 09-03 main runs and
   the fix landing, but the federated job is ADVISORY, so per-job validation
   history is not reconstructable from run conclusions. The figure is my own
   contemporaneous observation recorded on #1143 — real, but not checkable by
   a later reader.

   That is the SAME epistemic status as the v0.59 partial/silent-drop
   subcounts, which this release already handles by ATTRIBUTING them rather
   than asserting them (NOTE 3). Treating the two differently would be
   arbitrary, so the federated claim is now attributed the same way: the
   window is named as something #1143 recorded, not as something the notes
   assert. The FIX itself is verified and unchanged — only the duration was
   ever taken on faith.

2. NOTE 5's CARRY IS NOW A REFERENCE, NOT A PROMISE. Filed as #1159. The
   disposition previously said "carried to v0.63", which is exactly the kind
   of claim this project does not accept from anyone else. The issue also
   records why it is more than cosmetic: the histogram's job is RANKING, and
   a cause fragmented across N buckets is systematically under-ranked against
   a cause with no varying payload — which is the input v0.63 plans to
   prioritise from.

Refs #1143, #1156, #1159

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
@codecov

codecov Bot commented Sep 6, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@avrabe
avrabe merged commit 569ca75 into main Sep 6, 2026
64 checks passed
@avrabe
avrabe deleted the release/v0.62.0 branch September 6, 2026 10:01
avrabe added a commit that referenced this pull request Sep 6, 2026
…ult, and drop a number that goes stale at tag time (#1160)

Two pre-tag obligations, batched into one PR so #1158's 64-job CI was not
restarted for prose.

1. STEP-8 ATTESTATION, MEASURED. loop_conformance_check labels
   PR-head-vs-merge ATTESTED in BOTH pretag and retro mode (squash-merge head
   refs are not durably fetchable at audit time) and directs the result into
   the step-7 review record. Filling it is therefore a deliberate act:

     PR head  59441a8
     merged   569ca75
     git diff <PR head> <merged>  =  0 LINES

   So what CI verified, what the independent review audited, and what the
   v0.62.0 tag will name are byte-for-byte the same tree.

   Recorded alongside it: the four merge-ritual checks as they actually stood
   (9/9 required contexts green BY NAME from branch protection, baseRefOid ==
   origin/main at 5e6bc44, zero non-advisory reds across 64 checks,
   status_evidence exit 0 with 2 delivery commits / 2 attributed) and the
   CONFORMS verdict that preceded the merge.

   An attestation with nothing behind it is exactly the vacuity this release
   spent its scope finding — a slack floor, a rule blind to an unattributed
   commit, a sentence nobody checked. Leaving this one empty while shipping
   those findings would have been incoherent.

2. A NUMBER THAT GOES STALE AT TAG TIME. Caught on a final read-through of
   the notes. The entry said "the release commit itself adds a further
   +213/-51" — true when 0a8c1e1 was the ONLY release commit, wrong now that
   there are four and wrong again after this one. The fix is not a fresher
   figure but NO figure: state the scope (feature merges vs release-assembly
   commits) and drop a number that keeps moving until the instant of tagging.
   Same discipline as attributing the 17-hour and v0.59-subcount figures
   rather than asserting them.

Refs #1136, #1158


Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant