Go to file
Levi Neuwirth 80be47ca13
S16: ratification round 6 -- derive a mutation's blast radius, don't recall it
Whole-artifact review of 85429d6 returned one blocking finding: M6a's blast
radius was understated.

check_invariant is check_invariants(...).filter(...) (invariants.rs:313-:318),
so deleting the S->G dispatcher call silences that violation for every
consumer, not only the two tests M6a named. The full radius is six, each now
tabled with where it fails and why:

  m41...staff_names_absent_group          its own assert_eq! cardinality check
  invariant_21_negative_generator_...     same
  every_invariant_has_a_negative_generator  own assert! at generators.rs:994
  negative_generators_are_reasonably_targeted  own assert! at :1046
  every_invariant_shrinks_to_a_small_witness   INSIDE shrink, entry assert :933
  shrink_is_idempotent                         INSIDE shrink, same assertion

All six share one cause and all six are expected, not findings. The last two
panic with "shrink starting point must violate the target invariant", raised in
a function the mutation never edited, so they are to be reported as
shrink-entry failures rather than misread as a defect in shrink.

M6b's single expected failure -- m41b alone -- is now recorded as positive
evidence: the four all() consumers and the generator test all stay green
because every invariant-21 fixture is S->G, which confirms touch row 8's pinned
direction more directly than any assertion about the generator does.

Round 5 added the blast-radius rule and then enumerated the radius from memory.
Touch row 8 already lists those four consumers with these exact line numbers --
draft amendment 1 put them there as the two-crate root cause -- and M6a's
outcome was written without consulting the row that owns them. The document
knew; the mutation did not ask.

That is a new variety of the propagation failure. Revisions A-J recorded
corrections failing to reach a consumer; round 1 a declared peer; round 4 a
gate written later. This one is a fact recorded in one section not reaching a
requirement written in another -- nothing stale, nothing contradicted, and no
sweep for restated text would find it. It needed the question "what does this
section already know that this one should be using?"

So the fix is an obligation rather than a list: §3 now requires every mutation
to state its complete expected-failure set, derived from the recorded consumer
surfaces (touch row 8's four, pin 1a's three, pin 8's four), with any unlisted
failure treated as a finding in the contract or the implementation. M1's, M2's
and M5's radii are deliberately not enumerated here, since enumerating from
memory is what produced this finding; execution derives each and reports the
derivation.

Still DRAFT, still unratified. No implementation work has begun.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ps1szk2mSfgp4Cz21eVH9x
2026-08-09 20:16:29 +02:00
.github/workflows Editor T2 W3: the goldens become conformance gate [9/9] 2026-07-23 17:20:14 -04:00
crates P13-S27: accept reduction authority implementation 2026-08-09 15:05:58 +02:00
spec S16: ratification round 6 -- derive a mutation's blast radius, don't recall it 2026-08-09 20:16:29 +02:00
spikes/editor-toolkit Packet 2B: both candidates consume the frozen text apparatus 2026-07-30 21:42:05 -04:00
.gitignore Schema major 1 Phase F: ratify engrave I8/I9/I10 + process trail 2026-07-06 17:40:38 -04:00
CLAUDE.md Post-S27 doc reconciliation: CLAUDE, handoff, S16 contract, both ledger cells 2026-08-09 15:24:21 +02:00
CONFORMANCE.md Editor T2 W3: the goldens become conformance gate [9/9] 2026-07-23 17:20:14 -04:00
Cargo.lock Editor T4-pre W2: the glyph outlines become a shared typed seam 2026-07-24 18:54:30 -04:00
Cargo.toml T4 round 0: iced is eliminated, and the probe that cleared it proved nothing 2026-07-28 19:01:51 -04:00