Skip to content

mutation survey: DEAD means unreached by a soft-float, flag-off corpus — all four v0.65 DEAD sites are reachable (RQ-66-DELETE) #1238

Description

@avrabe

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions