plan(v0.67): scope the release — "One root cause, not five symptoms" (7 artifacts) - #1268
Merged
Merged
Conversation
…(6 artifacts) v0.66 built oracles that had never existed and ran them on code that had never been executed: the self-contained corpus images were COMPILED roughly 400 times per survey run and never once BOOTED, and the first run of the boot sweep found two silent miscompiles. It closed 77 of 103 pinned parity entries and still ended with `known_open_pins` at 127, because the instruments kept finding things faster than the fixes closed them. THE RESIDUE IS A CLUSTER THAT READS AS SEPARATE DEFECTS AND IS NOT. #1204, #1241 and a run of optimized-path wrong answers all report R9/R10/R11 clobbered. #1241 asks the question in its own title — "(#1204's pair class?)". #1204 names the mechanism: `ensure_callee_saved_prologue` (#490) covers R4-R8 while the allocator hands out R9-R11, and in a self-contained image R11 is the LINEAR-MEMORY BASE and R10 backs the software bounds guard. So v0.67 does what RQ-66-BOTHWRONG got right and generalises it: triage by root cause, and write the attribution as a MEASUREMENT rather than a prediction. The NEGATIVE CONTROL is built in — #1240 is explicitly the #916 zero-fill class, a different mechanism with its own artifact. If it closes as a side effect, the attribution is wrong somewhere and the release publishes that. THE SUBTRACTION LEVER IS NAMED BEFORE THE WORK STARTS, because "find something to delete" is what produced eight consecutive rises. v0.66 killed the previous lever honestly: all four "DEAD" sites were REACHABLE, and all four sat outside the ratchet's population anyway, so deleting every one would have moved the metric by zero. What remains is v0.58's own correction — a rule is done when the hand-written arm it replaces is DELETED — which makes `sel_dsl_rules` RISING the precondition for `selector_lines_code` FALLING. One artifact, not two. The candidate is the i64 IMMEDIATE family: i32 carries sixteen proven `_imm` rules, i64 carries ZERO of the 80, the hand-written arms exist, and the Rocq proofs follow a pattern already discharged. ARTIFACTS: CALLEESAVE (must, #1204), HIGHWORD (must, #1240), SUBTRACT (must, #242), PINDOWN (should, #242), NOTESGATE (should, #1259), ARCHMODEL (carried, #1136 — a SEVENTH consecutive N/A, re-verified at cut rather than copied). THE RELEASE ANCHOR MOVES TO v0.66.0 in this PR, which is what the window rule requires: `status_evidence_check` reported ANCHOR-LAG 1 and named the values it needed (delivery 69, programme 417). Moving it later reds A0; moving the constant without the ledger pin reds Claim Check, which it did on the first attempt here and is the gate working as designed. claim_check 0 · status_evidence 0 · oracle_wiring 0 · version_pins 0 rivet validate: 40 errors — UNCHANGED from the pre-existing baseline; the six new artifacts add only the same two WARN classes every v0.66 artifact already produces. Refs #1204 #1240 #1259 #1136 #242 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
…he VFP register file
A USER REPORT on shipped v0.66.0, filed while this plan PR was in CI. The falcon
flight cascade lowers 21 of 22 functions on --target cortex-m7dp and declines
exactly one, the tick, with "VFP register file exhausted (S0..S15 all live)".
DERIVED FROM THE SOURCE, not inferred from the message:
instruction_selector.rs `vfp_home: &[bool; 16]`, "These reside in S0..S15,
which are AAPCS-VFP CALLER-saved"
arm_encoder.rs encodes VfpReg::S0 through VfpReg::S31 already
VPUSH / VPOP appear NOWHERE in the encoder
liveness.rs:5977 "D8..D15 are CALLEE-saved, out of scope"
Every FPU target synth supports has D0-D15 = S0-S31. THE FILE IS NOT EXHAUSTED
WHEN THAT ERROR FIRES — HALF OF IT IS UNUSED, because using it needs a VPUSH/VPOP
prologue the encoder cannot emit.
THE REPORTER ASKED WHICH OF TWO REMEDIES WAS INTENDED. Neither is: they already
tried guest-side #[inline(never)] and the decline MOVED WITH THE BODY (#952 then
#1102), and VFP spilling was never going to cover a tick this size against half a
register file.
IT IS RQ-67-CALLEESAVE IN THE OTHER REGISTER FILE. Integer: the prologue saves
R4-R8 while the allocator hands out R9-R11, so a callee-saved register is
clobbered — a SILENT WRONG ANSWER. Float: nothing saves D8-D15, so the allocator
refuses to hand them out — a LOUD DECLINE. One root shape, opposite directions.
claim_check 0 · status_evidence 0
Refs #1267 #1204
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! |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Scopes v0.67 and moves the release anchor to
v0.66.0. Seven artifacts, no code changes.Why this theme
v0.66 built oracles that had never existed and ran them on code that had never been executed — the self-contained corpus images were compiled roughly 400 times per survey run and never once booted, and the boot sweep's first run found two silent miscompiles. It closed 77 of 103 pinned parity entries and still ended with
known_open_pinsat 127, because the instruments kept finding things faster than the fixes closed them.The residue is a cluster that reads as separate defects and is not. #1204, #1241 and a run of optimized-path wrong answers all report R9/R10/R11 clobbered. #1241 asks the question in its own title — "(#1204's pair class?)". #1204 already names the mechanism:
R110x2000_0100by the generated startupR10R9liveness::ensure_callee_saved_prologue(#490) saves R4-R8. The optimized path's allocator hands out R9-R11. The return values are correct; it is the next function that breaks.Artifacts
RQ-67-CALLEESAVERQ-67-VFPREACHRQ-67-HIGHWORDclz/ctz/popcnthigh word — the #916 class on the other selectorRQ-67-SUBTRACTselector_lines_codefall for the first timeRQ-67-PINDOWNknown_open_pinsmust end below 127RQ-67-NOTESGATERQ-67-ARCHMODELAdded after the plan was written, from a user report (#1267)
Filed by gale against shipped v0.66.0 while this PR was in CI. The falcon flight cascade lowers 21 of 22 functions on
--target cortex-m7dpand declines exactly one — the tick — withVFP register file exhausted (S0..S15 all live).Reading the source rather than the message: the selector allocates inside
S0-S15/D0-D7(vfp_home: &[bool; 16]), the encoder already encodesVfpReg::S0throughS31,VPUSH/VPOPappear nowhere, andliveness.rs:5977says in so many words thatD8-D15are callee-saved and out of scope. Every FPU target synth supports hasS0-S31. The file is not exhausted when that error fires — half of it is unused, because using it needs a prologue that cannot be emitted.That makes the release more coherent, not less. It is
RQ-67-CALLEESAVE's shape one register file over:R4-R8R9-R11D8-D15One root shape — the callee-saved contract and the allocator disagreeing about which registers exist — failing in opposite directions.
The reporter asked which of two remedies was intended. Neither: they already tried guest-side
#[inline(never)]and the decline moved with the body (#952, then #1102), and VFP spilling was never going to cover a tick this size against half a register file. Answered on the issue.Two things deliberately fixed in the plan rather than discovered during it
The attribution is a measurement, not a prediction. CALLEESAVE's done-when requires re-running the boot sweep and the parity oracle over the whole cluster and naming which issues closed. v0.66's five both-selectors-wrong classes turned out to be four root causes — two issues were one defect, one issue was two independent causes. Five fixes for one bug is worse than one honestly attributed, and so is one fix claimed to have closed five things it never touched. HIGHWORD stays a separate artifact as the negative control: it is explicitly a different mechanism, so if it closes as a side effect the attribution is wrong somewhere and the release says so.
The subtraction lever is named before the work starts. "Find something to delete" is the instruction that produced eight consecutive rises. v0.66 killed the previous lever honestly — all four "DEAD" sites were reachable, and all four sat outside the ratchet's population anyway, so deleting every one would have moved the metric by zero. What remains is v0.58's own correction, which makes
sel_dsl_rulesrising the precondition forselector_lines_codefalling: one artifact, not two. The candidate is the i64 immediate family — i32 carries sixteen proven_immrules, i64 carries zero of the 80, the hand-written arms exist inselect_with_stack.rs, and the Rocq proofs follow a pattern already discharged.The anchor move, and the gate that caught it
status_evidence_checkreportedANCHOR-LAG 1and named the values it needed (v0.66.0, delivery 69, programme 417). Moving the constant without the matching ledger pin reddened Claim Check on the first attempt here — the gate working exactly as designed, since the anchor is pinned inclaims.yamlprecisely so it cannot drift silently. Both move in this PR.Gates
rivet validatereports 40 errors, unchanged from the pre-existing baseline. The six new artifacts add only the same two WARN classes every v0.66 artifact already produces (req-type: processand the commit-trailer id shape).Refs #1204 #1240 #1259 #1267 #1136 #242
🤖 Generated with Claude Code
https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L