Skip to content

fix(rivet): RQ-64-FLOORPROSE was scoped from a wrong premise — corrected before any work was done - #1178

Merged
avrabe merged 1 commit into
mainfrom
fix/floorprose-premise
Sep 7, 2026
Merged

avrabe merged 1 commit into
mainfrom
fix/floorprose-premise

Conversation

@avrabe

@avrabe avrabe commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

I filed this artifact yesterday claiming the emulation floor moves in lockstep across three files — ci.yml, claims.yaml, and RQ-63-FLOOREQ.yaml's verified-by: prose — and that the third "goes stale silently" because nothing checks it.

I measured before implementing. Both halves are wrong.

Classified by framing, not counted

file occurrences what they are
claims.yaml 1 the verbatim pin — live, gated
.github/workflows/ci.yml 1 the enforced value — live, gated
RQ-63-FLOOREQ.yaml 3 one red-first transcript of a mutation test

The lockstep is two files, not three. And the artifact's three mentions are a record of a measurement that was actually executed — "with the OLD floor the mutation was EXIT=0; with the new one, EXIT=1" — which is true forever as a statement about what was run at v0.63.

It does not go stale. It becomes historical, which is exactly what a verified-by: is for. The rule this artifact itself proposed — an artifact records what was true when it shipped — the transcript already satisfied.

Implementing my own fix would have deleted a legitimate measurement record to satisfy a rule it already met.

What survives, and it is smaller

  1. The merge cost was real; the diagnosis was off by one. All four v0.63 lane rebases did conflict on the floor — the largest merge cost of the release — but on the two live files. The artifact copy never caused a conflict. Two files that must agree exactly is the design (that is RQ-63-FLOOREQ's equality), not a defect to remove.

  2. A dated transcript is unambiguous; an undated one is merely correct. A reader at v0.70 meets 324845 and cannot tell at a glance whether it is the value then or now. Fixed by saying "AT v0.63" beside it — which this PR does, instead of deleting the record.

The artifact is rewritten to state all of this, keeps the wrong premise in its description rather than silently replacing it, and is downgraded should → could.

How the error happened — the transferable part

The artifact was written from a grep for the literal. A grep returns occurrences and cannot return framing: three hits in one file read as three copies; they were one transcript.

That is v0.63's own finding — a blocker count is not a reach estimate — one domain over. I filed this artifact one day after publishing that. Knowing a lesson and applying it in a new domain are separate acts, which is why the wrong premise stays on the record.

Gates: status_evidence_check 0 · claim_check 0 · rivet validate at main's 40-error baseline (delta 0).

Refs #910

🤖 Generated with Claude Code

https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L

…ted before any work was done

I filed this artifact claiming the emulation floor moves in lockstep across
THREE files, the third being `RQ-63-FLOOREQ.yaml`'s `verified-by:` prose,
which "goes stale silently" because nothing checks it. I measured it before
implementing. Both halves are wrong.

CLASSIFIED BY FRAMING, not counted:

  claims.yaml               1   the verbatim pin        LIVE, gated
  .github/workflows/ci.yml  1   the enforced value      LIVE, gated
  RQ-63-FLOOREQ.yaml        3   one RED-FIRST TRANSCRIPT of a mutation test

THE LOCKSTEP IS TWO FILES. And the artifact's three mentions are a record of
a measurement that was actually executed — "with the OLD floor the mutation
was EXIT=0; with the new one, EXIT=1" — true forever as a statement about
what was run at v0.63. It does not go stale; it becomes HISTORICAL, which is
what a `verified-by:` is for. The rule the artifact itself proposed — an
artifact records what was true when it shipped — the transcript already met.

Implementing the fix would have DELETED A LEGITIMATE MEASUREMENT RECORD to
satisfy a rule it already satisfied.

WHAT SURVIVES, and it is smaller:
  - The merge cost was real (all four v0.63 rebases conflicted on the floor,
    the largest merge cost of the release) but on the TWO LIVE files. The
    artifact copy never caused a conflict. Two files that must agree exactly
    IS the design — that is RQ-63-FLOOREQ's equality — not a defect.
  - A dated transcript is unambiguous; an undated one is merely correct. A
    reader at v0.70 cannot tell at a glance whether `324845` is the value THEN
    or NOW. Fixed by saying "AT v0.63" beside it, which this commit does —
    instead of deleting the record.

Artifact rewritten to state all of the above and downgraded should -> could.
The wrong premise is kept in the description rather than silently replaced,
because the error is the transferable part.

HOW IT HAPPENED: the artifact was written from a `grep` for the literal.
A grep returns OCCURRENCES and cannot return FRAMING — three hits in one file
read as three copies; they were one transcript. A count is not a diagnosis,
which is v0.63's own "a blocker count is not a reach estimate" one domain
over, and I filed the artifact one day after publishing that finding.

Refs #910

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
@avrabe
avrabe merged commit 7b8b7e3 into main Sep 7, 2026
59 checks passed
@avrabe
avrabe deleted the fix/floorprose-premise branch September 7, 2026 06:20
@codecov

codecov Bot commented Sep 7, 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 Sep 7, 2026
…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
avrabe added a commit that referenced this pull request Sep 7, 2026
…S2, red-first on VCR-REACH-002 + the proof-count class (23 → 0 undated) (#1182)

* RQ-64-SCOPEGAP (#1085): unscoped artifacts get a staleness rule — S1/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

* RQ-64-SCOPEGAP (#1085): restate the equality-pin rejection on RQ-64-FLOORPROSE'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

* RQ-64-SCOPEGAP (#1085): record landed: PR #1182

Refs #1085

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

* RQ-64-SCOPEGAP (#1085): pin the staleness scan's population as an EQUALITY, 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

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
avrabe added a commit that referenced this pull request Sep 7, 2026
…g it: a LIVE pinned value may not be restated in release-artifact prose (#1185)

The artifact's own `verified-by` said the check "should be added rather than
promised". This adds it.

`check_live_floor_prose()` DERIVES the live floor from ci.yml's
`--exact-emulation-floor N` and fails if any `artifacts/release-v*/` file
restates that literal. ci.yml greps the emitted `floor-prose:` summary, so the
rule cannot silently stop running.

THE RULE IS ABOUT THE LIVE VALUE, NOT THE DIGITS — the distinction the premise
correction in #1178 turns on. The floor is enforced as an EQUALITY between
exactly TWO files (ci.yml and claims.yaml) which move together in the PR that
moves the floor. A third copy in prose is in no lockstep and rots the moment the
floor moves. But a SUPERSEDED floor quoted as dated history cannot rot, and
RQ-63-FLOOREQ's transcript of a red-first run "AT v0.63" must stay legible.

RED-FIRST, THREE CONSTRUCTED DIRECTIONS, each executed:
  1. live floor planted in an artifact -> EXIT 1, naming the exact file:line.
  2. RQ-63-FLOOREQ's three occurrences of the superseded value -> EXIT 0. The
     dated transcript is untouched, as the corrected premise demanded.
  3. THE RULE BLINDED (gate flag renamed to `--min-emulation-floor`) -> EXIT 1,
     "THIS rule went blind", summary `live floor UNDERIVABLE`. It refuses to
     pass when it cannot see its subject, rather than reporting a clean tree. A
     zero-population glob fails the same way.

AND A FOURTH NOBODY HAD TO CONSTRUCT: the rule fired on its own author. The
first draft of the artifact's `verified-by` quoted the live floor as a literal
while describing the measurement, and the checker went red naming that exact
line. The obvious way to write the field WAS the defect. Recorded in the
artifact rather than exempted, and the number is now cited by its derivation.

Verified: status_evidence exit 0 with `floor-prose: 50 release artifacts
scanned, ... restated 0 times` matching the ci.yml grep; claim_check 61/61;
ci.yml parses; rivet at main's baseline.

Refs #910


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