RQ-64-SCOPEGAP (#1085): unscoped artifacts get a staleness rule — S1/S2, red-first on VCR-REACH-002 + the proof-count class (23 → 0 undated) - #1182
Conversation
Refs #1085 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
Gate finding addressed: the population half is now an EQUALITY (commit 4)Where the 34 actually lived. It was in the PR — So the shipped floor was 34, not 10 — but you were right on the substance twice over: (1) the Churn, measured before choosing equality (
Two moves in seven release intervals — equality costs a one-line bump every few releases, not churn. Side finding: What changed. Proof it discriminates (real checker / real claim_check, file restored after each): 72 tests OK; 10/10 mutations killed (two new: equality disabled, equality weakened to Same shape, not fixed here (your call): Rebase status: |
…ALITY, not a floor — S-DRIFT both directions, ledger-pinned, churn measured Review on #1182 (coordinator): the population half of the S-VACUOUS guard was a LOWER BOUND pinned at live (34). It did red on lost reach — rotting the Qed pattern dropped the scan to 13 and the in-script floor fired (S-VACUOUS, exit 1, `1 failures` on the CI-pinned line) — but it could not see a citation landing WITHOUT its bump, and the ci.yml grep alone (`[1-9][0-9]*`) would have passed 13. RQ-63-FLOOREQ one surface over: a lower bound cannot see declared drifting. Measured before choosing equality: the citation count across v0.56.0 .. v0.63.0 was 30, 30, 30, 31, 31, 31, 31, 32 — two moves in seven release intervals — so equality costs a one-line bump every few releases, not constant churn. (Also measured: `undated` sat at 21-23 for all eight releases; the class is at least six months old.) STALENESS_CITATIONS = 34, red in BOTH directions (S-DRIFT): BELOW is lost reach, ABOVE is an unbumped landing; equal is green. claims.yaml SYNTH-STATUS-EVIDENCE-STALENESS-CITATIONS-1085 pins the constant's line verbatim AND count-eq pins that the `!=` check is still wired, so a value moved without the ledger or a check weakened back to `<` both red claim_check (transcript: 59/60 each). ci.yml comment states where the population half is enforced; the grep keeps asserting the scan ran and the undated half is zero. Transcripts (real checker, file restored after each): Qed pattern rot -> 13 scanned, FAIL S-DRIFT ... BELOW the declared 34, exit 1 declared 33 -> 34 scanned, FAIL S-DRIFT ... ABOVE the declared 33, exit 1 live -> 34 = 34, exit 0 72 tests OK; 10/10 mutations killed (new: equality disabled, equality weakened to `<`). claim_check 60/60. rivet unchanged (40 errors). Refs #1085 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
…` matched `41.6 %` The plan comment asserted that VG-009 and VCR-REACH-002 both still state aarch64 accepts 1.6 %. Only the second is true. VG-009's only "1.6" is the tail of "41.6 %", a line-coverage figure for synth-backend-riscv/src/backend.rs, framed "measured at v0.54.0" — correctly dated history, and untouched since #918. Flagging it would have been a false red on a properly dated citation. Measured and reported by the RQ-64-SCOPEGAP lane, which was briefed with explicit permission to return a negative result and used it. The claim was mine: it came from a grep for `1.6`, which returns OCCURRENCES and cannot return FRAMING. Same failure that produced v0.62's devirtualization claim, and the correction is left visible beside the original rather than edited away — the scoping error is the same shape the artifact is about. The real population the artifact should have named is larger and of a different kind: eight artifacts restating the repo's own proof counts as undated present-tense fact ("188 Qed / 52 Admitted", six months stale against a number CLAUDE.md itself count-eq-pins). `chore` deliberately, not `fix`: naming RQ-64-SCOPEGAP in a delivery-shaped subject would oblige R4 to find that artifact's status flip in THIS PR, and it belongs to #1182. Verified: rivet validate at main's 40-error baseline, 0 broken cross-refs; status_evidence_check exit 0. Refs #1085 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
…S2, red-first 23 undated across 13 artifacts, 0 after
The 293 artifacts with no `release:` (not 124 — that is the non-claiming
subset) were checked for a legal status and nothing else. Survey: 104
carry a figure token; every genuinely stale one has ONE shape, a
repo-derived proof count restated as undated present-tense fact
(VG-002 / ARCH-004 / SWVER-005 / TR-005 "188 Qed / 52 Admitted" from
2026-03, kernel recount 630 / 2; VER-001 "39 Qed"; VER-002 "95 Qed";
undated increment-log sentences) — plus the reported VCR-REACH-002 title
("1.6% AArch64 acceptance", superseded by v0.63's 20.2 % ladder).
VG-009 is NOT a drifted instance: its only "1.6" is the substring of
"41.6 %", a line-coverage figure explicitly "measured at v0.54.0". A rule
that flagged it would be a false red on correctly dated history, so none
does; the correction is recorded beside the finding in the artifact.
Decision (a), narrowed to the decidable: an unscoped artifact is a RECORD
that cites a moving figure only as dated history (version / #issue / ISO
date in the same sentence) or names the derivation. (b) `release: backlog`
rejected — mislabels the requirements base and buys no rule (every R-rule
presumes a window these items lack); (c) strip numbers rejected on the
survey — most figures are thresholds or a verification record's own
result; "pinned" as equality rejected — it is the lockstep copy
RQ-64-FLOORPROSE measured as v0.63's largest merge cost.
S1: undated `N Qed` / `N Admitted` in an unscoped artifact's description
or field prose is red (message names the live status.json value;
verdict is dated-or-not, never equality).
S2: an undated measured figure (percent, N/M, derived count, N modules)
in a TITLE is red.
Exempt by construction: version-shaped `release:`, version-named topic
files, release-v*/ files. S-VACUOUS floor 34 pins citations scanned.
ci.yml pins `programme-staleness: ... 0 undated`.
Red-first on the untouched tree: 23 undated citations across 13
artifacts, exit 1 (S2 on VCR-REACH-002 and VG-002 titles; S1 on the
rest). After dating every figure from its own increment header (never an
invented date) and naming the derivation where the number was only a
mirror: 34 scanned, 0 undated, exit 0. 12 new unit tests, all nine
mutations killed. rivet validate unchanged at 40 errors; claim_check
59/59.
Residual, stated: description-level percentages are not judged — a
threshold ("shall achieve at least 80%") and a measurement are not
mechanically separable (six threshold percentages would be false reds).
Refs #1085
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
…LOORPROSE's corrected premise (#1178) #1178 landed while this lane was in flight and refuted the premise the rejection cited: v0.63's floor conflicts sat on the two LIVE files (ci.yml, claims.yaml), never on an artifact transcript, and FLOORPROSE's verified-by was a dated record, not a stale copy. The rejection still holds — equality-pinning would turn every citing topic artifact into one more LIVE file in exactly that set — but is now stated on the measured premise, and FLOORPROSE's surviving rule ("say 'at v0.63' beside it") is named as S1 stated for one file. The field-prose scan cites its own measured instances (TR-005, VER-001/002) instead. Refs #1085 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
Refs #1085 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
…ALITY, not a floor — S-DRIFT both directions, ledger-pinned, churn measured Review on #1182 (coordinator): the population half of the S-VACUOUS guard was a LOWER BOUND pinned at live (34). It did red on lost reach — rotting the Qed pattern dropped the scan to 13 and the in-script floor fired (S-VACUOUS, exit 1, `1 failures` on the CI-pinned line) — but it could not see a citation landing WITHOUT its bump, and the ci.yml grep alone (`[1-9][0-9]*`) would have passed 13. RQ-63-FLOOREQ one surface over: a lower bound cannot see declared drifting. Measured before choosing equality: the citation count across v0.56.0 .. v0.63.0 was 30, 30, 30, 31, 31, 31, 31, 32 — two moves in seven release intervals — so equality costs a one-line bump every few releases, not constant churn. (Also measured: `undated` sat at 21-23 for all eight releases; the class is at least six months old.) STALENESS_CITATIONS = 34, red in BOTH directions (S-DRIFT): BELOW is lost reach, ABOVE is an unbumped landing; equal is green. claims.yaml SYNTH-STATUS-EVIDENCE-STALENESS-CITATIONS-1085 pins the constant's line verbatim AND count-eq pins that the `!=` check is still wired, so a value moved without the ledger or a check weakened back to `<` both red claim_check (transcript: 59/60 each). ci.yml comment states where the population half is enforced; the grep keeps asserting the scan ran and the undated half is zero. Transcripts (real checker, file restored after each): Qed pattern rot -> 13 scanned, FAIL S-DRIFT ... BELOW the declared 34, exit 1 declared 33 -> 34 scanned, FAIL S-DRIFT ... ABOVE the declared 33, exit 1 live -> 34 = 34, exit 0 72 tests OK; 10/10 mutations killed (new: equality disabled, equality weakened to `<`). claim_check 60/60. rivet unchanged (40 errors). Refs #1085 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
3d66c9b to
f1b4b31
Compare
…` matched `41.6 %` The plan comment asserted that VG-009 and VCR-REACH-002 both still state aarch64 accepts 1.6 %. Only the second is true. VG-009's only "1.6" is the tail of "41.6 %", a line-coverage figure for synth-backend-riscv/src/backend.rs, framed "measured at v0.54.0" — correctly dated history, and untouched since #918. Flagging it would have been a false red on a properly dated citation. Measured and reported by the RQ-64-SCOPEGAP lane, which was briefed with explicit permission to return a negative result and used it. The claim was mine: it came from a grep for `1.6`, which returns OCCURRENCES and cannot return FRAMING. Same failure that produced v0.62's devirtualization claim, and the correction is left visible beside the original rather than edited away — the scoping error is the same shape the artifact is about. The real population the artifact should have named is larger and of a different kind: eight artifacts restating the repo's own proof counts as undated present-tense fact ("188 Qed / 52 Admitted", six months stale against a number CLAUDE.md itself count-eq-pins). `chore` deliberately, not `fix`: naming RQ-64-SCOPEGAP in a delivery-shaped subject would oblige R4 to find that artifact's status flip in THIS PR, and it belongs to #1182. Verified: rivet validate at main's 40-error baseline, 0 broken cross-refs; status_evidence_check exit 0. Refs #1085 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
…` matched `41.6 %` The plan comment asserted that VG-009 and VCR-REACH-002 both still state aarch64 accepts 1.6 %. Only the second is true. VG-009's only "1.6" is the tail of "41.6 %", a line-coverage figure for synth-backend-riscv/src/backend.rs, framed "measured at v0.54.0" — correctly dated history, and untouched since #918. Flagging it would have been a false red on a properly dated citation. Measured and reported by the RQ-64-SCOPEGAP lane, which was briefed with explicit permission to return a negative result and used it. The claim was mine: it came from a grep for `1.6`, which returns OCCURRENCES and cannot return FRAMING. Same failure that produced v0.62's devirtualization claim, and the correction is left visible beside the original rather than edited away — the scoping error is the same shape the artifact is about. The real population the artifact should have named is larger and of a different kind: eight artifacts restating the repo's own proof counts as undated present-tense fact ("188 Qed / 52 Admitted", six months stale against a number CLAUDE.md itself count-eq-pins). `chore` deliberately, not `fix`: naming RQ-64-SCOPEGAP in a delivery-shaped subject would oblige R4 to find that artifact's status flip in THIS PR, and it belongs to #1182. Verified: rivet validate at main's 40-error baseline, 0 broken cross-refs; status_evidence_check exit 0. Refs #1085 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
…the suite ran on (#1186) * fix(ci): RQ-64-DEPS (#965) — the MINORHOLD exit exists but says nothing about the tree the suite ran on The artifact's original premise ("the hold has no exit") was too strong. The workflow states one at dependabot-auto-merge.yml:20 — "a hold is a delay, never a block: merge a held bump BY HAND once the FULL suite is green ... the discriminator is CI, not a maintainer's read of the diff." That criterion is correct. The premise is corrected in the artifact rather than edited away, the third premise correction this release and the same discipline RQ-64-FLOORPROSE got. What the exit omitted is everything about the TREE THE SUITE RAN ON, which is what made it unusable in practice: 1. Base freshness is part of "green". #1106/#1107/#1110 each showed exactly one red — `Rivet Federated Graph (advisory)` — which is GREEN on main, measured on trees whose merge-base was four days and one release stale. Neither that red nor a green would have attributed anything to the bump. 2. The refresh mechanism can be permanently gone. Those three each carry a human `Merge branch 'main' into dependabot/...` commit, and dependabot refuses to rebase a branch with foreign commits — it said so on all three at 06:05Z. Merging main into a dependabot branch to freshen it is the move that destroys the ability to freshen it. Now written down, because it is not obvious and it is not reversible. 3. A bump nobody evaluates needs a disposition. These accumulated for a week because nothing required an answer. "Still open" is not a disposition. None of this loosens the hold — 0.x-minor is breaking under semver and the ordeal 0.9->0.12 hang cost days. It makes the exit precise enough to use, which is what keeps a hold a delay rather than an accumulator. Verified: claim_check 59/59 (the MINORHOLD count-eq patterns are untouched — the added text deliberately avoids them), workflow parses, rivet validate at main's 40-error baseline with 0 broken cross-refs. Refs #965 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L * chore(rivet): correct the v0.64 plan's VG-009 claim — a grep for `1.6` matched `41.6 %` The plan comment asserted that VG-009 and VCR-REACH-002 both still state aarch64 accepts 1.6 %. Only the second is true. VG-009's only "1.6" is the tail of "41.6 %", a line-coverage figure for synth-backend-riscv/src/backend.rs, framed "measured at v0.54.0" — correctly dated history, and untouched since #918. Flagging it would have been a false red on a properly dated citation. Measured and reported by the RQ-64-SCOPEGAP lane, which was briefed with explicit permission to return a negative result and used it. The claim was mine: it came from a grep for `1.6`, which returns OCCURRENCES and cannot return FRAMING. Same failure that produced v0.62's devirtualization claim, and the correction is left visible beside the original rather than edited away — the scoping error is the same shape the artifact is about. The real population the artifact should have named is larger and of a different kind: eight artifacts restating the repo's own proof counts as undated present-tense fact ("188 Qed / 52 Admitted", six months stale against a number CLAUDE.md itself count-eq-pins). `chore` deliberately, not `fix`: naming RQ-64-SCOPEGAP in a delivery-shaped subject would oblige R4 to find that artifact's status flip in THIS PR, and it belongs to #1182. Verified: rivet validate at main's 40-error baseline, 0 broken cross-refs; status_evidence_check exit 0. Refs #1085 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L * fix(ci): RQ-64-DEPS (#965) — record the plain-text requirement for dependabot commands, measured by probe `@dependabot recreate` inside BACKTICKS is silently ignored. Measured 2026-09-07: three held PRs sat unchanged for over half an hour after a backticked command; the identical command posted UNFORMATTED on #1106 was acted on within minutes, and #1107/#1110 followed once reposted plain. Worth writing down for two reasons. The failure is indistinguishable from "the bot is slow", which is how it was misdiagnosed here. And the only reason it became a measurement rather than a guess is that the plain form was probed on ONE PR before being repeated on all of them — the difference between a controlled test and three identical shots in the dark. Refs #965 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L * chore(release): RQ-64-DEPS (#965) — record PR #1186 in landed:, status stays proposed (half the done-when) R4 is satisfied by fields.landed rather than a status flip, deliberately: the exit condition landed but the four held PRs have no disposition yet, and claiming `implemented` on half a criterion is the shape this release keeps finding in other people's gates. Refs #965 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>
RQ-64-SCOPEGAP (#1085) — what obligations does an artifact with no
release:carry?Answer, measured then enforced: an unscoped artifact is a RECORD. It may cite a measured, moving figure only as dated history (a version /
#issue/ ISO date in the same sentence) or by naming the derivation instead of the number. Enforced instatus_evidence_check.pyas S1/S2, red-first on the live corpus, CI-pinned.The survey (the number that drove the choice)
release:implemented/verified)at least 80%,64 KiB) or measured results that ARE a verification record's content (13/13,338/338)Negative finding — VG-009 is not a drifted instance. Its only "1.6" is the substring of
41.6 %, a LINE-COVERAGE figure the artifact frames as "measured at v0.54.0" (unchanged since #918). A rule that flagged it would be a false red on correctly dated history — the exact framing error the brief warns about — so none does. The correction is recorded in the artifact beside the original finding, not edited into it._release.yaml's plan comment still names VG-009; coordinator's call whether to amend it.So the class is real, but it is not "two acceptance figures": it is one acceptance title plus a proof-count class of eight, all one shape.
Decision and rejections
release: backlog— rejected: mislabels the requirements base (BR-001 is the trace root, not backlog work) and buys no rule — every R-rule presumes a release window or evidence scoping these items lack; the false-red argument RQ-62-ROADMAPGATE already made.ci.yml,claims.yaml); equality would grow that set. FLOORPROSE's surviving rule — "say 'at v0.63' beside it" — is S1 stated for one file.The rules
N Qed/N Admitted/N admitsin an unscoped artifact's description or any prose-valuedfields:entry is red. The message names the livestatus.jsonvalue so the reader sees the drift; the VERDICT is dated-or-not, never equality.N modules) in a TITLE is red — the title is what every listing renders and is always read as present tense.release:, a version-named topic file (sys-verification-v0.60.yamlrecords what was true at v0.60), andrelease-v*/files (R7/R8's surface).ci.ymlpinsprogramme-staleness: … 0 undated.Red-first transcript
Untouched tree: exit 1, 23 undated citations across 13 artifacts, 32 scanned —
S2 on the titles of
VCR-REACH-002(1.6%) andVG-002(52 VFP/float admits); S1 on VG-002 ×3, ARCH-004 ×2, SWVER-005, SWVER-020, SWVER-021, TR-005, VER-001 ×2, VER-002 ×2, VCR-SEL-001 ×2, VCR-ISA-001 ×3, VCR-WASM-001 ×2, VCR-X86-001. VG-009: not flagged.After corrections: exit 0, 34 scanned, 0 undated. Every date added comes from the artifact's own increment header (2026-07-07 / 2026-07-08 / v0.45 / v0.48 / 2026-07-17 / 2026-03-17 by
git log -S); none invented. Where a number was only a mirror of a derived value (ARCH-004, TR-005, VER-001/002 coverage) the derivation is named instead. VG-002's superseded note says the gap MOVED (VFP admits closed over axiomatized float semantics, percoq/STATUS.md), not that it vanished. VCR-REACH-002 keeps its dated 1.6 % and gains the v0.63 ladder (20.2 % on the 243-module reachable corpus — a different denominator, not a trend).Two of the 23 (VCR-WASM-001) were dated only by the ADJACENT sentence — the rule's known strictness; fixed by inline dating, stated here rather than softened into a "nearby anchor" heuristic that would let a version six sentences up date a count.
Verification
python3 scripts/status_evidence_check.py→ exit 0 (programme-staleness: 293 unscoped artifacts, 34 figure citations scanned, 0 undated)python3 scripts/test_status_evidence_check.py→ 72 tests OK (12 new); all 9 mutations killed (delete S1, delete S2, no sentence split, 1-digit#Nanchor, floor inert, release-file skip removed, fields not scanned) — the release-file mutation SURVIVED on the first fixture becauseFixture.release()stamps arelease:field that masked the path exemption; fixture switched tostamp=False, now killed.rivet validate→ 40 errors (baseline, zero delta); warnings 349 → 357: all 8 new are "RQ-64-SCOPEGAP prose mentions VG-002/ARCH-004/… but no typed link" — the corrected artifacts. Left as warnings deliberately: no release artifact usestraces-to, and inventing a link type to silence a linter would misstate the relationship.python3 scripts/claim_check.py claims.yaml→ 59/597b8b7e36(fix(rivet): RQ-64-FLOORPROSE was scoped from a wrong premise — corrected before any work was done #1178); touchesci.yml(one grep block) — will re-rebase after feat(aarch64): RQ-64-ARM64LINUX — the arm64-Linux host-library claim, linked by ld.lld and EXECUTED (natively, qemu-user, unicorn) vs wasmtime #1179 if needed.Refs #1085
🤖 Generated with Claude Code
https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L