fix(retrieval-gate): the mutant roster is pinned apart from the list it names
PM's J3. `MUTANT_ROSTER` carries the thirteen labels and `MUTANT_COUNT` their number, both written apart from `MUTANTS`, and `row_seven` refuses to run unless the labels it was handed ARE that roster, in order, with no duplicate. The bar is taken from the roster's length, not from `len(mutants)`. Why a pin and not a share: the bar is a percentage, so a longer list is a lower bar per survivor. Seven copies of `M03 k = 1` took the row to 18 of 20 GREEN with the same two survivors -- nothing new felled, the bar lowered. Lengthening the list honestly now costs three edits in three places, each readable as what it is; a duplicate label is refused outright, because two copies of one mutation are one mutation whatever the roster says. Row 7 is unchanged on the shipped list: 11 of 13, bar 12 of 13, RED, the same two survivors with the same measured notes. 56 passed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
68ea05c17d
commit
2f94bbcbd4
2 changed files with 67 additions and 4 deletions
|
|
@ -466,14 +466,15 @@ def test_row_seven_is_green_when_every_mutant_is_felled(tmp_path: Path) -> None:
|
|||
cases, _ = gate.synthetic_cases(tmp_path / "bundles", FIXTURES)
|
||||
baseline = gate.deterministic_rows(cases)
|
||||
lethal = (gate.MUTANTS[3],) # M04, the reversed ranking
|
||||
row = gate.row_seven(cases, baseline, mutants=lethal)
|
||||
row = gate.row_seven(cases, baseline, mutants=lethal, roster=[m.label for m in lethal])
|
||||
assert (row.k, row.m, row.status) == (1, 1, gate.GREEN)
|
||||
|
||||
|
||||
def test_row_seven_is_red_when_a_mutant_survives(tmp_path: Path) -> None:
|
||||
cases, _ = gate.synthetic_cases(tmp_path / "bundles", FIXTURES)
|
||||
baseline = gate.deterministic_rows(cases)
|
||||
row = gate.row_seven(cases, baseline, mutants=(_noop_mutant(),))
|
||||
noop = (_noop_mutant(),)
|
||||
row = gate.row_seven(cases, baseline, mutants=noop, roster=[m.label for m in noop])
|
||||
assert (row.k, row.m, row.status) == (0, 1, gate.RED)
|
||||
assert any(
|
||||
"SURVIVED" in detail and "row 1 should have taken it" in detail for detail in row.details
|
||||
|
|
@ -976,3 +977,9 @@ def test_j3_row_seven_refuses_a_mutant_list_that_is_not_the_pinned_roster(
|
|||
assert row.status != gate.GREEN, row
|
||||
assert row.fails
|
||||
assert "roster" in row.reason or "duplicate" in row.reason
|
||||
|
||||
|
||||
def test_the_mutant_roster_is_pinned_apart_from_the_list_it_names() -> None:
|
||||
assert tuple(mutant.label for mutant in gate.MUTANTS) == gate.MUTANT_ROSTER
|
||||
assert len(gate.MUTANT_ROSTER) == gate.MUTANT_COUNT
|
||||
assert len(set(gate.MUTANT_ROSTER)) == len(gate.MUTANT_ROSTER)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue