Skip to content

fix(release): remove broken ./publish verify step — unblocks crates.io publish (#146) - #192

Merged
avrabe merged 1 commit into
mainfrom
fix/remove-broken-verify-146
May 30, 2026
Merged

avrabe merged 1 commit into
mainfrom
fix/remove-broken-verify-146

Conversation

@avrabe

@avrabe avrabe commented May 30, 2026

Copy link
Copy Markdown
Contributor

The #146 verify step (cargo package per crate, v0.11.6) blocked the v0.11.7 crates.io publish: cargo package resolves path-dep version requirements against crates.io during upload prep, so dependents fail with failed to select a version for synth-core = ^0.11.7 on a first publish — the same chicken-and-egg as --dry-run (#144). I validated #146 locally against the already-published 0.11.6, which masked this. Removing the step (publish already works without it, v0.11.4/.5/.6). v0.11.7 is being re-published via workflow_dispatch on this branch. Reopens #146.

🤖 Generated with Claude Code

The verify step added in #146 (v0.11.6) runs `cargo package` per crate, which
resolves path-dep VERSION REQUIREMENTS (`synth-core = "^0.11.x"`) against the
crates.io index during upload prep — so on the FIRST publish of a new version,
every dependent crate fails with "failed to select a version for synth-core =
^0.11.x" (the deps aren't published yet). This is the SAME chicken-and-egg that
sank v0.7.0's `--dry-run` verify (#144); `cargo package` does NOT avoid it
(confirmed: it only passes when the version is already on crates.io). It blocked
the v0.11.7 crates.io publish.

Remove the step. Compile errors are caught by CI test/build (path deps, no
chicken-and-egg); `./publish publish` validates metadata as cargo's own
pre-upload check. Reopening #146 — the fail-fast it asked for is not achievable
with cargo package.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@avrabe
avrabe merged commit f90f99a into main May 30, 2026
9 checks passed
@avrabe
avrabe deleted the fix/remove-broken-verify-146 branch May 30, 2026 13:13
@codecov

codecov Bot commented May 30, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

avrabe added a commit that referenced this pull request Jul 1, 2026
#146) (#548)

`scripts/publish.rs::verify` already used `cargo package` per-crate, but
that still hits the crates.io chicken-and-egg for dependent crates on a
first publish of a new version: cargo verifies each packaged crate
outside the workspace, downloads its deps from the index, and fails when
the new version isn't published yet. Empirically confirmed at an
unpublished 0.99.0 — this is why PR #192 removed the CI verify step.

Fix: package the whole publishable set in ONE `cargo package -p a -p b …`
invocation. Cargo writes every member to target/package/*.crate first,
then verify-builds each against those local tarballs at the new version,
never touching the index. Confirmed at 0.99.0: dependents (synth-synthesis
etc.) compile against the just-packaged deps with nothing on crates.io.
Full verify build retained (no --no-verify), so non-compiling code is
still caught.

Also:
- Add synth-backend-aarch64 to CRATES_TO_PUBLISH. It is a hard, always-on
  dep of synth-cli (#538) but was never published — publish would (and
  the restored verify does) fail on synth-cli's unresolved dep. The
  restored fail-fast check is exactly what surfaced this latent gap.
- Restore the `./publish verify` pre-flight step in
  publish-to-crates-io.yml and rewrite the now-false comment (it asserted
  cargo package cannot avoid the chicken-and-egg; it can, when the whole
  set is packaged together).
- Update docs/release-process.md: describe the token-free verify
  pre-flight and add synth-backend-aarch64 to the published-crate table.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
avrabe added a commit that referenced this pull request Oct 8, 2026
…surement

THE ASK IS SIX WORDS AT SIX PCs, NOT THREE SLOTS. Derived from the module's own
disassembly, digests verified against the thread (c.wasm d854e5bb…, c.loom.wasm
791ab6b5…), each of the three gravity blocks reads TWO operands and the slots carried
forward from v0.81 are only the MULTIPLICANDS:

  pc 0x2498 -> offset 940   ADDEND [sp,#200] @0x2490   MULTIPLICAND [sp,#152] @0x2494
  pc 0x24c4 -> offset 936   ADDEND [sp,#216] @0x24bc   MULTIPLICAND [sp,#232] @0x24c0
  pc 0x24f0 -> offset 944   ADDEND [sp,#192] @0x24e8   MULTIPLICAND [sp,#208] @0x24ec

Two independent reasons three words could not answer the lane's question. A wrong ADDEND
and a wrong MULTIPLICAND are INDISTINGUISHABLE in the stored result, so sampling only the
multiplicands cannot name which operand is wrong. And these are general-purpose spill
homes, not dedicated operand slots: [sp,#152] is referenced 130 times in this object,
[sp,#208] 34, [sp,#232] 20 — so "the value of [sp,#152]" names no single value and each
word must be sampled AT THE PC OF ITS OWN LOAD.

WHAT THIS LANE DID NOT OBTAIN, STATED PLAINLY IN THE ARTIFACT. The runtime values were
NOT measured: qemu-system-arm and qemu-arm are both absent on the release machine and the
reporter's repository is not cloned here, so the image cannot be executed. A request
naming the six PCs was DRAFTED AND NOT SENT — it is correspondence with an external
reporter, surfaced to the maintainer rather than posted by the loop. The thread stands at
ten comments and this release added none.

THE REFUTING COMMAND HELD: the shipped oracle still reports the lowering FAITHFUL (9
assertions, 0 failures) with every refuted mechanism injectable, so v0.81's refutation
stands and the premise is intact.

THREE INSTRUMENT ERRORS, RECORDED RATHER THAN BURIED. A first grep reported FOUR
materializations of 9.81f; truncation by `head -8` hid five, and the real count is NINE.
A first store-offset attribution gave {932, 940, 936} and briefly made the carried claim
look wrong; the scan window began BEFORE its own anchor and picked up the preceding
block's `addw`. Forward-only scanning gives 940, 936, 944 — CONFIRMING the carried claim.
The brief was right and the first measurement was not.

Also corrected in the artifact: the done-when now demands all six words at their six PCs,
and the sentence calling three words "the whole lane" is gone.

AND R14 — LANDED BY THIS RELEASE'S OWN CLOSEARM LANE — NOW GOVERNS THIS ARTIFACT. The
verdict is PARTIAL, because the lane refined the measurement and did NOT name the defect,
and `leading_verdict` classifies it so from the prose rather than from a token chosen to
please the gate. PARTIAL is in the INCOMPLETE set, the status is claiming (R4-lane requires
that once the delivery commit is on main), so R14 demands that the ISSUE's fate be DECLARED:
`issue-scope: outlives`, the truthful value, because #1436 is still open and still
unexplained. No `disposition:` — R11 forbids one beside a claiming status.

PROVEN LOAD-BEARING, not assumed: with the declaration the gate is rc=0 with zero R14
findings; with `issue-scope` stripped it is rc=1 on
`R14 RQ-82-JESSDIVERGE4: verified-by opens PARTIAL while status implemented claims the
outcome holds, and no issue-scope says what that means for the ISSUE`; restored, rc=0. In
v0.81 this declaration depended on an operator remembering it. It is now mechanical.

Refs #1436

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
avrabe added a commit that referenced this pull request Oct 8, 2026
…surement

THE ASK IS SIX WORDS AT SIX PCs, NOT THREE SLOTS. Derived from the module's own
disassembly, digests verified against the thread (c.wasm d854e5bb…, c.loom.wasm
791ab6b5…), each of the three gravity blocks reads TWO operands and the slots carried
forward from v0.81 are only the MULTIPLICANDS:

  pc 0x2498 -> offset 940   ADDEND [sp,#200] @0x2490   MULTIPLICAND [sp,#152] @0x2494
  pc 0x24c4 -> offset 936   ADDEND [sp,#216] @0x24bc   MULTIPLICAND [sp,#232] @0x24c0
  pc 0x24f0 -> offset 944   ADDEND [sp,#192] @0x24e8   MULTIPLICAND [sp,#208] @0x24ec

Two independent reasons three words could not answer the lane's question. A wrong ADDEND
and a wrong MULTIPLICAND are INDISTINGUISHABLE in the stored result, so sampling only the
multiplicands cannot name which operand is wrong. And these are general-purpose spill
homes, not dedicated operand slots: [sp,#152] is referenced 130 times in this object,
[sp,#208] 34, [sp,#232] 20 — so "the value of [sp,#152]" names no single value and each
word must be sampled AT THE PC OF ITS OWN LOAD.

WHAT THIS LANE DID NOT OBTAIN, STATED PLAINLY IN THE ARTIFACT. The runtime values were
NOT measured: qemu-system-arm and qemu-arm are both absent on the release machine and the
reporter's repository is not cloned here, so the image cannot be executed. A request
naming the six PCs was DRAFTED AND NOT SENT — it is correspondence with an external
reporter, surfaced to the maintainer rather than posted by the loop. The thread stands at
ten comments and this release added none.

THE REFUTING COMMAND HELD: the shipped oracle still reports the lowering FAITHFUL (9
assertions, 0 failures) with every refuted mechanism injectable, so v0.81's refutation
stands and the premise is intact.

THREE INSTRUMENT ERRORS, RECORDED RATHER THAN BURIED. A first grep reported FOUR
materializations of 9.81f; truncation by `head -8` hid five, and the real count is NINE.
A first store-offset attribution gave {932, 940, 936} and briefly made the carried claim
look wrong; the scan window began BEFORE its own anchor and picked up the preceding
block's `addw`. Forward-only scanning gives 940, 936, 944 — CONFIRMING the carried claim.
The brief was right and the first measurement was not.

Also corrected in the artifact: the done-when now demands all six words at their six PCs,
and the sentence calling three words "the whole lane" is gone.

THE CLAIM SHAPE WAS WRONG ON THE FIRST PUSH, AND CI CAUGHT IT. This artifact first went out
as `status: implemented` with `issue-scope: outlives` and a PARTIAL verdict. #1487 reddened on
`Claim Check` — a REQUIRED context — because `verdict_prose_check` reds an INCOMPLETE prose
verdict beside a claiming status with no `disposition`, while R11 FORBIDS a disposition beside
a claiming status. `LEGAL_BESIDE_CLAIMING` has exactly ONE member, `REFUTED`, so A LANE THAT
NARROWS HAS NO LEGAL CLAIMING VERDICT AT ALL.

The gates permit a strictly safer shape and nothing pointed at it:

  status: proposed   disposition: partial   landed: <the increment>   issue-scope: OMITTED

  R4-lane      satisfied by `landed:` — its own message is a disjunction, "flip the status
               OR record the increment"
  R11          satisfied: a `disposition` IS present beside a NON-claiming status
  R12          `outlives` beside non-claiming would RED, so `issue-scope` is omitted
  verdict_prose incomplete + non-claiming passes; no carve-out needed
  R14          status not claiming, so out of population
  R3           cannot fire on a `manual:` done-when

Under this shape #1436 is NEVER placed in the authorised close set at all, where the claiming
shape authorises retirement and then relies on `issue-scope` to take it back. That is a better
answer to #1484 than the rule this release shipped for it, and R14 is looser than its sibling:
it accepts any of the 7 INCOMPLETE tokens given a declaration, where `verdict_prose` accepts
1 — a conjunction defect introduced by the fix for conjunction defects, recorded rather than
quietly corrected.

AND THE PRE-PUSH CHECK THAT MISSED IT: CHECK4's squash simulation runs 2 scripts
(`merge_gate`, `status_evidence`); the `Claim Check` job runs 33. A green CHECK4 is a true
statement about a narrower subject. This push is verified against the artifact-gate subset of
that job, with CI's own flags.

Refs #1436

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
avrabe added a commit that referenced this pull request Oct 8, 2026
…surement

THE ASK IS SIX WORDS AT SIX PCs, NOT THREE SLOTS. Derived from the module's own
disassembly, digests verified against the thread (c.wasm d854e5bb…, c.loom.wasm
791ab6b5…), each of the three gravity blocks reads TWO operands and the slots carried
forward from v0.81 are only the MULTIPLICANDS:

  pc 0x2498 -> offset 940   ADDEND [sp,#200] @0x2490   MULTIPLICAND [sp,#152] @0x2494
  pc 0x24c4 -> offset 936   ADDEND [sp,#216] @0x24bc   MULTIPLICAND [sp,#232] @0x24c0
  pc 0x24f0 -> offset 944   ADDEND [sp,#192] @0x24e8   MULTIPLICAND [sp,#208] @0x24ec

Two independent reasons three words could not answer the lane's question. A wrong ADDEND
and a wrong MULTIPLICAND are INDISTINGUISHABLE in the stored result, so sampling only the
multiplicands cannot name which operand is wrong. And these are general-purpose spill
homes, not dedicated operand slots: [sp,#152] is referenced 130 times in this object,
[sp,#208] 34, [sp,#232] 20 — so "the value of [sp,#152]" names no single value and each
word must be sampled AT THE PC OF ITS OWN LOAD.

WHAT THIS LANE DID NOT OBTAIN, STATED PLAINLY IN THE ARTIFACT. The runtime values were
NOT measured: qemu-system-arm and qemu-arm are both absent on the release machine and the
reporter's repository is not cloned here, so the image cannot be executed. A request
naming the six PCs was DRAFTED AND NOT SENT — it is correspondence with an external
reporter, surfaced to the maintainer rather than posted by the loop. The thread stands at
ten comments and this release added none.

THE REFUTING COMMAND HELD: the shipped oracle still reports the lowering FAITHFUL (9
assertions, 0 failures) with every refuted mechanism injectable, so v0.81's refutation
stands and the premise is intact.

THREE INSTRUMENT ERRORS, RECORDED RATHER THAN BURIED. A first grep reported FOUR
materializations of 9.81f; truncation by `head -8` hid five, and the real count is NINE.
A first store-offset attribution gave {932, 940, 936} and briefly made the carried claim
look wrong; the scan window began BEFORE its own anchor and picked up the preceding
block's `addw`. Forward-only scanning gives 940, 936, 944 — CONFIRMING the carried claim.
The brief was right and the first measurement was not.

Also corrected in the artifact: the done-when now demands all six words at their six PCs,
and the sentence calling three words "the whole lane" is gone.

THE CLAIM SHAPE WAS WRONG ON THE FIRST PUSH, AND CI CAUGHT IT. This artifact first went out
as `status: implemented` with `issue-scope: outlives` and a PARTIAL verdict. #1487 reddened on
`Claim Check` — a REQUIRED context — because `verdict_prose_check` reds an INCOMPLETE prose
verdict beside a claiming status with no `disposition`, while R11 FORBIDS a disposition beside
a claiming status. `LEGAL_BESIDE_CLAIMING` has exactly ONE member, `REFUTED`, so A LANE THAT
NARROWS HAS NO LEGAL CLAIMING VERDICT AT ALL.

The gates permit a strictly safer shape and nothing pointed at it:

  status: proposed   disposition: partial   landed: <NAMES THE DELIVERING PR>   issue-scope: OMITTED

  R4-lane      satisfied by `landed:` — its own message is a disjunction, "flip the status
               OR record the increment" — BUT ONLY IF the text names the PR the gate DERIVES.
               MEASURED, after this lane red on it: `_acknowledge` takes
               `PR_NUMBER.findall(subject)[-1]` with `PR_NUMBER = r"\(#(\d+)\)"` — the LAST
               PARENTHESISED number in the squash subject, which is the one the SQUASH
               APPENDS, i.e. THIS PR — and requires it in `landed_prs(fields)`. My first
               `landed:` named #1436, the ISSUE, and satisfied nothing. And no local run
               could have told me: R4-lane needs a DELIVERY COMMIT ON MAIN, so it cannot
               fire in the checkout at all — only in CHECK4's squash simulation. The local
               "ALL PASS" was a true statement about a tree with no delivery commit.
  R11          satisfied: a `disposition` IS present beside a NON-claiming status
  R12          `outlives` beside non-claiming would RED, so `issue-scope` is omitted
  verdict_prose incomplete + non-claiming passes; no carve-out needed
  R14          status not claiming, so out of population
  R3           cannot fire on a `manual:` done-when

Under this shape #1436 is NEVER placed in the authorised close set at all, where the claiming
shape authorises retirement and then relies on `issue-scope` to take it back. That is a better
answer to #1484 than the rule this release shipped for it, and R14 is looser than its sibling:
it accepts any of the 7 INCOMPLETE tokens given a declaration, where `verdict_prose` accepts
1 — a conjunction defect introduced by the fix for conjunction defects, recorded rather than
quietly corrected.

AND THE PRE-PUSH CHECK THAT MISSED IT: CHECK4's squash simulation runs 2 scripts
(`merge_gate`, `status_evidence`); the `Claim Check` job runs 33. A green CHECK4 is a true
statement about a narrower subject. This push is verified against the artifact-gate subset of
that job, with CI's own flags.

Refs #1436

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
avrabe added a commit that referenced this pull request Oct 8, 2026
…surement (#1487)

THE ASK IS SIX WORDS AT SIX PCs, NOT THREE SLOTS. Derived from the module's own
disassembly, digests verified against the thread (c.wasm d854e5bb…, c.loom.wasm
791ab6b5…), each of the three gravity blocks reads TWO operands and the slots carried
forward from v0.81 are only the MULTIPLICANDS:

  pc 0x2498 -> offset 940   ADDEND [sp,#200] @0x2490   MULTIPLICAND [sp,#152] @0x2494
  pc 0x24c4 -> offset 936   ADDEND [sp,#216] @0x24bc   MULTIPLICAND [sp,#232] @0x24c0
  pc 0x24f0 -> offset 944   ADDEND [sp,#192] @0x24e8   MULTIPLICAND [sp,#208] @0x24ec

Two independent reasons three words could not answer the lane's question. A wrong ADDEND
and a wrong MULTIPLICAND are INDISTINGUISHABLE in the stored result, so sampling only the
multiplicands cannot name which operand is wrong. And these are general-purpose spill
homes, not dedicated operand slots: [sp,#152] is referenced 130 times in this object,
[sp,#208] 34, [sp,#232] 20 — so "the value of [sp,#152]" names no single value and each
word must be sampled AT THE PC OF ITS OWN LOAD.

WHAT THIS LANE DID NOT OBTAIN, STATED PLAINLY IN THE ARTIFACT. The runtime values were
NOT measured: qemu-system-arm and qemu-arm are both absent on the release machine and the
reporter's repository is not cloned here, so the image cannot be executed. A request
naming the six PCs was DRAFTED AND NOT SENT — it is correspondence with an external
reporter, surfaced to the maintainer rather than posted by the loop. The thread stands at
ten comments and this release added none.

THE REFUTING COMMAND HELD: the shipped oracle still reports the lowering FAITHFUL (9
assertions, 0 failures) with every refuted mechanism injectable, so v0.81's refutation
stands and the premise is intact.

THREE INSTRUMENT ERRORS, RECORDED RATHER THAN BURIED. A first grep reported FOUR
materializations of 9.81f; truncation by `head -8` hid five, and the real count is NINE.
A first store-offset attribution gave {932, 940, 936} and briefly made the carried claim
look wrong; the scan window began BEFORE its own anchor and picked up the preceding
block's `addw`. Forward-only scanning gives 940, 936, 944 — CONFIRMING the carried claim.
The brief was right and the first measurement was not.

Also corrected in the artifact: the done-when now demands all six words at their six PCs,
and the sentence calling three words "the whole lane" is gone.

THE CLAIM SHAPE WAS WRONG ON THE FIRST PUSH, AND CI CAUGHT IT. This artifact first went out
as `status: implemented` with `issue-scope: outlives` and a PARTIAL verdict. #1487 reddened on
`Claim Check` — a REQUIRED context — because `verdict_prose_check` reds an INCOMPLETE prose
verdict beside a claiming status with no `disposition`, while R11 FORBIDS a disposition beside
a claiming status. `LEGAL_BESIDE_CLAIMING` has exactly ONE member, `REFUTED`, so A LANE THAT
NARROWS HAS NO LEGAL CLAIMING VERDICT AT ALL.

The gates permit a strictly safer shape and nothing pointed at it:

  status: proposed   disposition: partial   landed: <NAMES THE DELIVERING PR>   issue-scope: OMITTED

  R4-lane      satisfied by `landed:` — its own message is a disjunction, "flip the status
               OR record the increment" — BUT ONLY IF the text names the PR the gate DERIVES.
               MEASURED, after this lane red on it: `_acknowledge` takes
               `PR_NUMBER.findall(subject)[-1]` with `PR_NUMBER = r"\(#(\d+)\)"` — the LAST
               PARENTHESISED number in the squash subject, which is the one the SQUASH
               APPENDS, i.e. THIS PR — and requires it in `landed_prs(fields)`. My first
               `landed:` named #1436, the ISSUE, and satisfied nothing. And no local run
               could have told me: R4-lane needs a DELIVERY COMMIT ON MAIN, so it cannot
               fire in the checkout at all — only in CHECK4's squash simulation. The local
               "ALL PASS" was a true statement about a tree with no delivery commit.
  R11          satisfied: a `disposition` IS present beside a NON-claiming status
  R12          `outlives` beside non-claiming would RED, so `issue-scope` is omitted
  verdict_prose incomplete + non-claiming passes; no carve-out needed
  R14          status not claiming, so out of population
  R3           cannot fire on a `manual:` done-when

Under this shape #1436 is NEVER placed in the authorised close set at all, where the claiming
shape authorises retirement and then relies on `issue-scope` to take it back. That is a better
answer to #1484 than the rule this release shipped for it, and R14 is looser than its sibling:
it accepts any of the 7 INCOMPLETE tokens given a declaration, where `verdict_prose` accepts
1 — a conjunction defect introduced by the fix for conjunction defects, recorded rather than
quietly corrected.

AND THE PRE-PUSH CHECK THAT MISSED IT: CHECK4's squash simulation runs 2 scripts
(`merge_gate`, `status_evidence`); the `Claim Check` job runs 33. A green CHECK4 is a true
statement about a narrower subject. This push is verified against the artifact-gate subset of
that job, with CI's own flags.

Refs #1436


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

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
avrabe added a commit that referenced this pull request Oct 8, 2026
… — the ask was pointing at the wrong three words

THE ASK WAS POINTING AT THE WRONG THREE WORDS. This artifact planned to obtain
the runtime values of [sp,#152], [sp,#208] and [sp,#232]. Disassembling
ekf@0.10.0#estimate shows all three are the MULTIPLICAND of a `x 9.81`, in three
copies of one shape:

  vldr s8,[sp,#<accum>] ; vldr s9,[sp,#<slot>] ; movw/movt ip=0x411CF5C3
  vmov s10,ip ; vmul.f32 s11,s9,s10 ; vadd.f32 s9,s8,s11 ; str -> linmem

so each is the gravity DIRECTION and the OTHER operand is an accumulator. Pairs,
with the hand-read block at 0x24a4 as the extractor's positive control:
([sp,#200],[sp,#152])->+940  ([sp,#216],[sp,#232])->+936
([sp,#192],[sp,#208])->+944.

AND THE REPORTER'S PUBLISHED TICK-1 WORDS FIT ONE MECHANISM EXACTLY. If the
three ACCUMULATORS read zero, only gravity survives: down becomes 0 + 1.0*9.81,
integrated as 9.81*0.001, whose f32 bits are 0x3C20BA20 — BIT-IDENTICAL to the
vel-d measured on Renode, QEMU and i.MX RT1176 alike. North/east become exact
zeros, which is what was measured, while wasmtime's non-zero north/east come
from that same accumulator. pos-d fits (g*dt)*dt/2 to 5 significant figures.
Four of four published words, one cause.

HYPOTHESIS THREE, RECORDED AS A FALSIFIABLE PREDICTION RATHER THAN A CAUSE. The
first two were refuted, both claims about STATE; this is about the translational
computation, which is where that refutation pointed, and it does not contradict
the quaternion agreeing. Measured: the expression shape and the arithmetic fit.
NOT measured: any runtime value.

AN EMPTY POSITIVE CONTROL WAS THE FINDING, TWICE. (a) Searching the object for
the constant as a 4-byte LE pattern returned zero — and so did the controls, 1.0
and 0.001. synth materializes f32 constants as movw/movt pairs and Thumb-2
scatters a 16-bit immediate across i:imm3:imm8, so the pattern never appears
contiguously. Reconstructing pairs finds +9.81 at 5 sites, -9.81 at 2, controls
at 34 and 18. (b) The pairing extractor first returned ZERO triples because its
window began one instruction too late and saw one of the two vldrs; caught only
because the block had been read by eye first as a control.

DISCLOSED, not glossed: lowered with synth 0.82.0 while the reporter ran 0.77.0,
and 0.82.0 is NOT byte-compared against 0.77.0 for this module. Partial
stability evidence: all three inherited slot offsets reproduce here ([sp,#152]
82 sites, [sp,#208] 32, [sp,#232] 20). The correspondence therefore gives a
version-robust instruction-pattern locator and marks addresses as orientation.

Inputs verified against the committed SHA256SUMS before use. A first compile
without the reporter's own flags was REFUSED with a diagnostic naming #1041,
which is the refusal working.

Rule 4 binds: no oracle was hardened in #1436's name. The reply is DRAFTED AND
SURFACED for approval, not posted from this lane.

Refs #1436

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
avrabe added a commit that referenced this pull request Oct 9, 2026
…nly lanes, four refutations, none claiming (#1503)

* v0.83 FIRSTTOKEN2 (#1476): the widening is refused again, and this time because the hole it would close is EMPTY

v0.82 refused three widenings by weighing a cost against a benefit. This
re-measures the trade the refuting command asks about and finds the BENEFIT SIDE
IS ZERO — a stronger refusal than v0.82's, not a repeat of it.

THE HOLE HAS NO INSTANCES AT THIS TREE. `unclassified_lead` — the function that
makes #1476's hole nameable — returns a token for ZERO artifacts. Its own
docstring records the measured escapes as NOT LANDED, DONE, NOT-DELIVERED and
CLOSED; none of the four is present any more.

A DERIVED ZERO IS A REFUSAL AND NOT A PASS, so the detector was PAIRED-CONTROLLED
before the zero was believed. POSITIVE 4/4: fed the four openings its docstring
names, it returns each one. NEGATIVE 4/4: fed `PARTIAL,`, `DELIVERED,`,
`THE MEASUREMENT` and `MEASURED`, it returns None for all four.

SO THE TRADE IS 33 DROPPED TO CLOSE 0. Variant 3, stated precisely because the
count depends on the statement: drop any artifact whose FIRST SENTENCE of
verified-by contains a negator (NOT|NO|NEVER|WITHOUT|CANNOT|NEITHER|NOR). Over
the checker's own population plus this release's five delivered artifacts, 33 of
85. No widening is justified by an empty hole.

AND THE DROP COUNT MOVED, confirming the non-adoptability argument from a second
direction. v0.82 measured 27 of 78 at afa59b5 and observed the count moving
with the SENTENCE SCOPE; it also moves with the TREE. A population that changes
with a parsing choice and with the commit is not a population.

A FIRST ATTEMPT WAS WRONG IN THIS REPO'S RECORDED WAY. It reimplemented the
lookup as "LEAD matched but the phrase is in no set" and reported THIRTEEN
escapes. Every one was a false positive: LEAD prefers a TWO-WORD run and
`unclassified_lead` falls back to the FIRST word, so `IMPLEMENTED PER` is
correctly out of scope. The hand-rolled version measured the regex; the script's
function measures the rule. Thirteen became zero with the right instrument.

THIS RELEASE'S OWN FIVE DELIVERED ARTIFACTS WERE PUT THROUGH THE GATE — the
check this lane could most easily have skipped. All five in population, zero red
verdicts, zero escapes. One scare recorded: run from a branch cut off
origin/main the same scan showed four of them `lead=None` and apparently OUT of
population; the cause was the branch, not the artifacts — on main those files
are still the PLAN versions with no verified-by at all.

AND THE POPULATION FIGURE IS QUOTED FROM THE GATE'S OWN PRINTED LINE, not
computed. A first write gave three hand-derived numbers and all three were
unstable for reasons unrelated to the tree: 80 became 81 the moment this
artifact gained its own verified-by, and 577 became 575 under a one-line change
to my helper's type filter. The fix was to stop producing them and read the
instrument's output.

#1476 STAYS OPEN as the record of why no wider rule is adoptable.

Refs #1476

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

* v0.83 SWEEP (#1373): the board CAN answer "is this still broken?" — and for the pinned set the answer is YES, which refutes verify-and-close as a strategy

MAINTAINER-REQUESTED mid-release: reduce the open-issue count as far as evidence
allows. The plan was a verify-and-close sweep over the 54 open issues. THAT PLAN
IS REFUTED AS A STRATEGY, with numbers, and the refutation is the deliverable.

THE PINS ANSWER THE QUESTION #1373 SAYS THE BOARD CANNOT. #1428 established that
all six non-empty KNOWN*/PINNED* tables are exact in BOTH directions — they go
RED when a pinned defect is FIXED. So a PASSING differential is positive
evidence the defect is STILL LIVE. Re-measured against this release's binary:

  false_reject_1229_differential      PASS — 130 false-rejections of valid WASM
  invalid_accept_1207_differential    PASS — 38 wrongly-accepted invalid modules
  aarch64_operand_class_1231_diff     PASS — 4 operand-class confusions
  ra003_join_1230_differential        PASS — 3 remaining declines

Closing any of those as "verified fixed" would be a FALSE closure of a CI-proven
live defect — strictly worse than leaving the count where it is.

#1447 RE-RUN AND REPRODUCING EXACTLY: (if (result T)) with no params and two
constant arms gives i32 COMPILES, i64 COMPILES, f32 DECLINED, f64 DECLINED, with
the diagnostic unchanged — including "function too complex" about a
zero-parameter two-constant module. Stays open. The misleading clause is a cheap
separate fix and is deliberately NOT done here: a diagnostic correction is not
progress on the capability gap.

#1085 VERIFIED CLOSEABLE, recorded rather than closed. R7 is labelled
`# ---- R7 git archaeology (#1085)`, landed in b2abf95 whose first tag is
v0.61.0, carries class R7EvidenceRelease whose docstring records that disabling
R7 kills at least one test, and runs live at 84 archaeology checks / 0 skipped /
0 failures. Closure cites a TAGGED release, so it waits for v0.83.0.

#1448 IS AN HONEST NON-RESULT. A hand-written approximation of its bisection
DECLINED IN BOTH ARMS where the issue reports 1 compiling and 2 declining. That
does not refute the issue and is not evidence about it — the module is mine, not
the reporter's, and a disagreement between my approximation and a measured
bisection means MY module is wrong. #1448 has no committed repro, which is
exactly why it cannot be cheaply re-verified.

THE UNPINNED REMAINDER carries each figure WITH ITS GLOB, because one moved
while this was being written: 16 of 54 have a name-matched repro under
scripts/repro/*; "named anywhere" is 30 over
scripts/repro/* + crates/*/tests/*.rs + crates/*/src/*.rs, and a first pass over
a wider recursive set gave 29. The population is a property of the glob, not of
the board. The directional claim is unaffected.

AND AN INSTRUMENT USED FOR THIS TRIAGE WAS TOO CRUDE TO TRUST, recorded so it is
not re-used: a census mapping each issue to "the first tag containing the newest
commit mentioning it" dated #1085 to v0.64.0, where the IMPLEMENTING commit
gives v0.61.0. The newest mention is not the fix.

Refs #1373
Refs #1428
Refs #1085

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

* v0.83 WIDEFILE6 (#1439): the newly-accepted function disassembled — no VABS is emitted, and sign cannot come from reassociation

THE RETRY WAS APPLIED LOCALLY AND THE RUNG LANDS. v0.78's pool-grow retry for
stage 3, mirroring stage 2, re-applied on a scratch tree (NEVER committed;
restored byte-identically, diff -q IDENTICAL, tripwire green again at 10/10).
The 60-local right-leaning shape compiles — 1956 bytes — and
wide60_declines_and_the_ladder_dies_on_the_wide_file_rung_1426 FIRED exactly as
built: "IF THIS FIRED, THE RUNG LANDED".

AND THE DIFFERENTIAL NAMED AS THIS DEFECT'S ORACLE NEVER RUNS THE SHAPE. With
the retry applied it reports "PASS: 70 emulations bit-identical to wasmtime".
That PASS is TRUE ABOUT THE WRONG SUBJECT: F32_EXPORTS is
["live13","live14","live16","live24"], tops out at 24 locals, folds LEFT, and
every entry compiles on an EARLIER rung — live24 on vfp-frame-locals+pool-grow,
bit-exact since v0.78. The newly-accepted function is in no export list. The
tripwire's own message predicted this: "a compile-only green here says nothing
about the bytes".

THE ABS HYPOTHESIS IS REFUTED BY THE EMITTED CODE, not only by encoding
reachability. Over the function's 1956 bytes, sliding by a HALFWORD rather than
assuming alignment: ZERO VABS.F32, ZERO VMOV.F32 reg-reg, ZERO VNEG.F32.
POSITIVE CONTROL, which is why the zero means anything: the same scanner finds
VABS.F32 twice in a 74-byte abs/copysign module.

AND SIGN CANNOT COME FROM REASSOCIATION — proven, not assumed. sign(a*b) is the
XOR of the signs and XOR is commutative, so a product's sign is invariant under
any reordering; overflow destroys magnitude associativity and leaves sign alone.
Measured in f32 with infinity saturation over the exact 60-factor chain, forward
vs fully reversed, params +/-0.5/1/2/3: got ^ want == 0 every time. It also
explains the signature — the chain OVERFLOWS after ~25 factors, and two
infinities of opposite sign differ in exactly the sign bit with bit-identical
magnitudes, which is v0.78's observation verbatim.

THE MULTIPLY MULTISET IS INTACT: VMUL.F32 appears 119 times against 119 f32.mul
in the source, so none is dropped or duplicated. (Spill-traffic counts were
taken and are NOT quoted: those masks returned nothing on the control, so they
are UNPROVEN.)

SURVIVING CLASS, now the only one in this family: a WRONG OPERAND — a
spill/reload reading the wrong frame slot — which substitutes a value without
changing the instruction count or the sign algebra. Last on v0.81's candidate
list, never tested, now the sole survivor.

BOTH REFUTING COMMANDS REFUTED THEIR OWN EXPECTATIONS, and one was malformed in
this release's exact shape. `git log -S"pool grow retry" | wc -l` expected 0 and
returns 5 — and -S is a PICKAXE, matching every commit where the count CHANGED,
so it cannot speak about HEAD. Worse, all five commits are the artifact commits
themselves: the phrase lives ONLY in release-v0.81/-v0.82/-v0.83 YAML prose and
zero times in code, so the instrument was counting the commits that wrote the
artifacts carrying it. Replaced with `git grep` at HEAD, which says 0 — the
claim was true, the command could not establish it. And the emitter count is 4
not 3 under `-- crates/`, because a test asserts the constant; the pathspec is
part of the command, and `crates/*/src/*` gives 3 while `:(glob)crates/*/src/**`
gives 0 — a wrong pathspec looks exactly like a passing refutation.

Encoder line numbers RE-DERIVED at this commit: 2012 (F32Abs A32), 6366 (F32Abs
Thumb-2), 7354 — which is NOT an F32Abs emitter but sits inside
encode_thumb_f32_copysign. The v0.81 figures 1992/6322/7310 had all moved.

Fixture denominator re-measured because two records disagreed: 130 f32.mul (plus
15 f64.mul), zero abs/copysign/neg in both widths. A durable note carried 71
since v0.81; never true — the fixture has ONE commit (0ec9dc7, v0.60) and
`git show <rev>:<path>` gives 130 at every revision.

The cause is NOT named, so the retry STAYS OUT and the tripwire STAYS ARMED.

Refs #1439

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

* v0.83 JESSDIVERGE5 (#1436): the gravity triple read out of the object — the ask was pointing at the wrong three words

THE ASK WAS POINTING AT THE WRONG THREE WORDS. This artifact planned to obtain
the runtime values of [sp,#152], [sp,#208] and [sp,#232]. Disassembling
ekf@0.10.0#estimate shows all three are the MULTIPLICAND of a `x 9.81`, in three
copies of one shape:

  vldr s8,[sp,#<accum>] ; vldr s9,[sp,#<slot>] ; movw/movt ip=0x411CF5C3
  vmov s10,ip ; vmul.f32 s11,s9,s10 ; vadd.f32 s9,s8,s11 ; str -> linmem

so each is the gravity DIRECTION and the OTHER operand is an accumulator. Pairs,
with the hand-read block at 0x24a4 as the extractor's positive control:
([sp,#200],[sp,#152])->+940  ([sp,#216],[sp,#232])->+936
([sp,#192],[sp,#208])->+944.

AND THE REPORTER'S PUBLISHED TICK-1 WORDS FIT ONE MECHANISM EXACTLY. If the
three ACCUMULATORS read zero, only gravity survives: down becomes 0 + 1.0*9.81,
integrated as 9.81*0.001, whose f32 bits are 0x3C20BA20 — BIT-IDENTICAL to the
vel-d measured on Renode, QEMU and i.MX RT1176 alike. North/east become exact
zeros, which is what was measured, while wasmtime's non-zero north/east come
from that same accumulator. pos-d fits (g*dt)*dt/2 to 5 significant figures.
Four of four published words, one cause.

HYPOTHESIS THREE, RECORDED AS A FALSIFIABLE PREDICTION RATHER THAN A CAUSE. The
first two were refuted, both claims about STATE; this is about the translational
computation, which is where that refutation pointed, and it does not contradict
the quaternion agreeing. Measured: the expression shape and the arithmetic fit.
NOT measured: any runtime value.

AN EMPTY POSITIVE CONTROL WAS THE FINDING, TWICE. (a) Searching the object for
the constant as a 4-byte LE pattern returned zero — and so did the controls, 1.0
and 0.001. synth materializes f32 constants as movw/movt pairs and Thumb-2
scatters a 16-bit immediate across i:imm3:imm8, so the pattern never appears
contiguously. Reconstructing pairs finds +9.81 at 5 sites, -9.81 at 2, controls
at 34 and 18. (b) The pairing extractor first returned ZERO triples because its
window began one instruction too late and saw one of the two vldrs; caught only
because the block had been read by eye first as a control.

DISCLOSED, not glossed: lowered with synth 0.82.0 while the reporter ran 0.77.0,
and 0.82.0 is NOT byte-compared against 0.77.0 for this module. Partial
stability evidence: all three inherited slot offsets reproduce here ([sp,#152]
82 sites, [sp,#208] 32, [sp,#232] 20). The correspondence therefore gives a
version-robust instruction-pattern locator and marks addresses as orientation.

Inputs verified against the committed SHA256SUMS before use. A first compile
without the reporter's own flags was REFUSED with a diagnostic naming #1041,
which is the refusal working.

Rule 4 binds: no oracle was hardened in #1436's name. The reply is DRAFTED AND
SURFACED for approval, not posted from this lane.

Refs #1436

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

* v0.83 artifacts2: stamp `landed:` with the delivering PR (#1503) on all four lanes

R4-lane and R15 both red on the unstamped branch, four failures from one cause:
FIRSTTOKEN2 and SWEEP carried `landed: PENDING-PR-STAMP`, which names neither a
PR nor an issue. R15 states the remedy itself — "Name BOTH the issue and the
delivering PR" — and that is the arm taken here rather than flipping status,
because a CLAIMING status would authorise closing #1476 and #1373. Read R4-lane's
message as the disjunction it is.

WIDEFILE6 and JESSDIVERGE5 are restamped too. Their `PR #1501` / `PR #1502`
become FALSE the moment they land via a different PR, so this is a correction for
accuracy and not a concession to consolidating them. Each `landed:` value was
read in FULL before editing: the prose describes the FINDING, not the PR
mechanics, so the leading number was the only stale token.

Verified after the edit, not before it:
  status_evidence_check.py rc=0, 0 failures, printed count == printed list
  issue-scope: 0 issue(s) authorised for closure, 1 held by `outlives`
  all four still `status: proposed` with no `issue-scope:` — non-claiming
  closer-keyword scan over the new prose: zero adjacencies, control firing

The print-order fix that makes the first line trustworthy arrived with #1500:
this same tree printed 2 failures while counting 4 on the previous base.

Refs #1476, Refs #1373, Refs #1439, Refs #1436

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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