Finding (RQ-66-DELETE, epic #242)
RQ-65-MUTANTS classified four sampled mutants DEAD — byte-identical on the corpus AND the site never evaluated — and v0.66 scoped them as the first principled deletion list for the subtraction ratchet. Before deleting, RQ-66-DELETE tried to REACH each site instead. All four are reachable. Under the survey's own three configurations every probe stays silent (the v0.65 verdict reproduces exactly); under configurations the corpus never compiles, every site fires:
site (crates/synth-backend/src/arm_backend.rs) |
survey (3 x cortex-m4) |
reached by |
:808 if vfp.is_ok() { |
unreached |
vfp_spill_881.wat, vfp_local_pressure_1069.wat on --target cortex-m7dp (reloc + self) and cortex-m4f |
:836 || msg.contains("spilling the VFP register file") |
unreached |
vfp_local_pressure_1069.wat (live24, the grown-pool composition) on the same three hard-float configs |
:862 if grown.is_ok() { |
unreached |
vfp_local_pressure_1069.wat on the same three |
:1316 if literals > 0 { |
unreached |
171/203 modules with SYNTH_GRAPH_ALLOC=1 --relocatable, 108/203 self-contained |
Measured with the survey's OWN probe ({ eprintln!(MARK); token } on the original token, Edit(site, "probe")), the survey's own enumerate_sites() and corpus, and a rebuilt synth per site; tree restored and asserted clean after each.
Root cause — a property of the corpus configuration, not of the code
So DEAD = "unreached by a soft-float, flag-off corpus". That is exactly what the report says it means; it is not a deletion list.
A second structural fact
selector_lines_code (the ratchet) counts crates/synth-synthesis/src/instruction_selector.rs + instruction_selector/**. All four DEAD sites are in arm_backend.rs, and four of the survey's five regions (R1 routing, R2 optimizer_bridge.rs, R4 shared tail, R5 startup) are outside that population — only R3 (select_with_stack.rs) is inside it. A DEAD site from R1/R2/R4/R5 can never move the ratchet even if deleted.
What RQ-66-DELETE ships
scripts/mutation_survey.py reach [--write]: re-probes DEAD sites under REACH_CFGS (hard-float targets, SYNTH_GRAPH_ALLOC=1) and records the reaching modules per configuration on the ledger record (reach_wide).
pin-subset carries want_reach_wide witnesses; ci requires every pinned witness to keep reaching (a deletion, or a probe that went blind, is red) and prints MUTANTS-REACH-WIDE entries=N reached=N unreached=0, grepped in the mutation-survey-discrimination job.
- The DEAD classification is left as recorded (it is true for the stated frame); the report gains a section stating all four are reachable and are not deletion candidates.
Still open after this
- The corpus configurations themselves. Adding a hard-float and a flag-on configuration to
CORPUS_CFGS would change every baseline hash and changed set in the ledger — that is a re-survey (RQ-65-MUTANTS item 3 in the report), not a patch, and should be done when the survey is next re-run with the parity oracle in the suite.
- Any future DEAD verdict should be read as "unreached under CORPUS_CFGS + REACH_CFGS" and still needs a reachability argument before deletion.
Refs #242
Finding (RQ-66-DELETE, epic #242)
RQ-65-MUTANTS classified four sampled mutants DEAD — byte-identical on the corpus AND the site never evaluated — and v0.66 scoped them as the first principled deletion list for the subtraction ratchet. Before deleting, RQ-66-DELETE tried to REACH each site instead. All four are reachable. Under the survey's own three configurations every probe stays silent (the v0.65 verdict reproduces exactly); under configurations the corpus never compiles, every site fires:
crates/synth-backend/src/arm_backend.rs)cortex-m4):808if vfp.is_ok() {vfp_spill_881.wat,vfp_local_pressure_1069.waton--target cortex-m7dp(reloc + self) andcortex-m4f:836|| msg.contains("spilling the VFP register file")vfp_local_pressure_1069.wat(live24, the grown-pool composition) on the same three hard-float configs:862if grown.is_ok() {vfp_local_pressure_1069.waton the same three:1316if literals > 0 {SYNTH_GRAPH_ALLOC=1 --relocatable, 108/203 self-containedMeasured with the survey's OWN probe (
{ eprintln!(MARK); token }on the original token,Edit(site, "probe")), the survey's ownenumerate_sites()and corpus, and a rebuiltsynthper site; tree restored and asserted clean after each.Root cause — a property of the corpus configuration, not of the code
CORPUS_CFGScompiles every module as--target cortex-m4(no FPU). The GI-FPU-002 VFP retry ladder (GI-FPU-002 + RA tail is now the ONLY gate between the falcon cascade and the M7 — 5 entry-point symbols; phase-2 D-register pressure is new in v0.52 (inline-f64 #869 lowering) #881 / GI-FPU-002: three named cascade entry points are the entire remaining gap to a complete falcon M7 image (attitude#tick, ekf#estimate, position#tick) — everything else in the chain now works #1069) can only be entered on a hard-float target, so its three rungs are unreachable BY CONSTRUCTION under the survey — while the two fixtures written to exercise that ladder sit IN the corpus and are compiled by their own CI oracles oncortex-m7dp.literals > 0sizing) lives behind the flag-offSYNTH_GRAPH_ALLOCspike; the corpus sets no environment, so nothing undergraph_alloc::enabled()can ever be reached by the survey, although thevcr_dec_001_graph_alloc_differentialjob runs it on every PR.So DEAD = "unreached by a soft-float, flag-off corpus". That is exactly what the report says it means; it is not a deletion list.
A second structural fact
selector_lines_code(the ratchet) countscrates/synth-synthesis/src/instruction_selector.rs+instruction_selector/**. All four DEAD sites are inarm_backend.rs, and four of the survey's five regions (R1 routing, R2optimizer_bridge.rs, R4 shared tail, R5 startup) are outside that population — only R3 (select_with_stack.rs) is inside it. A DEAD site from R1/R2/R4/R5 can never move the ratchet even if deleted.What RQ-66-DELETE ships
scripts/mutation_survey.py reach [--write]: re-probes DEAD sites underREACH_CFGS(hard-float targets,SYNTH_GRAPH_ALLOC=1) and records the reaching modules per configuration on the ledger record (reach_wide).pin-subsetcarrieswant_reach_widewitnesses;cirequires every pinned witness to keep reaching (a deletion, or a probe that went blind, is red) and printsMUTANTS-REACH-WIDE entries=N reached=N unreached=0, grepped in themutation-survey-discriminationjob.Still open after this
CORPUS_CFGSwould change every baseline hash andchangedset in the ledger — that is a re-survey (RQ-65-MUTANTS item 3 in the report), not a patch, and should be done when the survey is next re-run with the parity oracle in the suite.Refs #242