Skip to content

fix(#1085): two v0.60 artifacts pinned evidence that could not fail on the failure they define - #1090

Merged
avrabe merged 1 commit into
mainfrom
fix/artifact-evidence-1085
Aug 27, 2026
Merged

fix(#1085): two v0.60 artifacts pinned evidence that could not fail on the failure they define#1090
avrabe merged 1 commit into
mainfrom
fix/artifact-evidence-1085

Conversation

@avrabe

@avrabe avrabe commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Refs #1085, #1017, #1021.

Both done-when predicates certified that code exists. Neither artifact's claim is that code exists.

RQ-60-A64IMPORT

Its own 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.

and its signature was contains:crates/synth-backend-aarch64/src/elf.rs:undefined_externals — a code-existence check, i.e. exactly 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.

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 / slot1 21→42). What changes is that the basis is written where the release-readiness query's reader sees it, including the negative: the AArch64 acceptance rate is UNMEASURED since #1071. The 805-module corpus is not synth-local; the re-run is requested at #1017 and named as increment 2 rather than quietly dropped. The v0.60 release notes assert no reach improvement.

RQ-60-CANARY

Signature moves from a function name in arm_encoder.rs to the canary gate's own non-vacuity floor, scripts/repro/expansion_canary_gate_1021.py:emulations >= 1200. The 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 floor from 1200 to 0 (needle counted == 1 before mutating) takes status-evidence from 0 failures to 1, naming RQ-60-CANARY. Restoring returns 0.

Also records shipped-in: v0.59.0. Measured:

2026-08-26 08:50   #1061  canary gate merged
2026-08-26 15:19   v0.59.0 tagged            <- the gate is an ANCESTOR of this tag
2026-08-26 18:56   #1070  plan(v0.60) scopes RQ-60-CANARY as future work

v0.59.0's notes already credit it ("VCR-TIER-001 increment 1 — the pseudo-op expansion canary gate"). v0.60 carries this artifact's traceability closure, not the capability, and the release notes say so.

Why both slipped through

Every gate passed throughout, because each asks whether the declared evidence exists and none asks which release it arrived in, or whether the evidence proves the stated claim. Found by auditing all eight v0.60 artifacts against the bar each 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 — R7 (evidence must belong to the release) and R9 (a contains: into crates/** is weaker than one pointing at the gate that exercises it) — are written up in #1085 and not implemented here; this PR corrects the two live instances.

Gates: status-evidence 0 failures (60 artifacts / 5 files / 8 predicates), claim_check 51/51, 24 tests OK.

🤖 Generated with Claude Code

https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L

…n the failure they define

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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
@codecov

codecov Bot commented Aug 27, 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 0399873 into main Aug 27, 2026
58 checks passed
@avrabe
avrabe deleted the fix/artifact-evidence-1085 branch August 27, 2026 16:37
avrabe added a commit that referenced this pull request Aug 27, 2026
…e, the release field must match the file, code-existence is not a predicate

Three rules, all found by USING the v0.60 status-evidence gate rather than
reasoning about it. Red-first each: all three defective fixtures pass the
pre-change checker with 0 failures, then fail on exactly the rule under
test and no other.

R7 — EVIDENCE MUST BELONG TO THE RELEASE. For every contains:/file:
done-when that HOLDS, the oldest first-parent commit introducing the
signature (git log -S for contains:, --diff-filter=A for file:) must not
be an ancestor of the previous minor's HIGHEST tag (so evidence shipped in
a previous PATCH is caught too). The RQ-60-CANARY shape — gate merged
08:50, v0.59.0 tagged 15:19, v0.60 plan written 18:56 — is replayed in a
real git fixture; the shipped-in: escape hatch (per-case, version-shaped,
reason written beside it, #1090) is the green control exactly as it stands
on main. Reliability stated, not silent: no-git/shallow/missing-tag/
uncommitted-signature SKIPS LOUDLY (R7-SKIP warning + a skip count in the
machine-read summary), and the CI grep pins '(0 skipped)' with >= 1
archaeology check — a shallow CI checkout already reds the R4 delivery
floor before R7 is reached. Live: 4 checks performed, 0 skipped.

R8 — THE release: FIELD MUST EQUAL THE FILE'S VERSION. The checker
version-gates by PATH; rivet's readiness query reads the FIELD; nothing
asserted agreement. The harmful never-hit direction (release: v0.60
parked in a pre-v0.60 file, exempt from every >= v0.60 rule while rivet
counts it in v0.60's scope) is the red fixture. THE 6 MEASURED MISMATCHES
ARE KEPT under the one now-STATED allowance: a field naming a PATCH of
the file's previous minor (vX.(Y-1).Z, Z >= 1) is the parked-patch
practice (v0.56.1/v0.56.2 in release-v0.57.yaml) and green; missing,
unparseable, ahead-of-path, or behind-without-patch fields are red. No
historical release file needed edits.

R9 — A contains: INTO CRATE SOURCE IS WEAKER THAN THE GATE. Under a
CLAIMING status, a signature whose path is crates/** excluding /tests/
components (crate integration-test dirs are executed by the required Test
job and are gate-shaped, like scripts/, coq/ and workflows — measured,
every honest live signature already points at one of those) requires a
written verified-by saying why code-existence IS the outcome; the better
fix is re-pointing at the gate, which is what both #1090 corrections did.
The RQ-60-A64IMPORT specimen is the red fixture; both correction forms
are green controls. test_4's green control updated to the #1090 corrected
done-when — the old fixture carried the exact shape R9 now reds, and R9
caught it.

Gates: 42 unit tests OK (7-instance replay intact); live tree 66
artifacts / 0 failures / 4 archaeology checks (0 skipped); 5 mutations
each kill >= 1 test with needle counts asserted before mutating
(R7 ancestor check, R8 loop, R8 allowance, R9 trigger, R7 skip
accounting) and byte-identical restore; claim_check 52/52;
test_claim_check 50 OK; ci.yml summary grep extended in the same PR.
Artifact flipped implemented with done-when pointing at the R7 replay
class in the unit suite (R9 applied to itself) and a written verified-by.

Refs #1085, #1090, #1064, #242.

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 Aug 27, 2026
…e, the release field must match the file, code-existence is not a predicate (#1099)

Three rules, all found by USING the v0.60 status-evidence gate rather than
reasoning about it. Red-first each: all three defective fixtures pass the
pre-change checker with 0 failures, then fail on exactly the rule under
test and no other.

R7 — EVIDENCE MUST BELONG TO THE RELEASE. For every contains:/file:
done-when that HOLDS, the oldest first-parent commit introducing the
signature (git log -S for contains:, --diff-filter=A for file:) must not
be an ancestor of the previous minor's HIGHEST tag (so evidence shipped in
a previous PATCH is caught too). The RQ-60-CANARY shape — gate merged
08:50, v0.59.0 tagged 15:19, v0.60 plan written 18:56 — is replayed in a
real git fixture; the shipped-in: escape hatch (per-case, version-shaped,
reason written beside it, #1090) is the green control exactly as it stands
on main. Reliability stated, not silent: no-git/shallow/missing-tag/
uncommitted-signature SKIPS LOUDLY (R7-SKIP warning + a skip count in the
machine-read summary), and the CI grep pins '(0 skipped)' with >= 1
archaeology check — a shallow CI checkout already reds the R4 delivery
floor before R7 is reached. Live: 4 checks performed, 0 skipped.

R8 — THE release: FIELD MUST EQUAL THE FILE'S VERSION. The checker
version-gates by PATH; rivet's readiness query reads the FIELD; nothing
asserted agreement. The harmful never-hit direction (release: v0.60
parked in a pre-v0.60 file, exempt from every >= v0.60 rule while rivet
counts it in v0.60's scope) is the red fixture. THE 6 MEASURED MISMATCHES
ARE KEPT under the one now-STATED allowance: a field naming a PATCH of
the file's previous minor (vX.(Y-1).Z, Z >= 1) is the parked-patch
practice (v0.56.1/v0.56.2 in release-v0.57.yaml) and green; missing,
unparseable, ahead-of-path, or behind-without-patch fields are red. No
historical release file needed edits.

R9 — A contains: INTO CRATE SOURCE IS WEAKER THAN THE GATE. Under a
CLAIMING status, a signature whose path is crates/** excluding /tests/
components (crate integration-test dirs are executed by the required Test
job and are gate-shaped, like scripts/, coq/ and workflows — measured,
every honest live signature already points at one of those) requires a
written verified-by saying why code-existence IS the outcome; the better
fix is re-pointing at the gate, which is what both #1090 corrections did.
The RQ-60-A64IMPORT specimen is the red fixture; both correction forms
are green controls. test_4's green control updated to the #1090 corrected
done-when — the old fixture carried the exact shape R9 now reds, and R9
caught it.

Gates: 42 unit tests OK (7-instance replay intact); live tree 66
artifacts / 0 failures / 4 archaeology checks (0 skipped); 5 mutations
each kill >= 1 test with needle counts asserted before mutating
(R7 ancestor check, R8 loop, R8 allowance, R9 trigger, R7 skip
accounting) and byte-identical restore; claim_check 52/52;
test_claim_check 50 OK; ci.yml summary grep extended in the same PR.
Artifact flipped implemented with done-when pointing at the R7 replay
class in the unit suite (R9 applied to itself) and a written verified-by.

Refs #1085, #1090, #1064, #242.


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