From 7304e48ea6ab912b99db11e720152a724c4cdb79 Mon Sep 17 00:00:00 2001 From: Ralf Anton Beier Date: Thu, 27 Aug 2026 16:59:35 +0200 Subject: [PATCH] fix(#1085): two v0.60 artifacts pinned evidence that could not fail on the failure they define MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both `done-when` predicates certified that code EXISTS. Neither artifact's claim is that code exists. RQ-60-A64IMPORT. Its description says, in capitals: "HONESTY REQUIREMENT: the acceptance number is the deliverable ... A change that adds a code path without moving the census has not delivered." Its signature was `contains:crates/synth-backend-aarch64/src/elf.rs:undefined_externals` — a code-existence check, i.e. precisely what the description says is NOT the deliverable. A predicate that cannot fail on the failure the artifact defines for itself is not a predicate. The status stays `implemented` — #1071's code is on main and EXECUTES (ld.lld links the objects against assembled definitions; unicorn runs the linked images: run(37)=42 through the import, table dispatch slot0 41->42 and slot1 21->42) — but the BASIS is now written where the release- readiness query's reader sees it, and it states the negative too: the AArch64 ACCEPTANCE RATE IS UNMEASURED since #1071. The 805-module corpus is not synth-local; the re-run is requested at #1017 and is named as increment 2 rather than quietly dropped. The v0.60 release notes assert no reach improvement. RQ-60-CANARY. Signature moves from `arm_encoder.rs:expansion_scratch_contract` (a function name) to the canary gate's own NON-VACUITY FLOOR, `scripts/repro/expansion_canary_gate_1021.py:emulations >= 1200`. The artifact's claim is that every rule-emitted expansion is EXECUTED with non-contract registers canaried; the old predicate would still hold with the gate deleted, and could never see the gate quietly emptied — the vacuity shape #910 exists for. SENSITIVITY PROVEN, not assumed: dropping the gate's floor from 1200 to 0 (needle counted == 1 before mutating) takes status-evidence from 0 failures to 1, naming RQ-60-CANARY. Restoring it returns 0. Also records `shipped-in: v0.59.0` on CANARY. Measured: the canary gate merged as #1061 at 08:50 on 2026-08-26, v0.59.0 was tagged at 15:19 the same day (so the gate is an ANCESTOR of that tag, and v0.59.0's notes already credit it), and the v0.60 plan was written at 18:56 — AFTER the tag — scoping as future work something already released. v0.60 carries this artifact's traceability closure, NOT the capability, and the notes say so. Every gate passed throughout, because each asks whether the declared evidence EXISTS and none asks which release it arrived in. Found by auditing all eight v0.60 artifacts against the bar each one's own description sets; three of eight pinned a `contains:` on an implementation path where the stated bar was measured or executed (the third, RQ-60-ARTIFACTSPLIT, was fixed in #1084). The proposed rules are R7 (evidence must belong to the release) and R9 (a `contains:` into `crates/**` is weaker than one pointing at the gate that exercises it) — both in #1085, neither implemented here. Gates: status-evidence 0 failures (60 artifacts / 5 files / 8 predicates), claim_check 51/51, 24 tests OK. Refs #1085, refs #1017, refs #1021. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L --- artifacts/release-v0.60.yaml | 50 +++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/artifacts/release-v0.60.yaml b/artifacts/release-v0.60.yaml index a8f5f969..269cad43 100644 --- a/artifacts/release-v0.60.yaml +++ b/artifacts/release-v0.60.yaml @@ -89,7 +89,24 @@ artifacts: verification-track: differential issue: "#1021" # The single declaration site the delivered gate hangs off (#1061). - done-when: "contains:crates/synth-backend/src/arm_encoder.rs:expansion_scratch_contract" + # The signature pins the GATE and its NON-VACUITY FLOOR, not the + # declaration site. `contains:arm_encoder.rs:expansion_scratch_contract` + # certified that a function exists; this artifact's claim is that every + # rule-emitted expansion is EXECUTED with non-contract registers + # canaried. Deleting the gate — or quietly dropping its emulation floor + # to zero, the vacuity shape #910 exists for — now turns this red. + done-when: "contains:scripts/repro/expansion_canary_gate_1021.py:emulations >= 1200" + # SHIPPED IN v0.59.0, not here (#1085). The canary gate merged as #1061 + # at 08:50 on 2026-08-26; v0.59.0 was tagged at 15:19 the same day, so + # the gate is an ANCESTOR of that tag and v0.59.0's release notes + # already credit it ("VCR-TIER-001 increment 1 — the pseudo-op expansion + # canary gate"). The v0.60 plan was written at 18:56, AFTER the tag, + # and scoped as future work something already released. v0.60 carries + # this artifact's traceability closure, NOT the capability; the release + # notes must not claim it. Every gate passed throughout, because each + # asks whether the evidence EXISTS and none asks which release it + # arrived in — that is the rule proposed as R7 in #1085. + shipped-in: "v0.59.0" - id: RQ-60-CFOBLIG type: system-req @@ -197,9 +214,34 @@ artifacts: priority: must verification-track: differential issue: "#1017" - # #1071's delivered surface: the driver-supplied SHN_UNDEF externals - # allowlist on the aarch64 relocatable ELF builder. - done-when: "contains:crates/synth-backend-aarch64/src/elf.rs:undefined_externals" + # INCREMENT 1 of VCR-REACH-002, and the DoD is split accordingly. + # + # The previous signature was `contains:.../elf.rs:undefined_externals` — + # a CODE-EXISTENCE check, which is precisely what this artifact's own + # description says is NOT the deliverable ("a change that adds a code + # path without moving the census has not delivered"). A predicate that + # cannot fail on the failure the artifact defines for itself is not a + # predicate; see #1085 (R9). + # + # INCREMENT 2, named rather than dropped: re-run the 805-module + # AArch64 acceptance census against the 13/805 (1.6%) baseline, with + # ARM 531/805 and RV32 113/805 as controls. The corpus lives with the + # downstream consumer; the re-run is requested at #1017. + done-when: "manual: increment 1 — aarch64 import dispatch lowers, links and EXECUTES; increment 2 — the 805-module acceptance census (#1017) — is NOT claimed here" + verified-by: >- + VERIFIED: imports lower through the same bl + R_AARCH64_CALL26 path as + local calls and a funcref slot holding an import emits a b + JUMP26 trampoline; pyelftools confirms host_add / ext_inc are + STB_GLOBAL STT_FUNC SHN_UNDEF; ld.lld links both objects against + assembled definitions and unicorn EXECUTES the linked images + (run(37) = 42 through the import; table dispatch slot0 41 -> 42, + slot1 21 -> 42); import-free modules byte-identical; a symbol neither + placed nor listed keeps the #1013 clean refusal. + NOT VERIFIED, and deliberately not claimed: the AArch64 ACCEPTANCE + RATE is UNMEASURED since #1071. The 805-module census has not been + re-run (the corpus is not synth-local), so no reach improvement is + asserted by this artifact or by the v0.60 release notes. Requested + at #1017; that measurement is increment 2, not this one. - id: RQ-60-RACOST type: system-req