fix(876): sweep session narrative out of hooks, workflows, scripts, tests and code comments; grow the detector to the process corpus #906

Merged
timothy merged 1 commits from fix/876-narrative-sweep-hooks-and-code into main 2026-09-03 21:26:04 +02:00
Owner

Closes #876.

docs.no-session-narrative reaches every durable artifact; its detector scanned only docs/**/*.md
and root markdown, and nothing had ever swept the rest. The issue named four sites and called them a
floor. This PR derives the population, classifies every site with #812's three dispositions, and
grows the detector to the corpus the sweep measured as active.

The population was not 4

A whitespace-joined sweep over every tracked file OUTSIDE the detector's population — for the
detector's own PATTERNS plus the attribution / review-round class #812 found — returned 453 sites in
108 files
at fb5592971 (2026-09-03). A second pass for phrasings the first list missed
(hyphenated round-N, "an earlier version", "the reviewer proved", "used to carry") added residuals
in the same files. Like #812, no closure over a phrasing space is claimed: the manifests' sites were
remediated, and the detector's --all over the grown population returns only the one docs carve-out
#812 already recorded.

corpus sites (first sweep) files
.claude/, .gitea/, .husky/, docker/ and scripts/ (non-test) 100 26
scripts/tests/ 226 35
web/ 108 31
C# + design-system/ 19 16

Dispositions

724 manifest rows across the five per-corpus manifests (posted as comments below; round-2 rows that
restate a round-1 site are marked as such): SEVER 467 · CUT 49 · KEEP 208 (carve-out, citation,
fixture, false-positive — each labelled with its reason). The rule applied throughout: the who-benefits
test; sever the attribution, keep the finding; a code comment's issue/PR number is a citation and stays;
a hook comment's rejected design stays with its harm; a test docstring's "round N found X" becomes X.
Twenty-six vitest titles carrying review-round or severity labels or a reviewer attribution (call sites whose title changed, each changed title line walked back to its it( / it.each(...)( anchor) were renamed after proving nothing filters or
references a title.

The detector grows to the process corpus

scripts/check-doc-narrative.py now scans every tracked file under .claude/, .gitea/, .husky/
and scripts/ regardless of extension, minus itself and its own test (exempt by NAME — their fixtures
are the phrasings); --all lists tracked REGULAR files, so a tracked symlink (this repo's cross-repo
.claude/skills/jellyfin link) is neither scanned under its own name nor counted, and neither is a gitlink. scripts/tests/fixtures/
is exempt as test data: it holds copies of decision records, so the records' own exemption reasoning
applies, and it is what keeps the record's "no scanned path deeper than three slashes" measurement true
(re-measured: 179 files, max depth 3, and now asserted by the oracle test so the claim cannot go stale silently). The #812 argument for keeping docs/superpowers/** in scope runs the other way
here: --diff sees only ADDED lines, and 287 of the 453 sites were under 30 days old — this is
where narrative is being added, so the advisory nudge has reach. Density agrees: 56 line-mode
PATTERNS hits over the 113 regular files the predicate admits (120 tracked entries minus the two by-name exemptions, the fixtures directory and a symlink), against 9 over 66 docs files before #812. web/ and C# stay out
on the same measurement: 3 of the 74 PATTERNS-matching sites, across ~4,600 files. The predicate did
not grow
— PATTERNS matched 74 of 453 sites, and widening the word list to the attribution class is
the treadmill the withdrawn parity test ran on; the record says so.

Proof: the population oracle is restated over path segments with the new arms; the synthetic cross
product gains the process heads, tests/hooks seconds, the exempt basenames and .py/.sh/.yml;
the fixture test witnesses a skill, a hook, a test and the exempt file's twin one directory over, and a
symlink fixture witnesses that a link to a file outside the population is neither scanned nor counted.
Ten mutants each redden the suite: keep the TAB git appends to a +++ filename containing a space (a pre-existing silent drop in --diff, fixed here with a positive control), test the mode per index row instead of per path (a conflicted path is otherwise scanned three times, and a symlink/regular add/add conflict opens the symlink), drop the process arm, drop the by-name exemption, exempt by
startswith instead of by name (a .py.bak axis in the cross product is what sees it), drop scripts/,
add web/, drop the fixtures exemption, list only *.md in --all, drop the symlink filter.

Code is unchanged by construction

Per file type, HEAD vs origin/main: Python modules AST-equal with docstrings stripped, except #
lines inside the embedded fixture programs (string literals) of three test modules; workflows differ
only in # lines inside run: block scalars; shell, C#, TypeScript and jq equal with comment lines
stripped. The stated exceptions: the detector and its test, the 26 vitest titles, two registry note
strings in pageSizeCallSites.guard.test.ts, and the prose fields of mutation_manifest.py (no
clause= or replacement= touched).

Verification

  • scripts/tests: 1569 passed, 3 skipped (final head); ruff check + format --check
    on all 39 changed Python files; bash -n on every changed shell file; yaml.safe_load on every
    changed workflow; BOM unchanged on every touched .cs.
  • web/: eslint, tsc -b, vitest run — 121 files / 1319 tests green.
  • check-doc-narrative.py --all: 179 files, 1 warning (the #812 carve-out); --diff origin/main:
    0 warnings.
  • decisions_validate --base origin/main: OK; catalog regenerated.
  • Cold reviews: round 1 on ddbe9d811 — Codex (cross-family, read-only; 2 MEDIUM / 2 LOW / 1 NIT) and
    an Opus reviewer in an isolated worktree that read every deleted line (1 HIGH / 5 MEDIUM / 10 LOW /
    3 NIT; no lost knowledge, every finding about the claims and the detector). All closed in the amended
    head; round 2 verified the closures (see the Review-verdict: comment).

Docs updated

docs/decisions/records/docs/no-session-narrative.md (mechanics:, signals:, body — Decisions-Edit: yes),
docs/decisions/README.md (regenerated), docs/ci-cd.md (the docs-reminder population).

🤖 Generated with Claude Code

https://claude.ai/code/session_01PEcBoFw7ctrf3Nb7R7x7wk

Closes #876. `docs.no-session-narrative` reaches every durable artifact; its detector scanned only `docs/**/*.md` and root markdown, and nothing had ever swept the rest. The issue named four sites and called them a floor. This PR derives the population, classifies every site with #812's three dispositions, and grows the detector to the corpus the sweep measured as active. ## The population was not 4 A whitespace-joined sweep over every tracked file OUTSIDE the detector's population — for the detector's own PATTERNS plus the attribution / review-round class #812 found — returned **453 sites in 108 files** at `fb5592971` (2026-09-03). A second pass for phrasings the first list missed (hyphenated `round-N`, "an earlier version", "the reviewer proved", "used to carry") added residuals in the same files. Like #812, no closure over a phrasing space is claimed: the manifests' sites were remediated, and the detector's `--all` over the grown population returns only the one docs carve-out #812 already recorded. | corpus | sites (first sweep) | files | |---|---|---| | `.claude/`, `.gitea/`, `.husky/`, `docker/` and `scripts/` (non-test) | 100 | 26 | | `scripts/tests/` | 226 | 35 | | `web/` | 108 | 31 | | C# + `design-system/` | 19 | 16 | ## Dispositions 724 manifest rows across the five per-corpus manifests (posted as comments below; round-2 rows that restate a round-1 site are marked as such): **SEVER 467 · CUT 49 · KEEP 208** (carve-out, citation, fixture, false-positive — each labelled with its reason). The rule applied throughout: the who-benefits test; sever the attribution, keep the finding; a code comment's issue/PR number is a citation and stays; a hook comment's rejected design stays with its harm; a test docstring's "round N found X" becomes X. Twenty-six vitest titles carrying review-round or severity labels or a reviewer attribution (call sites whose title changed, each changed title line walked back to its `it(` / `it.each(...)(` anchor) were renamed after proving nothing filters or references a title. ## The detector grows to the process corpus `scripts/check-doc-narrative.py` now scans every tracked file under `.claude/`, `.gitea/`, `.husky/` and `scripts/` regardless of extension, minus itself and its own test (exempt by NAME — their fixtures are the phrasings); `--all` lists tracked REGULAR files, so a tracked symlink (this repo's cross-repo `.claude/skills/jellyfin` link) is neither scanned under its own name nor counted, and neither is a gitlink. `scripts/tests/fixtures/` is exempt as test data: it holds copies of decision records, so the records' own exemption reasoning applies, and it is what keeps the record's "no scanned path deeper than three slashes" measurement true (re-measured: 179 files, max depth 3, and now asserted by the oracle test so the claim cannot go stale silently). The #812 argument for keeping `docs/superpowers/**` in scope runs the other way here: `--diff` sees only ADDED lines, and **287 of the 453 sites were under 30 days old** — this is where narrative is being added, so the advisory nudge has reach. Density agrees: 56 line-mode PATTERNS hits over the 113 regular files the predicate admits (120 tracked entries minus the two by-name exemptions, the fixtures directory and a symlink), against 9 over 66 docs files before #812. `web/` and C# stay out on the same measurement: 3 of the 74 PATTERNS-matching sites, across ~4,600 files. **The predicate did not grow** — PATTERNS matched 74 of 453 sites, and widening the word list to the attribution class is the treadmill the withdrawn parity test ran on; the record says so. Proof: the population oracle is restated over path segments with the new arms; the synthetic cross product gains the process heads, `tests`/`hooks` seconds, the exempt basenames and `.py`/`.sh`/`.yml`; the fixture test witnesses a skill, a hook, a test and the exempt file's twin one directory over, and a symlink fixture witnesses that a link to a file outside the population is neither scanned nor counted. Ten mutants each redden the suite: keep the TAB git appends to a `+++` filename containing a space (a pre-existing silent drop in `--diff`, fixed here with a positive control), test the mode per index row instead of per path (a conflicted path is otherwise scanned three times, and a symlink/regular add/add conflict opens the symlink), drop the process arm, drop the by-name exemption, exempt by `startswith` instead of by name (a `.py.bak` axis in the cross product is what sees it), drop `scripts/`, add `web/`, drop the fixtures exemption, list only `*.md` in `--all`, drop the symlink filter. ## Code is unchanged by construction Per file type, HEAD vs `origin/main`: Python modules AST-equal with docstrings stripped, except `#` lines inside the embedded fixture programs (string literals) of three test modules; workflows differ only in `#` lines inside `run:` block scalars; shell, C#, TypeScript and jq equal with comment lines stripped. The stated exceptions: the detector and its test, the 26 vitest titles, two registry `note` strings in `pageSizeCallSites.guard.test.ts`, and the prose fields of `mutation_manifest.py` (no `clause=` or `replacement=` touched). ## Verification - `scripts/tests`: 1569 passed, 3 skipped (final head); `ruff check` + `format --check` on all 39 changed Python files; `bash -n` on every changed shell file; `yaml.safe_load` on every changed workflow; BOM unchanged on every touched `.cs`. - `web/`: `eslint`, `tsc -b`, `vitest run` — 121 files / 1319 tests green. - `check-doc-narrative.py --all`: 179 files, 1 warning (the #812 carve-out); `--diff origin/main`: 0 warnings. - `decisions_validate --base origin/main`: OK; catalog regenerated. - Cold reviews: round 1 on `ddbe9d811` — Codex (cross-family, read-only; 2 MEDIUM / 2 LOW / 1 NIT) and an Opus reviewer in an isolated worktree that read every deleted line (1 HIGH / 5 MEDIUM / 10 LOW / 3 NIT; no lost knowledge, every finding about the claims and the detector). All closed in the amended head; round 2 verified the closures (see the `Review-verdict:` comment). ## Docs updated `docs/decisions/records/docs/no-session-narrative.md` (`mechanics:`, `signals:`, body — `Decisions-Edit: yes`), `docs/decisions/README.md` (regenerated), `docs/ci-cd.md` (the docs-reminder population). 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01PEcBoFw7ctrf3Nb7R7x7wk
timothy added 1 commit 2026-09-03 21:02:09 +02:00
fix(876): sweep session narrative out of hooks, workflows, scripts, tests and code comments; grow the detector to the process corpus
Build ErsatzTV Image / CI toolchain image resolves (pull_request) Successful in 35s
Build ErsatzTV Image / Delimiter ban (release path) (pull_request) Successful in 57s
PR Gates / CI image pin matches docker/ci (pull_request) Successful in 37s
PR Gates / Docs update reminder (pull_request) Successful in 1m0s
PR Gates / decisions lifecycle (pull_request) Successful in 20s
PR Gates / Fix proofs (Proves trailers) (pull_request) Successful in 17s
review-verdict/h10 Review-verdict: MERGEABLE @ a7d91bf (base: main)
Review verdict / Set review-verdict status (pull_request_target) Successful in 45s
Build ErsatzTV Image / Build & test (.NET) (pull_request) Successful in 9m25s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (pull_request) Successful in 6m17s
Build ErsatzTV Image / Build & push image (amd64) (pull_request) Skipped
PR Gates / Script lint and tests (ruff + pytest) (pull_request) Successful in 19m27s
Build ErsatzTV Image / Functional E2E (curl + UI contracts) (pull_request) Successful in 6m4s
Build ErsatzTV Image / API docs in sync (OpenAPI + endpoint index) (pull_request) Successful in 8s
Build ErsatzTV Image / Formatting (changed .cs conform to .editorconfig) (pull_request) Successful in 7s
a7d91bf15a
`docs.no-session-narrative` reaches every durable artifact, but its detector scanned only
`docs/**/*.md` and root markdown, and nothing had ever swept the rest. The issue named four sites
from one grep and called them a floor. Deriving the population instead — a whitespace-joined sweep
over every tracked file outside the detector, for the detector's own phrasings plus the attribution
and review-round class #812 found — gave 453 sites in 108 files at `fb5592971`, and a second pass
for phrasings the first list missed (hyphenated `round-N`, "an earlier version", "the reviewer
proved") added residuals in the same files. Every site was classified with #812's three
dispositions (CUT / SEVER / KEEP with its sub-kind) under the who-benefits test; the per-site
manifests are on the PR. The rejected designs, tested-and-rejected fixtures, measurements and
traps stay; the attribution of who found them and the round in which they were found go.

The detector's population grows to `.claude/`, `.gitea/`, `.husky/` and `scripts/` regardless
of extension, minus the detector and its own test (whose fixtures ARE the phrasings) and minus
`scripts/tests/fixtures/` (test data, including decision-record copies — the same reasoning as
the records' own exemption, and what keeps the record's depth measurement true), and `--all`
lists tracked REGULAR files only — a symlink's content is its target and a gitlink has none. The #812
argument for leaving `docs/superpowers/**` in the population runs the other way here: `--diff`
sees only ADDED lines, and 287 of the 453 sites were under 30 days old — this corpus is where
narrative is being added, so the advisory nudge has reach. Density agrees: 56 line-mode hits over
the 113 regular files the predicate admits, against 9 over 66 docs files before #812. `web/` and C# stay out on the same
measurement (3 of 74 PATTERNS-matching sites, ~4,600 files). The predicate did not grow: PATTERNS
matched 74 of 453 sites, and widening the word list to the attribution class is the treadmill
the withdrawn parity test ran on. The population oracle is restated over segments with the new
arms, the synthetic cross product gains the process heads and non-markdown extensions, a fixture
witnesses that a tracked symlink is neither scanned nor counted, a `.py.bak` axis separates a
by-name exemption from a `startswith` over the same tuple, and eight mutants (drop the process
arm, drop the by-name exemption, exempt by `startswith`, drop or add a prefix, drop the fixtures
exemption, list only markdown, drop the symlink filter, test the mode per row instead of per
path) each
redden it. A pre-existing silent drop in `--diff` goes with it: git tab-terminates a `+++`
filename that contains a space, and the kept tab made `is_scanned_path` refuse the file with no
notice — fixed, with a positive control and its own mutant.

Code is unchanged by construction, measured per file type against `origin/main`: Python modules
are AST-equal with docstrings stripped, except `#` lines inside the embedded fixture programs
(string literals) of three test modules; workflows differ only in `#` lines inside `run:` block
scalars; shell, C#, TypeScript and jq are equal with comment lines stripped. The stated
exceptions: the detector and its test, 26 vitest titles that carried review-round or severity
labels or a reviewer attribution (call sites whose title changed — every changed title line
walked back to its `it(` / `it.each(...)(` anchor, so a `' + '` concatenation counts once), two
registry note strings and the mutation manifest's prose fields. scripts/tests: 1565 passed.
Web: lint, typecheck, 1319 tests green. Closes #876.

Decisions-Edit: yes
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PEcBoFw7ctrf3Nb7R7x7wk
Author
Owner

Per-site manifest — hooks, workflows, scripts (non-test)

Line numbers are from the pre-edit tree (fb5592971); ## Round 2 rows come from the wider phrasing sweep. Rows marked as duplicates restate a round-1 site.

manifest_AB — narrative sweep, slice AB (hooks, workflows, docker, scripts minus scripts/tests)

Line numbers are from slice_AB.tsv (pre-edit). adjacent rows are sites found in the ±10-line
comment block around a listed site and handled under the same rules.

file:line matched disposition reason (≤25 words) edited
.claude/hooks/design-sync-reminder.sh:7 this session KEEP-false-positive "the FIRST time this session edits a UI file" — a runtime Claude session, not chronology no
.claude/hooks/design-sync-reminder.sh:58 this session KEEP-false-positive inside the displayed reason string; runtime session, and a displayed string no
.claude/hooks/posttooluse-worktree-marker.sh:3 this session KEEP-false-positive "this session's id" is the marker value written at runtime no
.claude/hooks/posttooluse-worktree-marker.sh:4 this session KEEP-false-positive "apart from this session's own" — runtime session identity no
.claude/hooks/prepush-donewhen.sh:73 adversarial review KEEP-false-positive displayed block message naming the "adversarial review passed" Done-when box no
.claude/hooks/pretooluse-agent-model.sh:11 the same session KEEP-carveout the measured incident IS the why-a-hook argument: every rule with a forcing function held, the one without defaulted no
.claude/hooks/pretooluse-agent-model.sh:67 this session KEEP-false-positive displayed prompt text about inheriting the session's model no
.claude/hooks/pretooluse-merge-consent.sh:12 used to say SEVER dropped "this comment used to say"; kept the rejected word "sound", the mechanism and ersatztv#778 yes
.claude/hooks/pretooluse-merge-consent.sh:23 adversarial review KEEP-false-positive names the Done-when box, not a review event no
.claude/hooks/pretooluse-merge-consent.sh:190 first draft SEVER dropped "Cold review found the first draft"; kept the rejected collapse and its exact false-open yes
.claude/hooks/pretooluse-merge-consent.sh:504 cold review found SEVER attribution only; everything after the colon (200-vs-404 precedence, dead hardened path) kept verbatim yes
.claude/hooks/pretooluse-merge-consent.sh:588 first draft SEVER dropped "The first draft"; kept the rejected arm and the measured no-op (suite stayed green) yes
.claude/hooks/pretooluse-merge-consent.sh:695 Codex review KEEP-false-positive displayed ask message naming the review to perform no
.claude/hooks/pretooluse-merge-consent.sh:773 cold review found SEVER dropped "cold review found"; kept the quoted cross-reference and both outcomes yes
.claude/hooks/pretooluse-merge-consent.sh:~208 adjacent (Cold review demonstrated) SEVER → "Measured"; kept "first landed inside the scheduled-auto-merge branch only", which :773 quotes verbatim yes
.claude/hooks/pretooluse-worktree-guard.sh:7 this session KEEP-false-positive "marker == this session" — runtime session identity no
.claude/skills/closing-an-issue/SKILL.md:20 adversarial review KEEP-false-positive procedural step ("Reply to reviewer"), not chronology no
.gitea/workflows/docker-build.yml:131 the first version of this SEVER kept the trap and the two-line staleness measurement; dropped "the first version of this comment" yes
.gitea/workflows/docker-build.yml:605 that session KEEP-false-positive "that sessions have been re-running by hand" is the job's rationale no
.gitea/workflows/docker-build.yml:796 the first version of this SEVER kept the rejected isolated-copy design and its harm (reports healthy while the real invocation is deselected) yes
.gitea/workflows/review-verdict.yml:47 used to be KEEP-carveout "written twice, drifted in the dangerous direction" is the rejected design plus the harm that justifies the shared script no
.gitea/workflows/review-verdict.yml:92 an earlier draft SEVER restated as "the all-time REPO-WIDE figure is the WRONG window"; all numbers kept yes
.gitea/workflows/review-verdict.yml:288 Found by cold review CUT standalone attribution sentence; the finding before it is complete yes
.gitea/workflows/review-verdict.yml:388 An earlier draft SEVER rejected npm-manifest inclusion kept conditionally, with its code-execution harm and quoted rationale yes
.gitea/workflows/review-verdict.yml:419 Found by cold review SEVER → "Measured"; the ersatztv#751 citation and the reproduced CLAUDE.md exemption kept yes
.gitea/workflows/review-verdict.yml:471 used to be KEEP-carveout the rejected exception and the self-contradictory reasoning quoted so it is not re-proposed no
.gitea/workflows/review-verdict.yml:585 found by cold review SEVER kept the nil-slice finding, the ersatztv#751 pointer and the measurement yes
.gitea/workflows/review-verdict.yml:636 cold review SEVER "(cold review reproduced this)" → "(reproduced)"; the string-vs-number mechanism kept yes
.gitea/workflows/review-verdict.yml:674 round 3 KEEP-citation (ersatztv#849 round 3) is a provenance pointer into the issue thread no
.gitea/workflows/review-verdict.yml:705 Round 8 SEVER "Round 8 scoped this" → "A narrowing scoped it"; the rejected narrowing and its refutation kept yes
.gitea/workflows/review-verdict.yml:761 round 4 SEVER "Round 3 type-tested" → "Type-testing"; the measurement and the (#849 round 4) citation kept yes
.gitea/workflows/review-verdict.yml:860 earlier attempt KEEP-carveout two rejected parses, each with its exact defeat (main)evil); the count structures the record no
.gitea/workflows/review-verdict.yml:1005 earlier version of this CUT clause only said the comment once rested on the margin; "corroborates rather than carries" states it twice above yes
.gitea/workflows/review-verdict.yml:1138 the first draft of this SEVER kept "19 would be the count if the last page could not sleep. It can." yes
.gitea/workflows/review-verdict.yml:1141 earlier version of this SEVER rejected ~335s reasoning kept as "A PLAUSIBLE reading", with the refutation and the 620s pessimum yes
.gitea/workflows/review-verdict.yml:1164 earlier drafts SEVER kept the state-once rule and its reason: two statements 45 lines apart drift into disagreement yes
.gitea/workflows/review-verdict.yml:1212 earlier version of this SEVER kept the staleness measurement ("three of five such counts went stale within days") yes
.gitea/workflows/review-verdict.yml:1241 The first draft of this SEVER kept the jq -e safe-by-accident rejection and the reasoning the rule exists to retire yes
.gitea/workflows/review-verdict.yml:1275 earlier version of this SEVER kept "the issue overstates it"; the artifact half of the attribution dropped yes
.gitea/workflows/review-verdict.yml:1326 round 2 KEEP-citation (ersatztv#763, round 2) is a provenance pointer no
.gitea/workflows/review-verdict.yml:1420 An earlier draft SEVER kept the intuitive mechanism recorded as WRONG (CreatorID == 0) without the draft chronology yes
.gitea/workflows/review-verdict.yml:1525 round 2 KEEP-citation (ersatztv#849, round 2); the surrounding text is the finding, not chronology no
.gitea/workflows/review-verdict.yml:1541 review round KEEP-carveout a withdrawn ::warning:: with its three concrete defects; the round count is the withdrawal reason no
.gitea/workflows/review-verdict.yml:1574 round 2 KEEP-citation (ersatztv#849, round 2) provenance pointer no
.gitea/workflows/review-verdict.yml:1589 round 3 KEEP-citation (ersatztv#849 round 3) provenance pointer no
.gitea/workflows/review-verdict.yml:1707 round 3 SEVER "The old message said" → "A message saying"; the rejected wording and the correction kept yes
.gitea/workflows/review-verdict.yml:1783 cold review SEVER kept the reproduced consequence of omitting the carry-forward branch, and the fixed-point rule yes
.gitea/workflows/review-verdict.yml:1815 Cold review SEVER rejected late-mark placement kept as "is WRONG, and badly so", with the blind-gap harm yes
.gitea/workflows/review-verdict.yml:~1817 adjacent (being claimed) SEVER "far wider than the one-round-trip residual being claimed" → "far wider than a one-round-trip residual" yes
.gitea/workflows/review-verdict.yml:~787 adjacent (An earlier version of) CUT parenthetical only said the comment once described the re-derivation as intended yes
.gitea/workflows/review-verdict.yml:~1899 adjacent (The heading said) CUT recorded only a narrower earlier heading; the next paragraph states the scope in full yes
.gitea/workflows/review-verdict.yml:1905 round 2 SEVER dropped "(corrected in round 2)" and "An earlier version restricted"; the rejected restriction and its damage kept yes
.gitea/workflows/review-verdict.yml:1973 first draft SEVER rejected state = success test kept as "one branch too narrow", with the pending-path harm yes
.gitea/workflows/review-verdict.yml:2039 round 3 KEEP-citation (ersatztv#849 round 3) provenance pointer no
.gitea/workflows/review-verdict.yml:2109 Round 8 SEVER "Round 8 promoted" → "Promoting … adds nothing"; the unreachability argument kept yes
.gitea/workflows/review-verdict.yml:~2110 adjacent (several rounds) SEVER dropped "the shape this branch has spent several rounds either proving or declaring" yes
.gitea/workflows/review-verdict.yml:2154 round 2 SEVER "The old message said" → "A message saying"; the citation and the correction kept yes
.gitea/workflows/review-verdict.yml:2493 used to be KEEP-carveout an unconditional message plus the concrete #761 undiagnosable stall: trap and consequence no
scripts/check-doc-narrative.py:10 review round KEEP-carveout the withdrawn parity test's six rounds ARE the empirical case the advisory-only rule rests on no
scripts/check-doc-narrative.py:14 cold review SEVER kept the rejected bash parser and all four defects; dropped "The first implementation"/"cold review demonstrated" yes
scripts/check-doc-narrative.py:64 an earlier draft KEEP-fixture PATTERNS regex literal — the detector's own pattern no
scripts/check-doc-narrative.py:65 earlier drafts KEEP-fixture PATTERNS regex literal no
scripts/check-doc-narrative.py:67 my first attempt KEEP-fixture PATTERNS regex literal no
scripts/check-doc-narrative.py:70 it turned out that KEEP-fixture PATTERNS regex literal no
scripts/check-doc-narrative.py:71 earlier today KEEP-fixture PATTERNS regex literal no
scripts/check-doc-narrative.py:72 as of just now KEEP-fixture PATTERNS regex literal no
scripts/check-doc-narrative.py:73 currently investigating KEEP-fixture PATTERNS regex literal no
scripts/check-doc-narrative.py:78 earlier draft KEEP-fixture WARNING template string, asserted on by the test suite no
scripts/check-review-verdict.sh:192 round 5 KEEP-citation (#629 round 5) provenance pointer no
scripts/check-review-verdict.sh:130 adjacent (An earlier version) SEVER rejected in-band sentinel kept with the forgeable-boundary attack yes
scripts/ci-prove-ban-detects.sh:4 used to be SEVER dropped "Review then"; the pytest-based guarantee and the one-file disarm kept yes
scripts/ci-prove-ban-detects.sh:15 the first version of this SEVER kept "measured"; dropped "it is why the first version of this script was wrong" yes
scripts/ci-prove-ban-detects.sh:37 earlier drafts SEVER both weaker readings kept with their harms; "in earlier drafts of this file" dropped yes
scripts/ci-prove-ban-detects.sh:84 an earlier draft SEVER both rejected readings restated as present-tense fall-throughs; the exact-failure rule kept yes
scripts/ci-step-ran.sh:52 an earlier draft CUT clause only said the comment once over-read the probe; "says nothing about private or empty" already states it yes
scripts/ci-step-ran.sh:77 found by cold review SEVER rejected nojob/norunid/1 default kept with the silent-PASS harm yes
scripts/ci-step-ran.sh:203 found by cold review SEVER attribution → "reproduced:"; the reproduction command and its output kept yes
scripts/ci-step-ran.sh:99 adjacent (this comment used to) SEVER "the residual this comment used to describe" → "the rerun residual"; matches the later carve-out wording yes
scripts/ci-toolchain-image-resolves.sh:25 first draft SEVER rejected warn-and-exit-0 kept with all three indistinguishable causes yes
scripts/decisions_validate.py:61 first draft SEVER kept "nearly unfalsifiable" and the 39–229 measurement; dropped "that was the first draft" yes
scripts/decisions_validate.py:444 earlier version of this SEVER rejected basename exemption, its false rationale and the reintroduced hole all kept yes
scripts/decisions_validate.py:683 used to be KEEP-carveout the corpus's prior one-line format is the why for excluding frontmatter from the metric no
scripts/decisions_validate.py:694 used to be KEEP-carveout why the generated catalog is excluded, with the 189-of-5658 measurement no
scripts/hook-fire-log.sh:50 this session KEEP-false-positive usage text for report; runtime session no
scripts/hook-fire-log.sh:408 earlier version of THIS SEVER kept why the rule is restated at every exec (violated eight lines below a single statement) yes
scripts/hook-fire-log.sh:171 adjacent (An earlier version) SEVER rejected lowercasing kept with the manufactured-deny harm yes
scripts/jq-preflight.sh:123 round 1 KEEP-carveout the round-1/2/3 sequence IS the recurrence argument ("each previous version failed for a variant of the same reason") no
scripts/lib/branch-rule-classifier.jq:78 cold review SEVER same sentence as :79; kept "collapsing the last two is a REGRESSION" yes
scripts/lib/branch-rule-classifier.jq:79 the first draft of this SEVER dropped "cold review caught in the first draft of this fix"; the three-outcome rule kept yes
scripts/lib/branch-rule-classifier.jq:83 first draft SEVER rejected fall-through kept with its measured both-directions harm yes
scripts/lib/branch-rule-classifier.jq:97 first draft SEVER rejected short-circuit kept with its order-dependence and both payload shapes yes
scripts/lib/review-verdict-vocabulary.sh:16 review round KEEP-carveout withdrawn parity test; the six rounds and the four escaping constructions are the argument no
scripts/lib/review-verdict-vocabulary.sh:54 used to be KEEP-carveout rejected if ! f gating plus the measured fail-open it produces no
scripts/mcp_smoke.py:6 the first version of THIS SEVER kept "the same weakness recurs one level in" and both failure shapes yes
scripts/mcp_smoke.py:29 first attempt SEVER rejected message/line caps kept with both defects (false green, "server did not start") yes
scripts/mcp_smoke.py:228 this session SEVER "this session found at start-up" → "observed accumulating at start-up" yes
scripts/mcp_smoke.py:25 adjacent (an earlier round) SEVER "caps were themselves a defect in an earlier round" → "the defect described below" yes
scripts/migrate_decisions_split.py:156 used to be KEEP-false-positive describes the input text being transformed ("where a bullet list used to be") no
scripts/post-review-verdict.sh:198 USED TO BE KEEP-carveout the wider window is the why for writing the comment after the status; the half-state harm is stated no
scripts/post-review-verdict.sh:206 used to be KEEP-carveout rejected `
scripts/post-review-verdict.sh:283 the first version of this SEVER → "the INTUITIVE reading is wrong in a way worth recording"; the paging measurement kept yes
scripts/post-review-verdict.sh:314 an earlier draft SEVER the three outcomes and the unwitnessable array-TYPE test kept; the draft attribution dropped yes
scripts/post-review-verdict.sh:347 used to be KEEP-carveout the removed guard was dead because jq exits 0 with empty output on empty input — a trap worth remembering no
scripts/post-review-verdict.sh:~344 adjacent (an earlier version named it) CUT clause only said a previous version named paging; "not a live candidate for THIS row" survives yes
scripts/pr-changed-files.sh:216 earlier version of this SEVER kept the wrong claim recorded as wrong and why testing it misleads a maintainer yes
scripts/prove-fix.sh:7 review round KEEP-carveout #776/#793 six rounds each is the measured basis for the whole script no
scripts/prove-fix.sh:17 Cold review SEVER kept the DRAFT-vs-COMMITTED boundary and both false-PROVEN cases yes
scripts/prove-fix.sh:202 Cold review found CUT standalone attribution sentence; the mechanism before and after it is complete yes
scripts/prove-fix.sh:59 adjacent (An earlier version) SEVER rejected second trap … EXIT kept with the leaked-directory consequence yes
scripts/security-scan.sh:5 Codex review KEEP-false-positive lists the in-ecosystem checks; not chronology no
scripts/select-queue.sh:9 The fix is to KEEP-false-positive design rationale for the script, not a session timeline no

Counts

disposition slice rows adjacent rows total
SEVER 50 8 58
CUT 4 3 7
KEEP-carveout 16 0 16
KEEP-false-positive 15 0 15
KEEP-fixture 8 0 8
KEEP-citation 7 0 7
total 100 11 111

15 files edited; 11 slice files untouched (all-KEEP).

Verification

--- bash -n on every edited .sh
ok  .claude/hooks/pretooluse-merge-consent.sh
ok  scripts/check-review-verdict.sh
ok  scripts/ci-prove-ban-detects.sh
ok  scripts/ci-step-ran.sh
ok  scripts/ci-toolchain-image-resolves.sh
ok  scripts/hook-fire-log.sh
ok  scripts/post-review-verdict.sh
ok  scripts/pr-changed-files.sh
ok  scripts/prove-fix.sh
--- yaml (python3 yaml.safe_load)
ok  .gitea/workflows/docker-build.yml
ok  .gitea/workflows/review-verdict.yml
--- jq (program still runs; both arms exercised)
$ echo '[{"rule_name":"main","branch_name":"main"}]' | jq --arg b main -c -f scripts/lib/branch-rule-classifier.jq
{"verdict":"exact","rule":{"rule_name":"main","branch_name":"main"}}
$ echo '[{"rule_name":"m*","branch_name":""}]'      | jq --arg b main -c -f scripts/lib/branch-rule-classifier.jq
{"verdict":"undecidable"}
--- ruff
$ ruff check scripts/check-doc-narrative.py scripts/decisions_validate.py scripts/mcp_smoke.py
All checks passed!
$ ruff format --check scripts/check-doc-narrative.py scripts/decisions_validate.py scripts/mcp_smoke.py
3 files already formatted
$ git diff --stat -- <my 15 files>
 .claude/hooks/pretooluse-merge-consent.sh |  24 +++----
 .gitea/workflows/docker-build.yml         |   8 +--
 .gitea/workflows/review-verdict.yml       | 101 ++++++++++++++----------------
 scripts/check-doc-narrative.py            |   4 +-
 scripts/check-review-verdict.sh           |   4 +-
 scripts/ci-prove-ban-detects.sh           |  16 ++---
 scripts/ci-step-ran.sh                    |  14 ++---
 scripts/ci-toolchain-image-resolves.sh    |   4 +-
 scripts/decisions_validate.py             |   9 ++-
 scripts/hook-fire-log.sh                  |   9 ++-
 scripts/lib/branch-rule-classifier.jq     |  14 ++---
 scripts/mcp_smoke.py                      |  16 ++---
 scripts/post-review-verdict.sh            |  14 ++---
 scripts/pr-changed-files.sh               |   6 +-
 scripts/prove-fix.sh                      |  12 ++--
 15 files changed, 123 insertions(+), 132 deletions(-)

Comment-only check: of the changed lines in these 15 files, every one is either a # comment line
or Python module-docstring prose (check-doc-narrative.py, decisions_validate.py,
mcp_smoke.py). No code, no YAML keys/values, no regexes, no asserted strings changed.

Notes on the two judgement calls the dispatch flagged

  • pretooluse-merge-consent.sh:504 ("It was used first, with the list consulted only on a 404, and
    cold review found what that left behind: …") — SEVERED to … and that design left a false-open behind:. Everything after the colon is byte-identical: the precedence argument, the main vs
    m* example, "The hardened path was dead code and the unhardened one was live."
  • check-doc-narrative.py PATTERNS and WARNING — untouched (KEEP-fixture). The only edit in that
    file is the module docstring's "WHY PYTHON AND NOT SHELL" paragraph, which keeps the rejected bash
    parser and all four of its defects.
  • The other worktree files in git status (C#, web/, docs/, scripts/tests/, and the decision record
    itself) are other agents' slices and were not touched here.

Round 2

Scope: the whole of every file in the slice, plus five files newly owned here
(.gitea/workflows/ci-image.yml, .gitea/workflows/pr-checks.yml,
scripts/check-required-contexts.sh, scripts/e2e-functional.sh, scripts/lib/h10-reviewers.sh).

29 of the 67 rows in round2_AB.tsv duplicate sites already graded in round 1 and are skipped
(rows 1, 2, 3, 6, 9, 10, 18, 19, 23, 25, 27, 28, 29, 30, 32, 34, 35, 37, 40, 41, 43, 44, 49, 51, 52,
54, 55, 56, 57 — line numbers shifted by round-1 edits in a few cases). The 38 new rows follow,
then the adjacent sites the whole-file sweep turned up.

file:line matched disposition reason (≤25 words) edited
.claude/hooks/pretooluse-agent-model.sh:15 The first cut SEVER → "A NARROWER cut was TRIED AND REJECTED" / "Measured (#583)"; the heuristic, both failure directions and every example kept yes
.claude/hooks/pretooluse-agent-model.sh:76 Independent review KEEP-false-positive displayed prompt stating the cross-family routing rule no
.claude/hooks/pretooluse-merge-consent.sh:344 no longer says KEEP-false-positive describes a mutable-config race at runtime ("a rule list that no longer says so"), not artifact history no
.claude/hooks/pretooluse-merge-consent.sh:362 was first KEEP-false-positive "the FIRST one pays" — first caller at runtime no
.claude/skills/closing-an-issue/SKILL.md:36 in this PR KEEP-false-positive template placeholder stating the docs-in-the-same-PR rule no
.gitea/workflows/docker-build.yml:730 The first cut of KEEP-carveout issue-anchored ("The first cut of #767") rejected design: a stdlib YAML scanner, kept with its harm no
.gitea/workflows/docker-build.yml:732 independent review SEVER dropped "Two independent reviews found"; kept "~10 false NEGATIVES, all found within one round" and all four shapes yes
.gitea/workflows/docker-build.yml:1073 in this PR KEEP-false-positive displayed echo "Changed files in this PR:" no
.gitea/workflows/docker-build.yml:1123 in THIS PR KEEP-false-positive displayed ::error:: stating the commit-the-artifacts rule no
.gitea/workflows/docker-build.yml:1178 in this PR KEEP-false-positive displayed echo "Changed .cs files in this PR:" no
.gitea/workflows/docker-build.yml:1195 in THIS PR KEEP-false-positive displayed ::error:: stating the fix-as-you-touch rule no
.gitea/workflows/review-verdict.yml:484 the first version SEVER → "Without one the else branch ends with a successful echo"; the false-open kept in full yes
.gitea/workflows/review-verdict.yml:511 earlier round SEVER → "Defining them AFTER …"; command not found, the dead PROTECTED branch and the three blind tests kept yes
.gitea/workflows/review-verdict.yml:562 no longer says SEVER "the heading no longer says" → "this heading does NOT say"; the non-atomicity and ersatztv#706 kept yes
.gitea/workflows/review-verdict.yml:722 I found KEEP-false-positive inside a displayed die message; "I" is the job speaking no
.gitea/workflows/review-verdict.yml:799 round-4 SEVER "(ersatztv#698, found in round-4 review)" → "(ersatztv#698, round 4)": discovery verb dropped, locator kept yes
.gitea/workflows/review-verdict.yml:1595 round-3 KEEP-citation back-reference to the (ersatztv#849 round 3) citation ten lines above no
.gitea/workflows/review-verdict.yml:1958 round-3 KEEP-citation (ersatztv#706, round-3 review) — issue-anchored locator, no discovery verb no
.gitea/workflows/review-verdict.yml:2308 round-5 CUT "(round-5 review)" carries no issue anchor and no finding; the two row shapes are enumerated below it yes
.gitea/workflows/review-verdict.yml:2531 round-2 CUT "which is what this comment claimed until round-2 review"; the rejected claim "the green never stands" survives as the contrast yes
scripts/check-review-verdict.sh:72 used to carry KEEP-carveout the rejected two-copy vocabulary and the drift it caused — why the shared file exists no
scripts/ci-step-ran.sh:120 An earlier revision SEVER → "Printing one makes both sub-commands fail…"; "Caught by" → "Pinned by", test name kept yes
scripts/hook-fire-log.sh:95 the first version of SEVER → "reusing the record scrubber here leaves the traversal wide open while reading as fixed" yes
scripts/jq-preflight.sh:113 previous version KEEP-carveout "the third round … each previous version failed for a variant of the same reason" IS the recurrence finding no
scripts/jq-preflight.sh:117 round-2 KEEP-carveout names which rejected fix narrowed but did not close it; part of the same enumeration no
scripts/jq-preflight.sh:119 round-1 KEEP-carveout "the round-1 mechanism resurrected" — the recurrence is the whole point of the block no
scripts/lib/review-verdict-vocabulary.sh:7 used to live KEEP-carveout the rejected two-copy vocabulary plus the green-status/denying-hook harm no
scripts/post-review-verdict.sh:47 used to carry KEEP-carveout mirror of check-review-verdict.sh:72; same rejected duplication no
.gitea/workflows/ci-image.yml:18 in the SAME PR KEEP-false-positive states the two-step toolchain-bump rule no
.gitea/workflows/pr-checks.yml:151 in the same PR KEEP-false-positive states the escape-hatch rule ("relax this length check in the same PR and say why") no
.gitea/workflows/pr-checks.yml:207 in this PR KEEP-false-positive displayed echo "Changed files in this PR:" no
.gitea/workflows/pr-checks.yml:217 in THIS PR KEEP-false-positive displayed ::warning:: stating the parity-doc rule no
.gitea/workflows/pr-checks.yml:409 used to do KEEP-carveout why the explicit merge check exists: --no-merges silently skipped the trailer no
.gitea/workflows/pr-checks.yml:433 in this PR KEEP-false-positive displayed ::notice:: stating what the job does and does not assert no
.gitea/workflows/pr-checks.yml:543 the first cut of this SEVER → "reading the files that seemed relevant … yields 'pure stdlib'"; the local-pass/CI-red harm kept yes
scripts/check-required-contexts.sh:123 review measured SEVER → "is a measured no-op (removing it left the suite green)"; the rejected arm and the merge-hook contrast kept yes
scripts/e2e-functional.sh:181 the first cut KEEP-citation "the first cut deferred (ersatztv#299 -> #363, #444)" — a scope pointer a reader follows no
scripts/lib/h10-reviewers.sh:101 An earlier version SEVER → "That reason is that …"; the wrong-but-obvious rationale, the real measurement and the refutation all kept yes
.gitea/workflows/docker-build.yml:788 adjacent (Review disarmed) SEVER → "ONE repo-root pytest.ini … disarms the entire gate"; both disarm shapes and the harm kept yes
.gitea/workflows/review-verdict.yml:1964 adjacent (this branch itself measured) SEVER → "reached through a measured run overlap" yes
.claude/hooks/pretooluse-merge-consent.sh:338 adjacent (used to issue) KEEP-carveout rejected independent GETs with the measurement (the stub recorded 2 URLs) — why the cache exists no
.gitea/workflows/ci-image.yml:105 adjacent (originally / briefly existed) KEEP-carveout issue-anchored (#748/#744/#835): why there is no exemption here and why the one that existed is deleted no
scripts/lib/h10-reviewers.sh:40 adjacent (used to scope itself) KEEP-carveout a guard walking a different tree than its subject, with the measured green-guard/red-suite result no
scripts/lib/h10-reviewers.sh:54 adjacent (used to produce) KEEP-false-positive "flags used to produce it" = employed to produce, not chronology no

Round 2 counts

disposition tsv rows adjacent rows total
SEVER 11 2 13
CUT 2 0 2
KEEP-carveout 8 3 11
KEEP-false-positive 14 1 15
KEEP-citation 3 0 3
new rows graded 38 6 44
duplicates skipped 29 29

Round 2 edited 8 files: pretooluse-agent-model.sh, docker-build.yml, pr-checks.yml,
review-verdict.yml, check-required-contexts.sh, ci-step-ran.sh, hook-fire-log.sh,
lib/h10-reviewers.sh. ci-image.yml and e2e-functional.sh are all-KEEP and untouched.

Round 2 rule applied for round-N citations

Severed where the phrase carries a discovery verb or no issue anchor
((ersatztv#698, found in round-4 review)(ersatztv#698, round 4); (round-5 review) cut;
"until round-2 review" cut). Kept where it is an issue-anchored locator into a thread a reader would
open ((ersatztv#849 round 3), (ersatztv#706, round-3 review), (ersatztv#763, round 2),
(#629 round 5)), and kept wholesale in jq-preflight.sh, where the round-1/2/3 sequence IS the
recurrence argument the block exists to make.

Round 2 verification

--- bash -n
ok  .claude/hooks/pretooluse-agent-model.sh
ok  .claude/hooks/pretooluse-merge-consent.sh
ok  scripts/check-required-contexts.sh
ok  scripts/check-review-verdict.sh
ok  scripts/ci-prove-ban-detects.sh
ok  scripts/ci-step-ran.sh
ok  scripts/ci-toolchain-image-resolves.sh
ok  scripts/hook-fire-log.sh
ok  scripts/post-review-verdict.sh
ok  scripts/pr-changed-files.sh
ok  scripts/prove-fix.sh
ok  scripts/lib/h10-reviewers.sh
--- yaml (python3 yaml.safe_load)
ok  .gitea/workflows/ci-image.yml
ok  .gitea/workflows/docker-build.yml
ok  .gitea/workflows/pr-checks.yml
ok  .gitea/workflows/review-verdict.yml
--- ruff
All checks passed!
3 files already formatted
--- jq
{"verdict":"exact","rule":{"rule_name":"main","branch_name":"main"}}

Cumulative git diff --stat for my files (rounds 1 + 2)

 .claude/hooks/pretooluse-agent-model.sh   |   6 +-
 .claude/hooks/pretooluse-merge-consent.sh |  24 +++---
 .gitea/workflows/docker-build.yml         |  18 ++---
 .gitea/workflows/pr-checks.yml            |   6 +-
 .gitea/workflows/review-verdict.yml       | 129 ++++++++++++++----------------
 scripts/check-doc-narrative.py            |   4 +-
 scripts/check-required-contexts.sh        |   4 +-
 scripts/check-review-verdict.sh           |   4 +-
 scripts/ci-prove-ban-detects.sh           |  16 ++--
 scripts/ci-step-ran.sh                    |  18 ++---
 scripts/ci-toolchain-image-resolves.sh    |   4 +-
 scripts/decisions_validate.py             |   9 +--
 scripts/hook-fire-log.sh                  |  13 ++-
 scripts/lib/branch-rule-classifier.jq     |  14 ++--
 scripts/lib/h10-reviewers.sh              |   4 +-
 scripts/mcp_smoke.py                      |  16 ++--
 scripts/post-review-verdict.sh            |  14 ++--
 scripts/pr-changed-files.sh               |   6 +-
 scripts/prove-fix.sh                      |  12 +--
 19 files changed, 156 insertions(+), 165 deletions(-)

Comment-only check re-run over all 19: 25 changed lines are not # comments, and all 25 are Python
module-docstring prose in check-doc-narrative.py, decisions_validate.py and mcp_smoke.py
unchanged from round 1, i.e. round 2 touched no non-# line at all. No code, YAML key/value, regex,
identifier or asserted string was modified.

Grand totals (rounds 1 + 2)

disposition total
SEVER 71
CUT 9
KEEP-carveout 27
KEEP-false-positive 30
KEEP-fixture 8
KEEP-citation 10
rows graded 155
## Per-site manifest — hooks, workflows, scripts (non-test) Line numbers are from the pre-edit tree (`fb5592971`); `## Round 2` rows come from the wider phrasing sweep. Rows marked as duplicates restate a round-1 site. # manifest_AB — narrative sweep, slice AB (hooks, workflows, docker, scripts minus scripts/tests) Line numbers are from `slice_AB.tsv` (pre-edit). `adjacent` rows are sites found in the ±10-line comment block around a listed site and handled under the same rules. | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | .claude/hooks/design-sync-reminder.sh:7 | this session | KEEP-false-positive | "the FIRST time this session edits a UI file" — a runtime Claude session, not chronology | no | | .claude/hooks/design-sync-reminder.sh:58 | this session | KEEP-false-positive | inside the displayed `reason` string; runtime session, and a displayed string | no | | .claude/hooks/posttooluse-worktree-marker.sh:3 | this session | KEEP-false-positive | "this session's id" is the marker value written at runtime | no | | .claude/hooks/posttooluse-worktree-marker.sh:4 | this session | KEEP-false-positive | "apart from this session's own" — runtime session identity | no | | .claude/hooks/prepush-donewhen.sh:73 | adversarial review | KEEP-false-positive | displayed block message naming the "adversarial review passed" Done-when box | no | | .claude/hooks/pretooluse-agent-model.sh:11 | the same session | KEEP-carveout | the measured incident IS the why-a-hook argument: every rule with a forcing function held, the one without defaulted | no | | .claude/hooks/pretooluse-agent-model.sh:67 | this session | KEEP-false-positive | displayed prompt text about inheriting the session's model | no | | .claude/hooks/pretooluse-merge-consent.sh:12 | used to say | SEVER | dropped "this comment used to say"; kept the rejected word "sound", the mechanism and ersatztv#778 | yes | | .claude/hooks/pretooluse-merge-consent.sh:23 | adversarial review | KEEP-false-positive | names the Done-when box, not a review event | no | | .claude/hooks/pretooluse-merge-consent.sh:190 | first draft | SEVER | dropped "Cold review found the first draft"; kept the rejected collapse and its exact false-open | yes | | .claude/hooks/pretooluse-merge-consent.sh:504 | cold review found | SEVER | attribution only; everything after the colon (200-vs-404 precedence, dead hardened path) kept verbatim | yes | | .claude/hooks/pretooluse-merge-consent.sh:588 | first draft | SEVER | dropped "The first draft"; kept the rejected arm and the measured no-op (suite stayed green) | yes | | .claude/hooks/pretooluse-merge-consent.sh:695 | Codex review | KEEP-false-positive | displayed `ask` message naming the review to perform | no | | .claude/hooks/pretooluse-merge-consent.sh:773 | cold review found | SEVER | dropped "cold review found"; kept the quoted cross-reference and both outcomes | yes | | .claude/hooks/pretooluse-merge-consent.sh:~208 | adjacent (Cold review demonstrated) | SEVER | → "Measured"; kept "first landed inside the scheduled-auto-merge branch only", which :773 quotes verbatim | yes | | .claude/hooks/pretooluse-worktree-guard.sh:7 | this session | KEEP-false-positive | "marker == this session" — runtime session identity | no | | .claude/skills/closing-an-issue/SKILL.md:20 | adversarial review | KEEP-false-positive | procedural step ("Reply to reviewer"), not chronology | no | | .gitea/workflows/docker-build.yml:131 | the first version of this | SEVER | kept the trap and the two-line staleness measurement; dropped "the first version of this comment" | yes | | .gitea/workflows/docker-build.yml:605 | that session | KEEP-false-positive | "that sessions have been re-running by hand" is the job's rationale | no | | .gitea/workflows/docker-build.yml:796 | the first version of this | SEVER | kept the rejected isolated-copy design and its harm (reports healthy while the real invocation is deselected) | yes | | .gitea/workflows/review-verdict.yml:47 | used to be | KEEP-carveout | "written twice, drifted in the dangerous direction" is the rejected design plus the harm that justifies the shared script | no | | .gitea/workflows/review-verdict.yml:92 | an earlier draft | SEVER | restated as "the all-time REPO-WIDE figure is the WRONG window"; all numbers kept | yes | | .gitea/workflows/review-verdict.yml:288 | Found by cold review | CUT | standalone attribution sentence; the finding before it is complete | yes | | .gitea/workflows/review-verdict.yml:388 | An earlier draft | SEVER | rejected npm-manifest inclusion kept conditionally, with its code-execution harm and quoted rationale | yes | | .gitea/workflows/review-verdict.yml:419 | Found by cold review | SEVER | → "Measured"; the ersatztv#751 citation and the reproduced `CLAUDE.md` exemption kept | yes | | .gitea/workflows/review-verdict.yml:471 | used to be | KEEP-carveout | the rejected exception and the self-contradictory reasoning quoted so it is not re-proposed | no | | .gitea/workflows/review-verdict.yml:585 | found by cold review | SEVER | kept the nil-slice finding, the ersatztv#751 pointer and the measurement | yes | | .gitea/workflows/review-verdict.yml:636 | cold review | SEVER | "(cold review reproduced this)" → "(reproduced)"; the string-vs-number mechanism kept | yes | | .gitea/workflows/review-verdict.yml:674 | round 3 | KEEP-citation | `(ersatztv#849 round 3)` is a provenance pointer into the issue thread | no | | .gitea/workflows/review-verdict.yml:705 | Round 8 | SEVER | "Round 8 scoped this" → "A narrowing scoped it"; the rejected narrowing and its refutation kept | yes | | .gitea/workflows/review-verdict.yml:761 | round 4 | SEVER | "Round 3 type-tested" → "Type-testing"; the measurement and the `(#849 round 4)` citation kept | yes | | .gitea/workflows/review-verdict.yml:860 | earlier attempt | KEEP-carveout | two rejected parses, each with its exact defeat (`main)evil`); the count structures the record | no | | .gitea/workflows/review-verdict.yml:1005 | earlier version of this | CUT | clause only said the comment once rested on the margin; "corroborates rather than carries" states it twice above | yes | | .gitea/workflows/review-verdict.yml:1138 | the first draft of this | SEVER | kept "19 would be the count if the last page could not sleep. It can." | yes | | .gitea/workflows/review-verdict.yml:1141 | earlier version of this | SEVER | rejected ~335s reasoning kept as "A PLAUSIBLE reading", with the refutation and the 620s pessimum | yes | | .gitea/workflows/review-verdict.yml:1164 | earlier drafts | SEVER | kept the state-once rule and its reason: two statements 45 lines apart drift into disagreement | yes | | .gitea/workflows/review-verdict.yml:1212 | earlier version of this | SEVER | kept the staleness measurement ("three of five such counts went stale within days") | yes | | .gitea/workflows/review-verdict.yml:1241 | The first draft of this | SEVER | kept the `jq -e` safe-by-accident rejection and the reasoning the rule exists to retire | yes | | .gitea/workflows/review-verdict.yml:1275 | earlier version of this | SEVER | kept "the issue overstates it"; the artifact half of the attribution dropped | yes | | .gitea/workflows/review-verdict.yml:1326 | round 2 | KEEP-citation | `(ersatztv#763, round 2)` is a provenance pointer | no | | .gitea/workflows/review-verdict.yml:1420 | An earlier draft | SEVER | kept the intuitive mechanism recorded as WRONG (`CreatorID == 0`) without the draft chronology | yes | | .gitea/workflows/review-verdict.yml:1525 | round 2 | KEEP-citation | `(ersatztv#849, round 2)`; the surrounding text is the finding, not chronology | no | | .gitea/workflows/review-verdict.yml:1541 | review round | KEEP-carveout | a withdrawn `::warning::` with its three concrete defects; the round count is the withdrawal reason | no | | .gitea/workflows/review-verdict.yml:1574 | round 2 | KEEP-citation | `(ersatztv#849, round 2)` provenance pointer | no | | .gitea/workflows/review-verdict.yml:1589 | round 3 | KEEP-citation | `(ersatztv#849 round 3)` provenance pointer | no | | .gitea/workflows/review-verdict.yml:1707 | round 3 | SEVER | "The old message said" → "A message saying"; the rejected wording and the correction kept | yes | | .gitea/workflows/review-verdict.yml:1783 | cold review | SEVER | kept the reproduced consequence of omitting the carry-forward branch, and the fixed-point rule | yes | | .gitea/workflows/review-verdict.yml:1815 | Cold review | SEVER | rejected late-mark placement kept as "is WRONG, and badly so", with the blind-gap harm | yes | | .gitea/workflows/review-verdict.yml:~1817 | adjacent (being claimed) | SEVER | "far wider than the one-round-trip residual being claimed" → "far wider than a one-round-trip residual" | yes | | .gitea/workflows/review-verdict.yml:~787 | adjacent (An earlier version of) | CUT | parenthetical only said the comment once described the re-derivation as intended | yes | | .gitea/workflows/review-verdict.yml:~1899 | adjacent (The heading said) | CUT | recorded only a narrower earlier heading; the next paragraph states the scope in full | yes | | .gitea/workflows/review-verdict.yml:1905 | round 2 | SEVER | dropped "(corrected in round 2)" and "An earlier version restricted"; the rejected restriction and its damage kept | yes | | .gitea/workflows/review-verdict.yml:1973 | first draft | SEVER | rejected `state = success` test kept as "one branch too narrow", with the pending-path harm | yes | | .gitea/workflows/review-verdict.yml:2039 | round 3 | KEEP-citation | `(ersatztv#849 round 3)` provenance pointer | no | | .gitea/workflows/review-verdict.yml:2109 | Round 8 | SEVER | "Round 8 promoted" → "Promoting … adds nothing"; the unreachability argument kept | yes | | .gitea/workflows/review-verdict.yml:~2110 | adjacent (several rounds) | SEVER | dropped "the shape this branch has spent several rounds either proving or declaring" | yes | | .gitea/workflows/review-verdict.yml:2154 | round 2 | SEVER | "The old message said" → "A message saying"; the citation and the correction kept | yes | | .gitea/workflows/review-verdict.yml:2493 | used to be | KEEP-carveout | an unconditional message plus the concrete #761 undiagnosable stall: trap and consequence | no | | scripts/check-doc-narrative.py:10 | review round | KEEP-carveout | the withdrawn parity test's six rounds ARE the empirical case the advisory-only rule rests on | no | | scripts/check-doc-narrative.py:14 | cold review | SEVER | kept the rejected bash parser and all four defects; dropped "The first implementation"/"cold review demonstrated" | yes | | scripts/check-doc-narrative.py:64 | an earlier draft | KEEP-fixture | PATTERNS regex literal — the detector's own pattern | no | | scripts/check-doc-narrative.py:65 | earlier drafts | KEEP-fixture | PATTERNS regex literal | no | | scripts/check-doc-narrative.py:67 | my first attempt | KEEP-fixture | PATTERNS regex literal | no | | scripts/check-doc-narrative.py:70 | it turned out that | KEEP-fixture | PATTERNS regex literal | no | | scripts/check-doc-narrative.py:71 | earlier today | KEEP-fixture | PATTERNS regex literal | no | | scripts/check-doc-narrative.py:72 | as of just now | KEEP-fixture | PATTERNS regex literal | no | | scripts/check-doc-narrative.py:73 | currently investigating | KEEP-fixture | PATTERNS regex literal | no | | scripts/check-doc-narrative.py:78 | earlier draft | KEEP-fixture | WARNING template string, asserted on by the test suite | no | | scripts/check-review-verdict.sh:192 | round 5 | KEEP-citation | `(#629 round 5)` provenance pointer | no | | scripts/check-review-verdict.sh:130 | adjacent (An earlier version) | SEVER | rejected in-band sentinel kept with the forgeable-boundary attack | yes | | scripts/ci-prove-ban-detects.sh:4 | used to be | SEVER | dropped "Review then"; the pytest-based guarantee and the one-file disarm kept | yes | | scripts/ci-prove-ban-detects.sh:15 | the first version of this | SEVER | kept "measured"; dropped "it is why the first version of this script was wrong" | yes | | scripts/ci-prove-ban-detects.sh:37 | earlier drafts | SEVER | both weaker readings kept with their harms; "in earlier drafts of this file" dropped | yes | | scripts/ci-prove-ban-detects.sh:84 | an earlier draft | SEVER | both rejected readings restated as present-tense fall-throughs; the exact-failure rule kept | yes | | scripts/ci-step-ran.sh:52 | an earlier draft | CUT | clause only said the comment once over-read the probe; "says nothing about private or empty" already states it | yes | | scripts/ci-step-ran.sh:77 | found by cold review | SEVER | rejected `nojob`/`norunid`/`1` default kept with the silent-PASS harm | yes | | scripts/ci-step-ran.sh:203 | found by cold review | SEVER | attribution → "reproduced:"; the reproduction command and its output kept | yes | | scripts/ci-step-ran.sh:99 | adjacent (this comment used to) | SEVER | "the residual this comment used to describe" → "the rerun residual"; matches the later carve-out wording | yes | | scripts/ci-toolchain-image-resolves.sh:25 | first draft | SEVER | rejected warn-and-exit-0 kept with all three indistinguishable causes | yes | | scripts/decisions_validate.py:61 | first draft | SEVER | kept "nearly unfalsifiable" and the 39–229 measurement; dropped "that was the first draft" | yes | | scripts/decisions_validate.py:444 | earlier version of this | SEVER | rejected basename exemption, its false rationale and the reintroduced hole all kept | yes | | scripts/decisions_validate.py:683 | used to be | KEEP-carveout | the corpus's prior one-line format is the why for excluding frontmatter from the metric | no | | scripts/decisions_validate.py:694 | used to be | KEEP-carveout | why the generated catalog is excluded, with the 189-of-5658 measurement | no | | scripts/hook-fire-log.sh:50 | this session | KEEP-false-positive | usage text for `report`; runtime session | no | | scripts/hook-fire-log.sh:408 | earlier version of THIS | SEVER | kept why the rule is restated at every `exec` (violated eight lines below a single statement) | yes | | scripts/hook-fire-log.sh:171 | adjacent (An earlier version) | SEVER | rejected lowercasing kept with the manufactured-`deny` harm | yes | | scripts/jq-preflight.sh:123 | round 1 | KEEP-carveout | the round-1/2/3 sequence IS the recurrence argument ("each previous version failed for a variant of the same reason") | no | | scripts/lib/branch-rule-classifier.jq:78 | cold review | SEVER | same sentence as :79; kept "collapsing the last two is a REGRESSION" | yes | | scripts/lib/branch-rule-classifier.jq:79 | the first draft of this | SEVER | dropped "cold review caught in the first draft of this fix"; the three-outcome rule kept | yes | | scripts/lib/branch-rule-classifier.jq:83 | first draft | SEVER | rejected fall-through kept with its measured both-directions harm | yes | | scripts/lib/branch-rule-classifier.jq:97 | first draft | SEVER | rejected short-circuit kept with its order-dependence and both payload shapes | yes | | scripts/lib/review-verdict-vocabulary.sh:16 | review round | KEEP-carveout | withdrawn parity test; the six rounds and the four escaping constructions are the argument | no | | scripts/lib/review-verdict-vocabulary.sh:54 | used to be | KEEP-carveout | rejected `if ! f` gating plus the measured fail-open it produces | no | | scripts/mcp_smoke.py:6 | the first version of THIS | SEVER | kept "the same weakness recurs one level in" and both failure shapes | yes | | scripts/mcp_smoke.py:29 | first attempt | SEVER | rejected message/line caps kept with both defects (false green, "server did not start") | yes | | scripts/mcp_smoke.py:228 | this session | SEVER | "this session found at start-up" → "observed accumulating at start-up" | yes | | scripts/mcp_smoke.py:25 | adjacent (an earlier round) | SEVER | "caps were themselves a defect in an earlier round" → "the defect described below" | yes | | scripts/migrate_decisions_split.py:156 | used to be | KEEP-false-positive | describes the input text being transformed ("where a bullet list used to be") | no | | scripts/post-review-verdict.sh:198 | USED TO BE | KEEP-carveout | the wider window is the why for writing the comment after the status; the half-state harm is stated | no | | scripts/post-review-verdict.sh:206 | used to be | KEEP-carveout | rejected `|| true` fold plus the fail-open it creates — a trap for the next refactor | no | | scripts/post-review-verdict.sh:283 | the first version of this | SEVER | → "the INTUITIVE reading is wrong in a way worth recording"; the paging measurement kept | yes | | scripts/post-review-verdict.sh:314 | an earlier draft | SEVER | the three outcomes and the unwitnessable array-TYPE test kept; the draft attribution dropped | yes | | scripts/post-review-verdict.sh:347 | used to be | KEEP-carveout | the removed guard was dead because jq exits 0 with empty output on empty input — a trap worth remembering | no | | scripts/post-review-verdict.sh:~344 | adjacent (an earlier version named it) | CUT | clause only said a previous version named paging; "not a live candidate for THIS row" survives | yes | | scripts/pr-changed-files.sh:216 | earlier version of this | SEVER | kept the wrong claim recorded as wrong and why testing it misleads a maintainer | yes | | scripts/prove-fix.sh:7 | review round | KEEP-carveout | #776/#793 six rounds each is the measured basis for the whole script | no | | scripts/prove-fix.sh:17 | Cold review | SEVER | kept the DRAFT-vs-COMMITTED boundary and both false-PROVEN cases | yes | | scripts/prove-fix.sh:202 | Cold review found | CUT | standalone attribution sentence; the mechanism before and after it is complete | yes | | scripts/prove-fix.sh:59 | adjacent (An earlier version) | SEVER | rejected second `trap … EXIT` kept with the leaked-directory consequence | yes | | scripts/security-scan.sh:5 | Codex review | KEEP-false-positive | lists the in-ecosystem checks; not chronology | no | | scripts/select-queue.sh:9 | The fix is to | KEEP-false-positive | design rationale for the script, not a session timeline | no | ## Counts | disposition | slice rows | adjacent rows | total | |---|---|---|---| | SEVER | 50 | 8 | 58 | | CUT | 4 | 3 | 7 | | KEEP-carveout | 16 | 0 | 16 | | KEEP-false-positive | 15 | 0 | 15 | | KEEP-fixture | 8 | 0 | 8 | | KEEP-citation | 7 | 0 | 7 | | **total** | **100** | **11** | **111** | 15 files edited; 11 slice files untouched (all-KEEP). ## Verification ``` --- bash -n on every edited .sh ok .claude/hooks/pretooluse-merge-consent.sh ok scripts/check-review-verdict.sh ok scripts/ci-prove-ban-detects.sh ok scripts/ci-step-ran.sh ok scripts/ci-toolchain-image-resolves.sh ok scripts/hook-fire-log.sh ok scripts/post-review-verdict.sh ok scripts/pr-changed-files.sh ok scripts/prove-fix.sh --- yaml (python3 yaml.safe_load) ok .gitea/workflows/docker-build.yml ok .gitea/workflows/review-verdict.yml --- jq (program still runs; both arms exercised) $ echo '[{"rule_name":"main","branch_name":"main"}]' | jq --arg b main -c -f scripts/lib/branch-rule-classifier.jq {"verdict":"exact","rule":{"rule_name":"main","branch_name":"main"}} $ echo '[{"rule_name":"m*","branch_name":""}]' | jq --arg b main -c -f scripts/lib/branch-rule-classifier.jq {"verdict":"undecidable"} --- ruff $ ruff check scripts/check-doc-narrative.py scripts/decisions_validate.py scripts/mcp_smoke.py All checks passed! $ ruff format --check scripts/check-doc-narrative.py scripts/decisions_validate.py scripts/mcp_smoke.py 3 files already formatted ``` ``` $ git diff --stat -- <my 15 files> .claude/hooks/pretooluse-merge-consent.sh | 24 +++---- .gitea/workflows/docker-build.yml | 8 +-- .gitea/workflows/review-verdict.yml | 101 ++++++++++++++---------------- scripts/check-doc-narrative.py | 4 +- scripts/check-review-verdict.sh | 4 +- scripts/ci-prove-ban-detects.sh | 16 ++--- scripts/ci-step-ran.sh | 14 ++--- scripts/ci-toolchain-image-resolves.sh | 4 +- scripts/decisions_validate.py | 9 ++- scripts/hook-fire-log.sh | 9 ++- scripts/lib/branch-rule-classifier.jq | 14 ++--- scripts/mcp_smoke.py | 16 ++--- scripts/post-review-verdict.sh | 14 ++--- scripts/pr-changed-files.sh | 6 +- scripts/prove-fix.sh | 12 ++-- 15 files changed, 123 insertions(+), 132 deletions(-) ``` Comment-only check: of the changed lines in these 15 files, every one is either a `#` comment line or Python module-docstring prose (`check-doc-narrative.py`, `decisions_validate.py`, `mcp_smoke.py`). No code, no YAML keys/values, no regexes, no asserted strings changed. ## Notes on the two judgement calls the dispatch flagged - `pretooluse-merge-consent.sh:504` ("It was used first, with the list consulted only on a 404, and cold review found what that left behind: …") — SEVERED to `… and that design left a false-open behind:`. Everything after the colon is byte-identical: the precedence argument, the `main` vs `m*` example, "The hardened path was dead code and the unhardened one was live." - `check-doc-narrative.py` PATTERNS and WARNING — untouched (KEEP-fixture). The only edit in that file is the module docstring's "WHY PYTHON AND NOT SHELL" paragraph, which keeps the rejected bash parser and all four of its defects. - The other worktree files in `git status` (C#, web/, docs/, scripts/tests/, and the decision record itself) are other agents' slices and were not touched here. ## Round 2 Scope: the whole of every file in the slice, plus five files newly owned here (`.gitea/workflows/ci-image.yml`, `.gitea/workflows/pr-checks.yml`, `scripts/check-required-contexts.sh`, `scripts/e2e-functional.sh`, `scripts/lib/h10-reviewers.sh`). **29 of the 67 rows in `round2_AB.tsv` duplicate sites already graded in round 1 and are skipped** (rows 1, 2, 3, 6, 9, 10, 18, 19, 23, 25, 27, 28, 29, 30, 32, 34, 35, 37, 40, 41, 43, 44, 49, 51, 52, 54, 55, 56, 57 — line numbers shifted by round-1 edits in a few cases). The 38 new rows follow, then the `adjacent` sites the whole-file sweep turned up. | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | .claude/hooks/pretooluse-agent-model.sh:15 | The first cut | SEVER | → "A NARROWER cut was TRIED AND REJECTED" / "Measured (#583)"; the heuristic, both failure directions and every example kept | yes | | .claude/hooks/pretooluse-agent-model.sh:76 | Independent review | KEEP-false-positive | displayed prompt stating the cross-family routing rule | no | | .claude/hooks/pretooluse-merge-consent.sh:344 | no longer says | KEEP-false-positive | describes a mutable-config race at runtime ("a rule list that no longer says so"), not artifact history | no | | .claude/hooks/pretooluse-merge-consent.sh:362 | was first | KEEP-false-positive | "the FIRST one pays" — first caller at runtime | no | | .claude/skills/closing-an-issue/SKILL.md:36 | in this PR | KEEP-false-positive | template placeholder stating the docs-in-the-same-PR rule | no | | .gitea/workflows/docker-build.yml:730 | The first cut of | KEEP-carveout | issue-anchored ("The first cut of #767") rejected design: a stdlib YAML scanner, kept with its harm | no | | .gitea/workflows/docker-build.yml:732 | independent review | SEVER | dropped "Two independent reviews found"; kept "~10 false NEGATIVES, all found within one round" and all four shapes | yes | | .gitea/workflows/docker-build.yml:1073 | in this PR | KEEP-false-positive | displayed `echo "Changed files in this PR:"` | no | | .gitea/workflows/docker-build.yml:1123 | in THIS PR | KEEP-false-positive | displayed `::error::` stating the commit-the-artifacts rule | no | | .gitea/workflows/docker-build.yml:1178 | in this PR | KEEP-false-positive | displayed `echo "Changed .cs files in this PR:"` | no | | .gitea/workflows/docker-build.yml:1195 | in THIS PR | KEEP-false-positive | displayed `::error::` stating the fix-as-you-touch rule | no | | .gitea/workflows/review-verdict.yml:484 | the first version | SEVER | → "Without one the `else` branch ends with a successful `echo`"; the false-open kept in full | yes | | .gitea/workflows/review-verdict.yml:511 | earlier round | SEVER | → "Defining them AFTER …"; `command not found`, the dead PROTECTED branch and the three blind tests kept | yes | | .gitea/workflows/review-verdict.yml:562 | no longer says | SEVER | "the heading no longer says" → "this heading does NOT say"; the non-atomicity and ersatztv#706 kept | yes | | .gitea/workflows/review-verdict.yml:722 | I found | KEEP-false-positive | inside a displayed die message; "I" is the job speaking | no | | .gitea/workflows/review-verdict.yml:799 | round-4 | SEVER | "(ersatztv#698, found in round-4 review)" → "(ersatztv#698, round 4)": discovery verb dropped, locator kept | yes | | .gitea/workflows/review-verdict.yml:1595 | round-3 | KEEP-citation | back-reference to the `(ersatztv#849 round 3)` citation ten lines above | no | | .gitea/workflows/review-verdict.yml:1958 | round-3 | KEEP-citation | `(ersatztv#706, round-3 review)` — issue-anchored locator, no discovery verb | no | | .gitea/workflows/review-verdict.yml:2308 | round-5 | CUT | "(round-5 review)" carries no issue anchor and no finding; the two row shapes are enumerated below it | yes | | .gitea/workflows/review-verdict.yml:2531 | round-2 | CUT | "which is what this comment claimed until round-2 review"; the rejected claim "the green never stands" survives as the contrast | yes | | scripts/check-review-verdict.sh:72 | used to carry | KEEP-carveout | the rejected two-copy vocabulary and the drift it caused — why the shared file exists | no | | scripts/ci-step-ran.sh:120 | An earlier revision | SEVER | → "Printing one makes both sub-commands fail…"; "Caught by" → "Pinned by", test name kept | yes | | scripts/hook-fire-log.sh:95 | the first version of | SEVER | → "reusing the record scrubber here leaves the traversal wide open while reading as fixed" | yes | | scripts/jq-preflight.sh:113 | previous version | KEEP-carveout | "the third round … each previous version failed for a variant of the same reason" IS the recurrence finding | no | | scripts/jq-preflight.sh:117 | round-2 | KEEP-carveout | names which rejected fix narrowed but did not close it; part of the same enumeration | no | | scripts/jq-preflight.sh:119 | round-1 | KEEP-carveout | "the round-1 mechanism resurrected" — the recurrence is the whole point of the block | no | | scripts/lib/review-verdict-vocabulary.sh:7 | used to live | KEEP-carveout | the rejected two-copy vocabulary plus the green-status/denying-hook harm | no | | scripts/post-review-verdict.sh:47 | used to carry | KEEP-carveout | mirror of check-review-verdict.sh:72; same rejected duplication | no | | .gitea/workflows/ci-image.yml:18 | in the SAME PR | KEEP-false-positive | states the two-step toolchain-bump rule | no | | .gitea/workflows/pr-checks.yml:151 | in the same PR | KEEP-false-positive | states the escape-hatch rule ("relax this length check in the same PR and say why") | no | | .gitea/workflows/pr-checks.yml:207 | in this PR | KEEP-false-positive | displayed `echo "Changed files in this PR:"` | no | | .gitea/workflows/pr-checks.yml:217 | in THIS PR | KEEP-false-positive | displayed `::warning::` stating the parity-doc rule | no | | .gitea/workflows/pr-checks.yml:409 | used to do | KEEP-carveout | why the explicit merge check exists: `--no-merges` silently skipped the trailer | no | | .gitea/workflows/pr-checks.yml:433 | in this PR | KEEP-false-positive | displayed `::notice::` stating what the job does and does not assert | no | | .gitea/workflows/pr-checks.yml:543 | the first cut of this | SEVER | → "reading the files that seemed relevant … yields 'pure stdlib'"; the local-pass/CI-red harm kept | yes | | scripts/check-required-contexts.sh:123 | review measured | SEVER | → "is a measured no-op (removing it left the suite green)"; the rejected arm and the merge-hook contrast kept | yes | | scripts/e2e-functional.sh:181 | the first cut | KEEP-citation | "the first cut deferred (ersatztv#299 -> #363, #444)" — a scope pointer a reader follows | no | | scripts/lib/h10-reviewers.sh:101 | An earlier version | SEVER | → "That reason is that …"; the wrong-but-obvious rationale, the real measurement and the refutation all kept | yes | | .gitea/workflows/docker-build.yml:788 | adjacent (Review disarmed) | SEVER | → "ONE repo-root `pytest.ini` … disarms the entire gate"; both disarm shapes and the harm kept | yes | | .gitea/workflows/review-verdict.yml:1964 | adjacent (this branch itself measured) | SEVER | → "reached through a measured run overlap" | yes | | .claude/hooks/pretooluse-merge-consent.sh:338 | adjacent (used to issue) | KEEP-carveout | rejected independent GETs with the measurement (the stub recorded 2 URLs) — why the cache exists | no | | .gitea/workflows/ci-image.yml:105 | adjacent (originally / briefly existed) | KEEP-carveout | issue-anchored (#748/#744/#835): why there is no exemption here and why the one that existed is deleted | no | | scripts/lib/h10-reviewers.sh:40 | adjacent (used to scope itself) | KEEP-carveout | a guard walking a different tree than its subject, with the measured green-guard/red-suite result | no | | scripts/lib/h10-reviewers.sh:54 | adjacent (used to produce) | KEEP-false-positive | "flags used to produce it" = employed to produce, not chronology | no | ### Round 2 counts | disposition | tsv rows | adjacent rows | total | |---|---|---|---| | SEVER | 11 | 2 | 13 | | CUT | 2 | 0 | 2 | | KEEP-carveout | 8 | 3 | 11 | | KEEP-false-positive | 14 | 1 | 15 | | KEEP-citation | 3 | 0 | 3 | | **new rows graded** | **38** | **6** | **44** | | duplicates skipped | 29 | — | 29 | Round 2 edited 8 files: `pretooluse-agent-model.sh`, `docker-build.yml`, `pr-checks.yml`, `review-verdict.yml`, `check-required-contexts.sh`, `ci-step-ran.sh`, `hook-fire-log.sh`, `lib/h10-reviewers.sh`. `ci-image.yml` and `e2e-functional.sh` are all-KEEP and untouched. ### Round 2 rule applied for `round-N` citations Severed where the phrase carries a discovery verb or no issue anchor (`(ersatztv#698, found in round-4 review)` → `(ersatztv#698, round 4)`; `(round-5 review)` cut; "until round-2 review" cut). Kept where it is an issue-anchored locator into a thread a reader would open (`(ersatztv#849 round 3)`, `(ersatztv#706, round-3 review)`, `(ersatztv#763, round 2)`, `(#629 round 5)`), and kept wholesale in `jq-preflight.sh`, where the round-1/2/3 sequence IS the recurrence argument the block exists to make. ### Round 2 verification ``` --- bash -n ok .claude/hooks/pretooluse-agent-model.sh ok .claude/hooks/pretooluse-merge-consent.sh ok scripts/check-required-contexts.sh ok scripts/check-review-verdict.sh ok scripts/ci-prove-ban-detects.sh ok scripts/ci-step-ran.sh ok scripts/ci-toolchain-image-resolves.sh ok scripts/hook-fire-log.sh ok scripts/post-review-verdict.sh ok scripts/pr-changed-files.sh ok scripts/prove-fix.sh ok scripts/lib/h10-reviewers.sh --- yaml (python3 yaml.safe_load) ok .gitea/workflows/ci-image.yml ok .gitea/workflows/docker-build.yml ok .gitea/workflows/pr-checks.yml ok .gitea/workflows/review-verdict.yml --- ruff All checks passed! 3 files already formatted --- jq {"verdict":"exact","rule":{"rule_name":"main","branch_name":"main"}} ``` ### Cumulative `git diff --stat` for my files (rounds 1 + 2) ``` .claude/hooks/pretooluse-agent-model.sh | 6 +- .claude/hooks/pretooluse-merge-consent.sh | 24 +++--- .gitea/workflows/docker-build.yml | 18 ++--- .gitea/workflows/pr-checks.yml | 6 +- .gitea/workflows/review-verdict.yml | 129 ++++++++++++++---------------- scripts/check-doc-narrative.py | 4 +- scripts/check-required-contexts.sh | 4 +- scripts/check-review-verdict.sh | 4 +- scripts/ci-prove-ban-detects.sh | 16 ++-- scripts/ci-step-ran.sh | 18 ++--- scripts/ci-toolchain-image-resolves.sh | 4 +- scripts/decisions_validate.py | 9 +-- scripts/hook-fire-log.sh | 13 ++- scripts/lib/branch-rule-classifier.jq | 14 ++-- scripts/lib/h10-reviewers.sh | 4 +- scripts/mcp_smoke.py | 16 ++-- scripts/post-review-verdict.sh | 14 ++-- scripts/pr-changed-files.sh | 6 +- scripts/prove-fix.sh | 12 +-- 19 files changed, 156 insertions(+), 165 deletions(-) ``` Comment-only check re-run over all 19: 25 changed lines are not `#` comments, and all 25 are Python module-docstring prose in `check-doc-narrative.py`, `decisions_validate.py` and `mcp_smoke.py` — unchanged from round 1, i.e. round 2 touched no non-`#` line at all. No code, YAML key/value, regex, identifier or asserted string was modified. ### Grand totals (rounds 1 + 2) | disposition | total | |---|---| | SEVER | 71 | | CUT | 9 | | KEEP-carveout | 27 | | KEEP-false-positive | 30 | | KEEP-fixture | 8 | | KEEP-citation | 10 | | **rows graded** | **155** |
Author
Owner

Per-site manifest — scripts/tests part 1

Line numbers are from the pre-edit tree (fb5592971); ## Round 2 rows come from the wider phrasing sweep. Rows marked as duplicates restate a round-1 site.

Manifest — slice C1 (scripts/tests/, 113 listed sites + 24 adjacent)

Line numbers are the ones in slice_C1.tsv (pre-edit). adjacent rows carry the pre-edit line
number found by a broader marker sweep over the same 15 files.

file:line matched disposition reason (≤25 words) edited
test_pr_changed_files.py:3 used to be KEEP-carveout domain history: why a shared script exists at all; the drift and its dangerous direction are the rationale no
test_pr_changed_files.py:228 Cold review found SEVER who-found-it dropped; the wrong-reason pass and the near-miss warning are still stated yes
test_pr_changed_files.py:229 first attempt SEVER same sentence; "nearest fixes" keeps the third-reason finding without the drafting order yes
test_pr_changed_files.py:304 cold review SEVER summary line rewritten to state the scope; attribution carried nothing yes
test_pr_changed_files.py:472 the previous version of this SEVER rejected behavioural form + why it cannot distinguish the comparators, kept in the general yes
test_pr_changed_files.py:500 cold review SEVER "claimed this and" dropped; the mutation measurement is the evidence and stays yes
test_pr_changed_files.py:707 first draft SEVER rejected match rule and the harm (matches the enum_error message) stated generally yes
test_pr_changed_files.py:727 cold review caught SEVER the "$SHA"-twice defeat stays; only the finder is removed yes
test_pr_changed_files.py:829 Cold review found SEVER the weaker pair and the added-trigger defeat stay yes
test_pr_changed_files.py:916 the first draft of this SEVER why CODE-only: raw text reds on the workflow's own comment — kept as a present-tense fact yes
test_pr_changed_files.py:919 cold review SEVER "and cold review was right to say so" removed; the presence-guard substring reason stays yes
test_pr_changed_files.py:969 FIRST ATTEMPT KEEP-false-positive describes the stub's retry behaviour, not a drafting round no
test_pr_changed_files.py:992 the first draft of this CUT parenthetical said only "we found this by breaking things" yes
test_pr_changed_files.py:1034 The first draft of this SEVER the rejected 502-page fixture and the surviving mutant kept as a general claim yes
test_pr_changed_files.py:1073 earlier version of this CUT correction of a belief the reader never held; the right mechanism is stated above it yes
test_pr_changed_files.py:1430 round 2 SEVER issue citation kept, review-round qualifier dropped (not a resolvable pointer) yes
test_pr_changed_files.py:1489 round 2 SEVER same yes
test_pr_changed_files.py:1513 first attempt KEEP-false-positive fixture behaviour: fails the first attempt of each read no
test_pr_changed_files.py:1657 FIRST ATTEMPT KEEP-false-positive fixture behaviour no
test_pr_changed_files.py:1721 round 2 SEVER issue citation kept, round dropped yes
test_pr_changed_files.py:1741 round 3 SEVER issue citation kept, round dropped yes
test_pr_changed_files.py:1918 used to be KEEP-false-positive quoted phrase inside a methodological argument about what a mutant claims no
test_pr_changed_files.py:1937 an earlier draft SEVER both self-disabling shapes and their harms kept, rephrased as conditions yes
test_pr_changed_files.py:2042 The first version of this SEVER the DISJOINT-sets defeat and "covers nothing" kept in the general yes
test_pr_changed_files.py:2193 earlier version of this SEVER rejected structural pin, its stated grounds, and the trailing-comment weakness all kept yes
test_pr_changed_files.py:2416 after cold review SEVER why the annotation was withdrawn (deleting it left the suite green) kept yes
test_pr_changed_files.py:2420 An earlier draft SEVER word-vs-value defeat kept; drafting order removed yes
test_pr_changed_files.py:2488 cold review showed SEVER "which does not hold" preserves the refutation without the reviewer yes
test_pr_changed_files.py:2517 first draft SEVER #742 kept as the provenance pointer; "first draft of" removed yes
test_pr_changed_files.py:2547 used to be KEEP-carveout why the explicit triple comparison exists — the split broke a previously free invariant no
test_pr_changed_files.py:2580 found by cold review CUT clause named only the finder; the unresolvable-citation harm stays yes
test_pr_changed_files.py:2841 earlier version of this SEVER why no assertion here (true by construction at a short-circuit) kept yes
test_pr_changed_files.py:2864 An earlier draft SEVER summary restated as the finding: including these is a Blocker; body carries the why yes
test_pr_changed_files.py:2978 first draft SEVER asserting on the description fails against a working guard — kept, generalised yes
test_pr_changed_files.py:3153 cold review showed SEVER "a blanket reason fits only the third" keeps the whole finding yes
test_pr_changed_files.py:3322 cold review SEVER the two rows a leading-token parser misses is the content; naming the round is not yes
test_pr_changed_files.py:3355 round 2 SEVER ersatztv#803 kept; "round 2" and "found by hand while re-reading the diff" dropped yes
test_pr_changed_files.py:3527 earlier version of this SEVER the unobservable-folding claim and its green-under-mutation harm kept yes
test_pr_changed_files.py:3603 used to read KEEP-carveout describes the shipped walk's defeated behaviour — the trap the fixtures below exist for no
test_pr_changed_files.py:3727 review round SEVER "Measured, not assumed" kept; the wrong intuition kept without the round yes
test_pr_changed_files.py:3766 The first version of this SEVER rejected 502-page fixture + surviving mutant + "measured, not assumed" all kept yes
test_pr_changed_files.py:3993 round 2 SEVER section header renamed to what it groups yes
test_pr_changed_files.py:3997 round 2 SEVER restated as the ordering property; "High finding of round 2" carried nothing yes
test_pr_changed_files.py:3999 was originally SEVER the late-mark blind gap and the 20-round-trip span kept yes
test_pr_changed_files.py:4034 round 2 SEVER "Without a sentinel, the repair lasts exactly one event" keeps the finding yes
test_pr_changed_files.py:4093 Round 2 SEVER the crash-also-produces-it gap kept; "Round 2 test-gap" dropped yes
test_pr_changed_files.py:4108 The first version of the SEVER rejected generic-description sentinel and the two-hop burial kept yes
test_pr_changed_files.py:4390 first attempt SEVER the two regex failure shapes and the second-parser argument kept yes
test_pr_changed_files.py:4402 cold review SEVER the zero-slack false red on a legitimate deletion kept yes
test_pr_changed_files.py:4443 the first version of this SEVER precision statement kept; the docstring's own history removed yes
test_pr_changed_files.py:4444 reviewers caught SEVER same sentence yes
test_pr_changed_files.py:4550 Cold review pointed SEVER the dead-code exit 1 defeat kept yes
test_pr_changed_files.py:4638 cold review SEVER same defeat, attribution dropped yes
test_pr_changed_files.py:4713 found by cold review SEVER #751 kept as the pointer yes
test_pr_changed_files.py:4742 Found by cold review CUT sentence was pure attribution; #751 survives in the next paragraph yes
test_pr_changed_files.py:4768 earlier version of this SEVER why counts are not recorded (five cited, three stale within days) kept yes
test_pr_changed_files.py:4798 cold review caught CUT trailing clause named only the finder yes
test_pr_changed_files.py:4848 cold review found SEVER the why is carried by the next paragraph's unreachable-guard record yes
test_pr_changed_files.py:4946 round 4 SEVER "withdrawn" kept — the rejected sort parameter matters; the round does not yes
test_pr_changed_files.py:5192 first attempt KEEP-false-positive fixture behaviour no
test_pr_changed_files.py:5239 used to be KEEP-carveout shipped-code defect + consequence (green standing over a rejection) no
test_pr_changed_files.py:5383 cold review SEVER "where survivors were found" keeps the finding without the finder yes
test_pr_changed_files.py:5387 cold review found SEVER same; the nearest-proof analysis stays yes
test_pr_changed_files.py:5601 the first version of the SEVER "without it these tests pass against the impossible shape" keeps the harm yes
test_pr_changed_files.py:5742 The first version of the SEVER restated as a constraint on the RECONCILED_AWAY test yes
test_pr_changed_files.py:5951 round 2 SEVER citation kept, round dropped; the rejected exclusion reasoning stays yes
test_pr_changed_files.py:5984 round 2 SEVER citation kept, round dropped yes
test_pr_changed_files.py:5988 used to say KEEP-carveout rejected message wording + why it is wrong; prevents re-adoption no
test_pr_changed_files.py:6101 round 3 SEVER citation kept, round dropped yes
test_pr_changed_files.py:6158 Round 8 SEVER the rejected scoping, its reasoning and the refutation all kept yes
test_pr_changed_files.py:6163 round 8 SEVER "reads as a POSITIVE control and is the failing case" keeps the inversion yes
test_pr_changed_files.py:6179 Round 8 SEVER names the mutant as the narrower scoping yes
test_pr_changed_files.py:6902 Round 3 SEVER the type-test-to-"" resolution and the greened-rejection harm kept yes
test_check_review_verdict.py:124 review round SEVER section header keeps its subject (fence length, masked reader failures); width preserved yes
test_check_review_verdict.py:183 review round SEVER same yes
test_check_review_verdict.py:447 Cold review SEVER the overclaim and the untested-member argument kept yes
test_check_review_verdict.py:455 review round KEEP-carveout six rounds then deletion IS the non-convergence evidence, cited by docs.no-session-narrative no
test_check_review_verdict.py:458 cold review SEVER the separable-invariant loss and the rule citation kept yes
test_check_review_verdict.py:467 the first draft of this CUT clause said only that the docstring previously asserted first; "MEASURED RATHER THAN REASONED" stands yes
test_decisions_validate.py:661 used to read KEEP-carveout named regression (#610 box 2) + the trap the test pins no
test_decisions_validate.py:1086 first draft SEVER the measured 39–229 acceptance range and the unfalsifiable floor kept yes
test_decisions_validate.py:1178 first attempt SEVER the constant-10 mutation defeat kept yes
test_decisions_validate.py:1221 the fix is to KEEP-carveout recurrence is the stated why for removing the coupling rather than patching no
test_decisions_validate.py:1222 Round 1 SEVER "the same coupling turned up in the drift test and again here" keeps both sites yes
test_prove_fix.py:180 the first version of this SEVER grep-matches-the-comment defeat kept yes
test_prove_fix.py:233 earlier version of this SEVER asserting the mutant misbehaves leaves the test green — kept yes
test_prove_fix.py:235 Cold review caught CUT sentence was pure attribution yes
test_prove_fix.py:321 Cold review SEVER "That pair was measured failing to separate old from new" keeps the measurement yes
test_prove_fix.py:336 Cold review SEVER the 127-stub non-reach and the UNPROVEN-from-its-own-gate harm kept yes
test_check_required_contexts.py:246 cold review SEVER byte-identical inline + comment defeat + the 1062-passed measurement kept yes
test_check_required_contexts.py:284 The first version of the SEVER empty-stdout false pass and the unsupported MUTATION grade kept yes
test_check_required_contexts.py:457 cold review SEVER the if false / exit 5 / still-prints-unreadable measurement kept yes
test_check_required_contexts.py:541 the first draft of the SEVER the branch_name short-circuit and both payload shapes kept yes
test_guard_inventory.py:71 reviewers caught CUT sentence named only the finders; the 27/5/6/3/18 drift stays yes
test_guard_inventory.py:136 cold review CUT clause said only that it was a blind spot until someone named it yes
test_guard_inventory.py:138 the first version of this SEVER the .husky/pre-commit:7 mention-vs-invocation trap kept verbatim yes
test_guard_inventory.py:312 cold review SEVER the drift numbers and "a summary nobody checks is a summary nobody can trust" kept yes
test_workflow_job_guards.py:84 earlier version of this SEVER coverage boundary restated against the claim, not against a past draft yes
test_workflow_job_guards.py:187 An earlier draft SEVER the self-written-arithmetic proof shape and its green-when-disarmed harm kept yes
test_workflow_job_guards.py:220 Cold review SEVER "Measured: flattening the live assertion left the file green" keeps the measurement yes
test_workflow_job_guards.py:535 An earlier draft SEVER the PyYAML-fact critique and the grep-reader green kept yes
test_jq_preflight.py:46 earlier version of this SEVER why the shim carries stderr/exit_code + the glibc-2.34 parse harm kept yes
test_jq_preflight.py:70 An earlier draft SEVER the vacuous missing-jq pass against a real /usr/bin/jq kept yes
test_jq_preflight.py:283 Round 3 SEVER "an 'anchor' with neither" keeps the rejected form and its parse yes
test_guard_populations_derive_from_git.py:348 cold review SEVER "all three verified" keeps the measurement; the verifier is not load-bearing yes
test_guard_populations_derive_from_git.py:397 earlier drafts SEVER "which measurement disproves" keeps the refutation of "synchronous" yes
test_remote_state_inventory.py:50 Cold review rejected SEVER the token-list filter, the four invisible files, and the scope-vs-filter point all kept yes
test_remote_state_inventory.py:242 the first draft of the SEVER the dated "ran for real" claim and dependency-scan.yml kept yes
mutation_harness_lib.py:132 the first version of this SEVER "has already shipped here covering three of them" keeps the measured harm yes
test_build_catalog_check_path.py:150 cold review SEVER all three text-scan defeats and the round-one/round-two escalation kept yes
test_complete_annotation_dispositions.py:8 cold review SEVER the kill-switch recipe and the #807 consequence kept; "measured" retained yes
test_merge_consent_head_change.py:183 cold review found SEVER scheduled-denied/immediate-granted asymmetry and the fixture kept yes
test_prepush_unsets_git_env.py:291 first draft CUT clause said only that this file once did it that way yes

Adjacent rows (found beyond the slice, same files, same rules)

file:line matched disposition reason (≤25 words) edited
test_pr_changed_files.py:11 adjacent A round-4 review traced SEVER the INCIDENTAL-not-designed finding and its bash-arithmetic mechanism kept yes
test_pr_changed_files.py:741 adjacent an earlier version anchored SEVER the files?page=1&limit=50 evasion kept yes
test_pr_changed_files.py:1005 adjacent The earlier version of this comment SEVER terminator-prints-[] leaves the type gate unexercised — kept as the harm yes
test_pr_changed_files.py:1985 adjacent previously survived SEVER names the mutation this test closes without the survival chronology yes
test_pr_changed_files.py:2077 adjacent This test used to assert SEVER the rejected posted is None reasoning and the FORGED-verdict inversion kept yes
test_pr_changed_files.py:2702 adjacent Cold cross-family review pointed out SEVER the well-formed-fixture reason the bare widening passed is kept yes
test_pr_changed_files.py:3206 adjacent An earlier version joined with a SPACE SEVER the jq - e '.' token split kept yes
test_pr_changed_files.py:3332 adjacent was the first version SEVER all four missed spellings kept yes
test_pr_changed_files.py:3377 adjacent An earlier version asserted SEVER the cries-wolf refactor argument kept yes
test_pr_changed_files.py:4301 adjacent cold re-review SEVER ersatztv#751 kept as the pointer yes
test_pr_changed_files.py:4382 adjacent An earlier version of this guard / Both reviewers SEVER both false-red reproductions and "more dangerous than the thing it protects" kept yes
test_pr_changed_files.py:4604 adjacent An earlier version picked out / Cold re-review SEVER the defined-but-not-reached write defeat kept yes
test_pr_changed_files.py:4816 adjacent cold re-review reproduced it SEVER "(reproduced, not assumed)" keeps the measurement yes
test_pr_changed_files.py:5678 adjacent An earlier version used a fixture SEVER the both-operands-false / isolates-neither argument kept yes
test_pr_changed_files.py:6852 adjacent Its first version KEEP-carveout shipped helper's defect + the false abstention it reported no
test_pr_changed_files.py:2309 / 5200 / 5622 adjacent used to KEEP-carveout shipped-code history explaining the current guard no
test_check_review_verdict.py:8 adjacent turned out KEEP-carveout a reported item tested and found not to be a defect, kept as characterization no
test_check_review_verdict.py:109 adjacent An earlier version joined bodies SEVER the in-band-delimiter forgery kept yes
test_check_review_verdict.py:364 adjacent found by re-review SEVER header keeps its subject; width preserved yes
test_decisions_validate.py:918 adjacent An earlier version excluded SEVER the false premise and the future records/README.md hole kept yes
test_decisions_validate.py:1154 adjacent used to live here KEEP-carveout deletion record: what it did, why it was wrong, what covers it now no
test_decisions_validate.py:1479 adjacent Review caught the earlier version SEVER the live-60/999 drift argument kept yes
test_remote_state_inventory.py:174 adjacent An earlier version put SEVER "a guard that cannot execute proves nothing" kept with its mechanism yes
test_remote_state_inventory.py:278 adjacent The first version matched SEVER the guard-reads-its-own-documentation failure kept yes
test_build_catalog_check_path.py:384 adjacent the first version detected SEVER "the only one a text scan detects" keeps the boundary yes
test_workflow_job_guards.py:218 adjacent used to rebuild KEEP names WHICH three proofs call the detector; severing would lose the callers no

Counts

Listed sites (113): SEVER 87 · CUT 8 · KEEP-carveout 10 · KEEP-false-positive 6 · KEEP-fixture 0
Adjacent rows (26 rows covering 24 edited sites + KEEP groups): SEVER 19 · KEEP-carveout 6 · KEEP 1

Total edits applied: 111 replacement operations across 15 files (including 8 pure re-flows of
paragraphs a sever shortened).

Verification

$ ruff check <all 15 files>
All checks passed!

$ ruff format --check <all 15 files>
15 files already formatted

AST equality proof (comments/docstrings only — no code, assertion, regex or identifier changed):

parse HEAD:<file> and the working tree, strip module/class/function docstrings, compare ast.dump
SAME  14 / 15 files
DIFFERENT  scripts/tests/test_pr_changed_files.py

The single difference is ONE string constant — the embedded gh stub script at line ~950. Its
diff was inspected line by line: every changed line inside it begins with # (a comment in the
embedded script). No executable line of the stub changed.

$ git diff --stat -- <the 15 files>
 scripts/tests/mutation_harness_lib.py              |   2 +-
 scripts/tests/test_build_catalog_check_path.py     |   4 +-
 scripts/tests/test_check_required_contexts.py      |  29 +--
 scripts/tests/test_check_review_verdict.py         |  27 +--
 scripts/tests/test_complete_annotation_dispositions.py |   2 +-
 scripts/tests/test_decisions_validate.py           |  26 +--
 scripts/tests/test_guard_inventory.py              |  28 +--
 scripts/tests/test_guard_populations_derive_from_git.py |   8 +-
 scripts/tests/test_jq_preflight.py                 |  29 +--
 scripts/tests/test_merge_consent_head_change.py    |   4 +-
 scripts/tests/test_pr_changed_files.py             | 320 +++++++++++-----------
 scripts/tests/test_prepush_unsets_git_env.py       |   2 +-
 scripts/tests/test_prove_fix.py                    |  23 +-
 scripts/tests/test_remote_state_inventory.py       |  23 +-
 scripts/tests/test_workflow_job_guards.py          |  21 +-

(exact figures reproduced in the final report; run after the last reflow)

Residual markers deliberately left

cold review|round N|earlier version|first version|first attempt|turned out still match 8 lines in
these files. Each is a labelled KEEP above: 4 are fixture behaviour ("fails the first attempt of
each logical read"), 1 is the mutant-precision statement about text an earlier commit shipped, and 3
are carve-outs (a shipped helper's defect, a tested-and-not-a-defect report, and the six-round
non-convergence evidence the active docs.no-session-narrative record itself cites).


Round 2

Scope: the WHOLE of each of the 15 round-1 files plus the two newly owned
(test_ci_image_paths_pin_agreement.py, test_mutation_harness.py), with the wider phrasing set.

Rows that duplicate round 1 — skipped

test_decisions_validate.py:661, :1154; test_pr_changed_files.py:3, :1913, :2410, :2542,
:3596, :5229, :5977, :6851 were already dispositioned in round 1 (all KEEP-carveout or
KEEP-false-positive) and are unchanged. test_pr_changed_files.py:478 and :4042 are assertion
message strings
, not comments — KEEP-fixture, not touched.
test_guard_populations_derive_from_git.py:401 is "in this process", a false positive of the
in this PR pattern — KEEP-false-positive.

New round-2 dispositions

file:line matched disposition reason (≤25 words) edited
test_check_review_verdict.py:81 cross-family review SEVER header keeps "three more false-opens, all reproduced before fixing"; the finder goes; width preserved yes
test_jq_preflight.py:240 round-1 SEVER "the original fail-open mechanism" — the body already names the empty-string case that started it yes
test_pr_changed_files.py:774 round-3 SEVER "the defect the fixed-point test exists to catch" keeps the whole claim yes
test_pr_changed_files.py:1333 An earlier shape SEVER both inertness mechanisms of the rejected planted row kept, in the present tense yes
test_pr_changed_files.py:2873 cross-family review SEVER section header keeps its subject; the SIGPIPE mechanism and the 171KB/1901-path measurement below are untouched yes
test_pr_changed_files.py:2956 Round-3 SEVER command not found / dead PROTECTED branch / three tests green anyway all kept yes
test_pr_changed_files.py:3028 Round-4 SEVER the escape through the HUMAN verdict path is the finding yes
test_pr_changed_files.py:3118 Round-5 SEVER "the sharpest of these escapes" keeps the ranking without the round yes
test_pr_changed_files.py:4005 round-3 CUT "(round-3 review nit)" carried nothing; the vacuity argument stands yes
test_pr_changed_files.py:4138 Round-3 SEVER "the only case in this series that failed toward SUCCESS" is the finding yes
test_pr_changed_files.py:4180 Round-4 / first form SEVER "a guard testing state = success is one branch too narrow" keeps both yes
test_pr_changed_files.py:4207 Round-5 SEVER counting only HUMAN rows being insufficient is the finding yes
test_pr_changed_files.py:5397 used to run KEEP-carveout shipped-code history + the rejected reasoning quoted + its counter-example no
test_pr_changed_files.py:6435 review measured SEVER "the one that was measured" keeps the measurement, drops the measurer yes
test_pr_changed_files.py:6776 round-4 SEVER "the narrower form" names what the mutant restores yes
test_pr_changed_files.py:6825 we found KEEP-false-positive "we" is the job reading statuses, not the author no
test_pr_changed_files.py:7118 round-3 SEVER "the weaker form restored" names the mutant yes
test_pr_changed_files.py:7137 round-2 SEVER "the mutation the suite was missing"; the whole why-it-survived analysis kept yes
test_ci_image_paths_pin_agreement.py:11 used to keep KEEP-carveout why divergence became possible — the removed self-reference, cited to a decision key no
test_mutation_harness.py:305 an earlier revision CUT clause corrected a belief the reader never held; the not-DETECTOR-gated reason and its measurement stay yes

Further same-class sites met in round 2 (not on either list)

file:line matched disposition reason (≤25 words) edited
test_pr_changed_files.py:2880 adjacent the original round did not have SEVER short-paths-below-the-buffer blind spot kept as the why yes
test_pr_changed_files.py:4686 adjacent review found the first regex missed SEVER all four spellings, the still-slipped fourth, and "budget three rounds" kept yes
test_decisions_validate.py:1070 adjacent Review found SEVER the <= p95 -> < survivor stays as the evidence yes
test_decisions_validate.py:1124 adjacent review found SEVER "entirely unmutated" kept yes
test_decisions_validate.py:1167 adjacent review found SEVER "both of which were unpinned" kept yes
test_decisions_validate.py:1448 adjacent review showed SEVER the ten-1000-line-records calculation kept yes
test_decisions_validate.py:1464 adjacent review caught SEVER "that is a trap" keeps the warning; the mechanism follows it yes
test_pr_changed_files.py:3125 adjacent An earlier comment KEEP-carveout the workflow's own rejected claim + why false; keeps it from being re-adopted no
test_decisions_validate.py:83 adjacent previously KEEP cannot establish whether the temporal marker is still load-bearing without re-deriving the validator; not fabricating no

Round 2 counts

Listed rows (34, covering 32 sites): SEVER 15 · CUT 2 · KEEP-carveout 2 · KEEP-false-positive 2 ·
KEEP-fixture 2 · duplicates skipped 11.
Further sites met: SEVER 7 · KEEP-carveout 1 · KEEP 1.
Round 2 edits applied: 24 replacements plus 8 paragraph re-flows, across 8 files.

Round 2 verification

$ ruff check <all 17 files>
All checks passed!

$ ruff format --check <all 17 files>
17 files already formatted

AST equality (docstrings stripped, ast.dump compared against HEAD:<file>):

code-identical: 16 / 17
differing: ['scripts/tests/test_pr_changed_files.py']

The one difference is the same embedded gh stub string constant as in round 1; every changed line
inside it begins with #.

$ git diff --stat -- <the 17 files>
 scripts/tests/mutation_harness_lib.py              |   2 +-
 scripts/tests/test_build_catalog_check_path.py     |   6 +-
 scripts/tests/test_check_required_contexts.py      |  31 +-
 scripts/tests/test_check_review_verdict.py         |  33 +-
 scripts/tests/test_complete_annotation_dispositions.py |   2 +-
 scripts/tests/test_decisions_validate.py           |  51 ++-
 scripts/tests/test_guard_inventory.py              |  30 +-
 scripts/tests/test_guard_populations_derive_from_git.py |  10 +-
 scripts/tests/test_jq_preflight.py                 |  31 +-
 scripts/tests/test_merge_consent_head_change.py    |   4 +-
 scripts/tests/test_mutation_harness.py             |   4 +-
 scripts/tests/test_pr_changed_files.py             | 379 ++++++++++-----------
 scripts/tests/test_prepush_unsets_git_env.py       |   2 +-
 scripts/tests/test_prove_fix.py                    |  23 +-
 scripts/tests/test_remote_state_inventory.py       |  27 +-
 scripts/tests/test_workflow_job_guards.py          |  21 +-
 16 files changed, 317 insertions(+), 339 deletions(-)

test_ci_image_paths_pin_agreement.py is absent from the stat because its only site is a KEEP.

Residual after round 2 — 30 lines, all labelled KEEP

The wide pattern set still matches 30 lines across the 17 files. Every one is a KEEP above:
21 are used to <verb> describing the SHIPPED code/workflow/validator's prior behaviour (the
trap-and-consequence carve-out, not a draft); 4 describe fixture retry behaviour ("fails the first
attempt of each logical read"); 1 is a quoted phrase inside a methodological argument
(test_pr_changed_files.py:1913); 1 is an assertion MESSAGE string (:4042); 1 is the
mutant-precision statement (:5372); 1 is "in this process"; and test_decisions_validate.py:83
is left because its previously cannot be shown still-true or not-true without re-deriving the
validator, and the brief forbids fabricating a replacement.

## Per-site manifest — scripts/tests part 1 Line numbers are from the pre-edit tree (`fb5592971`); `## Round 2` rows come from the wider phrasing sweep. Rows marked as duplicates restate a round-1 site. # Manifest — slice C1 (`scripts/tests/`, 113 listed sites + 24 adjacent) Line numbers are the ones in `slice_C1.tsv` (pre-edit). `adjacent` rows carry the pre-edit line number found by a broader marker sweep over the same 15 files. | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | test_pr_changed_files.py:3 | used to be | KEEP-carveout | domain history: why a shared script exists at all; the drift and its dangerous direction are the rationale | no | | test_pr_changed_files.py:228 | Cold review found | SEVER | who-found-it dropped; the wrong-reason pass and the near-miss warning are still stated | yes | | test_pr_changed_files.py:229 | first attempt | SEVER | same sentence; "nearest fixes" keeps the third-reason finding without the drafting order | yes | | test_pr_changed_files.py:304 | cold review | SEVER | summary line rewritten to state the scope; attribution carried nothing | yes | | test_pr_changed_files.py:472 | the previous version of this | SEVER | rejected behavioural form + why it cannot distinguish the comparators, kept in the general | yes | | test_pr_changed_files.py:500 | cold review | SEVER | "claimed this and" dropped; the mutation measurement is the evidence and stays | yes | | test_pr_changed_files.py:707 | first draft | SEVER | rejected match rule and the harm (matches the enum_error message) stated generally | yes | | test_pr_changed_files.py:727 | cold review caught | SEVER | the `"$SHA"`-twice defeat stays; only the finder is removed | yes | | test_pr_changed_files.py:829 | Cold review found | SEVER | the weaker pair and the added-trigger defeat stay | yes | | test_pr_changed_files.py:916 | the first draft of this | SEVER | why CODE-only: raw text reds on the workflow's own comment — kept as a present-tense fact | yes | | test_pr_changed_files.py:919 | cold review | SEVER | "and cold review was right to say so" removed; the presence-guard substring reason stays | yes | | test_pr_changed_files.py:969 | FIRST ATTEMPT | KEEP-false-positive | describes the stub's retry behaviour, not a drafting round | no | | test_pr_changed_files.py:992 | the first draft of this | CUT | parenthetical said only "we found this by breaking things" | yes | | test_pr_changed_files.py:1034 | The first draft of this | SEVER | the rejected 502-page fixture and the surviving mutant kept as a general claim | yes | | test_pr_changed_files.py:1073 | earlier version of this | CUT | correction of a belief the reader never held; the right mechanism is stated above it | yes | | test_pr_changed_files.py:1430 | round 2 | SEVER | issue citation kept, review-round qualifier dropped (not a resolvable pointer) | yes | | test_pr_changed_files.py:1489 | round 2 | SEVER | same | yes | | test_pr_changed_files.py:1513 | first attempt | KEEP-false-positive | fixture behaviour: fails the first attempt of each read | no | | test_pr_changed_files.py:1657 | FIRST ATTEMPT | KEEP-false-positive | fixture behaviour | no | | test_pr_changed_files.py:1721 | round 2 | SEVER | issue citation kept, round dropped | yes | | test_pr_changed_files.py:1741 | round 3 | SEVER | issue citation kept, round dropped | yes | | test_pr_changed_files.py:1918 | used to be | KEEP-false-positive | quoted phrase inside a methodological argument about what a mutant claims | no | | test_pr_changed_files.py:1937 | an earlier draft | SEVER | both self-disabling shapes and their harms kept, rephrased as conditions | yes | | test_pr_changed_files.py:2042 | The first version of this | SEVER | the DISJOINT-sets defeat and "covers nothing" kept in the general | yes | | test_pr_changed_files.py:2193 | earlier version of this | SEVER | rejected structural pin, its stated grounds, and the trailing-comment weakness all kept | yes | | test_pr_changed_files.py:2416 | after cold review | SEVER | why the annotation was withdrawn (deleting it left the suite green) kept | yes | | test_pr_changed_files.py:2420 | An earlier draft | SEVER | word-vs-value defeat kept; drafting order removed | yes | | test_pr_changed_files.py:2488 | cold review showed | SEVER | "which does not hold" preserves the refutation without the reviewer | yes | | test_pr_changed_files.py:2517 | first draft | SEVER | `#742` kept as the provenance pointer; "first draft of" removed | yes | | test_pr_changed_files.py:2547 | used to be | KEEP-carveout | why the explicit triple comparison exists — the split broke a previously free invariant | no | | test_pr_changed_files.py:2580 | found by cold review | CUT | clause named only the finder; the unresolvable-citation harm stays | yes | | test_pr_changed_files.py:2841 | earlier version of this | SEVER | why no assertion here (true by construction at a short-circuit) kept | yes | | test_pr_changed_files.py:2864 | An earlier draft | SEVER | summary restated as the finding: including these is a Blocker; body carries the why | yes | | test_pr_changed_files.py:2978 | first draft | SEVER | asserting on the description fails against a working guard — kept, generalised | yes | | test_pr_changed_files.py:3153 | cold review showed | SEVER | "a blanket reason fits only the third" keeps the whole finding | yes | | test_pr_changed_files.py:3322 | cold review | SEVER | the two rows a leading-token parser misses is the content; naming the round is not | yes | | test_pr_changed_files.py:3355 | round 2 | SEVER | `ersatztv#803` kept; "round 2" and "found by hand while re-reading the diff" dropped | yes | | test_pr_changed_files.py:3527 | earlier version of this | SEVER | the unobservable-folding claim and its green-under-mutation harm kept | yes | | test_pr_changed_files.py:3603 | used to read | KEEP-carveout | describes the shipped walk's defeated behaviour — the trap the fixtures below exist for | no | | test_pr_changed_files.py:3727 | review round | SEVER | "Measured, not assumed" kept; the wrong intuition kept without the round | yes | | test_pr_changed_files.py:3766 | The first version of this | SEVER | rejected 502-page fixture + surviving mutant + "measured, not assumed" all kept | yes | | test_pr_changed_files.py:3993 | round 2 | SEVER | section header renamed to what it groups | yes | | test_pr_changed_files.py:3997 | round 2 | SEVER | restated as the ordering property; "High finding of round 2" carried nothing | yes | | test_pr_changed_files.py:3999 | was originally | SEVER | the late-mark blind gap and the 20-round-trip span kept | yes | | test_pr_changed_files.py:4034 | round 2 | SEVER | "Without a sentinel, the repair lasts exactly one event" keeps the finding | yes | | test_pr_changed_files.py:4093 | Round 2 | SEVER | the crash-also-produces-it gap kept; "Round 2 test-gap" dropped | yes | | test_pr_changed_files.py:4108 | The first version of the | SEVER | rejected generic-description sentinel and the two-hop burial kept | yes | | test_pr_changed_files.py:4390 | first attempt | SEVER | the two regex failure shapes and the second-parser argument kept | yes | | test_pr_changed_files.py:4402 | cold review | SEVER | the zero-slack false red on a legitimate deletion kept | yes | | test_pr_changed_files.py:4443 | the first version of this | SEVER | precision statement kept; the docstring's own history removed | yes | | test_pr_changed_files.py:4444 | reviewers caught | SEVER | same sentence | yes | | test_pr_changed_files.py:4550 | Cold review pointed | SEVER | the dead-code `exit 1` defeat kept | yes | | test_pr_changed_files.py:4638 | cold review | SEVER | same defeat, attribution dropped | yes | | test_pr_changed_files.py:4713 | found by cold review | SEVER | `#751` kept as the pointer | yes | | test_pr_changed_files.py:4742 | Found by cold review | CUT | sentence was pure attribution; `#751` survives in the next paragraph | yes | | test_pr_changed_files.py:4768 | earlier version of this | SEVER | why counts are not recorded (five cited, three stale within days) kept | yes | | test_pr_changed_files.py:4798 | cold review caught | CUT | trailing clause named only the finder | yes | | test_pr_changed_files.py:4848 | cold review found | SEVER | the why is carried by the next paragraph's unreachable-guard record | yes | | test_pr_changed_files.py:4946 | round 4 | SEVER | "withdrawn" kept — the rejected sort parameter matters; the round does not | yes | | test_pr_changed_files.py:5192 | first attempt | KEEP-false-positive | fixture behaviour | no | | test_pr_changed_files.py:5239 | used to be | KEEP-carveout | shipped-code defect + consequence (green standing over a rejection) | no | | test_pr_changed_files.py:5383 | cold review | SEVER | "where survivors were found" keeps the finding without the finder | yes | | test_pr_changed_files.py:5387 | cold review found | SEVER | same; the nearest-proof analysis stays | yes | | test_pr_changed_files.py:5601 | the first version of the | SEVER | "without it these tests pass against the impossible shape" keeps the harm | yes | | test_pr_changed_files.py:5742 | The first version of the | SEVER | restated as a constraint on the RECONCILED_AWAY test | yes | | test_pr_changed_files.py:5951 | round 2 | SEVER | citation kept, round dropped; the rejected exclusion reasoning stays | yes | | test_pr_changed_files.py:5984 | round 2 | SEVER | citation kept, round dropped | yes | | test_pr_changed_files.py:5988 | used to say | KEEP-carveout | rejected message wording + why it is wrong; prevents re-adoption | no | | test_pr_changed_files.py:6101 | round 3 | SEVER | citation kept, round dropped | yes | | test_pr_changed_files.py:6158 | Round 8 | SEVER | the rejected scoping, its reasoning and the refutation all kept | yes | | test_pr_changed_files.py:6163 | round 8 | SEVER | "reads as a POSITIVE control and is the failing case" keeps the inversion | yes | | test_pr_changed_files.py:6179 | Round 8 | SEVER | names the mutant as the narrower scoping | yes | | test_pr_changed_files.py:6902 | Round 3 | SEVER | the type-test-to-`""` resolution and the greened-rejection harm kept | yes | | test_check_review_verdict.py:124 | review round | SEVER | section header keeps its subject (fence length, masked reader failures); width preserved | yes | | test_check_review_verdict.py:183 | review round | SEVER | same | yes | | test_check_review_verdict.py:447 | Cold review | SEVER | the overclaim and the untested-member argument kept | yes | | test_check_review_verdict.py:455 | review round | KEEP-carveout | six rounds then deletion IS the non-convergence evidence, cited by `docs.no-session-narrative` | no | | test_check_review_verdict.py:458 | cold review | SEVER | the separable-invariant loss and the rule citation kept | yes | | test_check_review_verdict.py:467 | the first draft of this | CUT | clause said only that the docstring previously asserted first; "MEASURED RATHER THAN REASONED" stands | yes | | test_decisions_validate.py:661 | used to read | KEEP-carveout | named regression (#610 box 2) + the trap the test pins | no | | test_decisions_validate.py:1086 | first draft | SEVER | the measured 39–229 acceptance range and the unfalsifiable floor kept | yes | | test_decisions_validate.py:1178 | first attempt | SEVER | the constant-10 mutation defeat kept | yes | | test_decisions_validate.py:1221 | the fix is to | KEEP-carveout | recurrence is the stated why for removing the coupling rather than patching | no | | test_decisions_validate.py:1222 | Round 1 | SEVER | "the same coupling turned up in the drift test and again here" keeps both sites | yes | | test_prove_fix.py:180 | the first version of this | SEVER | grep-matches-the-comment defeat kept | yes | | test_prove_fix.py:233 | earlier version of this | SEVER | asserting the mutant misbehaves leaves the test green — kept | yes | | test_prove_fix.py:235 | Cold review caught | CUT | sentence was pure attribution | yes | | test_prove_fix.py:321 | Cold review | SEVER | "That pair was measured failing to separate old from new" keeps the measurement | yes | | test_prove_fix.py:336 | Cold review | SEVER | the 127-stub non-reach and the UNPROVEN-from-its-own-gate harm kept | yes | | test_check_required_contexts.py:246 | cold review | SEVER | byte-identical inline + comment defeat + the 1062-passed measurement kept | yes | | test_check_required_contexts.py:284 | The first version of the | SEVER | empty-stdout false pass and the unsupported MUTATION grade kept | yes | | test_check_required_contexts.py:457 | cold review | SEVER | the `if false` / exit 5 / still-prints-`unreadable` measurement kept | yes | | test_check_required_contexts.py:541 | the first draft of the | SEVER | the `branch_name` short-circuit and both payload shapes kept | yes | | test_guard_inventory.py:71 | reviewers caught | CUT | sentence named only the finders; the 27/5/6/3/18 drift stays | yes | | test_guard_inventory.py:136 | cold review | CUT | clause said only that it was a blind spot until someone named it | yes | | test_guard_inventory.py:138 | the first version of this | SEVER | the `.husky/pre-commit:7` mention-vs-invocation trap kept verbatim | yes | | test_guard_inventory.py:312 | cold review | SEVER | the drift numbers and "a summary nobody checks is a summary nobody can trust" kept | yes | | test_workflow_job_guards.py:84 | earlier version of this | SEVER | coverage boundary restated against the claim, not against a past draft | yes | | test_workflow_job_guards.py:187 | An earlier draft | SEVER | the self-written-arithmetic proof shape and its green-when-disarmed harm kept | yes | | test_workflow_job_guards.py:220 | Cold review | SEVER | "Measured: flattening the live assertion left the file green" keeps the measurement | yes | | test_workflow_job_guards.py:535 | An earlier draft | SEVER | the PyYAML-fact critique and the grep-reader green kept | yes | | test_jq_preflight.py:46 | earlier version of this | SEVER | why the shim carries stderr/exit_code + the glibc-2.34 parse harm kept | yes | | test_jq_preflight.py:70 | An earlier draft | SEVER | the vacuous missing-jq pass against a real /usr/bin/jq kept | yes | | test_jq_preflight.py:283 | Round 3 | SEVER | "an 'anchor' with neither" keeps the rejected form and its parse | yes | | test_guard_populations_derive_from_git.py:348 | cold review | SEVER | "all three verified" keeps the measurement; the verifier is not load-bearing | yes | | test_guard_populations_derive_from_git.py:397 | earlier drafts | SEVER | "which measurement disproves" keeps the refutation of "synchronous" | yes | | test_remote_state_inventory.py:50 | Cold review rejected | SEVER | the token-list filter, the four invisible files, and the scope-vs-filter point all kept | yes | | test_remote_state_inventory.py:242 | the first draft of the | SEVER | the dated "ran for real" claim and `dependency-scan.yml` kept | yes | | mutation_harness_lib.py:132 | the first version of this | SEVER | "has already shipped here covering three of them" keeps the measured harm | yes | | test_build_catalog_check_path.py:150 | cold review | SEVER | all three text-scan defeats and the round-one/round-two escalation kept | yes | | test_complete_annotation_dispositions.py:8 | cold review | SEVER | the kill-switch recipe and the #807 consequence kept; "measured" retained | yes | | test_merge_consent_head_change.py:183 | cold review found | SEVER | scheduled-denied/immediate-granted asymmetry and the fixture kept | yes | | test_prepush_unsets_git_env.py:291 | first draft | CUT | clause said only that this file once did it that way | yes | ## Adjacent rows (found beyond the slice, same files, same rules) | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | test_pr_changed_files.py:11 `adjacent` | A round-4 review traced | SEVER | the INCIDENTAL-not-designed finding and its bash-arithmetic mechanism kept | yes | | test_pr_changed_files.py:741 `adjacent` | an earlier version anchored | SEVER | the `files?page=1&limit=50` evasion kept | yes | | test_pr_changed_files.py:1005 `adjacent` | The earlier version of this comment | SEVER | terminator-prints-`[]` leaves the type gate unexercised — kept as the harm | yes | | test_pr_changed_files.py:1985 `adjacent` | previously survived | SEVER | names the mutation this test closes without the survival chronology | yes | | test_pr_changed_files.py:2077 `adjacent` | This test used to assert | SEVER | the rejected `posted is None` reasoning and the FORGED-verdict inversion kept | yes | | test_pr_changed_files.py:2702 `adjacent` | Cold cross-family review pointed out | SEVER | the well-formed-fixture reason the bare widening passed is kept | yes | | test_pr_changed_files.py:3206 `adjacent` | An earlier version joined with a SPACE | SEVER | the `jq - e '.'` token split kept | yes | | test_pr_changed_files.py:3332 `adjacent` | was the first version | SEVER | all four missed spellings kept | yes | | test_pr_changed_files.py:3377 `adjacent` | An earlier version asserted | SEVER | the cries-wolf refactor argument kept | yes | | test_pr_changed_files.py:4301 `adjacent` | cold re-review | SEVER | `ersatztv#751` kept as the pointer | yes | | test_pr_changed_files.py:4382 `adjacent` | An earlier version of this guard / Both reviewers | SEVER | both false-red reproductions and "more dangerous than the thing it protects" kept | yes | | test_pr_changed_files.py:4604 `adjacent` | An earlier version picked out / Cold re-review | SEVER | the defined-but-not-reached write defeat kept | yes | | test_pr_changed_files.py:4816 `adjacent` | cold re-review reproduced it | SEVER | "(reproduced, not assumed)" keeps the measurement | yes | | test_pr_changed_files.py:5678 `adjacent` | An earlier version used a fixture | SEVER | the both-operands-false / isolates-neither argument kept | yes | | test_pr_changed_files.py:6852 `adjacent` | Its first version | KEEP-carveout | shipped helper's defect + the false abstention it reported | no | | test_pr_changed_files.py:2309 / 5200 / 5622 `adjacent` | used to | KEEP-carveout | shipped-code history explaining the current guard | no | | test_check_review_verdict.py:8 `adjacent` | turned out | KEEP-carveout | a reported item tested and found not to be a defect, kept as characterization | no | | test_check_review_verdict.py:109 `adjacent` | An earlier version joined bodies | SEVER | the in-band-delimiter forgery kept | yes | | test_check_review_verdict.py:364 `adjacent` | found by re-review | SEVER | header keeps its subject; width preserved | yes | | test_decisions_validate.py:918 `adjacent` | An earlier version excluded | SEVER | the false premise and the future `records/README.md` hole kept | yes | | test_decisions_validate.py:1154 `adjacent` | used to live here | KEEP-carveout | deletion record: what it did, why it was wrong, what covers it now | no | | test_decisions_validate.py:1479 `adjacent` | Review caught the earlier version | SEVER | the live-60/999 drift argument kept | yes | | test_remote_state_inventory.py:174 `adjacent` | An earlier version put | SEVER | "a guard that cannot execute proves nothing" kept with its mechanism | yes | | test_remote_state_inventory.py:278 `adjacent` | The first version matched | SEVER | the guard-reads-its-own-documentation failure kept | yes | | test_build_catalog_check_path.py:384 `adjacent` | the first version detected | SEVER | "the only one a text scan detects" keeps the boundary | yes | | test_workflow_job_guards.py:218 `adjacent` | used to rebuild | KEEP | names WHICH three proofs call the detector; severing would lose the callers | no | ## Counts Listed sites (113): SEVER 87 · CUT 8 · KEEP-carveout 10 · KEEP-false-positive 6 · KEEP-fixture 0 Adjacent rows (26 rows covering 24 edited sites + KEEP groups): SEVER 19 · KEEP-carveout 6 · KEEP 1 Total edits applied: 111 replacement operations across 15 files (including 8 pure re-flows of paragraphs a sever shortened). ## Verification ``` $ ruff check <all 15 files> All checks passed! $ ruff format --check <all 15 files> 15 files already formatted ``` AST equality proof (comments/docstrings only — no code, assertion, regex or identifier changed): ``` parse HEAD:<file> and the working tree, strip module/class/function docstrings, compare ast.dump SAME 14 / 15 files DIFFERENT scripts/tests/test_pr_changed_files.py ``` The single difference is ONE string constant — the embedded `gh` stub script at line ~950. Its diff was inspected line by line: every changed line inside it begins with `#` (a comment in the embedded script). No executable line of the stub changed. ``` $ git diff --stat -- <the 15 files> scripts/tests/mutation_harness_lib.py | 2 +- scripts/tests/test_build_catalog_check_path.py | 4 +- scripts/tests/test_check_required_contexts.py | 29 +-- scripts/tests/test_check_review_verdict.py | 27 +-- scripts/tests/test_complete_annotation_dispositions.py | 2 +- scripts/tests/test_decisions_validate.py | 26 +-- scripts/tests/test_guard_inventory.py | 28 +-- scripts/tests/test_guard_populations_derive_from_git.py | 8 +- scripts/tests/test_jq_preflight.py | 29 +-- scripts/tests/test_merge_consent_head_change.py | 4 +- scripts/tests/test_pr_changed_files.py | 320 +++++++++++----------- scripts/tests/test_prepush_unsets_git_env.py | 2 +- scripts/tests/test_prove_fix.py | 23 +- scripts/tests/test_remote_state_inventory.py | 23 +- scripts/tests/test_workflow_job_guards.py | 21 +- ``` (exact figures reproduced in the final report; run after the last reflow) ## Residual markers deliberately left `cold review|round N|earlier version|first version|first attempt|turned out` still match 8 lines in these files. Each is a labelled KEEP above: 4 are fixture behaviour ("fails the first attempt of each logical read"), 1 is the mutant-precision statement about text an earlier commit shipped, and 3 are carve-outs (a shipped helper's defect, a tested-and-not-a-defect report, and the six-round non-convergence evidence the active `docs.no-session-narrative` record itself cites). --- ## Round 2 Scope: the WHOLE of each of the 15 round-1 files plus the two newly owned (`test_ci_image_paths_pin_agreement.py`, `test_mutation_harness.py`), with the wider phrasing set. ### Rows that duplicate round 1 — skipped `test_decisions_validate.py:661`, `:1154`; `test_pr_changed_files.py:3`, `:1913`, `:2410`, `:2542`, `:3596`, `:5229`, `:5977`, `:6851` were already dispositioned in round 1 (all KEEP-carveout or KEEP-false-positive) and are unchanged. `test_pr_changed_files.py:478` and `:4042` are **assertion message strings**, not comments — KEEP-fixture, not touched. `test_guard_populations_derive_from_git.py:401` is "in this **process**", a false positive of the `in this PR` pattern — KEEP-false-positive. ### New round-2 dispositions | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | test_check_review_verdict.py:81 | cross-family review | SEVER | header keeps "three more false-opens, all reproduced before fixing"; the finder goes; width preserved | yes | | test_jq_preflight.py:240 | round-1 | SEVER | "the original fail-open mechanism" — the body already names the empty-string case that started it | yes | | test_pr_changed_files.py:774 | round-3 | SEVER | "the defect the fixed-point test exists to catch" keeps the whole claim | yes | | test_pr_changed_files.py:1333 | An earlier shape | SEVER | both inertness mechanisms of the rejected planted row kept, in the present tense | yes | | test_pr_changed_files.py:2873 | cross-family review | SEVER | section header keeps its subject; the SIGPIPE mechanism and the 171KB/1901-path measurement below are untouched | yes | | test_pr_changed_files.py:2956 | Round-3 | SEVER | `command not found` / dead PROTECTED branch / three tests green anyway all kept | yes | | test_pr_changed_files.py:3028 | Round-4 | SEVER | the escape through the HUMAN verdict path is the finding | yes | | test_pr_changed_files.py:3118 | Round-5 | SEVER | "the sharpest of these escapes" keeps the ranking without the round | yes | | test_pr_changed_files.py:4005 | round-3 | CUT | "(round-3 review nit)" carried nothing; the vacuity argument stands | yes | | test_pr_changed_files.py:4138 | Round-3 | SEVER | "the only case in this series that failed toward SUCCESS" is the finding | yes | | test_pr_changed_files.py:4180 | Round-4 / first form | SEVER | "a guard testing `state = success` is one branch too narrow" keeps both | yes | | test_pr_changed_files.py:4207 | Round-5 | SEVER | counting only HUMAN rows being insufficient is the finding | yes | | test_pr_changed_files.py:5397 | used to run | KEEP-carveout | shipped-code history + the rejected reasoning quoted + its counter-example | no | | test_pr_changed_files.py:6435 | review measured | SEVER | "the one that was measured" keeps the measurement, drops the measurer | yes | | test_pr_changed_files.py:6776 | round-4 | SEVER | "the narrower form" names what the mutant restores | yes | | test_pr_changed_files.py:6825 | we found | KEEP-false-positive | "we" is the job reading statuses, not the author | no | | test_pr_changed_files.py:7118 | round-3 | SEVER | "the weaker form restored" names the mutant | yes | | test_pr_changed_files.py:7137 | round-2 | SEVER | "the mutation the suite was missing"; the whole why-it-survived analysis kept | yes | | test_ci_image_paths_pin_agreement.py:11 | used to keep | KEEP-carveout | why divergence became possible — the removed self-reference, cited to a decision key | no | | test_mutation_harness.py:305 | an earlier revision | CUT | clause corrected a belief the reader never held; the not-DETECTOR-gated reason and its measurement stay | yes | ### Further same-class sites met in round 2 (not on either list) | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | test_pr_changed_files.py:2880 `adjacent` | the original round did not have | SEVER | short-paths-below-the-buffer blind spot kept as the why | yes | | test_pr_changed_files.py:4686 `adjacent` | review found the first regex missed | SEVER | all four spellings, the still-slipped fourth, and "budget three rounds" kept | yes | | test_decisions_validate.py:1070 `adjacent` | Review found | SEVER | the `<= p95` -> `<` survivor stays as the evidence | yes | | test_decisions_validate.py:1124 `adjacent` | review found | SEVER | "entirely unmutated" kept | yes | | test_decisions_validate.py:1167 `adjacent` | review found | SEVER | "both of which were unpinned" kept | yes | | test_decisions_validate.py:1448 `adjacent` | review showed | SEVER | the ten-1000-line-records calculation kept | yes | | test_decisions_validate.py:1464 `adjacent` | review caught | SEVER | "that is a trap" keeps the warning; the mechanism follows it | yes | | test_pr_changed_files.py:3125 `adjacent` | An earlier comment | KEEP-carveout | the workflow's own rejected claim + why false; keeps it from being re-adopted | no | | test_decisions_validate.py:83 `adjacent` | previously | KEEP | cannot establish whether the temporal marker is still load-bearing without re-deriving the validator; not fabricating | no | ### Round 2 counts Listed rows (34, covering 32 sites): SEVER 15 · CUT 2 · KEEP-carveout 2 · KEEP-false-positive 2 · KEEP-fixture 2 · duplicates skipped 11. Further sites met: SEVER 7 · KEEP-carveout 1 · KEEP 1. Round 2 edits applied: 24 replacements plus 8 paragraph re-flows, across 8 files. ### Round 2 verification ``` $ ruff check <all 17 files> All checks passed! $ ruff format --check <all 17 files> 17 files already formatted ``` AST equality (docstrings stripped, `ast.dump` compared against `HEAD:<file>`): ``` code-identical: 16 / 17 differing: ['scripts/tests/test_pr_changed_files.py'] ``` The one difference is the same embedded `gh` stub string constant as in round 1; every changed line inside it begins with `#`. ``` $ git diff --stat -- <the 17 files> scripts/tests/mutation_harness_lib.py | 2 +- scripts/tests/test_build_catalog_check_path.py | 6 +- scripts/tests/test_check_required_contexts.py | 31 +- scripts/tests/test_check_review_verdict.py | 33 +- scripts/tests/test_complete_annotation_dispositions.py | 2 +- scripts/tests/test_decisions_validate.py | 51 ++- scripts/tests/test_guard_inventory.py | 30 +- scripts/tests/test_guard_populations_derive_from_git.py | 10 +- scripts/tests/test_jq_preflight.py | 31 +- scripts/tests/test_merge_consent_head_change.py | 4 +- scripts/tests/test_mutation_harness.py | 4 +- scripts/tests/test_pr_changed_files.py | 379 ++++++++++----------- scripts/tests/test_prepush_unsets_git_env.py | 2 +- scripts/tests/test_prove_fix.py | 23 +- scripts/tests/test_remote_state_inventory.py | 27 +- scripts/tests/test_workflow_job_guards.py | 21 +- 16 files changed, 317 insertions(+), 339 deletions(-) ``` `test_ci_image_paths_pin_agreement.py` is absent from the stat because its only site is a KEEP. ### Residual after round 2 — 30 lines, all labelled KEEP The wide pattern set still matches 30 lines across the 17 files. Every one is a KEEP above: 21 are `used to <verb>` describing the SHIPPED code/workflow/validator's prior behaviour (the trap-and-consequence carve-out, not a draft); 4 describe fixture retry behaviour ("fails the first attempt of each logical read"); 1 is a quoted phrase inside a methodological argument (`test_pr_changed_files.py:1913`); 1 is an assertion MESSAGE string (`:4042`); 1 is the mutant-precision statement (`:5372`); 1 is "in this **process**"; and `test_decisions_validate.py:83` is left because its `previously` cannot be shown still-true or not-true without re-deriving the validator, and the brief forbids fabricating a replacement.
Author
Owner

Per-site manifest — scripts/tests part 2

Line numbers are from the pre-edit tree (fb5592971); ## Round 2 rows come from the wider phrasing sweep. Rows marked as duplicates restate a round-1 site.

Manifest — slice C2 (113 sites, 20 files under scripts/tests/)

Line numbers are the slice's (pre-edit). edited = whether the file text changed at that site.

scripts/tests/test_hook_fire_log.py

file:line matched disposition reason (≤25 words) edited
test_hook_fire_log.py:133 cold review found SEVER Kept "reading only the first is a hole" plus the 13-hook measurement; dropped the finder. yes
test_hook_fire_log.py:140 review round SEVER "Three review rounds attacked" → "Three successive lexical rules each fell"; enumeration and the withdrawal kept intact. yes
test_hook_fire_log.py:183 review round CUT "and cost this branch two review rounds" — the AttributeError-red mechanism is stated in full before it. yes
test_hook_fire_log.py:224 Cold review SEVER "Cold review measured the gap" → "The gap is MEASURED"; the containment-test counterexample kept. yes
test_hook_fire_log.py:623 cold review SEVER Kept both harms of a REPO_ROOT launch (FETCH_HEAD rewrite, live decisions validator); attribution only removed. yes
test_hook_fire_log.py:744 Cold review SEVER "Both were MEASURED passing"; the indented/exported-reassignment finding untouched. yes
test_hook_fire_log.py:771 cold review SEVER "it was MEASURED passing on all 13 hooks"; the :- fallback mechanism kept. yes
test_hook_fire_log.py:810 the first version of this SEVER "Stated because the first version claimed the opposite" → "MEASURED, not assumed"; 8/13, 0-exit, 4-hook figures kept. yes
test_hook_fire_log.py:1124 cold review SEVER "and was DEMONSTRATED collapsing two diagnostics"; the fd-state example kept verbatim. yes
test_hook_fire_log.py:1153 the first version of this CUT Docstring opener clause said only that the file once lacked this assertion. yes
test_hook_fire_log.py:1456 cold review SEVER "its absence was MEASURED by restoring the preference"; the method stays reproducible. yes
test_hook_fire_log.py:1513 cold review SEVER "shipped unexecuted — MEASURED: replacing the clause with : left this file green". yes
test_hook_fire_log.py:1519 cold review SEVER "MEASURED: that mutant left the whole file green"; the -e vs -ef argument kept. yes
test_hook_fire_log.py:1639 found by cold review SEVER "found by cold review by stubbing mktemp" → "also reachable by stubbing mktemp"; trigger kept. yes
test_hook_fire_log.py:2532 The first version of the SEVER Rewritten as a present-tense rule; the str/bytes TypeError trap and its "broken, not stricter" harm kept. yes
test_hook_fire_log.py:2544 an earlier draft SEVER Kept the vacuity trap: an absolute cwd passes identically for every shape, crashes included. yes
test_hook_fire_log.py:2558 adjacent round-3 defect CUT Named only the round; the defect ("cwd is being ignored") is stated in the same sentence. yes
test_hook_fire_log.py:1451 adjacent used to prefer KEEP-carveout Pre-#891 production behaviour is the regression this test pins — trap plus consequence. no
test_hook_fire_log.py:2538 adjacent A previous version of the guard KEEP-carveout Tested-and-removed dead branch; it is why the assertion below exists. no
test_hook_fire_log.py:63, :95 used to KEEP-carveout #785/#778 traps with their measured harm (58 records/run; untracked hook entering the population). Outside every ±10 window. no

scripts/tests/test_merge_consent_required_check.py

file:line matched disposition reason (≤25 words) edited
test_merge_consent_required_check.py:81 Cold review SEVER "MEASURED: reintroducing a by-name lookup left the suite 33/33 green"; the record-before-filtering finding kept. yes
test_merge_consent_required_check.py:117 first draft SEVER Restated as a rule about any fix that falls through to rule_name; the AUTO-GRANT harm kept. yes
test_merge_consent_required_check.py:401 cold review CUT Bare "(cold review)" parenthetical; the reason it is not enough follows in the same sentence. yes
test_merge_consent_required_check.py:527 cold review CUT "stated without the overclaim cold review removed" — the corrected scope is the whole docstring body. yes
test_merge_consent_required_check.py:569 An earlier draft SEVER "Calling the whole clause defence-in-depth understates it" — the mis-sort warning kept, present tense. yes
test_merge_consent_required_check.py:588 Cold review SEVER "Demonstrated side by side, it is the shape…"; the fix-one-path-check-its-TWIN lesson kept. yes
test_merge_consent_required_check.py:601 review round CUT "found in the fifth cold-review round"; the defect itself is the docstring's subject. yes
test_merge_consent_required_check.py:667 used to be KEEP-carveout The release/26.4 path-separator 404 read as "unprotected" is the trap that retired the encoding test. no
test_merge_consent_required_check.py:928 cold review found SEVER Attribution dropped; the scheduled-denied/immediate-granted asymmetry is the evidence and stays. yes
test_merge_consent_required_check.py:1027 first draft SEVER "it passes without ever reaching the code it names" — stronger than the original "proves nothing". yes
test_merge_consent_required_check.py:1056 the first draft of this SEVER "a test arranged that way passes with the repo gate disabled"; vacuity mechanism kept. yes
test_merge_consent_required_check.py:1075 Cold review SEVER "Re-inlining a BYTE-IDENTICAL copy … left the whole suite green"; the mentioned-vs-loaded finding kept. yes
test_merge_consent_required_check.py:1354 cold review SEVER Opener rewritten to name the defect ("the bypass that makes every other arm decorative (#858)"); citation kept. yes
test_merge_consent_required_check.py:1438 first draft SEVER "The regression a collapsed fall-through introduces in #859's fix, measured both ways". yes
test_merge_consent_required_check.py:1442 first draft SEVER "Collapsing them makes …" — both measured directions (AUTO-GRANT and false DENY) kept verbatim. yes
test_merge_consent_required_check.py:1466 Cold review SEVER "The consequence is MEASURED — changing *) to set bp_code=200 left the suite green". yes
test_merge_consent_required_check.py:706 The first version emitted KEEP-carveout Tested-and-rejected escaping with its false-open→false-DENY harm. Outside every ±10 window; not touched. no

scripts/tests/test_ci_dropped_step_guard.py

file:line matched disposition reason (≤25 words) edited
test_ci_dropped_step_guard.py:87 An earlier draft CUT "An earlier draft of this change walked straight into it" — the constraint and its imprecise shorthand are stated above. yes
test_ci_dropped_step_guard.py:228 earlier draft SEVER Kept the rejected "smaller cost than a required context" framing and the unsmoked-candidate harm; dropped whose draft claimed it. yes
test_ci_dropped_step_guard.py:252 found by cold review CUT The opener-vs-closed-pair mechanism follows immediately and is unaffected. yes
test_ci_dropped_step_guard.py:337 round 2 SEVER "build's two payloads moved into env:, which brought it into the ban" — the do-not-narrow instruction kept. yes
test_ci_dropped_step_guard.py:447 found by both review CUT The third-condition fall-through and its deadlock consequence are stated in full. yes
test_ci_dropped_step_guard.py:537 found by cold review CUT The typo example and the docs-only false-red follow in the same comment. yes
test_ci_dropped_step_guard.py:579 Found by cold review SEVER "DEMONSTRATED:"; the one-token regression and the 30-green measurement kept. yes
test_ci_dropped_step_guard.py:599 earlier version of this SEVER Kept the principle ("a test double is an assertion about what the real system sends") bound to this double. yes
test_ci_dropped_step_guard.py:762 first attempt KEEP-false-positive "first attempt" is GITHUB_RUN_ATTEMPT=1, a domain term, inside a displayed assertion message. no
test_ci_dropped_step_guard.py:816 Found by cold review CUT Standalone attribution sentence; the reusable-path harm precedes it. yes
test_ci_dropped_step_guard.py:852 cold review SEVER "three mutations … all survived a 50-green suite" — the three mutations and the measurement kept. yes
test_ci_dropped_step_guard.py:869 Cold review SEVER "REPRODUCED exactly:"; the transcript that follows is the evidence. yes
test_ci_dropped_step_guard.py:891 cold review CUT "— cold review's last finding" on the docstring summary line. yes
test_ci_dropped_step_guard.py:893 Round 3 SEVER Kept "(true, true) is REACHABLE" and the deadlock direction; the false-blindness fact is already recorded at GATE_VALUES_IN_THE_WILD. yes
test_ci_dropped_step_guard.py:543 adjacent An earlier version compared SEVER Present tense; the brittleness cost (LC_ALL, ${{x}} spacing, red blocks every merge) kept. yes
test_ci_dropped_step_guard.py:813 adjacent The first version of marker_path KEEP-carveout Rejected default with its silent-PASS harm; the "defect the guard had itself" shape. no
test_ci_dropped_step_guard.py:842 adjacent the first two attempts KEEP-carveout Two measurement methods that prove nothing, kept so they are not re-attempted. no

scripts/tests/test_image_build_delegates_the_spa_suite.py

file:line matched disposition reason (≤25 words) edited
…spa_suite.py:24 review round SEVER "A predicate asking … was wrong nine times"; the nine enumerated mechanisms and the withdrawal kept. yes
…spa_suite.py:45 earlier version of this SEVER Kept the corrected claim: "a pin cannot have a false green" is FALSE, refuted by execution. yes
…spa_suite.py:46 cold review SEVER Same sentence as :45; the refutation-by-execution stays, the refuter goes. yes
…spa_suite.py:121 earlier version of this SEVER Kept the boundary and the rejected wider reading ("has the suite available to run"). yes
…spa_suite.py:137 cold review SEVER "until a stage was MEASURED escaping through it" — the npm t selector gap kept. yes
…spa_suite.py:214 Cold review SEVER "ersatztv#887 was RE-ARMED through it twice"; both re-arming spellings kept. yes
…spa_suite.py:220 cold review SEVER "ersatztv#887 was RE-ARMED through four spellings"; the four spellings kept. yes
…spa_suite.py:314 cold review CUT "by cold review" → "MEASURED"; the npm t -- --run sweep escape kept. yes
…spa_suite.py:456 cold review SEVER "MEASURED False for the glob, which left the receiving stage unpinned". yes
…spa_suite.py:671 cold review CUT "by cold review"; the run: > fold and the swallowed-suite consequence kept. yes
…spa_suite.py:773 review round SEVER Dropped "across three review rounds"; "defeated seven measured ways" and all seven kept. yes
…spa_suite.py:912 cold review SEVER "MEASURED MISSED without this assertion" — the shell-body publish gap kept. yes
…spa_suite.py:974 cold review SEVER "MEASURED False before the predicate was widened"; the unpinned-stage consequence kept. yes
…spa_suite.py:127 adjacent wrong three times SEVER "(MEASURED, not reasoned: a destination rename IS recognised, because only sources are read.)" yes
…spa_suite.py:208 adjacent Round-1 review found SEVER "It is CHECKED rather than stated as fact — an unchecked premise is one level out from the same defect." yes
…spa_suite.py:837 (same file, outside ±10) Round-1 review found SEVER Same phrase, second site; left inconsistent otherwise. Content preserved as "stating that in prose with nothing checking it". yes
…spa_suite.py:662 adjacent measured by cold review KEEP-fixture Inside a displayed assertion message — hard limit forbids editing a displayed string. no
…spa_suite.py:372, :650, :749, :854, :1016 earlier versions KEEP-carveout Tested-and-defeated parser generations with their defeating shapes. Outside every ±10 window. no

scripts/tests/test_ci_release_path_scan_job.py

file:line matched disposition reason (≤25 words) edited
…scan_job.py:18 review round CUT "within one review round"; the ~10 false negatives and the four shapes are the measurement and stay. yes
…scan_job.py:20 The fix was to SEVER "This job runs the real PyYAML-based test instead" — end state, with the no-drift-surface reason kept. yes
…scan_job.py:29 Round 2 SEVER "Checks ABOUT the command … replaced a substring check"; "shape assertions lost twice" kept. yes
…scan_job.py:31 round 3 SEVER Same sentence; "the gate was then disarmed seven more ways" and all seven kept. yes
…scan_job.py:39 ROUND 4 SEVER "THE TWIN OF THAT FIX IS THE REUSABLE LESSON"; tier mechanism, the always() finding and "Nor is needs:…" kept. yes
…scan_job.py:413 an earlier draft SEVER "a tally here has already disagreed with its own list" — the do-not-add-a-count instruction kept. yes
…scan_job.py:460 an earlier draft SEVER "the exact reading that reports the gate healthy while an unsmoked candidate would publish". yes
…scan_job.py:482 an earlier draft SEVER "precisely the reading that reads as success"; the exit-5 measurement kept. yes
…scan_job.py:501 An earlier draft CUT Sentence's only content was the draft's misreading; "just not the one that proves anything" precedes it. yes
…scan_job.py:512 First draft CUT Parenthetical; the exit-0/wrong-branch mechanism is stated in the same comment. yes
…scan_job.py:10 adjacent Two independent reviews killed it SEVER "That is wrong on two counts" — both counts and the "worth writing down" framing kept. yes
…scan_job.py:54 adjacent disarms review reported SEVER "Two proposed disarms were checked and are NOT real" — the refutation and its own caveat kept. yes
…scan_job.py:46 adjacent ENUMERATING THAT LIST THEN FOUND KEEP-carveout The $GITHUB_ENV fourth tier, its measurement, and the ban-rather-than-model rule. no

scripts/tests/mutation_manifest.py

file:line matched disposition reason (≤25 words) edited
mutation_manifest.py:138 an earlier draft SEVER Restated as the trap: a copy without its sibling classifier exits 2 and satisfies "not drift". yes
mutation_manifest.py:208 found by cold review SEVER Both provenance numbers (#778, #806) kept; only the finder removed. yes
mutation_manifest.py:385 round 5 SEVER "#793 replaced the lock rather than tightening it" — citation kept, round dropped. yes
mutation_manifest.py:409 cold review SEVER "flipping this row from ANNOTATED to CREATE retires the requirement…" — the whole demonstrated chain kept. yes
mutation_manifest.py:445 review round SEVER "(that predicate was wrong nine times)"; matches the severed docstring it paraphrases. yes
mutation_manifest.py:476 review round SEVER "Sorting these … was wrong twice — in both directions"; the NO GROUPING rejection and harm kept. yes

Checked before editing: test_mutation_harness.py asserts only that why is non-empty and that
UNDECLARED values exceed 60 characters. No clause, replacement, target or UNDECLARED value
was touched.

scripts/tests/test_check_doc_narrative.py

file:line matched disposition reason (≤25 words) edited
test_check_doc_narrative.py:3 cold review SEVER "a defect DEMONSTRATED in the first, shell implementation" — the provenance of the cases kept. yes
test_check_doc_narrative.py:26 I initially thought KEEP-fixture NARRATIVE constant — the detector's sample input. no
test_check_doc_narrative.py:44 an earlier draft KEEP-fixture Inside truth()'s predicate — executable code, not prose. no
test_check_doc_narrative.py:373 review round SEVER "after a mutant keyed on each was found"; the seven axes and the ENUMERATES caveat kept. yes
test_check_doc_narrative.py:466 AN EARLIER DRAFT KEEP-fixture Case-sensitivity fixture written into docs/case.md. no

scripts/tests/test_post_review_verdict.py

file:line matched disposition reason (≤25 words) edited
test_post_review_verdict.py:130 earlier version of this SEVER Restated as the shim trap: appending LAST and slicing from the front manufactures a truncation the server cannot produce. yes
test_post_review_verdict.py:263 used to say SEVER "with the comment written FIRST, a refusal left Review-verdict: MERGEABLE with no status" — the false-consent harm kept. yes
test_post_review_verdict.py:443 after cold review CUT Docstring opener clause; the read-side-only gap is the next paragraph's subject. yes
test_post_review_verdict.py:479 found by cold review SEVER Kept the ersatztv#778 citation; dropped the finder. yes
test_post_review_verdict.py:1083 previously claimed SEVER "This does NOT witness the row-count fallback" — the array-TYPE branch fact kept as a live caveat. yes
test_post_review_verdict.py:446 adjacent Review of that rescue found it SEVER "That rescue covered only check-review-verdict.sh"; the undisclosed-loss finding kept. yes
test_post_review_verdict.py:1086 adjacent the old test was written for SEVER "That fallback was dead code and is gone" — the reason the count is unreachable kept. yes

scripts/tests/test_worktree_ownership_guard.py

file:line matched disposition reason (≤25 words) edited
test_worktree_ownership_guard.py:57 used to be SEVER "A pin made sense while…"; the #891 reason it now steers nothing, and reads as a control, kept. yes
test_worktree_ownership_guard.py:209 Cold review SEVER "That is DEMONSTRATED — restore the module-level snapshot…"; the 54-record measurement kept. yes
test_worktree_ownership_guard.py:221 the first version of this SEVER "stated precisely because it is narrower than it looks"; the launch-path-not-file scope kept. yes
test_worktree_ownership_guard.py:222 Cold review SEVER Same edit as :221; "The gap is DEMONSTRATED" with the 18-record second-launcher case kept. yes
test_worktree_ownership_guard.py:390 used to be SEVER "Arranging this by pinning $CLAUDE_PROJECT_DIR … worked only while the hooks read that variable" — no-op-control harm kept. yes

scripts/tests/test_ci_image_pin_population.py

file:line matched disposition reason (≤25 words) edited
test_ci_image_pin_population.py:72 The first version of this SEVER Rejected design stated as a rule: comparing the two sets is blind to a deleted container: block. yes
test_ci_image_pin_population.py:85 earlier version of this SEVER "NOT 'in the same diff hunk'."; the measured distances and the INDEPENDENCE property kept. yes
test_ci_image_pin_population.py:272 the first version of this SEVER "MEASURED: that blind spot is NOT live" — the empty blind-spot set and its converse caveat kept. yes
test_ci_image_pin_population.py:502 Found by cold review SEVER "This file criticises MARKED_JOBS for exactly this and then ships the same shape" — the self-criticism kept. yes

scripts/tests/test_optional_request_members.py

file:line matched disposition reason (≤25 words) edited
test_optional_request_members.py:13 round 1 KEEP-carveout Labels #807's first hand-written attempt and its two live silent drops — an issue-level enumeration, not session chronology. no
test_optional_request_members.py:15 round 2 KEEP-carveout Labels the second attempt and the ArtworkContentTypeModel miss; the pair is the evidence for deriving the guard. no
test_optional_request_members.py:40 An earlier draft SEVER "the reach is what _resolve resolves and NOT the universal 'anywhere in the request graph'" — the false universal kept as a caution. yes
test_optional_request_members.py:175 An earlier draft SEVER "Scanning POST/PUT/PATCH reads as obviously right and already has an exception"; the DELETE counterexample kept. yes

scripts/tests/hook_fire_isolation.py

file:line matched disposition reason (≤25 words) edited
hook_fire_isolation.py:56 this session KEEP-false-positive "this session" is the pytest session's later exports, a runtime referent. no
hook_fire_isolation.py:112 this session KEEP-false-positive "this session's isolation" is the test session's log directory. no
hook_fire_isolation.py:200 review round SEVER "two consecutive fixes here have each created the next finding" — the subtract-a-layer trigger kept. yes

scripts/tests/conftest.py

file:line matched disposition reason (≤25 words) edited
conftest.py:15 the fix is that KEEP-false-positive States the current design plus the rejected alternative (a test-marking field); no session referent. no
conftest.py:91 the first version of this CUT "which is how the first version of this measurement was wrong"; the double-counting mechanism precedes it. yes

scripts/tests/test_docs_only_detector_clone_depth.py

file:line matched disposition reason (≤25 words) edited
…clone_depth.py:59 the first version of this SEVER "without this the file is green locally and red in CI" — the green-here/red-in-CI trap kept. yes
…clone_depth.py:282 the first version of this SEVER "MEASURED: … the PR arm's --depth=200 is inert" — the no-production-consumer statement kept. yes

scripts/tests/test_merge_consent_base_change.py

file:line matched disposition reason (≤25 words) edited
…base_change.py:152 cold review CUT Bare ", per cold review"; the tag-only-check failure mode follows. yes
…base_change.py:184 first draft SEVER "Collapsing the two makes an unreadable response … skip validation in silence"; the later auto-grant harm kept. yes

scripts/tests/test_review_verdict_vocabulary.py

file:line matched disposition reason (≤25 words) edited
…vocabulary.py:10 review round SEVER "withdrew it after six rounds" — the count is the non-convergence evidence; only "cold-review" removed. yes
…vocabulary.py:415 Cold review SEVER "MEASURED exactly that: all three sentinel guards removed, 150 tests still passing". yes

scripts/tests/test_ci_toolchain_image_resolves.py

file:line matched disposition reason (≤25 words) edited
…image_resolves.py:155 first draft SEVER "Warning and exiting 0 here is how a preflight becomes a no-op" — the rule kept, present tense. yes

scripts/tests/test_merge_consent_exemption.py

file:line matched disposition reason (≤25 words) edited
…exemption.py:402 The first version of this SEVER "a test using it passes with the newline guard entirely removed" — the fixture trap kept as a live warning. yes

scripts/tests/test_migration_equivalence.py

file:line matched disposition reason (≤25 words) edited
…equivalence.py:189 earlier version of this SEVER "Asserting existence from docs/decisions/ … is the wrong base"; both wrong bases and the 105-link measurement kept. yes

scripts/tests/test_workflow_persist_credentials.py

file:line matched disposition reason (≤25 words) edited
…persist_credentials.py:64 earlier version of this SEVER "each of which escaped a simpler normalisation"; all six spellings kept. yes

Counts

Slice sites (113):

disposition count
SEVER 84
CUT 19
KEEP-carveout 3
KEEP-fixture 3
KEEP-false-positive 4
total 113

Adjacent sites found beyond the slice (16 rows; 2 of them outside ±10 but in a file I own and
carrying a phrase I had just severed elsewhere in the same file — …spa_suite.py:837,
…scan_job.py:54 — plus 5 rows listed for completeness and NOT edited):

disposition count
SEVER 9
CUT 1
KEEP-carveout 5
KEEP-fixture 1
total 16

Verification

ruff check and ruff format --check were run from the worktree root on every edited file, and once
over the whole directory:

$ ruff check scripts/tests/
All checks passed!
$ ruff format --check scripts/tests/
45 files already formatted

Change-shape proof — every changed line in my 20 files is a comment or docstring line:

$ git diff -U0 -- <my 20 files> | grep -cE '^[+-][^+-]'
346
$ git diff -U0 -- <my 20 files> | grep -E '^[+-][^+-]' \
    | grep -vE '^[+-]\s*#' | grep -vE '^[+-]\s*("""|[A-Za-z`"(\[*.—…])'
-    1 — a real test failure, just not the one that proves anything. An earlier draft read that as
+    1 — a real test failure, just not the one that proves anything.

(the one line the filter does not classify begins 1 — , a docstring continuation of "gives pytest
exit / 1 — a real test failure"). No code, assertion, regex, identifier, fixture literal or
displayed message was changed.

git diff --stat for my 20 files:

 scripts/tests/conftest.py                          |  3 +-
 scripts/tests/hook_fire_isolation.py               |  6 +--
 scripts/tests/mutation_manifest.py                 | 16 +++----
 scripts/tests/test_check_doc_narrative.py          |  4 +-
 scripts/tests/test_ci_dropped_step_guard.py        | 49 ++++++++++------------
 scripts/tests/test_ci_image_pin_population.py      | 14 +++----
 scripts/tests/test_ci_release_path_scan_job.py     | 39 +++++++++--------
 scripts/tests/test_ci_toolchain_image_resolves.py  |  2 +-
 .../tests/test_docs_only_detector_clone_depth.py   |  6 +--
 scripts/tests/test_hook_fire_log.py                | 47 ++++++++++-----------
 .../test_image_build_delegates_the_spa_suite.py    | 49 +++++++++++-----------
 scripts/tests/test_merge_consent_base_change.py    |  6 +--
 scripts/tests/test_merge_consent_exemption.py      |  6 +--
 scripts/tests/test_merge_consent_required_check.py | 45 ++++++++++----------
 scripts/tests/test_migration_equivalence.py        |  6 +--
 scripts/tests/test_optional_request_members.py     |  8 ++--
 scripts/tests/test_post_review_verdict.py          | 22 +++++-----
 scripts/tests/test_review_verdict_vocabulary.py    |  4 +-
 scripts/tests/test_workflow_persist_credentials.py |  2 +-
 scripts/tests/test_worktree_ownership_guard.py     | 14 +++----
 20 files changed, 170 insertions(+), 178 deletions(-)

Round 2 — wider phrasing sweep (44 listed sites, whole-file scope)

Duplicates of round 1: test_check_doc_narrative.py:466 (already KEEP-fixture) is the only exact
repeat and is unchanged. Four sites I had dispositioned KEEP in round 1 are REVISED to SEVER here
under the wider scope, because each restates cleanly as a hazard that is true today with nothing
lost: test_ci_dropped_step_guard.py:812, test_hook_fire_log.py:2538,
test_merge_consent_required_check.py:667, test_optional_request_members.py:13/15.
test_merge_consent_required_check.py:706 was out of every ±10 window in round 1 and is handled now.

Policy applied consistently in round 2, stated so the KEEPs are legible: history of THE ARTIFACT'S
OWN TEXT is always severed or cut; history of THE SUBJECT UNDER TEST is severed to a present-tense
hazard when that stays true and loses nothing, and KEPT when restating would drop a removed design's
record or assert something false about the current system.

file:line matched disposition reason (≤25 words) edited
hook_fire_isolation.py:72 Cross-family review SEVER "That is a LIVE BYPASS:"; the relative-value-with-cwd=$HOME mechanism kept whole. yes
hook_fire_isolation.py:80 previous version of this SEVER "A branch for the int case is DEAD code" — the os.fspath reason and the green-on-deletion measurement kept. yes
hook_fire_isolation.py:83 the FIRST version SEVER "os.fspath alone leaves os.path.join raising on mixing str with bytes" — the trap kept as a rule. yes
hook_fire_isolation.py:103 earlier round SEVER Points at where the regression is recorded (_anchored) instead of when it shipped. yes
test_check_doc_narrative.py:284 next round SEVER "each defeated by the next"; the three defeated controls and their defeating rules kept. yes
test_check_doc_narrative.py:466 AN EARLIER DRAFT of this KEEP-fixture Case-sensitivity fixture written into docs/case.md. Duplicate of round 1. no
test_ci_dropped_step_guard.py:812 The first version of SEVER (revised) "A marker_path defaulting to nojob/norunid/1 uses names every run shares"; the silent-PASS harm kept. yes
test_ci_image_pin_population.py:505 this file once KEEP-carveout Identifies the referents of two now-dead names (TOOLCHAIN_JOBS/BARE_RUNNER_JOBS) and their #789 replacement. no
test_ci_release_path_scan_job.py:9 The first cut of SEVER "A bespoke stdlib scanner in build itself is wrong on two counts"; both counts kept. yes
test_ci_toolchain_image_resolves.py:246 I found KEEP-false-positive "'I found nothing'" is the report wording the script must emit, not the author's voice. no
test_docs_only_detector_clone_depth.py:219 was first SEVER "that is MEASURED: the PR arm against the 31-commit origin … passed against the unfixed script". yes
test_hook_fire_log.py:326 in this PR SEVER Narrates this change's history; restated as the rejected merge-base comparison and its coupling harm. yes
test_hook_fire_log.py:1605 ROUND-2 SEVER Section header renamed to what it groups ("PROOFS FOR THE DEFECTS THIS INSTRUMENTATION SHIPPED"). yes
test_hook_fire_log.py:1776 independent review SEVER "corroborated by a file … written 13 seconds earlier by another process (ersatztv#822)" — evidence kept, finder dropped. yes
test_hook_fire_log.py:2493 cross-family review SEVER "A LIVE BYPASS:"; the parent-vs-child anchoring mechanism kept. yes
test_hook_fire_log.py:2538 previous version of the SEVER (revised) "A branch for that case is dead code" — the os.fspath reason and removed-rather-than-proved decision kept. yes
…spa_suite.py:443 used to sit SEVER "A second startswith("[") test here is dead code"; the raise-poisoning measurement kept. yes
…spa_suite.py:749 An earlier version SEVER "Pinning only the scripts whose body contains vitest is a SELECTOR"; all four short-goings kept. yes
…spa_suite.py:854 earlier version SEVER "Deciding whether a command RUNS the suite was wrong nine times." yes
test_merge_consent_exemption.py:255 round-3 SEVER "an ABSENT status fails closed"; the dodge it prevents and the asserting test kept. yes
test_merge_consent_exemption.py:257 this test used to CUT Sentence's only content was that this test once carried a statusless row. yes
test_merge_consent_exemption.py:286 in this pr KEEP-false-positive Substring of "pin this property" — not a phrase in the text at all. no
test_merge_consent_exemption.py:495 round-3 SEVER Section rule: "(three surviving mutants)"; the mutant count is the finding. yes
test_merge_consent_exemption.py:496 round-3 SEVER "The .. finding was an anchor subversion"; both surviving anchor mutants kept. yes
test_merge_consent_exemption.py:536 Round-2 SEVER "The enforced gate gained large-input regression tests while the hook … did not" — the asymmetry and its record kept. yes
test_merge_consent_exemption.py:536 cross-family review SEVER Same edit as the row above. yes
test_merge_consent_required_check.py:78 used to live SEVER "A recorder inside the endswith branch below would make the assertion unfalsifiable" — the mechanism kept. yes
test_merge_consent_required_check.py:667 used to be SEVER (revised) "Interpolating the ref into branch_protections/{name} lets a base like release/26.4 inject a path separator and 404". yes
test_merge_consent_required_check.py:706 The first version SEVER "Emitting TWO backslashes … makes every rule containing a metacharacter UNMATCHABLE"; the false-DENY harm kept. yes
test_merge_consent_required_check.py:796 The hook used to SEVER "Looking the rule up by NAME first … is that twin"; the whole rejected-flow analysis kept. yes
test_merge_consent_required_check.py:1184 used to fail SEVER "they FAIL DIFFERENTLY without the fix and converge only with it"; both failure shapes kept. yes
test_migration_equivalence.py:7 An earlier version SEVER "Migrating the real docs/ tree would make this a one-shot"; the whole one-shot harm kept. yes
test_migration_equivalence.py:33 Review proved SEVER "PROVED: collapsing interior blank lines there left all harness tests green". yes
test_optional_request_members.py:13 round 1 SEVER (revised) Relabelled attempt 1; both live silent drops and the column layout unchanged. yes
test_optional_request_members.py:15 round 2 SEVER (revised) Relabelled attempt 2; the ArtworkContentTypeModel miss and its reachability kept. yes
test_optional_request_members.py:220 An earlier version SEVER "ASSERTING instead that no property name contains a dot is a guard where a restructure is available". yes
test_optional_request_members.py:288 An earlier version SEVER "Putting then/else in the conjunctive list … is the polarity error"; the mutual-exclusion reason kept. yes
test_optional_request_members.py:439 used to sit SEVER "A THIRD assumption sat here unstated and was already violated"; the inline-body violation kept. yes
test_post_review_verdict.py:413 was previously SEVER "Left IMPLICIT, this guard is only a side effect"; the fail-OPEN conversion kept. yes
test_post_review_verdict.py:893 an earlier version SEVER Kept the tempting evidence (total_count), the measured ORDER, and the unproducible conclusion. yes
test_post_review_verdict.py:939 was first SEVER "one file over from where it is recorded" — the pointer stays, the discovery goes. yes
test_review_verdict_vocabulary.py:4 used to carry SEVER "must not carry two hand-written copies of the word list" — states the rule, keeps the divergence hazard. yes
test_review_verdict_vocabulary.py:429 round-2 SEVER "that same overclaim one level down" — the referent is this paragraph's own opener. yes
test_workflow_persist_credentials.py:138 in the same PR KEEP-false-positive States a rule (change the guard alongside the checkout) inside a displayed failure message. no

Further same-class sites met during the whole-file sweep (not on either list)

file:line matched disposition reason (≤25 words) edited
test_hook_fire_log.py:63 used to predate SEVER "such a snapshot PREDATES it"; the 58-records-per-run measurement and fail-open reason kept. yes
test_hook_fire_log.py:95 used to enter SEVER "would enter this population"; the red-locally/green-in-CI harm kept. yes
test_hook_fire_log.py:235 found by self-audit rather than by a reviewer CUT Pure attribution; "both slip past a ${…}/$NAME test" is the finding and stays. yes
test_hook_fire_log.py:622 used to make SEVER (revises round 1 KEEP) "A relative launch from REPO_ROOT itself is wrong twice over"; both measured harms kept. yes
test_hook_fire_log.py:1451 used to prefer SEVER (revises round 1 KEEP) "Preferring $CLAUDE_PROJECT_DIR … reads as harmless"; the two-roots confident-table harm kept. yes
…spa_suite.py:372 three earlier versions SEVER "the shell traps that defeated the parser"; the three traps kept. yes
…spa_suite.py:650 Three earlier versions SEVER "Recognising those individually was tried three times and missed …"; both misses kept. yes
…spa_suite.py:1016 three earlier versions SEVER "The shapes that broke the parser must not break the pin comparison." yes
test_optional_request_members.py:251 (the first version) CUT Parenthetical attribution; "Unioning them instead marks a member required because one arm requires it" is the finding. yes

Confirmed-KEEP residuals the sweep re-surfaced and did not touch: test_ci_dropped_step_guard.py:761
(GITHUB_RUN_ATTEMPT domain term in a displayed message), hook_fire_isolation.py:56 and :112
(pytest-session referent), test_check_doc_narrative.py:26/:44/:466 (detector fixtures and
predicate), mutation_manifest.py:418/:419 (clause=/replacement= mutation strings),
test_post_review_verdict.py H10_REVIEWERS/"reviewer" occurrences and
test_review_verdict_vocabulary.py:55 (domain terms), test_merge_consent_exemption.py:285
("pin this property"), test_workflow_persist_credentials.py:138 (rule in a displayed message).
Also untouched: test_merge_consent_required_check.py:82's "this PR's sibling record" — the record's
key could not be resolved from the catalog, so naming it would be fabrication (brief: KEEP and say why).

Round 2 counts

Listed sites (44):

disposition count
SEVER 38
CUT 1
KEEP-carveout 1
KEEP-fixture 1
KEEP-false-positive 3
total 44

Further same-class sites found beyond the list (9): SEVER 7, CUT 2.

Combined across both rounds: 157 listed sites + 25 unlisted = 182 dispositioned;
SEVER 138, CUT 23, KEEP 21.

Round 2 verification

$ ruff check scripts/tests/
All checks passed!
$ ruff format --check scripts/tests/
45 files already formatted

Change-shape proof, re-run over my 20 files after round 2 — 511 changed lines, all comment or
docstring, the same single unclassifiable line (a docstring continuation beginning 1 — ):

$ git diff -U0 -- <my 20 files> | grep -cE '^[+-][^+-]'
511
$ git diff -U0 -- <my 20 files> | grep -E '^[+-][^+-]' \
    | grep -vE '^[+-]\s*#' | grep -vE '^[+-]\s*("""|[A-Za-z`"(\[*.—…])'
-    1 — a real test failure, just not the one that proves anything. An earlier draft read that as
+    1 — a real test failure, just not the one that proves anything.

git diff --stat for my 20 files after round 2:

 scripts/tests/conftest.py                          |  3 +-
 scripts/tests/hook_fire_isolation.py               | 20 +++---
 scripts/tests/mutation_manifest.py                 | 16 ++---
 scripts/tests/test_check_doc_narrative.py          |  6 +-
 scripts/tests/test_ci_dropped_step_guard.py        | 51 +++++++------
 scripts/tests/test_ci_image_pin_population.py      | 14 ++--
 scripts/tests/test_ci_release_path_scan_job.py     | 41 ++++++-----
 scripts/tests/test_ci_toolchain_image_resolves.py  |  2 +-
 .../tests/test_docs_only_detector_clone_depth.py   | 12 ++--
 scripts/tests/test_hook_fire_log.py                | 83 +++++++++++-----------
 .../test_image_build_delegates_the_spa_suite.py    | 63 ++++++++--------
 scripts/tests/test_merge_consent_base_change.py    |  6 +-
 scripts/tests/test_merge_consent_exemption.py      | 17 +++--
 scripts/tests/test_merge_consent_required_check.py | 67 +++++++++--------
 scripts/tests/test_migration_equivalence.py        | 14 ++--
 scripts/tests/test_optional_request_members.py     | 30 ++++----
 scripts/tests/test_post_review_verdict.py          | 42 +++++------
 scripts/tests/test_review_verdict_vocabulary.py    | 10 +--
 scripts/tests/test_workflow_persist_credentials.py |  2 +-
 scripts/tests/test_worktree_ownership_guard.py     | 14 ++--
 20 files changed, 252 insertions(+), 261 deletions(-)
## Per-site manifest — scripts/tests part 2 Line numbers are from the pre-edit tree (`fb5592971`); `## Round 2` rows come from the wider phrasing sweep. Rows marked as duplicates restate a round-1 site. # Manifest — slice C2 (113 sites, 20 files under `scripts/tests/`) Line numbers are the slice's (pre-edit). `edited` = whether the file text changed at that site. ## scripts/tests/test_hook_fire_log.py | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | test_hook_fire_log.py:133 | cold review found | SEVER | Kept "reading only the first is a hole" plus the 13-hook measurement; dropped the finder. | yes | | test_hook_fire_log.py:140 | review round | SEVER | "Three review rounds attacked" → "Three successive lexical rules each fell"; enumeration and the withdrawal kept intact. | yes | | test_hook_fire_log.py:183 | review round | CUT | "and cost this branch two review rounds" — the AttributeError-red mechanism is stated in full before it. | yes | | test_hook_fire_log.py:224 | Cold review | SEVER | "Cold review measured the gap" → "The gap is MEASURED"; the containment-test counterexample kept. | yes | | test_hook_fire_log.py:623 | cold review | SEVER | Kept both harms of a REPO_ROOT launch (FETCH_HEAD rewrite, live decisions validator); attribution only removed. | yes | | test_hook_fire_log.py:744 | Cold review | SEVER | "Both were MEASURED passing"; the indented/exported-reassignment finding untouched. | yes | | test_hook_fire_log.py:771 | cold review | SEVER | "it was MEASURED passing on all 13 hooks"; the `:-` fallback mechanism kept. | yes | | test_hook_fire_log.py:810 | the first version of this | SEVER | "Stated because the first version claimed the opposite" → "MEASURED, not assumed"; 8/13, 0-exit, 4-hook figures kept. | yes | | test_hook_fire_log.py:1124 | cold review | SEVER | "and was DEMONSTRATED collapsing two diagnostics"; the fd-state example kept verbatim. | yes | | test_hook_fire_log.py:1153 | the first version of this | CUT | Docstring opener clause said only that the file once lacked this assertion. | yes | | test_hook_fire_log.py:1456 | cold review | SEVER | "its absence was MEASURED by restoring the preference"; the method stays reproducible. | yes | | test_hook_fire_log.py:1513 | cold review | SEVER | "shipped unexecuted — MEASURED: replacing the clause with `:` left this file green". | yes | | test_hook_fire_log.py:1519 | cold review | SEVER | "MEASURED: that mutant left the whole file green"; the `-e` vs `-ef` argument kept. | yes | | test_hook_fire_log.py:1639 | found by cold review | SEVER | "found by cold review by stubbing `mktemp`" → "also reachable by stubbing `mktemp`"; trigger kept. | yes | | test_hook_fire_log.py:2532 | The first version of the | SEVER | Rewritten as a present-tense rule; the str/bytes `TypeError` trap and its "broken, not stricter" harm kept. | yes | | test_hook_fire_log.py:2544 | an earlier draft | SEVER | Kept the vacuity trap: an absolute `cwd` passes identically for every shape, crashes included. | yes | | test_hook_fire_log.py:2558 `adjacent` | round-3 defect | CUT | Named only the round; the defect ("`cwd` is being ignored") is stated in the same sentence. | yes | | test_hook_fire_log.py:1451 `adjacent` | used to prefer | KEEP-carveout | Pre-#891 production behaviour is the regression this test pins — trap plus consequence. | no | | test_hook_fire_log.py:2538 `adjacent` | A previous version of the guard | KEEP-carveout | Tested-and-removed dead branch; it is why the assertion below exists. | no | | test_hook_fire_log.py:63, :95 | used to | KEEP-carveout | #785/#778 traps with their measured harm (58 records/run; untracked hook entering the population). Outside every ±10 window. | no | ## scripts/tests/test_merge_consent_required_check.py | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | test_merge_consent_required_check.py:81 | Cold review | SEVER | "MEASURED: reintroducing a by-name lookup left the suite 33/33 green"; the record-before-filtering finding kept. | yes | | test_merge_consent_required_check.py:117 | first draft | SEVER | Restated as a rule about any fix that falls through to `rule_name`; the AUTO-GRANT harm kept. | yes | | test_merge_consent_required_check.py:401 | cold review | CUT | Bare "(cold review)" parenthetical; the reason it is not enough follows in the same sentence. | yes | | test_merge_consent_required_check.py:527 | cold review | CUT | "stated without the overclaim cold review removed" — the corrected scope is the whole docstring body. | yes | | test_merge_consent_required_check.py:569 | An earlier draft | SEVER | "Calling the whole clause defence-in-depth understates it" — the mis-sort warning kept, present tense. | yes | | test_merge_consent_required_check.py:588 | Cold review | SEVER | "Demonstrated side by side, it is the shape…"; the fix-one-path-check-its-TWIN lesson kept. | yes | | test_merge_consent_required_check.py:601 | review round | CUT | "found in the fifth cold-review round"; the defect itself is the docstring's subject. | yes | | test_merge_consent_required_check.py:667 | used to be | KEEP-carveout | The `release/26.4` path-separator 404 read as "unprotected" is the trap that retired the encoding test. | no | | test_merge_consent_required_check.py:928 | cold review found | SEVER | Attribution dropped; the scheduled-denied/immediate-granted asymmetry is the evidence and stays. | yes | | test_merge_consent_required_check.py:1027 | first draft | SEVER | "it passes without ever reaching the code it names" — stronger than the original "proves nothing". | yes | | test_merge_consent_required_check.py:1056 | the first draft of this | SEVER | "a test arranged that way passes with the repo gate disabled"; vacuity mechanism kept. | yes | | test_merge_consent_required_check.py:1075 | Cold review | SEVER | "Re-inlining a BYTE-IDENTICAL copy … left the whole suite green"; the mentioned-vs-loaded finding kept. | yes | | test_merge_consent_required_check.py:1354 | cold review | SEVER | Opener rewritten to name the defect ("the bypass that makes every other arm decorative (#858)"); citation kept. | yes | | test_merge_consent_required_check.py:1438 | first draft | SEVER | "The regression a collapsed fall-through introduces in #859's fix, measured both ways". | yes | | test_merge_consent_required_check.py:1442 | first draft | SEVER | "Collapsing them makes …" — both measured directions (AUTO-GRANT and false DENY) kept verbatim. | yes | | test_merge_consent_required_check.py:1466 | Cold review | SEVER | "The consequence is MEASURED — changing `*)` to set `bp_code=200` left the suite green". | yes | | test_merge_consent_required_check.py:706 | The first version emitted | KEEP-carveout | Tested-and-rejected escaping with its false-open→false-DENY harm. Outside every ±10 window; not touched. | no | ## scripts/tests/test_ci_dropped_step_guard.py | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | test_ci_dropped_step_guard.py:87 | An earlier draft | CUT | "An earlier draft of this change walked straight into it" — the constraint and its imprecise shorthand are stated above. | yes | | test_ci_dropped_step_guard.py:228 | earlier draft | SEVER | Kept the rejected "smaller cost than a required context" framing and the unsmoked-candidate harm; dropped whose draft claimed it. | yes | | test_ci_dropped_step_guard.py:252 | found by cold review | CUT | The opener-vs-closed-pair mechanism follows immediately and is unaffected. | yes | | test_ci_dropped_step_guard.py:337 | round 2 | SEVER | "`build`'s two payloads moved into `env:`, which brought it into the ban" — the do-not-narrow instruction kept. | yes | | test_ci_dropped_step_guard.py:447 | found by both review | CUT | The third-condition fall-through and its deadlock consequence are stated in full. | yes | | test_ci_dropped_step_guard.py:537 | found by cold review | CUT | The typo example and the docs-only false-red follow in the same comment. | yes | | test_ci_dropped_step_guard.py:579 | Found by cold review | SEVER | "DEMONSTRATED:"; the one-token regression and the 30-green measurement kept. | yes | | test_ci_dropped_step_guard.py:599 | earlier version of this | SEVER | Kept the principle ("a test double is an assertion about what the real system sends") bound to this double. | yes | | test_ci_dropped_step_guard.py:762 | first attempt | KEEP-false-positive | "first attempt" is `GITHUB_RUN_ATTEMPT=1`, a domain term, inside a displayed assertion message. | no | | test_ci_dropped_step_guard.py:816 | Found by cold review | CUT | Standalone attribution sentence; the reusable-path harm precedes it. | yes | | test_ci_dropped_step_guard.py:852 | cold review | SEVER | "three mutations … all survived a 50-green suite" — the three mutations and the measurement kept. | yes | | test_ci_dropped_step_guard.py:869 | Cold review | SEVER | "REPRODUCED exactly:"; the transcript that follows is the evidence. | yes | | test_ci_dropped_step_guard.py:891 | cold review | CUT | "— cold review's last finding" on the docstring summary line. | yes | | test_ci_dropped_step_guard.py:893 | Round 3 | SEVER | Kept "(true, true) is REACHABLE" and the deadlock direction; the `false`-blindness fact is already recorded at GATE_VALUES_IN_THE_WILD. | yes | | test_ci_dropped_step_guard.py:543 `adjacent` | An earlier version compared | SEVER | Present tense; the brittleness cost (`LC_ALL`, `${{x}}` spacing, red blocks every merge) kept. | yes | | test_ci_dropped_step_guard.py:813 `adjacent` | The first version of `marker_path` | KEEP-carveout | Rejected default with its silent-PASS harm; the "defect the guard had itself" shape. | no | | test_ci_dropped_step_guard.py:842 `adjacent` | the first two attempts | KEEP-carveout | Two measurement methods that prove nothing, kept so they are not re-attempted. | no | ## scripts/tests/test_image_build_delegates_the_spa_suite.py | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | …spa_suite.py:24 | review round | SEVER | "A predicate asking … was wrong nine times"; the nine enumerated mechanisms and the withdrawal kept. | yes | | …spa_suite.py:45 | earlier version of this | SEVER | Kept the corrected claim: "a pin cannot have a false green" is FALSE, refuted by execution. | yes | | …spa_suite.py:46 | cold review | SEVER | Same sentence as :45; the refutation-by-execution stays, the refuter goes. | yes | | …spa_suite.py:121 | earlier version of this | SEVER | Kept the boundary and the rejected wider reading ("has the suite available to run"). | yes | | …spa_suite.py:137 | cold review | SEVER | "until a stage was MEASURED escaping through it" — the `npm t` selector gap kept. | yes | | …spa_suite.py:214 | Cold review | SEVER | "ersatztv#887 was RE-ARMED through it twice"; both re-arming spellings kept. | yes | | …spa_suite.py:220 | cold review | SEVER | "ersatztv#887 was RE-ARMED through four spellings"; the four spellings kept. | yes | | …spa_suite.py:314 | cold review | CUT | "by cold review" → "MEASURED"; the `npm t -- --run` sweep escape kept. | yes | | …spa_suite.py:456 | cold review | SEVER | "MEASURED False for the glob, which left the receiving stage unpinned". | yes | | …spa_suite.py:671 | cold review | CUT | "by cold review"; the `run: >` fold and the swallowed-suite consequence kept. | yes | | …spa_suite.py:773 | review round | SEVER | Dropped "across three review rounds"; "defeated seven measured ways" and all seven kept. | yes | | …spa_suite.py:912 | cold review | SEVER | "MEASURED MISSED without this assertion" — the shell-body publish gap kept. | yes | | …spa_suite.py:974 | cold review | SEVER | "MEASURED False before the predicate was widened"; the unpinned-stage consequence kept. | yes | | …spa_suite.py:127 `adjacent` | wrong three times | SEVER | "(MEASURED, not reasoned: a destination rename IS recognised, because only sources are read.)" | yes | | …spa_suite.py:208 `adjacent` | Round-1 review found | SEVER | "It is CHECKED rather than stated as fact — an unchecked premise is one level out from the same defect." | yes | | …spa_suite.py:837 (same file, outside ±10) | Round-1 review found | SEVER | Same phrase, second site; left inconsistent otherwise. Content preserved as "stating that in prose with nothing checking it". | yes | | …spa_suite.py:662 `adjacent` | measured by cold review | KEEP-fixture | Inside a displayed assertion message — hard limit forbids editing a displayed string. | no | | …spa_suite.py:372, :650, :749, :854, :1016 | earlier versions | KEEP-carveout | Tested-and-defeated parser generations with their defeating shapes. Outside every ±10 window. | no | ## scripts/tests/test_ci_release_path_scan_job.py | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | …scan_job.py:18 | review round | CUT | "within one review round"; the ~10 false negatives and the four shapes are the measurement and stay. | yes | | …scan_job.py:20 | The fix was to | SEVER | "This job runs the real PyYAML-based test instead" — end state, with the no-drift-surface reason kept. | yes | | …scan_job.py:29 | Round 2 | SEVER | "Checks ABOUT the command … replaced a substring check"; "shape assertions lost twice" kept. | yes | | …scan_job.py:31 | round 3 | SEVER | Same sentence; "the gate was then disarmed seven more ways" and all seven kept. | yes | | …scan_job.py:39 | ROUND 4 | SEVER | "THE TWIN OF THAT FIX IS THE REUSABLE LESSON"; tier mechanism, the `always()` finding and "Nor is `needs:`…" kept. | yes | | …scan_job.py:413 | an earlier draft | SEVER | "a tally here has already disagreed with its own list" — the do-not-add-a-count instruction kept. | yes | | …scan_job.py:460 | an earlier draft | SEVER | "the exact reading that reports the gate healthy while an unsmoked candidate would publish". | yes | | …scan_job.py:482 | an earlier draft | SEVER | "precisely the reading that reads as success"; the exit-5 measurement kept. | yes | | …scan_job.py:501 | An earlier draft | CUT | Sentence's only content was the draft's misreading; "just not the one that proves anything" precedes it. | yes | | …scan_job.py:512 | First draft | CUT | Parenthetical; the exit-0/wrong-branch mechanism is stated in the same comment. | yes | | …scan_job.py:10 `adjacent` | Two independent reviews killed it | SEVER | "That is wrong on two counts" — both counts and the "worth writing down" framing kept. | yes | | …scan_job.py:54 `adjacent` | disarms review reported | SEVER | "Two proposed disarms were checked and are NOT real" — the refutation and its own caveat kept. | yes | | …scan_job.py:46 `adjacent` | ENUMERATING THAT LIST THEN FOUND | KEEP-carveout | The `$GITHUB_ENV` fourth tier, its measurement, and the ban-rather-than-model rule. | no | ## scripts/tests/mutation_manifest.py | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | mutation_manifest.py:138 | an earlier draft | SEVER | Restated as the trap: a copy without its sibling classifier exits 2 and satisfies "not drift". | yes | | mutation_manifest.py:208 | found by cold review | SEVER | Both provenance numbers (#778, #806) kept; only the finder removed. | yes | | mutation_manifest.py:385 | round 5 | SEVER | "#793 replaced the lock rather than tightening it" — citation kept, round dropped. | yes | | mutation_manifest.py:409 | cold review | SEVER | "flipping this row from ANNOTATED to CREATE retires the requirement…" — the whole demonstrated chain kept. | yes | | mutation_manifest.py:445 | review round | SEVER | "(that predicate was wrong nine times)"; matches the severed docstring it paraphrases. | yes | | mutation_manifest.py:476 | review round | SEVER | "Sorting these … was wrong twice — in both directions"; the NO GROUPING rejection and harm kept. | yes | Checked before editing: `test_mutation_harness.py` asserts only that `why` is non-empty and that `UNDECLARED` values exceed 60 characters. No `clause`, `replacement`, `target` or `UNDECLARED` value was touched. ## scripts/tests/test_check_doc_narrative.py | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | test_check_doc_narrative.py:3 | cold review | SEVER | "a defect DEMONSTRATED in the first, shell implementation" — the provenance of the cases kept. | yes | | test_check_doc_narrative.py:26 | I initially thought | KEEP-fixture | `NARRATIVE` constant — the detector's sample input. | no | | test_check_doc_narrative.py:44 | an earlier draft | KEEP-fixture | Inside `truth()`'s predicate — executable code, not prose. | no | | test_check_doc_narrative.py:373 | review round | SEVER | "after a mutant keyed on each was found"; the seven axes and the ENUMERATES caveat kept. | yes | | test_check_doc_narrative.py:466 | AN EARLIER DRAFT | KEEP-fixture | Case-sensitivity fixture written into `docs/case.md`. | no | ## scripts/tests/test_post_review_verdict.py | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | test_post_review_verdict.py:130 | earlier version of this | SEVER | Restated as the shim trap: appending LAST and slicing from the front manufactures a truncation the server cannot produce. | yes | | test_post_review_verdict.py:263 | used to say | SEVER | "with the comment written FIRST, a refusal left `Review-verdict: MERGEABLE` with no status" — the false-consent harm kept. | yes | | test_post_review_verdict.py:443 | after cold review | CUT | Docstring opener clause; the read-side-only gap is the next paragraph's subject. | yes | | test_post_review_verdict.py:479 | found by cold review | SEVER | Kept the ersatztv#778 citation; dropped the finder. | yes | | test_post_review_verdict.py:1083 | previously claimed | SEVER | "This does NOT witness the row-count fallback" — the array-TYPE branch fact kept as a live caveat. | yes | | test_post_review_verdict.py:446 `adjacent` | Review of that rescue found it | SEVER | "That rescue covered only `check-review-verdict.sh`"; the undisclosed-loss finding kept. | yes | | test_post_review_verdict.py:1086 `adjacent` | the old test was written for | SEVER | "That fallback was dead code and is gone" — the reason the count is unreachable kept. | yes | ## scripts/tests/test_worktree_ownership_guard.py | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | test_worktree_ownership_guard.py:57 | used to be | SEVER | "A pin made sense while…"; the #891 reason it now steers nothing, and reads as a control, kept. | yes | | test_worktree_ownership_guard.py:209 | Cold review | SEVER | "That is DEMONSTRATED — restore the module-level snapshot…"; the 54-record measurement kept. | yes | | test_worktree_ownership_guard.py:221 | the first version of this | SEVER | "stated precisely because it is narrower than it looks"; the launch-path-not-file scope kept. | yes | | test_worktree_ownership_guard.py:222 | Cold review | SEVER | Same edit as :221; "The gap is DEMONSTRATED" with the 18-record second-launcher case kept. | yes | | test_worktree_ownership_guard.py:390 | used to be | SEVER | "Arranging this by pinning `$CLAUDE_PROJECT_DIR` … worked only while the hooks read that variable" — no-op-control harm kept. | yes | ## scripts/tests/test_ci_image_pin_population.py | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | test_ci_image_pin_population.py:72 | The first version of this | SEVER | Rejected design stated as a rule: comparing the two sets is blind to a deleted `container:` block. | yes | | test_ci_image_pin_population.py:85 | earlier version of this | SEVER | "NOT 'in the same diff hunk'."; the measured distances and the INDEPENDENCE property kept. | yes | | test_ci_image_pin_population.py:272 | the first version of this | SEVER | "MEASURED: that blind spot is NOT live" — the empty blind-spot set and its converse caveat kept. | yes | | test_ci_image_pin_population.py:502 | Found by cold review | SEVER | "This file criticises `MARKED_JOBS` for exactly this and then ships the same shape" — the self-criticism kept. | yes | ## scripts/tests/test_optional_request_members.py | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | test_optional_request_members.py:13 | round 1 | KEEP-carveout | Labels #807's first hand-written attempt and its two live silent drops — an issue-level enumeration, not session chronology. | no | | test_optional_request_members.py:15 | round 2 | KEEP-carveout | Labels the second attempt and the `ArtworkContentTypeModel` miss; the pair is the evidence for deriving the guard. | no | | test_optional_request_members.py:40 | An earlier draft | SEVER | "the reach is what `_resolve` resolves and NOT the universal 'anywhere in the request graph'" — the false universal kept as a caution. | yes | | test_optional_request_members.py:175 | An earlier draft | SEVER | "Scanning POST/PUT/PATCH reads as obviously right and already has an exception"; the `DELETE` counterexample kept. | yes | ## scripts/tests/hook_fire_isolation.py | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | hook_fire_isolation.py:56 | this session | KEEP-false-positive | "this session" is the pytest session's later exports, a runtime referent. | no | | hook_fire_isolation.py:112 | this session | KEEP-false-positive | "this session's isolation" is the test session's log directory. | no | | hook_fire_isolation.py:200 | review round | SEVER | "two consecutive fixes here have each created the next finding" — the subtract-a-layer trigger kept. | yes | ## scripts/tests/conftest.py | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | conftest.py:15 | the fix is that | KEEP-false-positive | States the current design plus the rejected alternative (a test-marking field); no session referent. | no | | conftest.py:91 | the first version of this | CUT | "which is how the first version of this measurement was wrong"; the double-counting mechanism precedes it. | yes | ## scripts/tests/test_docs_only_detector_clone_depth.py | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | …clone_depth.py:59 | the first version of this | SEVER | "without this the file is green locally and red in CI" — the green-here/red-in-CI trap kept. | yes | | …clone_depth.py:282 | the first version of this | SEVER | "MEASURED: … the PR arm's `--depth=200` is inert" — the no-production-consumer statement kept. | yes | ## scripts/tests/test_merge_consent_base_change.py | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | …base_change.py:152 | cold review | CUT | Bare ", per cold review"; the tag-only-check failure mode follows. | yes | | …base_change.py:184 | first draft | SEVER | "Collapsing the two makes an unreadable response … skip validation in silence"; the later auto-grant harm kept. | yes | ## scripts/tests/test_review_verdict_vocabulary.py | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | …vocabulary.py:10 | review round | SEVER | "withdrew it after six rounds" — the count is the non-convergence evidence; only "cold-review" removed. | yes | | …vocabulary.py:415 | Cold review | SEVER | "MEASURED exactly that: all three sentinel guards removed, 150 tests still passing". | yes | ## scripts/tests/test_ci_toolchain_image_resolves.py | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | …image_resolves.py:155 | first draft | SEVER | "Warning and exiting 0 here is how a preflight becomes a no-op" — the rule kept, present tense. | yes | ## scripts/tests/test_merge_consent_exemption.py | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | …exemption.py:402 | The first version of this | SEVER | "a test using it passes with the newline guard entirely removed" — the fixture trap kept as a live warning. | yes | ## scripts/tests/test_migration_equivalence.py | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | …equivalence.py:189 | earlier version of this | SEVER | "Asserting existence from `docs/decisions/` … is the wrong base"; both wrong bases and the 105-link measurement kept. | yes | ## scripts/tests/test_workflow_persist_credentials.py | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | …persist_credentials.py:64 | earlier version of this | SEVER | "each of which escaped a simpler normalisation"; all six spellings kept. | yes | ## Counts Slice sites (113): | disposition | count | |---|---| | SEVER | 84 | | CUT | 19 | | KEEP-carveout | 3 | | KEEP-fixture | 3 | | KEEP-false-positive | 4 | | **total** | **113** | Adjacent sites found beyond the slice (16 rows; 2 of them outside ±10 but in a file I own and carrying a phrase I had just severed elsewhere in the same file — `…spa_suite.py:837`, `…scan_job.py:54` — plus 5 rows listed for completeness and NOT edited): | disposition | count | |---|---| | SEVER | 9 | | CUT | 1 | | KEEP-carveout | 5 | | KEEP-fixture | 1 | | **total** | **16** | ## Verification `ruff check` and `ruff format --check` were run from the worktree root on every edited file, and once over the whole directory: ``` $ ruff check scripts/tests/ All checks passed! $ ruff format --check scripts/tests/ 45 files already formatted ``` Change-shape proof — every changed line in my 20 files is a comment or docstring line: ``` $ git diff -U0 -- <my 20 files> | grep -cE '^[+-][^+-]' 346 $ git diff -U0 -- <my 20 files> | grep -E '^[+-][^+-]' \ | grep -vE '^[+-]\s*#' | grep -vE '^[+-]\s*("""|[A-Za-z`"(\[*.—…])' - 1 — a real test failure, just not the one that proves anything. An earlier draft read that as + 1 — a real test failure, just not the one that proves anything. ``` (the one line the filter does not classify begins `1 — `, a docstring continuation of "gives pytest exit / 1 — a real test failure"). No code, assertion, regex, identifier, fixture literal or displayed message was changed. `git diff --stat` for my 20 files: ``` scripts/tests/conftest.py | 3 +- scripts/tests/hook_fire_isolation.py | 6 +-- scripts/tests/mutation_manifest.py | 16 +++---- scripts/tests/test_check_doc_narrative.py | 4 +- scripts/tests/test_ci_dropped_step_guard.py | 49 ++++++++++------------ scripts/tests/test_ci_image_pin_population.py | 14 +++---- scripts/tests/test_ci_release_path_scan_job.py | 39 +++++++++-------- scripts/tests/test_ci_toolchain_image_resolves.py | 2 +- .../tests/test_docs_only_detector_clone_depth.py | 6 +-- scripts/tests/test_hook_fire_log.py | 47 ++++++++++----------- .../test_image_build_delegates_the_spa_suite.py | 49 +++++++++++----------- scripts/tests/test_merge_consent_base_change.py | 6 +-- scripts/tests/test_merge_consent_exemption.py | 6 +-- scripts/tests/test_merge_consent_required_check.py | 45 ++++++++++---------- scripts/tests/test_migration_equivalence.py | 6 +-- scripts/tests/test_optional_request_members.py | 8 ++-- scripts/tests/test_post_review_verdict.py | 22 +++++----- scripts/tests/test_review_verdict_vocabulary.py | 4 +- scripts/tests/test_workflow_persist_credentials.py | 2 +- scripts/tests/test_worktree_ownership_guard.py | 14 +++---- 20 files changed, 170 insertions(+), 178 deletions(-) ``` --- # Round 2 — wider phrasing sweep (44 listed sites, whole-file scope) Duplicates of round 1: `test_check_doc_narrative.py:466` (already KEEP-fixture) is the only exact repeat and is unchanged. Four sites I had dispositioned KEEP in round 1 are REVISED to SEVER here under the wider scope, because each restates cleanly as a hazard that is true today with nothing lost: `test_ci_dropped_step_guard.py:812`, `test_hook_fire_log.py:2538`, `test_merge_consent_required_check.py:667`, `test_optional_request_members.py:13/15`. `test_merge_consent_required_check.py:706` was out of every ±10 window in round 1 and is handled now. Policy applied consistently in round 2, stated so the KEEPs are legible: history of THE ARTIFACT'S OWN TEXT is always severed or cut; history of THE SUBJECT UNDER TEST is severed to a present-tense hazard when that stays true and loses nothing, and KEPT when restating would drop a removed design's record or assert something false about the current system. | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | hook_fire_isolation.py:72 | Cross-family review | SEVER | "That is a LIVE BYPASS:"; the relative-value-with-`cwd=$HOME` mechanism kept whole. | yes | | hook_fire_isolation.py:80 | previous version of this | SEVER | "A branch for the int case is DEAD code" — the `os.fspath` reason and the green-on-deletion measurement kept. | yes | | hook_fire_isolation.py:83 | the FIRST version | SEVER | "`os.fspath` alone leaves `os.path.join` raising on mixing str with bytes" — the trap kept as a rule. | yes | | hook_fire_isolation.py:103 | earlier round | SEVER | Points at where the regression is recorded (`_anchored`) instead of when it shipped. | yes | | test_check_doc_narrative.py:284 | next round | SEVER | "each defeated by the next"; the three defeated controls and their defeating rules kept. | yes | | test_check_doc_narrative.py:466 | AN EARLIER DRAFT of this | KEEP-fixture | Case-sensitivity fixture written into `docs/case.md`. Duplicate of round 1. | no | | test_ci_dropped_step_guard.py:812 | The first version of | SEVER (revised) | "A `marker_path` defaulting to `nojob`/`norunid`/`1` uses names every run shares"; the silent-PASS harm kept. | yes | | test_ci_image_pin_population.py:505 | this file once | KEEP-carveout | Identifies the referents of two now-dead names (`TOOLCHAIN_JOBS`/`BARE_RUNNER_JOBS`) and their #789 replacement. | no | | test_ci_release_path_scan_job.py:9 | The first cut of | SEVER | "A bespoke stdlib scanner in `build` itself is wrong on two counts"; both counts kept. | yes | | test_ci_toolchain_image_resolves.py:246 | I found | KEEP-false-positive | "'I found nothing'" is the report wording the script must emit, not the author's voice. | no | | test_docs_only_detector_clone_depth.py:219 | was first | SEVER | "that is MEASURED: the PR arm against the 31-commit origin … passed against the unfixed script". | yes | | test_hook_fire_log.py:326 | in this PR | SEVER | Narrates this change's history; restated as the rejected merge-base comparison and its coupling harm. | yes | | test_hook_fire_log.py:1605 | ROUND-2 | SEVER | Section header renamed to what it groups ("PROOFS FOR THE DEFECTS THIS INSTRUMENTATION SHIPPED"). | yes | | test_hook_fire_log.py:1776 | independent review | SEVER | "corroborated by a file … written 13 seconds earlier by another process (ersatztv#822)" — evidence kept, finder dropped. | yes | | test_hook_fire_log.py:2493 | cross-family review | SEVER | "A LIVE BYPASS:"; the parent-vs-child anchoring mechanism kept. | yes | | test_hook_fire_log.py:2538 | previous version of the | SEVER (revised) | "A branch for that case is dead code" — the `os.fspath` reason and removed-rather-than-proved decision kept. | yes | | …spa_suite.py:443 | used to sit | SEVER | "A second `startswith("[")` test here is dead code"; the `raise`-poisoning measurement kept. | yes | | …spa_suite.py:749 | An earlier version | SEVER | "Pinning only the scripts whose body contains `vitest` is a SELECTOR"; all four short-goings kept. | yes | | …spa_suite.py:854 | earlier version | SEVER | "Deciding whether a command RUNS the suite was wrong nine times." | yes | | test_merge_consent_exemption.py:255 | round-3 | SEVER | "an ABSENT status fails closed"; the dodge it prevents and the asserting test kept. | yes | | test_merge_consent_exemption.py:257 | this test used to | CUT | Sentence's only content was that this test once carried a statusless row. | yes | | test_merge_consent_exemption.py:286 | in this pr | KEEP-false-positive | Substring of "pin this property" — not a phrase in the text at all. | no | | test_merge_consent_exemption.py:495 | round-3 | SEVER | Section rule: "(three surviving mutants)"; the mutant count is the finding. | yes | | test_merge_consent_exemption.py:496 | round-3 | SEVER | "The `..` finding was an anchor subversion"; both surviving anchor mutants kept. | yes | | test_merge_consent_exemption.py:536 | Round-2 | SEVER | "The enforced gate gained large-input regression tests while the hook … did not" — the asymmetry and its record kept. | yes | | test_merge_consent_exemption.py:536 | cross-family review | SEVER | Same edit as the row above. | yes | | test_merge_consent_required_check.py:78 | used to live | SEVER | "A recorder inside the `endswith` branch below would make the assertion unfalsifiable" — the mechanism kept. | yes | | test_merge_consent_required_check.py:667 | used to be | SEVER (revised) | "Interpolating the ref into `branch_protections/{name}` lets a base like `release/26.4` inject a path separator and 404". | yes | | test_merge_consent_required_check.py:706 | The first version | SEVER | "Emitting TWO backslashes … makes every rule containing a metacharacter UNMATCHABLE"; the false-DENY harm kept. | yes | | test_merge_consent_required_check.py:796 | The hook used to | SEVER | "Looking the rule up by NAME first … is that twin"; the whole rejected-flow analysis kept. | yes | | test_merge_consent_required_check.py:1184 | used to fail | SEVER | "they FAIL DIFFERENTLY without the fix and converge only with it"; both failure shapes kept. | yes | | test_migration_equivalence.py:7 | An earlier version | SEVER | "Migrating the real `docs/` tree would make this a one-shot"; the whole one-shot harm kept. | yes | | test_migration_equivalence.py:33 | Review proved | SEVER | "PROVED: collapsing interior blank lines there left all harness tests green". | yes | | test_optional_request_members.py:13 | round 1 | SEVER (revised) | Relabelled `attempt 1`; both live silent drops and the column layout unchanged. | yes | | test_optional_request_members.py:15 | round 2 | SEVER (revised) | Relabelled `attempt 2`; the `ArtworkContentTypeModel` miss and its reachability kept. | yes | | test_optional_request_members.py:220 | An earlier version | SEVER | "ASSERTING instead that no property name contains a dot is a guard where a restructure is available". | yes | | test_optional_request_members.py:288 | An earlier version | SEVER | "Putting `then`/`else` in the conjunctive list … is the polarity error"; the mutual-exclusion reason kept. | yes | | test_optional_request_members.py:439 | used to sit | SEVER | "A THIRD assumption sat here unstated and was already violated"; the inline-body violation kept. | yes | | test_post_review_verdict.py:413 | was previously | SEVER | "Left IMPLICIT, this guard is only a side effect"; the fail-OPEN conversion kept. | yes | | test_post_review_verdict.py:893 | an earlier version | SEVER | Kept the tempting evidence (`total_count`), the measured ORDER, and the unproducible conclusion. | yes | | test_post_review_verdict.py:939 | was first | SEVER | "one file over from where it is recorded" — the pointer stays, the discovery goes. | yes | | test_review_verdict_vocabulary.py:4 | used to carry | SEVER | "must not carry two hand-written copies of the word list" — states the rule, keeps the divergence hazard. | yes | | test_review_verdict_vocabulary.py:429 | round-2 | SEVER | "that same overclaim one level down" — the referent is this paragraph's own opener. | yes | | test_workflow_persist_credentials.py:138 | in the same PR | KEEP-false-positive | States a rule (change the guard alongside the checkout) inside a displayed failure message. | no | ## Further same-class sites met during the whole-file sweep (not on either list) | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | test_hook_fire_log.py:63 | used to predate | SEVER | "such a snapshot PREDATES it"; the 58-records-per-run measurement and fail-open reason kept. | yes | | test_hook_fire_log.py:95 | used to enter | SEVER | "would enter this population"; the red-locally/green-in-CI harm kept. | yes | | test_hook_fire_log.py:235 | found by self-audit rather than by a reviewer | CUT | Pure attribution; "both slip past a `${…}`/`$NAME` test" is the finding and stays. | yes | | test_hook_fire_log.py:622 | used to make | SEVER (revises round 1 KEEP) | "A relative launch from REPO_ROOT itself is wrong twice over"; both measured harms kept. | yes | | test_hook_fire_log.py:1451 | used to prefer | SEVER (revises round 1 KEEP) | "Preferring `$CLAUDE_PROJECT_DIR` … reads as harmless"; the two-roots confident-table harm kept. | yes | | …spa_suite.py:372 | three earlier versions | SEVER | "the shell traps that defeated the parser"; the three traps kept. | yes | | …spa_suite.py:650 | Three earlier versions | SEVER | "Recognising those individually was tried three times and missed …"; both misses kept. | yes | | …spa_suite.py:1016 | three earlier versions | SEVER | "The shapes that broke the parser must not break the pin comparison." | yes | | test_optional_request_members.py:251 | (the first version) | CUT | Parenthetical attribution; "Unioning them instead marks a member required because one arm requires it" is the finding. | yes | Confirmed-KEEP residuals the sweep re-surfaced and did not touch: `test_ci_dropped_step_guard.py:761` (`GITHUB_RUN_ATTEMPT` domain term in a displayed message), `hook_fire_isolation.py:56` and `:112` (pytest-session referent), `test_check_doc_narrative.py:26`/`:44`/`:466` (detector fixtures and predicate), `mutation_manifest.py:418`/`:419` (`clause=`/`replacement=` mutation strings), `test_post_review_verdict.py` `H10_REVIEWERS`/"reviewer" occurrences and `test_review_verdict_vocabulary.py:55` (domain terms), `test_merge_consent_exemption.py:285` ("pin this property"), `test_workflow_persist_credentials.py:138` (rule in a displayed message). Also untouched: `test_merge_consent_required_check.py:82`'s "this PR's sibling record" — the record's key could not be resolved from the catalog, so naming it would be fabrication (brief: KEEP and say why). ## Round 2 counts Listed sites (44): | disposition | count | |---|---| | SEVER | 38 | | CUT | 1 | | KEEP-carveout | 1 | | KEEP-fixture | 1 | | KEEP-false-positive | 3 | | **total** | **44** | Further same-class sites found beyond the list (9): SEVER 7, CUT 2. Combined across both rounds: 157 listed sites + 25 unlisted = 182 dispositioned; SEVER 138, CUT 23, KEEP 21. ## Round 2 verification ``` $ ruff check scripts/tests/ All checks passed! $ ruff format --check scripts/tests/ 45 files already formatted ``` Change-shape proof, re-run over my 20 files after round 2 — 511 changed lines, all comment or docstring, the same single unclassifiable line (a docstring continuation beginning `1 — `): ``` $ git diff -U0 -- <my 20 files> | grep -cE '^[+-][^+-]' 511 $ git diff -U0 -- <my 20 files> | grep -E '^[+-][^+-]' \ | grep -vE '^[+-]\s*#' | grep -vE '^[+-]\s*("""|[A-Za-z`"(\[*.—…])' - 1 — a real test failure, just not the one that proves anything. An earlier draft read that as + 1 — a real test failure, just not the one that proves anything. ``` `git diff --stat` for my 20 files after round 2: ``` scripts/tests/conftest.py | 3 +- scripts/tests/hook_fire_isolation.py | 20 +++--- scripts/tests/mutation_manifest.py | 16 ++--- scripts/tests/test_check_doc_narrative.py | 6 +- scripts/tests/test_ci_dropped_step_guard.py | 51 +++++++------ scripts/tests/test_ci_image_pin_population.py | 14 ++-- scripts/tests/test_ci_release_path_scan_job.py | 41 ++++++----- scripts/tests/test_ci_toolchain_image_resolves.py | 2 +- .../tests/test_docs_only_detector_clone_depth.py | 12 ++-- scripts/tests/test_hook_fire_log.py | 83 +++++++++++----------- .../test_image_build_delegates_the_spa_suite.py | 63 ++++++++-------- scripts/tests/test_merge_consent_base_change.py | 6 +- scripts/tests/test_merge_consent_exemption.py | 17 +++-- scripts/tests/test_merge_consent_required_check.py | 67 +++++++++-------- scripts/tests/test_migration_equivalence.py | 14 ++-- scripts/tests/test_optional_request_members.py | 30 ++++---- scripts/tests/test_post_review_verdict.py | 42 +++++------ scripts/tests/test_review_verdict_vocabulary.py | 10 +-- scripts/tests/test_workflow_persist_credentials.py | 2 +- scripts/tests/test_worktree_ownership_guard.py | 14 ++-- 20 files changed, 252 insertions(+), 261 deletions(-) ```
Author
Owner

Per-site manifest — web/

Line numbers are from the pre-edit tree (fb5592971); ## Round 2 rows come from the wider phrasing sweep. Rows marked as duplicates restate a round-1 site.

Manifest — slice D (web/), ersatztv #876 narrative sweep

Worktree /Users/timothy/ersatztv-wt-876. 108 slice rows over 31 files; comment-only edits.
Line numbers are the SLICE's (pre-edit). edited = yes/no.

Slice-specific rule applied to test TITLE strings (it/describe/it.each argument): graded
KEEP-fixture, not renamed — rename proposals are listed in a separate section below.

file:line matched disposition reason (≤25 words) edited
web/src/api/completeAnnotationScan.test.ts:146 cold review SEVER Kept the measurement and the rejected narrower guard (throws on intersections alone); dropped "by cold review" and the earlier comment's wording. yes
web/src/api/completeAnnotationScan.ts:30 review round KEEP-carveout "Withdrawn guard (six review rounds, then deleted)" is the empirical case against string-matching predicates; the round count IS the evidence. no
web/src/api/completeAnnotationScan.ts:217 Cold review SEVER Kept the rejected unconstrained form and its harm (a declare module block silently overwrites a schema); dropped the attribution. yes
web/src/api/completeAnnotations.guard.test.ts:109 Cold review pointed SEVER Restated as the standing reason: CREATE would be permissive while the note says annotating breaks semantics. yes
web/src/api/completeAnnotations.guard.test.ts:239 Cold review SEVER Bypass (strip Complete<> off the wrapper, retype the test fixture) fully kept; only "Cold review demonstrated" removed. yes
web/src/api/completeAnnotations.guard.test.ts:245 cold review SEVER The .test.-only form is false; the dated measurement ("measured on 4.1.9") stays on the next line. yes
web/src/api/completeAnnotations.guard.test.ts:250 earlier version of this SEVER Kept the rejected universal claim ("all of the spellings vitest accepts") as a bound; dropped "an earlier version of this comment". yes
web/src/api/completeAnnotations.guard.test.ts:381 cold review SEVER Measurement (65 of 257 files dropped, pins and floor green) kept; attribution replaced by "a measured narrowing". yes
web/src/api/completeAnnotations.guard.test.ts:401 cold review showed SEVER Selective-narrowing finding kept verbatim; only "cold review showed that" removed. yes
web/src/api/completeAnnotations.guard.test.ts:437 cold review SEVER "a false green cold review demonstrated" → "a demonstrated false green"; the shadowing hazard is untouched. yes
web/src/api/completeRequest.guard.test.ts:101 earlier version of this SEVER Rewritten as a standing prohibition: pinning a REQUIRED member costs the proof its discriminating case, and the "no optional member" reasoning is false. yes
web/src/api/completeRequest.ts:53 earlier draft CUT Clause said only that an earlier draft's count was wrong; the durable reason ("not a derived population") stays. yes
web/src/api/libraryBrowse.test.ts:72 The previous version of this SEVER Kept the rejected approach (hand-copied sample), the omitted &/` `, and the general trap; dropped "The previous version of this test".
web/src/api/pageSizeCallSites.guard.test.ts:41 after review KEEP-false-positive "lands after review and after the merge gate" states WHEN breakage surfaces — a structural property, not attribution. no
web/src/api/pageSizeCallSites.guard.test.ts:471 round 4 SEVER Dropped " round 4" from (#650 follow-up round 4); the rejected plant-a-file verification and why it pins nothing are untouched. yes
web/src/api/pageSizeCallSites.guard.test.ts:484 round 3 SEVER (#650 follow-up round 3 MEDIUM finding)(#650 follow-up); issue pointer kept, review chronology dropped. yes
web/src/api/pageSizeCallSites.guard.test.ts:680 the review asked SEVER Kept the snapshot boundary (b90f8a3b, these 4 prove nothing) and the pointer to the fixture test; dropped "where the review asked for it" and "this round's". yes
web/src/api/pageSizeCallSites.guard.test.ts:700 round 4 KEEP-fixture Inside the it.each TITLE string (displayed test output). Rename proposed below, not applied. no
web/src/api/pageSizeCallSites.guard.test.ts:957 round 6 SEVER (#819 round 6)(#819); the "not derived from tracked on both sides" finding is untouched. yes
web/src/api/pageSizeScan.test.ts:14 round 1 SEVER Prior scanner renamed to its durable identifier b90f8a3b; "a round-3 review found" dropped. Which fixtures are contract vs regression pins is kept in full. yes
web/src/api/pageSizeScan.test.ts:16 round 1 SEVER Same paragraph: "round 1's OWN heuristics" → "its OWN heuristics". yes
web/src/api/pageSizeScan.test.ts:18 round 1 SEVER Same paragraph: "fail against round 1" → "fail against b90f8a3b"; the verified fixture list is unchanged. yes
web/src/api/pageSizeScan.test.ts:22 round 1 SEVER Same paragraph: "fails round 1 for several of those reasons" → "fails it …". yes
web/src/api/pageSizeScan.test.ts:43 round 1 SEVER Body comment: "round 1's unconditional literal regex" → "the prior scanner's"; the contract-vs-regression distinction is kept. yes
web/src/api/pageSizeScan.test.ts:48 round 1 SEVER Same comment: "round 1's comment-stripping step" → "the prior scanner's comment-stripping step". yes
web/src/api/pageSizeScan.test.ts:75 round 1 SEVER Body comment: "round 1's literal-form regex" → "the prior scanner's"; "not a round-1 regression" → "not a regression against it". yes
web/src/api/pageSizeScan.ts:10 after a review SEVER "replaced after a review found it defeated by" → "replaced because it was defeated by"; the defeating input classes are untouched. yes
web/src/api/pageSizeScan.ts:53 round 3 SEVER (#650 follow-up round 3 MEDIUM finding)(#650 follow-up). yes
web/src/api/pageSizeScan.ts:60 round 3 SEVER (#650 follow-up round 3 MEDIUM)(#650 follow-up). yes
web/src/api/pageSizeScan.ts:79 round 3 SEVER (#650 follow-up round 3 MEDIUM)(#650 follow-up). yes
web/src/api/selectionId.test.ts:5 round 8 SEVER (#651 round 8)(#651); relative time "until now it was only exercised indirectly" → "screen tests exercise it only indirectly". yes
web/src/api/selectionId.ts:6 round 7 SEVER Rewritten as the standing boundary argument: putting the check at the search picker leaves two doors open. Rejection and harm kept, rounds dropped. yes
web/src/api/selectionId.ts:9 round 8 SEVER Same block: "(round 8)" → "(#651)". yes
web/src/builder/ChannelBuilder.test.tsx:731 first attempt KEEP-false-positive "the first attempt fails" is the test's own retry scenario, not a session round. no
web/src/builder/ChannelBuilder.test.tsx:845 round 3 KEEP-fixture Inside the it TITLE string. Rename proposed below, not applied. no
web/src/builder/ChannelBuilder.test.tsx:847 Round 1 SEVER Kept the mirror-image race and why single-flight replaces it; "Round 1 fixed…/Round 3's review found…" → "A narrower fix … leaves". yes
web/src/builder/ChannelBuilder.test.tsx:1220 round 3 KEEP-fixture TITLE string. no
web/src/builder/ChannelBuilder.test.tsx:1263 round 4 KEEP-fixture TITLE string. no
web/src/builder/ChannelBuilder.test.tsx:1342 round 3 KEEP-fixture TITLE string. no
web/src/builder/libraryBrowse.ts:85 review round SEVER Kept the rejected one-interleaving-at-a-time approach and why single-flight replaces it; dropped "review round 3", "rounds 1-2", "the reviewer". yes
web/src/builder/rules/roundtrip.test.ts:106 review round SEVER #578 / #651 review round 2:#578 / #651:; the LCG derivation and why a recomputed divisor proves nothing are untouched. yes
web/src/schedules/ScheduleItemInspector.tsx:440 round 4 SEVER (#651 round 4 HIGH-1)(#651); the cross-namespace harm stays. yes
web/src/schedules/pickers.test.tsx:441 The original version of this SEVER Kept the trap (pressing Escape cancels the timer that exposes the storm) and the storm mechanism; dropped "The original version of this test". yes
web/src/schedules/pickers.test.tsx:310 round 3 KEEP-fixture TITLE string ("BLOCKER 3 / round 3: …"). Rename proposed below. no
web/src/schedules/pickers.test.tsx:341 round 3 KEEP-fixture TITLE string ("round 3 HIGH: …"). Rename proposed below. no
web/src/schedules/pickers.test.tsx:376 review round SEVER Section banner comment: #651 review round 4:#651:. yes
web/src/schedules/pickers.test.tsx:507 round 7 SEVER (#651 round 7)(#651); the int32-binding harm stays. yes
web/src/schedules/pickers.test.tsx:512 round 6 KEEP-fixture TITLE string ("MEDIUM-3 (round 6): …"). Rename proposed below. no
web/src/schedules/pickers.test.tsx:529 round 7 SEVER (#651 round 7)(#651). yes
web/src/schedules/pickers.tsx:46 round 6 SEVER (#651 round 6)(#651); the container-vs-contents finding is untouched. yes
web/src/schedules/pickers.tsx:49 round 8 SEVER (#651 round 8)(#651). yes
web/src/schedules/pickers.tsx:78 round 4 SEVER (#651 round 4 HIGH-1)(#651). yes
web/src/schedules/pickers.tsx:83 round 4 SEVER (#651 round 4 MEDIUM-5)(#651). yes
web/src/schedules/pickers.tsx:93 round 5 SEVER (#651 round 5 MEDIUM-2: …)(#651: …); the request-storm harm inside the parenthesis is kept. yes
web/src/schedules/pickers.tsx:115 round 3 SEVER (#651 round 3, MEDIUM)(#651). yes
web/src/schedules/pickers.tsx:121 round 5 SEVER (#651 round 5 MEDIUM-2)(#651). yes
web/src/schedules/pickers.tsx:143 round 5 SEVER (#651 round 5 MEDIUM-3)(#651). yes
web/src/schedules/pickers.tsx:157 round 5 SEVER (#651 round 5 MEDIUM-3, round 6)(#651). yes
web/src/schedules/pickers.tsx:194 round 2 SEVER (#651 round 2 BLOCKER 2, round 4 HIGH-1)(#651). yes
web/src/schedules/pickers.tsx:199 round 7 SEVER (#651 round 7)(#651). yes
web/src/schedules/pickers.tsx:212 review round SEVER (#651 review round 3, HIGH)(#651); the one-gate-per-commit-path rationale is untouched. yes
web/src/schedules/pickers.tsx:236 review round SEVER (#651 review round 2, BLOCKER 3)(#651). yes
web/src/screens/CollectionsScreen.test.tsx:648 review round SEVER Kept the conflation finding in the parenthesis; (#685 review round 3 — …)(#685 — …). yes
web/src/screens/CollectionsScreen.test.tsx:655 review round SEVER (#685 review round 4)(#685). yes
web/src/screens/CollectionsScreen.tsx:84 review round SEVER Kept "one of two ingress paths was enforced, which is not an invariant"; dropped "review round 3". yes
web/src/screens/CollectionsScreen.tsx:90 review round SEVER (#685 review round 4)(#685). yes
web/src/screens/CollectionsScreen.tsx:432 review round CUT "review round 4 flagged the divergence as unexplained" says only that a review asked; the explanation it asked for is the whole comment. yes
web/src/screens/CollectionsScreen.tsx:448 review round SEVER (#685 review round 3)(#685); the live-region trap is untouched. yes
web/src/screens/CollectionsScreen.tsx:466 review round SEVER (#685 review round 4)(#685). yes
web/src/screens/FillerPresetsScreen.tsx:222 round 8 SEVER (#651 round 8)(#651). yes
web/src/screens/FillerPresetsScreen.tsx:857 review round SEVER #651 review round 3.#651.; the "add the guard WITH the test that reaches it" rule is untouched. yes
web/src/screens/LocalLibraryEditScreen.tsx:56 this session KEEP-false-positive "added in this session" = the user's unsaved edit session in the UI, not an authoring session. no
web/src/screens/PlaybackTroubleshootingScreen.test.tsx:364 THIS session KEEP-false-positive "THIS session" = a playback session (statusStore.Reset). no
web/src/screens/PlaybackTroubleshootingScreen.tsx:37 the PREVIOUS session KEEP-false-positive Playback session, not an authoring session. no
web/src/screens/PlaybackTroubleshootingScreen.tsx:195 the PREVIOUS session KEEP-false-positive Playback session. no
web/src/screens/PlaybackTroubleshootingScreen.tsx:479 THIS session KEEP-false-positive Playback session. no
web/src/screens/PlaylistsScreen.test.tsx:327 round 4 SEVER (#651 round 4 HIGH-2)(#651). yes
web/src/screens/PlaylistsScreen.test.tsx:361 round 9 SEVER Section banner comment: #651 round 9:#651:. yes
web/src/screens/PlaylistsScreen.test.tsx:366 round 9 KEEP-fixture TITLE string. Rename proposed below. no
web/src/screens/PlaylistsScreen.test.tsx:410 round 9 KEEP-fixture TITLE string. Rename proposed below. no
web/src/screens/PlaylistsScreen.tsx:241 round 9 SEVER (#651 round 9)(#651); the contradictory-label finding is untouched. yes
web/src/screens/PlaylistsScreen.tsx:368 round 9 SEVER (#651 round 9)(#651). yes
web/src/screens/PlaylistsScreen.tsx:428 round 4 SEVER (#651 round 4 HIGH-2)(#651). yes
web/src/screens/PlexSourceScreen.test.tsx:175 used to claim KEEP-carveout Describes the #345 PRODUCT defect this test pins (unremovable stored authorization), not a doc's earlier draft. no
web/src/screens/RerunCollectionsScreen.test.tsx:6 round 6 SEVER (#651 round 6)(#651), and relative "now"; the fixture trap (a mock without an ETag exercises a force-write path) is kept. yes
web/src/screens/RerunCollectionsScreen.test.tsx:483 round 3 SEVER (#651 round 3 HIGH, round 5 redesign)(#651); "prevented structurally rather than by a merge rule" kept. yes
web/src/screens/RerunCollectionsScreen.test.tsx:513 round 4 SEVER (#651 round 4 HIGH-2)(#651). yes
web/src/screens/RerunCollectionsScreen.test.tsx:554 review round SEVER Banner #651 review round 5:#651:. yes
web/src/screens/RerunCollectionsScreen.test.tsx:558 round 5 SEVER "Rounds 2-4 each produced a HIGH finding …; round 5 removed the race" → "Every version … produced a HIGH finding, so the race is removed rather than refereed". yes
web/src/screens/RerunCollectionsScreen.test.tsx:660 round 3 SEVER Kept both mutation-sensitivity halves and the #671 shape; dropped "Replaces the deleted …", "the previous version had neither", "that round 3 showed". yes
web/src/screens/RerunCollectionsScreen.test.tsx:751 round 7 SEVER (#651 round 7 HIGH)(#651); the empty-ETag force-write harm is untouched. yes
web/src/screens/RerunCollectionsScreen.test.tsx:866 round 7 SEVER (#651 round 7)(#651). yes
web/src/screens/RerunCollectionsScreen.test.tsx:914 round 6 SEVER "not a round-6 defect: round 6's race guard" → "not the race alone: the race guard"; what the test actually fails is unchanged. yes
web/src/screens/RerunCollectionsScreen.test.tsx:965 round 8 SEVER Banner #651 round 8:#651:. yes
web/src/screens/RerunCollectionsScreen.test.tsx:967 Round 7 SEVER "Round 7 put the predicate inside …" → "Putting the predicate inside … leaves the two other doors open". yes
web/src/screens/RerunCollectionsScreen.test.tsx:974 round 8 KEEP-fixture TITLE string. Rename proposed below. no
web/src/screens/RerunCollectionsScreen.test.tsx:1000 round 8 KEEP-fixture TITLE string. Rename proposed below. no
web/src/screens/RerunCollectionsScreen.tsx:112 round 8 SEVER (#651 round 8 — the boundary, not the site)(#651 — the boundary, not the site). yes
web/src/screens/RerunCollectionsScreen.tsx:239 round 7 SEVER (#651 round 7 HIGH)(#651). yes
web/src/screens/RerunCollectionsScreen.tsx:259 review round SEVER NOTE (#651 review round 5):NOTE (#651):; the no-reconciliation-machinery prohibition is untouched. yes
web/src/screens/RerunCollectionsScreen.tsx:262 review round KEEP-carveout "a HIGH finding in three consecutive review rounds, including three cross-user lost updates" IS the tested-and-rejected evidence against rebuilding reconciliation. no
web/src/screens/RerunCollectionsScreen.tsx:303 round 4 SEVER (#651 round 4 HIGH-2)(#651). yes
web/src/screens/RerunCollectionsScreen.tsx:336 round 7 SEVER (#651 round 7)(#651). yes
web/src/screens/RerunCollectionsScreen.tsx:469 round 6 SEVER (#651 round 6)(#651). yes
web/src/screens/RerunCollectionsScreen.tsx:551 round 4 SEVER (#651 round 4 MEDIUM-4, now structural rather than guarded)(#651 — structural rather than guarded). yes
web/src/screens/SchedulesScreen.tsx:430 Codex review SEVER (Codex review, PR #242)(PR #242) — the brief's own example: keep the number, drop the attribution. yes
web/vite-plugins/trackedSourceFiles.test.ts:45 round 6 SEVER #819 round 6:#819:; the cancellation argument is untouched. yes
web/vite-plugins/trackedSourceFiles.ts:55 round 6 SEVER (#819 round 6)(#819). yes

Adjacent rows (found inside the ±10-line window of a slice site)

file:line matched disposition reason (≤25 words) edited
web/src/api/completeAnnotations.guard.test.ts:406 (adjacent to 401) the round-5 .spec.ts bypass SEVER "round-5" dropped; the bypass is described in isProductionSource above. yes
web/src/api/completeAnnotations.guard.test.ts:29-37 (adjacent to 41) This guard was BORN RED … #676's merge KEEP-carveout Rejected line:column identity kept with the concrete incident that killed it, including the "#676 is not the cause" warning. no
web/src/api/completeRequest.ts:58 (adjacent to 53) a reviewer can see KEEP-false-positive "a reviewer" is a generic role in a domain sentence, not session attribution. no
web/src/api/pageSizeCallSites.guard.test.ts:54 (adjacent to 41) a reviewer conditioned to re-pin line numbers KEEP-false-positive Generic role, describing why the old identity caught the substitution case only incidentally. no
web/src/api/pageSizeCallSites.guard.test.ts:461 (adjacent to 471) the #819 round-5 fix SEVER "round-5" dropped; the cancels-on-both-sides reason and the 15-file measurement are untouched. yes
web/src/api/pageSizeCallSites.guard.test.ts:703 (adjacent to 700) A prior verification planted SEVER Restated timelessly ("Planting a REAL .mts file … proves … but pins nothing"); the rejected verification and its reason are kept. yes
web/src/api/pageSizeCallSites.guard.test.ts:948 (adjacent to 957) used to sit side by side here / One assertion now SEVER Trap kept ("duplicate guards mask each other"); the file's own history and relative "now" dropped. yes
web/src/screens/CollectionsScreen.tsx:440 (adjacent to 432/448) (#685 review) SEVER (#685). yes
web/src/screens/CollectionsScreen.tsx:457 (adjacent to 448) (#685 review finding 1) SEVER (#685); the measured harm (rows wiped while selected still held them) is kept. yes
web/src/screens/CollectionsScreen.tsx:459 (adjacent to 466) (#685 second review) SEVER (#685). yes
web/src/screens/PlaybackTroubleshootingScreen.tsx:476 (adjacent to 479) (Codex MAJOR) SEVER Attribution with no issue/PR number; the fast-completion race description is untouched. yes
web/src/screens/PlaylistsScreen.test.tsx:412 (adjacent to 410) which the round-8 sweep missed SEVER Clause named only when it was found; "the same class, on the same screen" carries the finding. yes
web/src/screens/RerunCollectionsScreen.test.tsx:556 (adjacent to 554/558) Every reconciliation test above was deleted with the machinery it exercised CUT Only content is the file's own edit history; "there is nothing to reconcile" follows two sentences later. yes
web/src/screens/SchedulesScreen.tsx:433 (adjacent to 430) (Codex re-review, PR #242) SEVER (PR #242), same rule as line 430. yes

Disposition counts

Slice rows (108): SEVER 84 · CUT 2 · KEEP-carveout 3 · KEEP-fixture 12 · KEEP-false-positive 7
Adjacent rows (14): SEVER 10 · CUT 1 · KEEP-carveout 1 · KEEP-false-positive 2

Test-TITLE rename proposals (NOT applied — parent decides)

Titles are displayed test output, so per the dispatch they were left alone. None is purely
chronological; each would only lose a round/severity prefix or suffix.

  • pageSizeCallSites.guard.test.ts:700 — drop round 4 from (#650 follow-up round 4)
  • ChannelBuilder.test.tsx:845, 1220, 1342 — drop round 3; :1263 — drop round 4
  • pickers.test.tsx:310 — drop the BLOCKER 3 / round 3: prefix; :341 — drop round 3 HIGH: ; :512 — drop (round 6)
  • pageSizeScan.test.ts:42, 74not a round-1 regression pinnot a regression pin against the prior scanner
  • PlaylistsScreen.test.tsx:366, 410 — drop the round 9: prefix
  • RerunCollectionsScreen.test.tsx:974, 1000 — drop the round 8: prefix
  • RerunCollectionsScreen.test.tsx:364, 390 — drop (round-3 review) / , round-3 review
  • PlaybackTroubleshootingScreen.test.tsx:361 — drop (Codex race fix)
  • pageSizeCallSites.guard.test.ts:195the #685 round-3 review findingthe #685 finding

Same-class sites found in my files but OUTSIDE the ±10-line window (NOT edited)

Reported rather than edited, per the brief's hard limit. Each is the same phrase class I severed
above, so several of my files are now internally inconsistent (e.g. pageSizeScan.test.ts's header
no longer names "round 1" while three section banners below still say "round-3 MEDIUM finding").
Proposed dispositions in brackets.

  • completeAnnotationScan.ts:86 — "(the #819 round-5 finding recorded in the pageSize guard)" [SEVER → (the #819 finding …)]
  • completeAnnotationScan.ts:247 — "An earlier version threw on intersections only … Review measured that false by execution: …" [SEVER — keep the measured shapes, drop "An earlier version"/"Review measured"; this is the source-side mirror of the test comment I severed at completeAnnotationScan.test.ts:146]
  • libraryBrowse.test.ts:159 — "The reviewer proved this helper was dead code to the suite: deleting its clamp, or deleting…" [SEVER — keep the deadness proof, drop "The reviewer proved"]
  • pageSizeCallSites.guard.test.ts:68 — "an input class a text-level scanner previously got wrong" [SEVER → "gets wrong"]
  • pageSizeCallSites.guard.test.ts:792 — "An earlier version called isScannableSourceFileName on this side too … MEASURED: …" [SEVER — keep the cancellation harm and both measurements]
  • pageSizeCallSites.guard.test.ts:1130 — "the anti-vacuity expect(...) this comment used to enforce is deleted DELIBERATELY" [KEEP-carveout — a deliberate deletion plus the condition to re-add it]
  • pageSizeScan.test.ts:179, 210, 234 — section banners // ---- round-3 MEDIUM finding: … ---- [SEVER → drop round-3 MEDIUM finding: ]
  • pageSizeScan.ts:22 — "A round-3 review found the AST version still had its own … false negatives" [SEVER → "The AST version still had its own …"]
  • builder/libraryBrowse.ts:176, 187 — "the exact window earlier rounds kept losing" / "the page-ordering defect earlier rounds kept chasing one interleaving at a time" [SEVER — keep the defect class, drop "earlier rounds"]
  • pickers.test.tsx:401 — "the round-3 re-query guard keyed on query alone, which SUPPRESSED this request" [SEVER — keep the rejected keyed-on-query-alone guard and its harm]
  • pickers.test.tsx:469 — "re-asking would be the round-3 defect" [SEVER → "would be the same defect"]
  • ScheduleItemInspector.tsx:371, FillerPresetsScreen.tsx:668 — "Out-of-list injection (round-3 review F2)" [SEVER → "Out-of-list injection (#651 F2)" or drop the parenthesis]
  • SchedulesScreen.tsx:62 — "(round-3 review F3)" [SEVER, same]
  • CollectionsScreen.tsx:253 — "This screen used to keep a SECOND copy of the min-query check here — the #685 review proved…" [SEVER — keep the rejected duplicate check and its harm]
  • CollectionsScreen.tsx:287 — "(#685 — merged.slice(0, 50) used to drop up to 100 of…)" [KEEP-carveout — measured harm of a removed clamp]
  • CollectionsScreen.test.tsx:616 — "the previously-ticked row" [KEEP-false-positive — domain sequence inside one test]
  • RerunCollectionsScreen.test.tsx:623 — "The round-4 false-conflict hole: …" [SEVER — keep the hole, drop "round-4"]
  • RerunCollectionsScreen.test.tsx:787 — "so this passes pre-#651-round-7 too" [SEVER — keep why the test exists, drop the round]
  • PlaybackTroubleshootingScreen.test.tsx:385 — "it is ACCEPTED (previously discarded as a stale result)" [KEEP-carveout — states the behaviour change the test pins]
  • PlaylistsScreen.tsx:63, RerunCollectionsScreen.tsx:38 — "the truncation hint they used to carry is gone with the truncation" [KEEP-false-positive — domain statement about the current code]
  • PlexSourceScreen.test.tsx:175, libraryBrowse.test.ts:93 — "used to claim …" / "used to compile with && live" [KEEP-carveout — product-defect descriptions the tests pin]

Verification

.ts/.tsx only — no build run (comment-only edits, per the brief).

Only comment lines changed. git diff -U0 -- web/ filtered for lines not starting with
//, *, /* or {/* yields exactly five hits, all continuation lines of two JSX
{/* … */} block comments in CollectionsScreen.tsx. No added line exceeds 118 columns.

$ git diff --stat -- web/
 web/src/api/completeAnnotationScan.test.ts        |  8 ++---
 web/src/api/completeAnnotationScan.ts             |  2 +-
 web/src/api/completeAnnotations.guard.test.ts     | 35 +++++++++----------
 web/src/api/completeRequest.guard.test.ts         | 10 +++---
 web/src/api/completeRequest.ts                    |  3 +-
 web/src/api/libraryBrowse.test.ts                 |  9 +++--
 web/src/api/pageSizeCallSites.guard.test.ts       | 32 +++++++++---------
 web/src/api/pageSizeScan.test.ts                  | 30 ++++++++---------
 web/src/api/pageSizeScan.ts                       | 10 +++---
 web/src/api/selectionId.test.ts                   |  6 ++--
 web/src/api/selectionId.ts                        | 10 +++---
 web/src/builder/ChannelBuilder.test.tsx           | 16 ++++-----
 web/src/builder/libraryBrowse.ts                  | 10 +++---
 web/src/builder/rules/roundtrip.test.ts           |  2 +-
 web/src/schedules/ScheduleItemInspector.tsx       |  4 +--
 web/src/schedules/pickers.test.tsx                | 13 ++++---
 web/src/schedules/pickers.tsx                     | 26 +++++++-------
 web/src/screens/CollectionsScreen.test.tsx        |  6 ++--
 web/src/screens/CollectionsScreen.tsx             | 21 +++++-------
 web/src/screens/FillerPresetsScreen.tsx           |  4 +--
 web/src/screens/PlaybackTroubleshootingScreen.tsx |  2 +-
 web/src/screens/PlaylistsScreen.test.tsx          |  6 ++--
 web/src/screens/PlaylistsScreen.tsx               |  6 ++--
 web/src/screens/RerunCollectionsScreen.test.tsx   | 41 +++++++++++------------
 web/src/screens/RerunCollectionsScreen.tsx        | 21 ++++++------
 web/src/screens/SchedulesScreen.tsx               |  4 +--
 web/vite-plugins/trackedSourceFiles.test.ts       |  2 +-
 web/vite-plugins/trackedSourceFiles.ts            |  2 +-
 28 files changed, 166 insertions(+), 175 deletions(-)

git status --porcelain -- web/ lists exactly these 28 files, all inside the slice's 31-file set.
The three untouched slice files are LocalLibraryEditScreen.tsx,
PlaybackTroubleshootingScreen.test.tsx and PlexSourceScreen.test.tsx (all-KEEP).

Round 2 — whole-file scope, plus the 5 newly owned files

Scope: the WHOLE of all 36 owned files (31 from slice D + web/src/api/trakt.ts,
web/src/mediaSources/useDirtyGuard.ts, web/src/screens/PlayoutsScreen.tsx,
PlayoutsScreen.test.tsx, SchedulesScreen.test.tsx). Sources: my Round 1 out-of-window list,
round2_D_web.tsv, and my own whole-file re-sweep with a widened pattern set (round[ -]N,
rounds N, an earlier, the reviewer, previously, originally, used to keep/enforce/sit/…,
first fix/version, second review, in this PR, severity labels).

Skipped as duplicates (one line, as asked): round2_D_web.tsv rows 8, 11, 12, 17-20, 24, 25,
28, 33, 34, 37, 38, 41, 42 are the test titles already renamed in the title pass below, and rows
32, 35, 36, 43 were already graded in Round 1.

Test-TITLE renames (decision 1) — applied

Reference check first: nothing in scripts/, .gitea/, .husky/, web/package.json,
web/vite.config.ts or docs/ filters or names any of these titles. web/package.json's script is
a bare "test": "vitest", vite.config.ts selects by FILE glob only, and there is no -t /
--testNamePattern anywhere in the repo. Grepping each title's distinctive fragment repo-wide
returned only its own test file, every time.

13 of the 14 proposals applied, across 17 title-string lines (four titles are ' + '
concatenations spanning two lines). Each change is the only edit on its line.

file:line matched disposition reason (≤25 words) edited
pageSizeCallSites.guard.test.ts:700 round 4 SEVER (#650 follow-up round 4)(#650 follow-up). yes
ChannelBuilder.test.tsx:845, 1220, 1263, 1342 round 3 / round 4 SEVER All four → (#650 follow-up). yes
pickers.test.tsx:310, 341, 512 round 3 / round 6 SEVER Dropped the BLOCKER 3 / round 3: , round 3 HIGH: and (round 6) labels; descriptions unchanged. yes
pageSizeScan.test.ts:42, 74 round-1 SEVER not a round-1 regression pinnot a regression pin; the body comment now names the prior scanner. yes
PlaylistsScreen.test.tsx:366, 410 round 9 SEVER Dropped the round 9: prefix. yes
RerunCollectionsScreen.test.tsx:974, 1000 round 8 SEVER Dropped the round 8: prefix. yes
RerunCollectionsScreen.test.tsx:364, 390 round-3 SEVER Dropped (round-3 review) and , round-3 review; (seqRef guard) kept. yes
PlaybackTroubleshootingScreen.test.tsx:361 Codex race fix SEVER Dropped (Codex race fix); the behaviour description carries the test. yes

Proposal 14 was NOT a title — correction to Round 1. pageSizeCallSites.guard.test.ts:195 is a
REGISTRY note string (prose data, asserted only as entry.note.length > 20, never rendered in a
failure message). It is handled as a prose SEVER below instead.

Applied edits (decision 2)

file:line matched disposition reason (≤25 words) edited
completeAnnotationScan.ts:86 round-5 SEVER (the #819 round-5 finding …)(the #819 finding …). yes
completeAnnotationScan.ts:247 An earlier version / Review measured SEVER Source-side mirror of the test comment severed in Round 1: kept every measured shape and the positive-test argument. yes
libraryBrowse.test.ts:159 The reviewer proved SEVER "This helper was dead code to the suite, measured: deleting its clamp, or its gate, both left the suite green." yes
pageSizeCallSites.guard.test.ts:68 previously got SEVER "a text-level scanner previously got wrong" → "gets wrong". yes
pageSizeCallSites.guard.test.ts:109 an earlier revision of this comment SEVER Kept the false-exhaustiveness class and the fourth registry entry; dropped what an earlier revision of the comment said. yes
pageSizeCallSites.guard.test.ts:184 review proved SEVER Registry note: "the #685 second review proved the two masked each other" → "the two masked each other". yes
pageSizeCallSites.guard.test.ts:195 round-3 SEVER Registry note: "the #685 round-3 review finding" → "the #685 finding"; length assertion still satisfied. yes
pageSizeCallSites.guard.test.ts:792 An earlier version SEVER "An earlier version called … too" → "Calling … too"; both measurements (1 file, 11 files) kept. yes
pageSizeCallSites.guard.test.ts:1130 this comment used to SEVER "this comment used to enforce is deleted … per its own instruction" → "is omitted DELIBERATELY here"; the re-add condition kept. yes
pageSizeScan.test.ts:179, 210, 234 round-3 SEVER Section banners: dropped round-3 MEDIUM finding: , rule width preserved by padding the trailing dashes. yes
pageSizeScan.ts:22 round-3 SEVER "A round-3 review found the AST version still had…" → "The AST version still had…". yes
builder/libraryBrowse.ts:176 earlier rounds SEVER "the exact window earlier rounds kept losing" → "the exact window a per-interleaving fix keeps missing". yes
builder/libraryBrowse.ts:187 earlier rounds SEVER "every page-ordering defect earlier rounds kept chasing one interleaving at a time" → "…this hook had, one interleaving at a time". yes
ScheduleItemInspector.tsx:371 round-3 SEVER (round-3 review F2)(#644 follow-up F2); issue MEASURED from git log -S (commit daedf003e fix(644)), not guessed. yes
FillerPresetsScreen.tsx:668 round-3 SEVER Same finding, same commit → (#644 follow-up F2). yes
SchedulesScreen.tsx:62 round-3 SEVER (round-3 review F3)(#644 follow-up F3), matching the #644 follow-up F4 two lines above. yes
pickers.test.tsx:401 round-3 SEVER "The round-3 re-query guard keyed on query alone, which SUPPRESSED…" → "A re-query guard keyed on query alone SUPPRESSES…". yes
pickers.test.tsx:469 round-3 SEVER "would be the round-3 defect" → "would be the duplicate-request defect", the name pickers.tsx gives it. yes
CollectionsScreen.tsx:253 used to keep / review proved SEVER Rejected duplicate min-query gate kept with its measured harm (deleting either leaves the suite green). yes
ChannelBuilder.test.tsx:1382 An earlier … attempt SEVER "An earlier compare-and-set rollback attempt made this assertion fail" → "A compare-and-set rollback fails this assertion". yes
RerunCollectionsScreen.test.tsx:622 round-4 SEVER "The round-4 false-conflict hole" → "The false-conflict hole"; the force-write mechanism kept. yes
RerunCollectionsScreen.test.tsx:726 Replaces the F1 family CUT Clause names only which deleted tests this replaces; the honest-outcome finding follows it. yes
RerunCollectionsScreen.test.tsx:786 round-7 SEVER "passes pre-#651-round-7 too" → "passes with or without usableEtag's trim"; it stays a regression guard. yes
RerunCollectionsScreen.tsx:361 rounds 6 SEVER (#651 rounds 6 and 7)(#651). yes

KEEP rows (43 sites, no edit)

file:line matched disposition reason (≤25 words) edited
completeAnnotationScan.ts:30 six review rounds KEEP-carveout Re-affirmed: the round count is the empirical case against string-matching predicates. no
libraryBrowse.test.ts:93 used to compile KEEP-carveout Describes the Rock && Roll PRODUCT regression the test pins. no
pageSizeCallSites.guard.test.ts:187 first fix KEEP-carveout "Unlike the #685 first fix" warns that truncation is still possible — a live distinction, not comment history. no
pageSizeCallSites.guard.test.ts:800 four rounds KEEP-carveout "four rounds of 'restate the scope' … each defeated by something SHARED with its subject", dated (#819, 2026-08-29). no
ChannelBuilder.test.tsx:115, 118 #650 follow-up F4 / F3 KEEP-citation Finding ids naming the defect the fixture simulates. no
ChannelBuilder.test.tsx:826 Without the F3 fix KEEP-citation Names what the fix prevents; F3 is a pointer, and the mechanism is stated inline. no
pickers.tsx:320, 321 BLOCKER 2 / BLOCKER 3 KEEP-citation These point at the two BLOCKER 2:/BLOCKER 3: tests, which were NOT renamed — stripping them breaks a live cross-reference. no
pickers.test.tsx:257, 293, 385, 426, 473, 541 BLOCKER/HIGH-1/MEDIUM-5/MEDIUM-3 KEEP-fixture TITLE strings carrying only a severity label, no round. Outside decision 1's 14; rename candidates below. no
PlaylistsScreen.test.tsx:324; RerunCollectionsScreen.test.tsx:508 HIGH-2 KEEP-fixture TITLE strings; same class, rename candidates. no
SchedulesScreen.test.tsx:404, 605 review fixes / review follow-up KEEP-fixture describe TITLE strings; rename candidates. no
SchedulesScreen.test.tsx:405 F1: KEEP-fixture TITLE string; F1 is a finding id used as a defect name in SchedulesScreen.tsx too. no
SchedulesScreen.tsx:268, 269 F1 / F4 KEEP-citation The labels NAME two defect classes described inline; they are the pointer, not attribution. no
CollectionsScreen.tsx:287 used to drop KEEP-carveout merged.slice(0, 50) dropping up to 100 rows is the measured harm of the removed clamp. no
CollectionsScreen.tsx:239, 439 an earlier query KEEP-false-positive "an earlier query" is the user's previous search in the UI. no
CollectionsScreen.test.tsx:616 previously-ticked KEEP-false-positive Sequence within one test. no
PlaybackTroubleshootingScreen.test.tsx:385 previously discarded KEEP-carveout States the behaviour change the test pins (settled statuses accepted after the 200). no
PlaylistsScreen.tsx:63; RerunCollectionsScreen.tsx:38 used to carry KEEP-carveout Re-graded from Round 1's KEEP-false-positive: it is the why behind an ABSENT truncation hint. no
PlexSourceScreen.test.tsx:175 used to claim KEEP-carveout Re-affirmed: the #345 product defect the test pins. no
RerunCollectionsScreen.tsx:261 three consecutive review rounds KEEP-carveout Re-affirmed: the round count plus three cross-user lost updates is the evidence against rebuilding reconciliation. no
LocalLibraryEditScreen.tsx:56; PlaybackTroubleshootingScreen.tsx:37, 195, 479; …test.tsx:364 this/PREVIOUS session KEEP-false-positive Re-affirmed: UI edit session and playback sessions. no
trakt.ts:37 the list once KEEP-false-positive "reload the list once it goes idle" — a domain instruction. no
useDirtyGuard.ts:16 in the same pr KEEP-false-positive The pattern matched "in the same promise callback". States a rule about React render timing. no
PlayoutsScreen.tsx:111; PlayoutsScreen.test.tsx:986 used to run KEEP-fixture A displayed UI label ("The command line used to run the scripted schedule") that the test asserts on. no
rules/roundtrip.test.ts:110 first value KEEP-false-positive The LCG's first output value. no
SchedulesScreen.test.tsx:274, 300, 597 round-trips / no longer KEEP-false-positive Domain verb and a post-normalization statement. no

Round 2 counts

Comment/prose sites: SEVER 25 · CUT 1 applied; KEEP 43 (carveout 10 · citation 6 · fixture 13 · false-positive 14).
Test titles: 13 proposals applied over 17 title-string lines; 1 proposal reclassified as a registry note.

Further rename candidates (still NOT applied — outside decision 1's 14)

Titles carrying only a review SEVERITY label, no round: pickers.test.tsx:257 (BLOCKER 2: ),
:293 (BLOCKER 3: — referenced by pickers.tsx:321, so rename both together or neither),
:385 (HIGH-1: ), :426 (MEDIUM-5: ), :473/:541 (MEDIUM-3: );
PlaylistsScreen.test.tsx:324 and RerunCollectionsScreen.test.tsx:508 (HIGH-2: );
SchedulesScreen.test.tsx:404 (— review fixes (F1/F3/F4/F5)) and :605 ((#242 review follow-up)).

Round 2 verification

Every changed line in git diff -U0 -- web/ is one of: a // or * comment line (431), a JSX
block-comment continuation (4), a test-TITLE string (17), or one of the 2 REGISTRY note prose
strings. Enumerated exhaustively — the 21 added lines that are not //-prefixed are exactly those
17 + 2 + 2. No added line exceeds 118 columns.

$ git diff --stat -- web/
 web/src/api/completeAnnotationScan.test.ts         |  8 +--
 web/src/api/completeAnnotationScan.ts              | 18 +++----
 web/src/api/completeAnnotations.guard.test.ts      | 35 +++++++------
 web/src/api/completeRequest.guard.test.ts          | 10 ++--
 web/src/api/completeRequest.ts                     |  3 +-
 web/src/api/libraryBrowse.test.ts                  | 13 +++--
 web/src/api/pageSizeCallSites.guard.test.ts        | 58 ++++++++++-----------
 web/src/api/pageSizeScan.test.ts                   | 40 +++++++--------
 web/src/api/pageSizeScan.ts                        | 12 ++---
 web/src/api/selectionId.test.ts                    |  6 +--
 web/src/api/selectionId.ts                         | 10 ++--
 web/src/builder/ChannelBuilder.test.tsx            | 32 ++++++------
 web/src/builder/libraryBrowse.ts                   | 14 ++---
 web/src/builder/rules/roundtrip.test.ts            |  2 +-
 web/src/schedules/ScheduleItemInspector.tsx        |  6 +--
 web/src/schedules/pickers.test.tsx                 | 27 +++++-----
 web/src/schedules/pickers.tsx                      | 26 +++++-----
 web/src/screens/CollectionsScreen.test.tsx         |  6 +--
 web/src/screens/CollectionsScreen.tsx              | 29 +++++------
 web/src/screens/FillerPresetsScreen.tsx            |  6 +--
 .../screens/PlaybackTroubleshootingScreen.test.tsx |  2 +-
 web/src/screens/PlaybackTroubleshootingScreen.tsx  |  2 +-
 web/src/screens/PlaylistsScreen.test.tsx           | 10 ++--
 web/src/screens/PlaylistsScreen.tsx                |  6 +--
 web/src/screens/RerunCollectionsScreen.test.tsx    | 60 +++++++++++-----------
 web/src/screens/RerunCollectionsScreen.tsx         | 23 ++++-----
 web/src/screens/SchedulesScreen.tsx                |  6 +--
 web/vite-plugins/trackedSourceFiles.test.ts        |  2 +-
 web/vite-plugins/trackedSourceFiles.ts             |  2 +-
 29 files changed, 232 insertions(+), 242 deletions(-)

git status --porcelain -- web/ lists 29 files, all inside the 36-file owned set. Seven owned files
are untouched (all-KEEP): LocalLibraryEditScreen.tsx, PlexSourceScreen.test.tsx,
trakt.ts, useDirtyGuard.ts, PlayoutsScreen.tsx, PlayoutsScreen.test.tsx,
SchedulesScreen.test.tsx.

## Per-site manifest — web/ Line numbers are from the pre-edit tree (`fb5592971`); `## Round 2` rows come from the wider phrasing sweep. Rows marked as duplicates restate a round-1 site. # Manifest — slice D (`web/`), ersatztv #876 narrative sweep Worktree `/Users/timothy/ersatztv-wt-876`. 108 slice rows over 31 files; comment-only edits. Line numbers are the SLICE's (pre-edit). `edited` = yes/no. Slice-specific rule applied to test TITLE strings (`it`/`describe`/`it.each` argument): graded `KEEP-fixture`, **not renamed** — rename proposals are listed in a separate section below. | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | web/src/api/completeAnnotationScan.test.ts:146 | cold review | SEVER | Kept the measurement and the rejected narrower guard (throws on intersections alone); dropped "by cold review" and the earlier comment's wording. | yes | | web/src/api/completeAnnotationScan.ts:30 | review round | KEEP-carveout | "Withdrawn guard (six review rounds, then deleted)" is the empirical case against string-matching predicates; the round count IS the evidence. | no | | web/src/api/completeAnnotationScan.ts:217 | Cold review | SEVER | Kept the rejected unconstrained form and its harm (a `declare module` block silently overwrites a schema); dropped the attribution. | yes | | web/src/api/completeAnnotations.guard.test.ts:109 | Cold review pointed | SEVER | Restated as the standing reason: CREATE would be permissive while the note says annotating breaks semantics. | yes | | web/src/api/completeAnnotations.guard.test.ts:239 | Cold review | SEVER | Bypass (strip `Complete<>` off the wrapper, retype the test fixture) fully kept; only "Cold review demonstrated" removed. | yes | | web/src/api/completeAnnotations.guard.test.ts:245 | cold review | SEVER | The `.test.`-only form is false; the dated measurement ("measured on 4.1.9") stays on the next line. | yes | | web/src/api/completeAnnotations.guard.test.ts:250 | earlier version of this | SEVER | Kept the rejected universal claim ("all of the spellings vitest accepts") as a bound; dropped "an earlier version of this comment". | yes | | web/src/api/completeAnnotations.guard.test.ts:381 | cold review | SEVER | Measurement (65 of 257 files dropped, pins and floor green) kept; attribution replaced by "a measured narrowing". | yes | | web/src/api/completeAnnotations.guard.test.ts:401 | cold review showed | SEVER | Selective-narrowing finding kept verbatim; only "cold review showed that" removed. | yes | | web/src/api/completeAnnotations.guard.test.ts:437 | cold review | SEVER | "a false green cold review demonstrated" → "a demonstrated false green"; the shadowing hazard is untouched. | yes | | web/src/api/completeRequest.guard.test.ts:101 | earlier version of this | SEVER | Rewritten as a standing prohibition: pinning a REQUIRED member costs the proof its discriminating case, and the "no optional member" reasoning is false. | yes | | web/src/api/completeRequest.ts:53 | earlier draft | CUT | Clause said only that an earlier draft's count was wrong; the durable reason ("not a derived population") stays. | yes | | web/src/api/libraryBrowse.test.ts:72 | The previous version of this | SEVER | Kept the rejected approach (hand-copied sample), the omitted `&`/`|`, and the general trap; dropped "The previous version of this test". | yes | | web/src/api/pageSizeCallSites.guard.test.ts:41 | after review | KEEP-false-positive | "lands after review and after the merge gate" states WHEN breakage surfaces — a structural property, not attribution. | no | | web/src/api/pageSizeCallSites.guard.test.ts:471 | round 4 | SEVER | Dropped " round 4" from `(#650 follow-up round 4)`; the rejected plant-a-file verification and why it pins nothing are untouched. | yes | | web/src/api/pageSizeCallSites.guard.test.ts:484 | round 3 | SEVER | `(#650 follow-up round 3 MEDIUM finding)` → `(#650 follow-up)`; issue pointer kept, review chronology dropped. | yes | | web/src/api/pageSizeCallSites.guard.test.ts:680 | the review asked | SEVER | Kept the snapshot boundary (`b90f8a3b`, these 4 prove nothing) and the pointer to the fixture test; dropped "where the review asked for it" and "this round's". | yes | | web/src/api/pageSizeCallSites.guard.test.ts:700 | round 4 | KEEP-fixture | Inside the `it.each` TITLE string (displayed test output). Rename proposed below, not applied. | no | | web/src/api/pageSizeCallSites.guard.test.ts:957 | round 6 | SEVER | `(#819 round 6)` → `(#819)`; the "not derived from `tracked` on both sides" finding is untouched. | yes | | web/src/api/pageSizeScan.test.ts:14 | round 1 | SEVER | Prior scanner renamed to its durable identifier `b90f8a3b`; "a round-3 review found" dropped. Which fixtures are contract vs regression pins is kept in full. | yes | | web/src/api/pageSizeScan.test.ts:16 | round 1 | SEVER | Same paragraph: "round 1's OWN heuristics" → "its OWN heuristics". | yes | | web/src/api/pageSizeScan.test.ts:18 | round 1 | SEVER | Same paragraph: "fail against round 1" → "fail against `b90f8a3b`"; the verified fixture list is unchanged. | yes | | web/src/api/pageSizeScan.test.ts:22 | round 1 | SEVER | Same paragraph: "fails round 1 for several of those reasons" → "fails it …". | yes | | web/src/api/pageSizeScan.test.ts:43 | round 1 | SEVER | Body comment: "round 1's unconditional literal regex" → "the prior scanner's"; the contract-vs-regression distinction is kept. | yes | | web/src/api/pageSizeScan.test.ts:48 | round 1 | SEVER | Same comment: "round 1's comment-stripping step" → "the prior scanner's comment-stripping step". | yes | | web/src/api/pageSizeScan.test.ts:75 | round 1 | SEVER | Body comment: "round 1's literal-form regex" → "the prior scanner's"; "not a round-1 regression" → "not a regression against it". | yes | | web/src/api/pageSizeScan.ts:10 | after a review | SEVER | "replaced after a review found it defeated by" → "replaced because it was defeated by"; the defeating input classes are untouched. | yes | | web/src/api/pageSizeScan.ts:53 | round 3 | SEVER | `(#650 follow-up round 3 MEDIUM finding)` → `(#650 follow-up)`. | yes | | web/src/api/pageSizeScan.ts:60 | round 3 | SEVER | `(#650 follow-up round 3 MEDIUM)` → `(#650 follow-up)`. | yes | | web/src/api/pageSizeScan.ts:79 | round 3 | SEVER | `(#650 follow-up round 3 MEDIUM)` → `(#650 follow-up)`. | yes | | web/src/api/selectionId.test.ts:5 | round 8 | SEVER | `(#651 round 8)` → `(#651)`; relative time "until now it was only exercised indirectly" → "screen tests exercise it only indirectly". | yes | | web/src/api/selectionId.ts:6 | round 7 | SEVER | Rewritten as the standing boundary argument: putting the check at the search picker leaves two doors open. Rejection and harm kept, rounds dropped. | yes | | web/src/api/selectionId.ts:9 | round 8 | SEVER | Same block: "(round 8)" → "(#651)". | yes | | web/src/builder/ChannelBuilder.test.tsx:731 | first attempt | KEEP-false-positive | "the first attempt fails" is the test's own retry scenario, not a session round. | no | | web/src/builder/ChannelBuilder.test.tsx:845 | round 3 | KEEP-fixture | Inside the `it` TITLE string. Rename proposed below, not applied. | no | | web/src/builder/ChannelBuilder.test.tsx:847 | Round 1 | SEVER | Kept the mirror-image race and why single-flight replaces it; "Round 1 fixed…/Round 3's review found…" → "A narrower fix … leaves". | yes | | web/src/builder/ChannelBuilder.test.tsx:1220 | round 3 | KEEP-fixture | TITLE string. | no | | web/src/builder/ChannelBuilder.test.tsx:1263 | round 4 | KEEP-fixture | TITLE string. | no | | web/src/builder/ChannelBuilder.test.tsx:1342 | round 3 | KEEP-fixture | TITLE string. | no | | web/src/builder/libraryBrowse.ts:85 | review round | SEVER | Kept the rejected one-interleaving-at-a-time approach and why single-flight replaces it; dropped "review round 3", "rounds 1-2", "the reviewer". | yes | | web/src/builder/rules/roundtrip.test.ts:106 | review round | SEVER | `#578 / #651 review round 2:` → `#578 / #651:`; the LCG derivation and why a recomputed divisor proves nothing are untouched. | yes | | web/src/schedules/ScheduleItemInspector.tsx:440 | round 4 | SEVER | `(#651 round 4 HIGH-1)` → `(#651)`; the cross-namespace harm stays. | yes | | web/src/schedules/pickers.test.tsx:441 | The original version of this | SEVER | Kept the trap (pressing Escape cancels the timer that exposes the storm) and the storm mechanism; dropped "The original version of this test". | yes | | web/src/schedules/pickers.test.tsx:310 | round 3 | KEEP-fixture | TITLE string ("BLOCKER 3 / round 3: …"). Rename proposed below. | no | | web/src/schedules/pickers.test.tsx:341 | round 3 | KEEP-fixture | TITLE string ("round 3 HIGH: …"). Rename proposed below. | no | | web/src/schedules/pickers.test.tsx:376 | review round | SEVER | Section banner comment: `#651 review round 4:` → `#651:`. | yes | | web/src/schedules/pickers.test.tsx:507 | round 7 | SEVER | `(#651 round 7)` → `(#651)`; the int32-binding harm stays. | yes | | web/src/schedules/pickers.test.tsx:512 | round 6 | KEEP-fixture | TITLE string ("MEDIUM-3 (round 6): …"). Rename proposed below. | no | | web/src/schedules/pickers.test.tsx:529 | round 7 | SEVER | `(#651 round 7)` → `(#651)`. | yes | | web/src/schedules/pickers.tsx:46 | round 6 | SEVER | `(#651 round 6)` → `(#651)`; the container-vs-contents finding is untouched. | yes | | web/src/schedules/pickers.tsx:49 | round 8 | SEVER | `(#651 round 8)` → `(#651)`. | yes | | web/src/schedules/pickers.tsx:78 | round 4 | SEVER | `(#651 round 4 HIGH-1)` → `(#651)`. | yes | | web/src/schedules/pickers.tsx:83 | round 4 | SEVER | `(#651 round 4 MEDIUM-5)` → `(#651)`. | yes | | web/src/schedules/pickers.tsx:93 | round 5 | SEVER | `(#651 round 5 MEDIUM-2: …)` → `(#651: …)`; the request-storm harm inside the parenthesis is kept. | yes | | web/src/schedules/pickers.tsx:115 | round 3 | SEVER | `(#651 round 3, MEDIUM)` → `(#651)`. | yes | | web/src/schedules/pickers.tsx:121 | round 5 | SEVER | `(#651 round 5 MEDIUM-2)` → `(#651)`. | yes | | web/src/schedules/pickers.tsx:143 | round 5 | SEVER | `(#651 round 5 MEDIUM-3)` → `(#651)`. | yes | | web/src/schedules/pickers.tsx:157 | round 5 | SEVER | `(#651 round 5 MEDIUM-3, round 6)` → `(#651)`. | yes | | web/src/schedules/pickers.tsx:194 | round 2 | SEVER | `(#651 round 2 BLOCKER 2, round 4 HIGH-1)` → `(#651)`. | yes | | web/src/schedules/pickers.tsx:199 | round 7 | SEVER | `(#651 round 7)` → `(#651)`. | yes | | web/src/schedules/pickers.tsx:212 | review round | SEVER | `(#651 review round 3, HIGH)` → `(#651)`; the one-gate-per-commit-path rationale is untouched. | yes | | web/src/schedules/pickers.tsx:236 | review round | SEVER | `(#651 review round 2, BLOCKER 3)` → `(#651)`. | yes | | web/src/screens/CollectionsScreen.test.tsx:648 | review round | SEVER | Kept the conflation finding in the parenthesis; `(#685 review round 3 — …)` → `(#685 — …)`. | yes | | web/src/screens/CollectionsScreen.test.tsx:655 | review round | SEVER | `(#685 review round 4)` → `(#685)`. | yes | | web/src/screens/CollectionsScreen.tsx:84 | review round | SEVER | Kept "one of two ingress paths was enforced, which is not an invariant"; dropped "review round 3". | yes | | web/src/screens/CollectionsScreen.tsx:90 | review round | SEVER | `(#685 review round 4)` → `(#685)`. | yes | | web/src/screens/CollectionsScreen.tsx:432 | review round | CUT | "review round 4 flagged the divergence as unexplained" says only that a review asked; the explanation it asked for is the whole comment. | yes | | web/src/screens/CollectionsScreen.tsx:448 | review round | SEVER | `(#685 review round 3)` → `(#685)`; the live-region trap is untouched. | yes | | web/src/screens/CollectionsScreen.tsx:466 | review round | SEVER | `(#685 review round 4)` → `(#685)`. | yes | | web/src/screens/FillerPresetsScreen.tsx:222 | round 8 | SEVER | `(#651 round 8)` → `(#651)`. | yes | | web/src/screens/FillerPresetsScreen.tsx:857 | review round | SEVER | `#651 review round 3.` → `#651.`; the "add the guard WITH the test that reaches it" rule is untouched. | yes | | web/src/screens/LocalLibraryEditScreen.tsx:56 | this session | KEEP-false-positive | "added in this session" = the user's unsaved edit session in the UI, not an authoring session. | no | | web/src/screens/PlaybackTroubleshootingScreen.test.tsx:364 | THIS session | KEEP-false-positive | "THIS session" = a playback session (statusStore.Reset). | no | | web/src/screens/PlaybackTroubleshootingScreen.tsx:37 | the PREVIOUS session | KEEP-false-positive | Playback session, not an authoring session. | no | | web/src/screens/PlaybackTroubleshootingScreen.tsx:195 | the PREVIOUS session | KEEP-false-positive | Playback session. | no | | web/src/screens/PlaybackTroubleshootingScreen.tsx:479 | THIS session | KEEP-false-positive | Playback session. | no | | web/src/screens/PlaylistsScreen.test.tsx:327 | round 4 | SEVER | `(#651 round 4 HIGH-2)` → `(#651)`. | yes | | web/src/screens/PlaylistsScreen.test.tsx:361 | round 9 | SEVER | Section banner comment: `#651 round 9:` → `#651:`. | yes | | web/src/screens/PlaylistsScreen.test.tsx:366 | round 9 | KEEP-fixture | TITLE string. Rename proposed below. | no | | web/src/screens/PlaylistsScreen.test.tsx:410 | round 9 | KEEP-fixture | TITLE string. Rename proposed below. | no | | web/src/screens/PlaylistsScreen.tsx:241 | round 9 | SEVER | `(#651 round 9)` → `(#651)`; the contradictory-label finding is untouched. | yes | | web/src/screens/PlaylistsScreen.tsx:368 | round 9 | SEVER | `(#651 round 9)` → `(#651)`. | yes | | web/src/screens/PlaylistsScreen.tsx:428 | round 4 | SEVER | `(#651 round 4 HIGH-2)` → `(#651)`. | yes | | web/src/screens/PlexSourceScreen.test.tsx:175 | used to claim | KEEP-carveout | Describes the #345 PRODUCT defect this test pins (unremovable stored authorization), not a doc's earlier draft. | no | | web/src/screens/RerunCollectionsScreen.test.tsx:6 | round 6 | SEVER | `(#651 round 6)` → `(#651)`, and relative "now"; the fixture trap (a mock without an ETag exercises a force-write path) is kept. | yes | | web/src/screens/RerunCollectionsScreen.test.tsx:483 | round 3 | SEVER | `(#651 round 3 HIGH, round 5 redesign)` → `(#651)`; "prevented structurally rather than by a merge rule" kept. | yes | | web/src/screens/RerunCollectionsScreen.test.tsx:513 | round 4 | SEVER | `(#651 round 4 HIGH-2)` → `(#651)`. | yes | | web/src/screens/RerunCollectionsScreen.test.tsx:554 | review round | SEVER | Banner `#651 review round 5:` → `#651:`. | yes | | web/src/screens/RerunCollectionsScreen.test.tsx:558 | round 5 | SEVER | "Rounds 2-4 each produced a HIGH finding …; round 5 removed the race" → "Every version … produced a HIGH finding, so the race is removed rather than refereed". | yes | | web/src/screens/RerunCollectionsScreen.test.tsx:660 | round 3 | SEVER | Kept both mutation-sensitivity halves and the #671 shape; dropped "Replaces the deleted …", "the previous version had neither", "that round 3 showed". | yes | | web/src/screens/RerunCollectionsScreen.test.tsx:751 | round 7 | SEVER | `(#651 round 7 HIGH)` → `(#651)`; the empty-ETag force-write harm is untouched. | yes | | web/src/screens/RerunCollectionsScreen.test.tsx:866 | round 7 | SEVER | `(#651 round 7)` → `(#651)`. | yes | | web/src/screens/RerunCollectionsScreen.test.tsx:914 | round 6 | SEVER | "not a round-6 defect: round 6's race guard" → "not the race alone: the race guard"; what the test actually fails is unchanged. | yes | | web/src/screens/RerunCollectionsScreen.test.tsx:965 | round 8 | SEVER | Banner `#651 round 8:` → `#651:`. | yes | | web/src/screens/RerunCollectionsScreen.test.tsx:967 | Round 7 | SEVER | "Round 7 put the predicate inside …" → "Putting the predicate inside … leaves the two other doors open". | yes | | web/src/screens/RerunCollectionsScreen.test.tsx:974 | round 8 | KEEP-fixture | TITLE string. Rename proposed below. | no | | web/src/screens/RerunCollectionsScreen.test.tsx:1000 | round 8 | KEEP-fixture | TITLE string. Rename proposed below. | no | | web/src/screens/RerunCollectionsScreen.tsx:112 | round 8 | SEVER | `(#651 round 8 — the boundary, not the site)` → `(#651 — the boundary, not the site)`. | yes | | web/src/screens/RerunCollectionsScreen.tsx:239 | round 7 | SEVER | `(#651 round 7 HIGH)` → `(#651)`. | yes | | web/src/screens/RerunCollectionsScreen.tsx:259 | review round | SEVER | `NOTE (#651 review round 5):` → `NOTE (#651):`; the no-reconciliation-machinery prohibition is untouched. | yes | | web/src/screens/RerunCollectionsScreen.tsx:262 | review round | KEEP-carveout | "a HIGH finding in three consecutive review rounds, including three cross-user lost updates" IS the tested-and-rejected evidence against rebuilding reconciliation. | no | | web/src/screens/RerunCollectionsScreen.tsx:303 | round 4 | SEVER | `(#651 round 4 HIGH-2)` → `(#651)`. | yes | | web/src/screens/RerunCollectionsScreen.tsx:336 | round 7 | SEVER | `(#651 round 7)` → `(#651)`. | yes | | web/src/screens/RerunCollectionsScreen.tsx:469 | round 6 | SEVER | `(#651 round 6)` → `(#651)`. | yes | | web/src/screens/RerunCollectionsScreen.tsx:551 | round 4 | SEVER | `(#651 round 4 MEDIUM-4, now structural rather than guarded)` → `(#651 — structural rather than guarded)`. | yes | | web/src/screens/SchedulesScreen.tsx:430 | Codex review | SEVER | `(Codex review, PR #242)` → `(PR #242)` — the brief's own example: keep the number, drop the attribution. | yes | | web/vite-plugins/trackedSourceFiles.test.ts:45 | round 6 | SEVER | `#819 round 6:` → `#819:`; the cancellation argument is untouched. | yes | | web/vite-plugins/trackedSourceFiles.ts:55 | round 6 | SEVER | `(#819 round 6)` → `(#819)`. | yes | ## Adjacent rows (found inside the ±10-line window of a slice site) | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | web/src/api/completeAnnotations.guard.test.ts:406 (adjacent to 401) | the round-5 `.spec.ts` bypass | SEVER | "round-5" dropped; the bypass is described in `isProductionSource` above. | yes | | web/src/api/completeAnnotations.guard.test.ts:29-37 (adjacent to 41) | This guard was BORN RED … #676's merge | KEEP-carveout | Rejected line:column identity kept with the concrete incident that killed it, including the "#676 is not the cause" warning. | no | | web/src/api/completeRequest.ts:58 (adjacent to 53) | a reviewer can see | KEEP-false-positive | "a reviewer" is a generic role in a domain sentence, not session attribution. | no | | web/src/api/pageSizeCallSites.guard.test.ts:54 (adjacent to 41) | a reviewer conditioned to re-pin line numbers | KEEP-false-positive | Generic role, describing why the old identity caught the substitution case only incidentally. | no | | web/src/api/pageSizeCallSites.guard.test.ts:461 (adjacent to 471) | the #819 round-5 fix | SEVER | "round-5" dropped; the cancels-on-both-sides reason and the 15-file measurement are untouched. | yes | | web/src/api/pageSizeCallSites.guard.test.ts:703 (adjacent to 700) | A prior verification planted | SEVER | Restated timelessly ("Planting a REAL .mts file … proves … but pins nothing"); the rejected verification and its reason are kept. | yes | | web/src/api/pageSizeCallSites.guard.test.ts:948 (adjacent to 957) | used to sit side by side here / One assertion now | SEVER | Trap kept ("duplicate guards mask each other"); the file's own history and relative "now" dropped. | yes | | web/src/screens/CollectionsScreen.tsx:440 (adjacent to 432/448) | (#685 review) | SEVER | → `(#685)`. | yes | | web/src/screens/CollectionsScreen.tsx:457 (adjacent to 448) | (#685 review finding 1) | SEVER | → `(#685)`; the measured harm (rows wiped while `selected` still held them) is kept. | yes | | web/src/screens/CollectionsScreen.tsx:459 (adjacent to 466) | (#685 second review) | SEVER | → `(#685)`. | yes | | web/src/screens/PlaybackTroubleshootingScreen.tsx:476 (adjacent to 479) | (Codex MAJOR) | SEVER | Attribution with no issue/PR number; the fast-completion race description is untouched. | yes | | web/src/screens/PlaylistsScreen.test.tsx:412 (adjacent to 410) | which the round-8 sweep missed | SEVER | Clause named only when it was found; "the same class, on the same screen" carries the finding. | yes | | web/src/screens/RerunCollectionsScreen.test.tsx:556 (adjacent to 554/558) | Every reconciliation test above was deleted with the machinery it exercised | CUT | Only content is the file's own edit history; "there is nothing to reconcile" follows two sentences later. | yes | | web/src/screens/SchedulesScreen.tsx:433 (adjacent to 430) | (Codex re-review, PR #242) | SEVER | → `(PR #242)`, same rule as line 430. | yes | ## Disposition counts Slice rows (108): **SEVER 84 · CUT 2 · KEEP-carveout 3 · KEEP-fixture 12 · KEEP-false-positive 7** Adjacent rows (14): **SEVER 10 · CUT 1 · KEEP-carveout 1 · KEEP-false-positive 2** ## Test-TITLE rename proposals (NOT applied — parent decides) Titles are displayed test output, so per the dispatch they were left alone. None is *purely* chronological; each would only lose a round/severity prefix or suffix. - `pageSizeCallSites.guard.test.ts:700` — drop ` round 4` from `(#650 follow-up round 4)` - `ChannelBuilder.test.tsx:845, 1220, 1342` — drop ` round 3`; `:1263` — drop ` round 4` - `pickers.test.tsx:310` — drop the `BLOCKER 3 / round 3: ` prefix; `:341` — drop `round 3 HIGH: `; `:512` — drop ` (round 6)` - `pageSizeScan.test.ts:42, 74` — `not a round-1 regression pin` → `not a regression pin against the prior scanner` - `PlaylistsScreen.test.tsx:366, 410` — drop the `round 9: ` prefix - `RerunCollectionsScreen.test.tsx:974, 1000` — drop the `round 8: ` prefix - `RerunCollectionsScreen.test.tsx:364, 390` — drop ` (round-3 review)` / `, round-3 review` - `PlaybackTroubleshootingScreen.test.tsx:361` — drop ` (Codex race fix)` - `pageSizeCallSites.guard.test.ts:195` — `the #685 round-3 review finding` → `the #685 finding` ## Same-class sites found in my files but OUTSIDE the ±10-line window (NOT edited) Reported rather than edited, per the brief's hard limit. Each is the same phrase class I severed above, so several of my files are now internally inconsistent (e.g. `pageSizeScan.test.ts`'s header no longer names "round 1" while three section banners below still say "round-3 MEDIUM finding"). Proposed dispositions in brackets. - `completeAnnotationScan.ts:86` — "(the #819 round-5 finding recorded in the pageSize guard)" [SEVER → `(the #819 finding …)`] - `completeAnnotationScan.ts:247` — "An earlier version threw on intersections only … Review measured that false by execution: …" [SEVER — keep the measured shapes, drop "An earlier version"/"Review measured"; this is the source-side mirror of the test comment I severed at `completeAnnotationScan.test.ts:146`] - `libraryBrowse.test.ts:159` — "The reviewer proved this helper was dead code to the suite: deleting its clamp, or deleting…" [SEVER — keep the deadness proof, drop "The reviewer proved"] - `pageSizeCallSites.guard.test.ts:68` — "an input class a text-level scanner previously got wrong" [SEVER → "gets wrong"] - `pageSizeCallSites.guard.test.ts:792` — "An earlier version called `isScannableSourceFileName` on this side too … MEASURED: …" [SEVER — keep the cancellation harm and both measurements] - `pageSizeCallSites.guard.test.ts:1130` — "the anti-vacuity `expect(...)` this comment used to enforce is deleted DELIBERATELY" [KEEP-carveout — a deliberate deletion plus the condition to re-add it] - `pageSizeScan.test.ts:179, 210, 234` — section banners `// ---- round-3 MEDIUM finding: … ----` [SEVER → drop `round-3 MEDIUM finding: `] - `pageSizeScan.ts:22` — "A round-3 review found the AST version still had its own … false negatives" [SEVER → "The AST version still had its own …"] - `builder/libraryBrowse.ts:176, 187` — "the exact window earlier rounds kept losing" / "the page-ordering defect earlier rounds kept chasing one interleaving at a time" [SEVER — keep the defect class, drop "earlier rounds"] - `pickers.test.tsx:401` — "the round-3 re-query guard keyed on query alone, which SUPPRESSED this request" [SEVER — keep the rejected keyed-on-query-alone guard and its harm] - `pickers.test.tsx:469` — "re-asking would be the round-3 defect" [SEVER → "would be the same defect"] - `ScheduleItemInspector.tsx:371`, `FillerPresetsScreen.tsx:668` — "Out-of-list injection (round-3 review F2)" [SEVER → "Out-of-list injection (#651 F2)" or drop the parenthesis] - `SchedulesScreen.tsx:62` — "(round-3 review F3)" [SEVER, same] - `CollectionsScreen.tsx:253` — "This screen used to keep a SECOND copy of the min-query check here — the #685 review proved…" [SEVER — keep the rejected duplicate check and its harm] - `CollectionsScreen.tsx:287` — "(#685 — merged.slice(0, 50) used to drop up to 100 of…)" [KEEP-carveout — measured harm of a removed clamp] - `CollectionsScreen.test.tsx:616` — "the previously-ticked row" [KEEP-false-positive — domain sequence inside one test] - `RerunCollectionsScreen.test.tsx:623` — "The round-4 false-conflict hole: …" [SEVER — keep the hole, drop "round-4"] - `RerunCollectionsScreen.test.tsx:787` — "so this passes pre-#651-round-7 too" [SEVER — keep why the test exists, drop the round] - `PlaybackTroubleshootingScreen.test.tsx:385` — "it is ACCEPTED (previously discarded as a stale result)" [KEEP-carveout — states the behaviour change the test pins] - `PlaylistsScreen.tsx:63`, `RerunCollectionsScreen.tsx:38` — "the truncation hint they used to carry is gone with the truncation" [KEEP-false-positive — domain statement about the current code] - `PlexSourceScreen.test.tsx:175`, `libraryBrowse.test.ts:93` — "used to claim …" / "used to compile with `&&` live" [KEEP-carveout — product-defect descriptions the tests pin] ## Verification `.ts`/`.tsx` only — no build run (comment-only edits, per the brief). Only comment lines changed. `git diff -U0 -- web/` filtered for lines not starting with `//`, `*`, `/*` or `{/*` yields exactly five hits, all continuation lines of two JSX `{/* … */}` block comments in `CollectionsScreen.tsx`. No added line exceeds 118 columns. ``` $ git diff --stat -- web/ web/src/api/completeAnnotationScan.test.ts | 8 ++--- web/src/api/completeAnnotationScan.ts | 2 +- web/src/api/completeAnnotations.guard.test.ts | 35 +++++++++---------- web/src/api/completeRequest.guard.test.ts | 10 +++--- web/src/api/completeRequest.ts | 3 +- web/src/api/libraryBrowse.test.ts | 9 +++-- web/src/api/pageSizeCallSites.guard.test.ts | 32 +++++++++--------- web/src/api/pageSizeScan.test.ts | 30 ++++++++--------- web/src/api/pageSizeScan.ts | 10 +++--- web/src/api/selectionId.test.ts | 6 ++-- web/src/api/selectionId.ts | 10 +++--- web/src/builder/ChannelBuilder.test.tsx | 16 ++++----- web/src/builder/libraryBrowse.ts | 10 +++--- web/src/builder/rules/roundtrip.test.ts | 2 +- web/src/schedules/ScheduleItemInspector.tsx | 4 +-- web/src/schedules/pickers.test.tsx | 13 ++++--- web/src/schedules/pickers.tsx | 26 +++++++------- web/src/screens/CollectionsScreen.test.tsx | 6 ++-- web/src/screens/CollectionsScreen.tsx | 21 +++++------- web/src/screens/FillerPresetsScreen.tsx | 4 +-- web/src/screens/PlaybackTroubleshootingScreen.tsx | 2 +- web/src/screens/PlaylistsScreen.test.tsx | 6 ++-- web/src/screens/PlaylistsScreen.tsx | 6 ++-- web/src/screens/RerunCollectionsScreen.test.tsx | 41 +++++++++++------------ web/src/screens/RerunCollectionsScreen.tsx | 21 ++++++------ web/src/screens/SchedulesScreen.tsx | 4 +-- web/vite-plugins/trackedSourceFiles.test.ts | 2 +- web/vite-plugins/trackedSourceFiles.ts | 2 +- 28 files changed, 166 insertions(+), 175 deletions(-) ``` `git status --porcelain -- web/` lists exactly these 28 files, all inside the slice's 31-file set. The three untouched slice files are `LocalLibraryEditScreen.tsx`, `PlaybackTroubleshootingScreen.test.tsx` and `PlexSourceScreen.test.tsx` (all-KEEP). ## Round 2 — whole-file scope, plus the 5 newly owned files Scope: the WHOLE of all 36 owned files (31 from slice D + `web/src/api/trakt.ts`, `web/src/mediaSources/useDirtyGuard.ts`, `web/src/screens/PlayoutsScreen.tsx`, `PlayoutsScreen.test.tsx`, `SchedulesScreen.test.tsx`). Sources: my Round 1 out-of-window list, `round2_D_web.tsv`, and my own whole-file re-sweep with a widened pattern set (`round[ -]N`, `rounds N`, `an earlier`, `the reviewer`, `previously`, `originally`, `used to keep/enforce/sit/…`, `first fix/version`, `second review`, `in this PR`, severity labels). **Skipped as duplicates** (one line, as asked): `round2_D_web.tsv` rows 8, 11, 12, 17-20, 24, 25, 28, 33, 34, 37, 38, 41, 42 are the test titles already renamed in the title pass below, and rows 32, 35, 36, 43 were already graded in Round 1. ### Test-TITLE renames (decision 1) — applied Reference check first: nothing in `scripts/`, `.gitea/`, `.husky/`, `web/package.json`, `web/vite.config.ts` or `docs/` filters or names any of these titles. `web/package.json`'s script is a bare `"test": "vitest"`, `vite.config.ts` selects by FILE glob only, and there is no `-t` / `--testNamePattern` anywhere in the repo. Grepping each title's distinctive fragment repo-wide returned only its own test file, every time. **13 of the 14 proposals applied, across 17 title-string lines** (four titles are `' + '` concatenations spanning two lines). Each change is the only edit on its line. | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | pageSizeCallSites.guard.test.ts:700 | round 4 | SEVER | `(#650 follow-up round 4)` → `(#650 follow-up)`. | yes | | ChannelBuilder.test.tsx:845, 1220, 1263, 1342 | round 3 / round 4 | SEVER | All four → `(#650 follow-up)`. | yes | | pickers.test.tsx:310, 341, 512 | round 3 / round 6 | SEVER | Dropped the `BLOCKER 3 / round 3: `, `round 3 HIGH: ` and ` (round 6)` labels; descriptions unchanged. | yes | | pageSizeScan.test.ts:42, 74 | round-1 | SEVER | `not a round-1 regression pin` → `not a regression pin`; the body comment now names the prior scanner. | yes | | PlaylistsScreen.test.tsx:366, 410 | round 9 | SEVER | Dropped the `round 9: ` prefix. | yes | | RerunCollectionsScreen.test.tsx:974, 1000 | round 8 | SEVER | Dropped the `round 8: ` prefix. | yes | | RerunCollectionsScreen.test.tsx:364, 390 | round-3 | SEVER | Dropped ` (round-3 review)` and `, round-3 review`; `(seqRef guard)` kept. | yes | | PlaybackTroubleshootingScreen.test.tsx:361 | Codex race fix | SEVER | Dropped ` (Codex race fix)`; the behaviour description carries the test. | yes | **Proposal 14 was NOT a title — correction to Round 1.** `pageSizeCallSites.guard.test.ts:195` is a REGISTRY `note` string (prose data, asserted only as `entry.note.length > 20`, never rendered in a failure message). It is handled as a prose SEVER below instead. ### Applied edits (decision 2) | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | completeAnnotationScan.ts:86 | round-5 | SEVER | `(the #819 round-5 finding …)` → `(the #819 finding …)`. | yes | | completeAnnotationScan.ts:247 | An earlier version / Review measured | SEVER | Source-side mirror of the test comment severed in Round 1: kept every measured shape and the positive-test argument. | yes | | libraryBrowse.test.ts:159 | The reviewer proved | SEVER | "This helper was dead code to the suite, measured: deleting its clamp, or its gate, both left the suite green." | yes | | pageSizeCallSites.guard.test.ts:68 | previously got | SEVER | "a text-level scanner previously got wrong" → "gets wrong". | yes | | pageSizeCallSites.guard.test.ts:109 | an earlier revision of this comment | SEVER | Kept the false-exhaustiveness class and the fourth registry entry; dropped what an earlier revision of the comment said. | yes | | pageSizeCallSites.guard.test.ts:184 | review proved | SEVER | Registry note: "the #685 second review proved the two masked each other" → "the two masked each other". | yes | | pageSizeCallSites.guard.test.ts:195 | round-3 | SEVER | Registry note: "the #685 round-3 review finding" → "the #685 finding"; length assertion still satisfied. | yes | | pageSizeCallSites.guard.test.ts:792 | An earlier version | SEVER | "An earlier version called … too" → "Calling … too"; both measurements (1 file, 11 files) kept. | yes | | pageSizeCallSites.guard.test.ts:1130 | this comment used to | SEVER | "this comment used to enforce is deleted … per its own instruction" → "is omitted DELIBERATELY here"; the re-add condition kept. | yes | | pageSizeScan.test.ts:179, 210, 234 | round-3 | SEVER | Section banners: dropped `round-3 MEDIUM finding: `, rule width preserved by padding the trailing dashes. | yes | | pageSizeScan.ts:22 | round-3 | SEVER | "A round-3 review found the AST version still had…" → "The AST version still had…". | yes | | builder/libraryBrowse.ts:176 | earlier rounds | SEVER | "the exact window earlier rounds kept losing" → "the exact window a per-interleaving fix keeps missing". | yes | | builder/libraryBrowse.ts:187 | earlier rounds | SEVER | "every page-ordering defect earlier rounds kept chasing one interleaving at a time" → "…this hook had, one interleaving at a time". | yes | | ScheduleItemInspector.tsx:371 | round-3 | SEVER | `(round-3 review F2)` → `(#644 follow-up F2)`; issue MEASURED from `git log -S` (commit daedf003e `fix(644)`), not guessed. | yes | | FillerPresetsScreen.tsx:668 | round-3 | SEVER | Same finding, same commit → `(#644 follow-up F2)`. | yes | | SchedulesScreen.tsx:62 | round-3 | SEVER | `(round-3 review F3)` → `(#644 follow-up F3)`, matching the `#644 follow-up F4` two lines above. | yes | | pickers.test.tsx:401 | round-3 | SEVER | "The round-3 re-query guard keyed on query alone, which SUPPRESSED…" → "A re-query guard keyed on query alone SUPPRESSES…". | yes | | pickers.test.tsx:469 | round-3 | SEVER | "would be the round-3 defect" → "would be the duplicate-request defect", the name `pickers.tsx` gives it. | yes | | CollectionsScreen.tsx:253 | used to keep / review proved | SEVER | Rejected duplicate min-query gate kept with its measured harm (deleting either leaves the suite green). | yes | | ChannelBuilder.test.tsx:1382 | An earlier … attempt | SEVER | "An earlier compare-and-set rollback attempt made this assertion fail" → "A compare-and-set rollback fails this assertion". | yes | | RerunCollectionsScreen.test.tsx:622 | round-4 | SEVER | "The round-4 false-conflict hole" → "The false-conflict hole"; the force-write mechanism kept. | yes | | RerunCollectionsScreen.test.tsx:726 | Replaces the F1 family | CUT | Clause names only which deleted tests this replaces; the honest-outcome finding follows it. | yes | | RerunCollectionsScreen.test.tsx:786 | round-7 | SEVER | "passes pre-#651-round-7 too" → "passes with or without `usableEtag`'s trim"; it stays a regression guard. | yes | | RerunCollectionsScreen.tsx:361 | rounds 6 | SEVER | `(#651 rounds 6 and 7)` → `(#651)`. | yes | ### KEEP rows (43 sites, no edit) | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | completeAnnotationScan.ts:30 | six review rounds | KEEP-carveout | Re-affirmed: the round count is the empirical case against string-matching predicates. | no | | libraryBrowse.test.ts:93 | used to compile | KEEP-carveout | Describes the `Rock && Roll` PRODUCT regression the test pins. | no | | pageSizeCallSites.guard.test.ts:187 | first fix | KEEP-carveout | "Unlike the #685 first fix" warns that truncation is still possible — a live distinction, not comment history. | no | | pageSizeCallSites.guard.test.ts:800 | four rounds | KEEP-carveout | "four rounds of 'restate the scope' … each defeated by something SHARED with its subject", dated (#819, 2026-08-29). | no | | ChannelBuilder.test.tsx:115, 118 | #650 follow-up F4 / F3 | KEEP-citation | Finding ids naming the defect the fixture simulates. | no | | ChannelBuilder.test.tsx:826 | Without the F3 fix | KEEP-citation | Names what the fix prevents; F3 is a pointer, and the mechanism is stated inline. | no | | pickers.tsx:320, 321 | BLOCKER 2 / BLOCKER 3 | KEEP-citation | These point at the two `BLOCKER 2:`/`BLOCKER 3:` tests, which were NOT renamed — stripping them breaks a live cross-reference. | no | | pickers.test.tsx:257, 293, 385, 426, 473, 541 | BLOCKER/HIGH-1/MEDIUM-5/MEDIUM-3 | KEEP-fixture | TITLE strings carrying only a severity label, no round. Outside decision 1's 14; rename candidates below. | no | | PlaylistsScreen.test.tsx:324; RerunCollectionsScreen.test.tsx:508 | HIGH-2 | KEEP-fixture | TITLE strings; same class, rename candidates. | no | | SchedulesScreen.test.tsx:404, 605 | review fixes / review follow-up | KEEP-fixture | `describe` TITLE strings; rename candidates. | no | | SchedulesScreen.test.tsx:405 | F1: | KEEP-fixture | TITLE string; `F1` is a finding id used as a defect name in `SchedulesScreen.tsx` too. | no | | SchedulesScreen.tsx:268, 269 | F1 / F4 | KEEP-citation | The labels NAME two defect classes described inline; they are the pointer, not attribution. | no | | CollectionsScreen.tsx:287 | used to drop | KEEP-carveout | `merged.slice(0, 50)` dropping up to 100 rows is the measured harm of the removed clamp. | no | | CollectionsScreen.tsx:239, 439 | an earlier query | KEEP-false-positive | "an earlier query" is the user's previous search in the UI. | no | | CollectionsScreen.test.tsx:616 | previously-ticked | KEEP-false-positive | Sequence within one test. | no | | PlaybackTroubleshootingScreen.test.tsx:385 | previously discarded | KEEP-carveout | States the behaviour change the test pins (settled statuses accepted after the 200). | no | | PlaylistsScreen.tsx:63; RerunCollectionsScreen.tsx:38 | used to carry | KEEP-carveout | Re-graded from Round 1's KEEP-false-positive: it is the why behind an ABSENT truncation hint. | no | | PlexSourceScreen.test.tsx:175 | used to claim | KEEP-carveout | Re-affirmed: the #345 product defect the test pins. | no | | RerunCollectionsScreen.tsx:261 | three consecutive review rounds | KEEP-carveout | Re-affirmed: the round count plus three cross-user lost updates is the evidence against rebuilding reconciliation. | no | | LocalLibraryEditScreen.tsx:56; PlaybackTroubleshootingScreen.tsx:37, 195, 479; …test.tsx:364 | this/PREVIOUS session | KEEP-false-positive | Re-affirmed: UI edit session and playback sessions. | no | | trakt.ts:37 | the list once | KEEP-false-positive | "reload the list once it goes idle" — a domain instruction. | no | | useDirtyGuard.ts:16 | in the same pr | KEEP-false-positive | The pattern matched "in the same **pr**omise callback". States a rule about React render timing. | no | | PlayoutsScreen.tsx:111; PlayoutsScreen.test.tsx:986 | used to run | KEEP-fixture | A displayed UI label ("The command line used to run the scripted schedule") that the test asserts on. | no | | rules/roundtrip.test.ts:110 | first value | KEEP-false-positive | The LCG's first output value. | no | | SchedulesScreen.test.tsx:274, 300, 597 | round-trips / no longer | KEEP-false-positive | Domain verb and a post-normalization statement. | no | ### Round 2 counts Comment/prose sites: **SEVER 25 · CUT 1** applied; **KEEP 43** (carveout 10 · citation 6 · fixture 13 · false-positive 14). Test titles: **13 proposals applied over 17 title-string lines**; 1 proposal reclassified as a registry note. ### Further rename candidates (still NOT applied — outside decision 1's 14) Titles carrying only a review SEVERITY label, no round: `pickers.test.tsx:257` (`BLOCKER 2: `), `:293` (`BLOCKER 3: ` — referenced by `pickers.tsx:321`, so rename both together or neither), `:385` (`HIGH-1: `), `:426` (`MEDIUM-5: `), `:473`/`:541` (`MEDIUM-3: `); `PlaylistsScreen.test.tsx:324` and `RerunCollectionsScreen.test.tsx:508` (`HIGH-2: `); `SchedulesScreen.test.tsx:404` (`— review fixes (F1/F3/F4/F5)`) and `:605` (`(#242 review follow-up)`). ### Round 2 verification Every changed line in `git diff -U0 -- web/` is one of: a `//` or `*` comment line (431), a JSX block-comment continuation (4), a test-TITLE string (17), or one of the 2 REGISTRY `note` prose strings. Enumerated exhaustively — the 21 added lines that are not `//`-prefixed are exactly those 17 + 2 + 2. No added line exceeds 118 columns. ``` $ git diff --stat -- web/ web/src/api/completeAnnotationScan.test.ts | 8 +-- web/src/api/completeAnnotationScan.ts | 18 +++---- web/src/api/completeAnnotations.guard.test.ts | 35 +++++++------ web/src/api/completeRequest.guard.test.ts | 10 ++-- web/src/api/completeRequest.ts | 3 +- web/src/api/libraryBrowse.test.ts | 13 +++-- web/src/api/pageSizeCallSites.guard.test.ts | 58 ++++++++++----------- web/src/api/pageSizeScan.test.ts | 40 +++++++-------- web/src/api/pageSizeScan.ts | 12 ++--- web/src/api/selectionId.test.ts | 6 +-- web/src/api/selectionId.ts | 10 ++-- web/src/builder/ChannelBuilder.test.tsx | 32 ++++++------ web/src/builder/libraryBrowse.ts | 14 ++--- web/src/builder/rules/roundtrip.test.ts | 2 +- web/src/schedules/ScheduleItemInspector.tsx | 6 +-- web/src/schedules/pickers.test.tsx | 27 +++++----- web/src/schedules/pickers.tsx | 26 +++++----- web/src/screens/CollectionsScreen.test.tsx | 6 +-- web/src/screens/CollectionsScreen.tsx | 29 +++++------ web/src/screens/FillerPresetsScreen.tsx | 6 +-- .../screens/PlaybackTroubleshootingScreen.test.tsx | 2 +- web/src/screens/PlaybackTroubleshootingScreen.tsx | 2 +- web/src/screens/PlaylistsScreen.test.tsx | 10 ++-- web/src/screens/PlaylistsScreen.tsx | 6 +-- web/src/screens/RerunCollectionsScreen.test.tsx | 60 +++++++++++----------- web/src/screens/RerunCollectionsScreen.tsx | 23 ++++----- web/src/screens/SchedulesScreen.tsx | 6 +-- web/vite-plugins/trackedSourceFiles.test.ts | 2 +- web/vite-plugins/trackedSourceFiles.ts | 2 +- 29 files changed, 232 insertions(+), 242 deletions(-) ``` `git status --porcelain -- web/` lists 29 files, all inside the 36-file owned set. Seven owned files are untouched (all-KEEP): `LocalLibraryEditScreen.tsx`, `PlexSourceScreen.test.tsx`, `trakt.ts`, `useDirtyGuard.ts`, `PlayoutsScreen.tsx`, `PlayoutsScreen.test.tsx`, `SchedulesScreen.test.tsx`.
Author
Owner

Per-site manifest — C# and design-system

Line numbers are from the pre-edit tree (fb5592971); ## Round 2 rows come from the wider phrasing sweep. Rows marked as duplicates restate a round-1 site.

Manifest — slice_EF (ersatztv#876 narrative sweep)

file:line matched disposition reason (≤25 words) edited
ErsatzTV.Application/Channels/Commands/UpdateChannelHandler.cs:311 [used to be] KEEP-carveout Rejected design (silent coercion, #401) + why the transition is now rejected instead; trap+consequence, not session narrative. no
ErsatzTV.Application/Search/Queries/GetSearchFieldValuesHandler.cs:21 [earlier attempt] SEVER Dropped "arriving at that took four tries — each earlier attempt bounded a quantity..."; kept the three enumerated rejected bounds and their harms. yes
ErsatzTV.Application/Search/Queries/GetSearchFieldValuesHandler.cs:40 [earlier version of this] CUT Clause's only content was "an earlier version of this comment asserted it anyway"; the two findings that follow already stand alone. yes
ErsatzTV.Application/Streaming/HlsSessionWorker.cs:60 [this session] KEEP-false-positive "session" = the ffmpeg/HLS streaming session, domain meaning, not an authoring session. no
ErsatzTV.Core.Tests/FFmpeg/WatermarkSelectorDecoResolutionTests.cs:362 [earlier version of this] SEVER Dropped "an earlier version of this test gave..."; kept the trap (unfalsifiable fixture) as a stated hypothetical. yes
ErsatzTV.Core/Api/Troubleshooting/TroubleshootingPlaybackStatusResponseModel.cs:7 [last session] KEEP-false-positive "last session" = the last playback/troubleshooting run recorded by the entity locker, domain meaning. no
ErsatzTV.Core/Api/Troubleshooting/TroubleshootingPlaybackStatusResponseModel.cs:8 [last session] KEEP-false-positive Same as line 7 — domain meaning, not authoring chronology. no
ErsatzTV.Scanner.Tests/Core/Plex/PlexMovieLibraryScannerTests.cs:214 [used to be] KEEP-carveout Describes a prior stuck-bug state the test now pins; trap+consequence for the code, not a comment-drafting note. no
ErsatzTV.Scanner/Core/Metadata/MediaServerMusicVideoLibraryScanner.cs:15 [used to be] KEEP-carveout Rejected design (library-scoped diff + hard delete, ersatztv#496) kept with its harm; citation + why. no
ErsatzTV.Tests/Application/Channels/CreateChannelFromLineupHandlerTests.cs:467 [found by adversarial review] SEVER (#70, found by adversarial review of PR #402)(#70, PR #402); kept both issue/PR numbers per brief instruction. yes
ErsatzTV.Tests/Application/MediaCollections/AddToCollectionIdempotencyConcurrencyTests.cs:237 [first attempt] KEEP-false-positive "the first attempt's save" describes the racer's retry mechanics in the concurrency scenario, domain meaning. no
ErsatzTV.Tests/Application/ProgramSchedules/ScheduleItemResponseRoundTripTests.cs:362 [earlier drafts] SEVER Dropped "three earlier drafts of this comment..."; kept the trap (a confident mechanism here is easy to get wrong) as a stated finding. yes
ErsatzTV.Tests/Infrastructure/GraphicsElementSeederUpgradeTests.cs:196 [used to be] KEEP-carveout Describes prior harmless-fault behavior the test now guards against; trap+consequence about the app, not the comment's drafting. no
ErsatzTV.Tests/Integration/LibraryFolderDedupeMigrationTests.cs:130 [that session] KEEP-false-positive "session" = a MySQL connection-pool session, domain meaning. no
ErsatzTV.Tests/Integration/LibraryRepositoryTests.cs:33 [used to read] KEEP-carveout Regression note (ersatztv#488) describing prior throw-on-first-item bug + fix rationale; citation + trap+consequence. no
ErsatzTV.Tests/Integration/LibraryRepositoryTests.cs:91 [first pass] KEEP-false-positive "first pass" is a test-step label (first of two GetOrAddFolder calls in the same test), not session chronology. no
ErsatzTV.Tests/Integration/SongIndexerMetadataMutationTests.cs:36 [adversarial review] KEEP-carveout Citation (ersatztv#691) + rejected design (entity-level guard reverted) + why (guard moved to read site); provenance a reader would follow. no
ErsatzTV/Controllers/Api/AuthController.cs:236 [THIS session] KEEP-false-positive "THIS session" = the caller's authenticated login session surviving a cookie rotation, domain meaning. no
design-system/docs/superpowers/specs/2026-07-01-chicorytv-ui-redesign-design.md:179 [was originally ] SEVER Dropped "was originally...but is now"; kept the forward-pointing scope note ("specified in §6, not deferred to Pass 2") a reader of the Out-of-scope list needs. yes

Adjacent (found beyond the slice's grep hits, same rule applied)

file:line matched disposition reason (≤25 words) edited
ErsatzTV.Core.Tests/FFmpeg/WatermarkSelectorDecoResolutionTests.cs:468 (adjacent) [previously] KEEP-false-positive "previously yielded two (graphics engine)" is a domain comparison of routing behavior before/after the code change, not session narrative. no
ErsatzTV.Tests/Application/Channels/CreateChannelFromLineupHandlerTests.cs:971 (adjacent) [originally] KEEP-carveout Citation (#732) + rejected/buggy prior state ("the default attach originally missed") + concrete consequence (silent missing overlay); trap+consequence. no

Counts by disposition

  • CUT: 1
  • SEVER: 6
  • KEEP-carveout: 8
  • KEEP-false-positive: 10 (8 in slice + 2 adjacent)
  • KEEP-citation: 0 (folded into KEEP-carveout rows where the citation co-occurs with a rejected-design/trap finding)
  • KEEP-fixture: 0
  • Total slice rows: 19 (+2 adjacent) = 21

Verification

All 19 slice sites are in .cs files except site 19 (.md). Per the brief's .ts/.tsx/.cs rule, no build/run needed for comment-only edits.

  • BOM check (head -c3 <file> | xxd -p) run before and after editing on all 15 .cs files in the slice: none started efbbbf before, none started efbbbf after (all began 757369 = using, matching .cs file starts). No BOM was introduced.
  • git diff --stat for the edited files (5 of 16 slice files touched: 4 .cs + 1 .md):
 ErsatzTV.Application/Search/Queries/GetSearchFieldValuesHandler.cs                          | 6 ++----
 ErsatzTV.Core.Tests/FFmpeg/WatermarkSelectorDecoResolutionTests.cs                          | 6 +++---
 ErsatzTV.Tests/Application/Channels/CreateChannelFromLineupHandlerTests.cs                  | 2 +-
 ErsatzTV.Tests/Application/ProgramSchedules/ScheduleItemResponseRoundTripTests.cs           | 6 +++---
 design-system/docs/superpowers/specs/2026-07-01-chicorytv-ui-redesign-design.md             | 2 +-
 5 files changed, 10 insertions(+), 12 deletions(-)
  • git diff for those 5 files (manually reviewed): every changed hunk is inside a /// XML-doc comment, a // line comment, or markdown prose — no code, attribute, string literal, YAML key, or identifier was touched.
  • No files outside the slice's 16-file set were edited. No git add/commit/stash/checkout run in the worktree.

Round 2 (round2_EF.tsv — whole-file scope, wider phrasing sweep)

file:line matched disposition reason (≤25 words) edited
ErsatzTV.Application/Channels/Commands/UpdateChannelHandler.cs:311 [used to be] KEEP-carveout Duplicate of round-1 site; same disposition, no change. no
ErsatzTV.Application/Search/Queries/GetSearchFieldValuesHandler.cs:143 [an earlier revision of the] SEVER Dropped "how an earlier revision of the decision record got it wrong"; kept the trap grounded in the preceding sentence (a literal-pattern probe over-matches unlike the real query). yes
ErsatzTV.Application/Search/Queries/GetSearchFieldValuesHandler.cs:473 [earlier revision ] SEVER Dropped "which is how every earlier revision scanned past its own bound"; kept the mechanism as a stated consequence ("a gap wide enough to scan straight past a nominal row-count bound"). yes
ErsatzTV.Core.Tests/FFmpeg/WatermarkSelectorDecoResolutionTests.cs:284 [used to throw] KEEP-carveout Domain history of prior throwing arms from the #510 unification kept as trap+consequence for a future refactor; not comment-drafting narrative. no
ErsatzTV.Scanner.Tests/Core/Plex/PlexMovieLibraryScannerTests.cs:214 [used to be] KEEP-carveout Duplicate of round-1 site; same disposition, no change. no
ErsatzTV.Scanner/Core/Metadata/MediaServerMusicVideoLibraryScanner.cs:15 [used to be] KEEP-carveout Duplicate of round-1 site; same disposition, no change. no
ErsatzTV.Tests/Application/ProgramSchedules/ScheduleItemResponseRoundTripTests.cs:347 [The previous version ] KEEP-carveout Rejected design (hand-written ShouldBe mirror) kept with its concrete harm (silent drift, ersatztv#779/#754); the rejected design IS the actionable content. no
ErsatzTV.Tests/Application/ProgramSchedules/ScheduleItemResponseRoundTripTests.cs:356 [The first version ] KEEP-carveout Tested-and-rejected reasoning ("PUT replaces the item set...") for the Id exemption, kept with why it was wrong; prevents re-adding the exemption. no
ErsatzTV.Tests/Infrastructure/GraphicsElementSeederUpgradeTests.cs:196 [used to be] KEEP-carveout Duplicate of round-1 site; same disposition, no change. no
ErsatzTV.Tests/Integration/LibraryRepositoryTests.cs:33 [used to read] KEEP-carveout Duplicate of round-1 site; same disposition, no change. no
ErsatzTV.Tests/Integration/SongIndexerMetadataMutationTests.cs:36 [adversarial review] KEEP-carveout Duplicate of round-1 site; same disposition, no change. no
design-system/docs/superpowers/specs/2026-07-01-chicorytv-ui-redesign-design.md:37 [in this pr] KEEP-false-positive Substring match only — the text reads "in this project" (component library scope), not "in this PR"; no narrative present. no
ErsatzTV.Application/Channels/Commands/ChannelValidations.cs:8 [were previously ] KEEP-carveout "These were previously enforced only by the Blazor page" states why the validations were ported into the handlers (REST API parity); why-behind-choice, not session chronology. no
ErsatzTV.Application/Streaming/WorkAheadSlots.cs:13 [The previous shape ] KEEP-carveout Rejected design (non-atomic check-then-act TOCTOU) described with its concrete race and citations (ersatztv#231/#250); trap+consequence. no
ErsatzTV.Core.Tests/Streaming/WorkAheadSlotsTests.cs:116 [next round] KEEP-false-positive "round" = one iteration of the stress-test barrier loop, a loop counter, not session chronology. no
ErsatzTV.Core/Scheduling/PlaylistEnumerator.cs:251 [were first ] KEEP-carveout "this was a bug when playlist enumerators were first added; shouldn't happen anymore" explains why a defensive guard still exists; trap+consequence for the code. no
ErsatzTV.Infrastructure.Tests/Locking/EntityLockerTests.cs:102 [round 64] KEEP-carveout Tested-and-rejected design (single-round 64-thread barrier does not reliably collide the race, verified) kept as rationale for the thousands-of-rounds stress design. no
ErsatzTV.Infrastructure.Tests/Locking/EntityLockerTests.cs:129 [next round] KEEP-false-positive "round" = one iteration of the stress-test barrier loop, a loop counter, not session chronology. no
ErsatzTV.Tests/Application/Playouts/PlayoutHandlerTests.cs:436 [the original version ] KEEP-false-positive "the original version" = the DB row's concurrency-token version at load time (domain meaning), not a prior comment/test draft. no
ErsatzTV.Tests/Application/Search/GetSearchFieldValuesHandlerTests.cs:375 [round-4] SEVER Dropped "THE round-4 killer. That revision..."; kept the finding (bounding the Id keyspace degrades capacity linearly with deletion ratio) as a stated mechanism. yes
ErsatzTV.Tests/Application/Search/GetSearchFieldValuesHandlerTests.cs:536 [An earlier version ] KEEP-carveout Tested-and-rejected fixture pair ("Zulu"/"Éclair") kept so nobody reintroduces a pair that can't distinguish the two orderings; paradigm carve-out case. no
ErsatzTV.Tests/Integration/JellyfinMusicVideoLibraryScannerTests.cs:661 [used to pass] KEEP-carveout Regression (ersatztv#500) describing prior duplicate-insert bug + mechanism (materialized ToList before mutation); citation + trap+consequence. no
ErsatzTV.Tests/Integration/SearchIndexMutationCoverageTests.cs:86 [an earlier revision ] KEEP-carveout Sequence of tested-and-rejected attribute lists, each with its concrete failure mode (TestCase-only / Theory fixture falsely reddened); prevents re-narrowing the vocabulary. no
design-system/design_handoff_auto_tune/README.md:165 [in the same PR] KEEP-false-positive "Docs to update in the same PR: ..." states a scope/checklist rule for this change, not a narration of this doc's own drafting history. no

Full-file rescan (whole-file scope per round-2 instructions)

Re-grepped every file in round2_EF.tsv for the wider phrasing set (round-N, "an earlier version", "used to carry/keep", "review proved/measured", "in this PR", plus the round-1 phrase set) across the ENTIRE file, not just ±10 lines. No additional same-class sites were found beyond the 24 listed rows above (one hit, WatermarkSelectorDecoResolutionTests.cs:468, is the same "previously yielded two" site already logged as adjacent/KEEP-false-positive in round 1).

Round 2 counts by disposition

  • CUT: 0
  • SEVER: 3
  • KEEP-carveout: 15 (6 of which are duplicates of round-1 sites, unchanged)
  • KEEP-false-positive: 6
  • Total round-2 rows: 24

Round 2 verification

  • BOM check (head -c3 <file> | xxd -p) run before and after on the 2 .cs files touched this round (GetSearchFieldValuesHandler.cs, GetSearchFieldValuesHandlerTests.cs): both began and remained 757369 (using) — no BOM introduced.
  • git diff --stat for round-2-touched files (both already appeared in round 1's file set; totals below are the FILE'S cumulative diff across both rounds):
 .../Search/Queries/GetSearchFieldValuesHandler.cs              | 10 ++++------
 .../Application/Search/GetSearchFieldValuesHandlerTests.cs     |  2 +-
 2 files changed, 5 insertions(+), 7 deletions(-)
  • Manual review of git diff for both files: every changed hunk is inside a /// XML-doc comment or a // line comment; no code, attribute, string literal, or identifier was touched.
  • No files outside the round-2 slice's file set were edited. No git add/commit/stash/checkout run in the worktree.
## Per-site manifest — C# and design-system Line numbers are from the pre-edit tree (`fb5592971`); `## Round 2` rows come from the wider phrasing sweep. Rows marked as duplicates restate a round-1 site. # Manifest — slice_EF (ersatztv#876 narrative sweep) | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | ErsatzTV.Application/Channels/Commands/UpdateChannelHandler.cs:311 | [used to be] | KEEP-carveout | Rejected design (silent coercion, #401) + why the transition is now rejected instead; trap+consequence, not session narrative. | no | | ErsatzTV.Application/Search/Queries/GetSearchFieldValuesHandler.cs:21 | [earlier attempt] | SEVER | Dropped "arriving at that took four tries — each earlier attempt bounded a quantity..."; kept the three enumerated rejected bounds and their harms. | yes | | ErsatzTV.Application/Search/Queries/GetSearchFieldValuesHandler.cs:40 | [earlier version of this] | CUT | Clause's only content was "an earlier version of this comment asserted it anyway"; the two findings that follow already stand alone. | yes | | ErsatzTV.Application/Streaming/HlsSessionWorker.cs:60 | [this session] | KEEP-false-positive | "session" = the ffmpeg/HLS streaming session, domain meaning, not an authoring session. | no | | ErsatzTV.Core.Tests/FFmpeg/WatermarkSelectorDecoResolutionTests.cs:362 | [earlier version of this] | SEVER | Dropped "an earlier version of this test gave..."; kept the trap (unfalsifiable fixture) as a stated hypothetical. | yes | | ErsatzTV.Core/Api/Troubleshooting/TroubleshootingPlaybackStatusResponseModel.cs:7 | [last session] | KEEP-false-positive | "last session" = the last playback/troubleshooting run recorded by the entity locker, domain meaning. | no | | ErsatzTV.Core/Api/Troubleshooting/TroubleshootingPlaybackStatusResponseModel.cs:8 | [last session] | KEEP-false-positive | Same as line 7 — domain meaning, not authoring chronology. | no | | ErsatzTV.Scanner.Tests/Core/Plex/PlexMovieLibraryScannerTests.cs:214 | [used to be] | KEEP-carveout | Describes a prior stuck-bug state the test now pins; trap+consequence for the code, not a comment-drafting note. | no | | ErsatzTV.Scanner/Core/Metadata/MediaServerMusicVideoLibraryScanner.cs:15 | [used to be] | KEEP-carveout | Rejected design (library-scoped diff + hard delete, ersatztv#496) kept with its harm; citation + why. | no | | ErsatzTV.Tests/Application/Channels/CreateChannelFromLineupHandlerTests.cs:467 | [found by adversarial review] | SEVER | `(#70, found by adversarial review of PR #402)` → `(#70, PR #402)`; kept both issue/PR numbers per brief instruction. | yes | | ErsatzTV.Tests/Application/MediaCollections/AddToCollectionIdempotencyConcurrencyTests.cs:237 | [first attempt] | KEEP-false-positive | "the first attempt's save" describes the racer's retry mechanics in the concurrency scenario, domain meaning. | no | | ErsatzTV.Tests/Application/ProgramSchedules/ScheduleItemResponseRoundTripTests.cs:362 | [earlier drafts] | SEVER | Dropped "three earlier drafts of this comment..."; kept the trap (a confident mechanism here is easy to get wrong) as a stated finding. | yes | | ErsatzTV.Tests/Infrastructure/GraphicsElementSeederUpgradeTests.cs:196 | [used to be] | KEEP-carveout | Describes prior harmless-fault behavior the test now guards against; trap+consequence about the app, not the comment's drafting. | no | | ErsatzTV.Tests/Integration/LibraryFolderDedupeMigrationTests.cs:130 | [that session] | KEEP-false-positive | "session" = a MySQL connection-pool session, domain meaning. | no | | ErsatzTV.Tests/Integration/LibraryRepositoryTests.cs:33 | [used to read] | KEEP-carveout | Regression note (ersatztv#488) describing prior throw-on-first-item bug + fix rationale; citation + trap+consequence. | no | | ErsatzTV.Tests/Integration/LibraryRepositoryTests.cs:91 | [first pass] | KEEP-false-positive | "first pass" is a test-step label (first of two `GetOrAddFolder` calls in the same test), not session chronology. | no | | ErsatzTV.Tests/Integration/SongIndexerMetadataMutationTests.cs:36 | [adversarial review] | KEEP-carveout | Citation (ersatztv#691) + rejected design (entity-level guard reverted) + why (guard moved to read site); provenance a reader would follow. | no | | ErsatzTV/Controllers/Api/AuthController.cs:236 | [THIS session] | KEEP-false-positive | "THIS session" = the caller's authenticated login session surviving a cookie rotation, domain meaning. | no | | design-system/docs/superpowers/specs/2026-07-01-chicorytv-ui-redesign-design.md:179 | [was originally ] | SEVER | Dropped "was originally...but is now"; kept the forward-pointing scope note ("specified in §6, not deferred to Pass 2") a reader of the Out-of-scope list needs. | yes | ## Adjacent (found beyond the slice's grep hits, same rule applied) | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | ErsatzTV.Core.Tests/FFmpeg/WatermarkSelectorDecoResolutionTests.cs:468 (adjacent) | [previously] | KEEP-false-positive | "previously yielded two (graphics engine)" is a domain comparison of routing behavior before/after the code change, not session narrative. | no | | ErsatzTV.Tests/Application/Channels/CreateChannelFromLineupHandlerTests.cs:971 (adjacent) | [originally] | KEEP-carveout | Citation (#732) + rejected/buggy prior state ("the default attach originally missed") + concrete consequence (silent missing overlay); trap+consequence. | no | ## Counts by disposition - CUT: 1 - SEVER: 6 - KEEP-carveout: 8 - KEEP-false-positive: 10 (8 in slice + 2 adjacent) - KEEP-citation: 0 (folded into KEEP-carveout rows where the citation co-occurs with a rejected-design/trap finding) - KEEP-fixture: 0 - Total slice rows: 19 (+2 adjacent) = 21 ## Verification All 19 slice sites are in `.cs` files except site 19 (`.md`). Per the brief's `.ts/.tsx/.cs` rule, no build/run needed for comment-only edits. - BOM check (`head -c3 <file> | xxd -p`) run before and after editing on all 15 `.cs` files in the slice: none started `efbbbf` before, none started `efbbbf` after (all began `757369` = `usi`ng, matching `.cs` file starts). No BOM was introduced. - `git diff --stat` for the edited files (5 of 16 slice files touched: 4 `.cs` + 1 `.md`): ``` ErsatzTV.Application/Search/Queries/GetSearchFieldValuesHandler.cs | 6 ++---- ErsatzTV.Core.Tests/FFmpeg/WatermarkSelectorDecoResolutionTests.cs | 6 +++--- ErsatzTV.Tests/Application/Channels/CreateChannelFromLineupHandlerTests.cs | 2 +- ErsatzTV.Tests/Application/ProgramSchedules/ScheduleItemResponseRoundTripTests.cs | 6 +++--- design-system/docs/superpowers/specs/2026-07-01-chicorytv-ui-redesign-design.md | 2 +- 5 files changed, 10 insertions(+), 12 deletions(-) ``` - `git diff` for those 5 files (manually reviewed): every changed hunk is inside a `///` XML-doc comment, a `//` line comment, or markdown prose — no code, attribute, string literal, YAML key, or identifier was touched. - No files outside the slice's 16-file set were edited. No `git add`/`commit`/`stash`/`checkout` run in the worktree. ## Round 2 (round2_EF.tsv — whole-file scope, wider phrasing sweep) | file:line | matched | disposition | reason (≤25 words) | edited | |---|---|---|---|---| | ErsatzTV.Application/Channels/Commands/UpdateChannelHandler.cs:311 | [used to be] | KEEP-carveout | Duplicate of round-1 site; same disposition, no change. | no | | ErsatzTV.Application/Search/Queries/GetSearchFieldValuesHandler.cs:143 | [an earlier revision of the] | SEVER | Dropped "how an earlier revision of the decision record got it wrong"; kept the trap grounded in the preceding sentence (a literal-pattern probe over-matches unlike the real query). | yes | | ErsatzTV.Application/Search/Queries/GetSearchFieldValuesHandler.cs:473 | [earlier revision ] | SEVER | Dropped "which is how every earlier revision scanned past its own bound"; kept the mechanism as a stated consequence ("a gap wide enough to scan straight past a nominal row-count bound"). | yes | | ErsatzTV.Core.Tests/FFmpeg/WatermarkSelectorDecoResolutionTests.cs:284 | [used to throw] | KEEP-carveout | Domain history of prior throwing arms from the #510 unification kept as trap+consequence for a future refactor; not comment-drafting narrative. | no | | ErsatzTV.Scanner.Tests/Core/Plex/PlexMovieLibraryScannerTests.cs:214 | [used to be] | KEEP-carveout | Duplicate of round-1 site; same disposition, no change. | no | | ErsatzTV.Scanner/Core/Metadata/MediaServerMusicVideoLibraryScanner.cs:15 | [used to be] | KEEP-carveout | Duplicate of round-1 site; same disposition, no change. | no | | ErsatzTV.Tests/Application/ProgramSchedules/ScheduleItemResponseRoundTripTests.cs:347 | [The previous version ] | KEEP-carveout | Rejected design (hand-written `ShouldBe` mirror) kept with its concrete harm (silent drift, ersatztv#779/#754); the rejected design IS the actionable content. | no | | ErsatzTV.Tests/Application/ProgramSchedules/ScheduleItemResponseRoundTripTests.cs:356 | [The first version ] | KEEP-carveout | Tested-and-rejected reasoning ("PUT replaces the item set...") for the Id exemption, kept with why it was wrong; prevents re-adding the exemption. | no | | ErsatzTV.Tests/Infrastructure/GraphicsElementSeederUpgradeTests.cs:196 | [used to be] | KEEP-carveout | Duplicate of round-1 site; same disposition, no change. | no | | ErsatzTV.Tests/Integration/LibraryRepositoryTests.cs:33 | [used to read] | KEEP-carveout | Duplicate of round-1 site; same disposition, no change. | no | | ErsatzTV.Tests/Integration/SongIndexerMetadataMutationTests.cs:36 | [adversarial review] | KEEP-carveout | Duplicate of round-1 site; same disposition, no change. | no | | design-system/docs/superpowers/specs/2026-07-01-chicorytv-ui-redesign-design.md:37 | [in this pr] | KEEP-false-positive | Substring match only — the text reads "in this project" (component library scope), not "in this PR"; no narrative present. | no | | ErsatzTV.Application/Channels/Commands/ChannelValidations.cs:8 | [were previously ] | KEEP-carveout | "These were previously enforced only by the Blazor page" states why the validations were ported into the handlers (REST API parity); why-behind-choice, not session chronology. | no | | ErsatzTV.Application/Streaming/WorkAheadSlots.cs:13 | [The previous shape ] | KEEP-carveout | Rejected design (non-atomic check-then-act TOCTOU) described with its concrete race and citations (ersatztv#231/#250); trap+consequence. | no | | ErsatzTV.Core.Tests/Streaming/WorkAheadSlotsTests.cs:116 | [next round] | KEEP-false-positive | "round" = one iteration of the stress-test barrier loop, a loop counter, not session chronology. | no | | ErsatzTV.Core/Scheduling/PlaylistEnumerator.cs:251 | [were first ] | KEEP-carveout | "this was a bug when playlist enumerators were first added; shouldn't happen anymore" explains why a defensive guard still exists; trap+consequence for the code. | no | | ErsatzTV.Infrastructure.Tests/Locking/EntityLockerTests.cs:102 | [round 64] | KEEP-carveout | Tested-and-rejected design (single-round 64-thread barrier does not reliably collide the race, verified) kept as rationale for the thousands-of-rounds stress design. | no | | ErsatzTV.Infrastructure.Tests/Locking/EntityLockerTests.cs:129 | [next round] | KEEP-false-positive | "round" = one iteration of the stress-test barrier loop, a loop counter, not session chronology. | no | | ErsatzTV.Tests/Application/Playouts/PlayoutHandlerTests.cs:436 | [the original version ] | KEEP-false-positive | "the original version" = the DB row's concurrency-token version at load time (domain meaning), not a prior comment/test draft. | no | | ErsatzTV.Tests/Application/Search/GetSearchFieldValuesHandlerTests.cs:375 | [round-4] | SEVER | Dropped "THE round-4 killer. That revision..."; kept the finding (bounding the Id keyspace degrades capacity linearly with deletion ratio) as a stated mechanism. | yes | | ErsatzTV.Tests/Application/Search/GetSearchFieldValuesHandlerTests.cs:536 | [An earlier version ] | KEEP-carveout | Tested-and-rejected fixture pair ("Zulu"/"Éclair") kept so nobody reintroduces a pair that can't distinguish the two orderings; paradigm carve-out case. | no | | ErsatzTV.Tests/Integration/JellyfinMusicVideoLibraryScannerTests.cs:661 | [used to pass] | KEEP-carveout | Regression (ersatztv#500) describing prior duplicate-insert bug + mechanism (materialized ToList before mutation); citation + trap+consequence. | no | | ErsatzTV.Tests/Integration/SearchIndexMutationCoverageTests.cs:86 | [an earlier revision ] | KEEP-carveout | Sequence of tested-and-rejected attribute lists, each with its concrete failure mode (TestCase-only / Theory fixture falsely reddened); prevents re-narrowing the vocabulary. | no | | design-system/design_handoff_auto_tune/README.md:165 | [in the same PR] | KEEP-false-positive | "Docs to update in the same PR: ..." states a scope/checklist rule for this change, not a narration of this doc's own drafting history. | no | ### Full-file rescan (whole-file scope per round-2 instructions) Re-grepped every file in round2_EF.tsv for the wider phrasing set (`round-N`, "an earlier version", "used to carry/keep", "review proved/measured", "in this PR", plus the round-1 phrase set) across the ENTIRE file, not just ±10 lines. No additional same-class sites were found beyond the 24 listed rows above (one hit, `WatermarkSelectorDecoResolutionTests.cs:468`, is the same "previously yielded two" site already logged as `adjacent`/KEEP-false-positive in round 1). ### Round 2 counts by disposition - CUT: 0 - SEVER: 3 - KEEP-carveout: 15 (6 of which are duplicates of round-1 sites, unchanged) - KEEP-false-positive: 6 - Total round-2 rows: 24 ### Round 2 verification - BOM check (`head -c3 <file> | xxd -p`) run before and after on the 2 `.cs` files touched this round (`GetSearchFieldValuesHandler.cs`, `GetSearchFieldValuesHandlerTests.cs`): both began and remained `757369` (`usi`ng) — no BOM introduced. - `git diff --stat` for round-2-touched files (both already appeared in round 1's file set; totals below are the FILE'S cumulative diff across both rounds): ``` .../Search/Queries/GetSearchFieldValuesHandler.cs | 10 ++++------ .../Application/Search/GetSearchFieldValuesHandlerTests.cs | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) ``` - Manual review of `git diff` for both files: every changed hunk is inside a `///` XML-doc comment or a `//` line comment; no code, attribute, string literal, or identifier was touched. - No files outside the round-2 slice's file set were edited. No `git add`/`commit`/`stash`/`checkout` run in the worktree.
Author
Owner

Review-verdict: MERGEABLE @ a7d91bf

Six cold review rounds, two families, review-only and worktree-isolated. Codex (cross-family) rounds 1-5 through 8cadae08a: 2 MEDIUM, 2 LOW, 1 NIT in round 1, all closed; round 5 found the space-path control had been deleted by a range edit (restored byte-identical) and the title count stale (fixed). Codex round 6 on the final tree aborted on a usage limit. Opus (worktree, every deleted line read) rounds 1-6: 1 HIGH (the population growth falsified the record's depth measurement; fixtures exempted, re-measured, now asserted), 5 MEDIUM, 10 LOW, 3 NIT, all closed; round 6 on this tree MERGEABLE with 0 new findings, mutants and by-function-name test diff verified by execution. No lost rejected design, harm, measurement or trap across ~1,100 deleted prose lines. Sweep: scripts/tests 1569 passed; web 1319 passed; check-doc-narrative --all 179 files / 1 known carve-out, --diff 0 warnings; decisions_validate OK.

Review-verdict: MERGEABLE @ a7d91bf Six cold review rounds, two families, review-only and worktree-isolated. Codex (cross-family) rounds 1-5 through 8cadae08a: 2 MEDIUM, 2 LOW, 1 NIT in round 1, all closed; round 5 found the space-path control had been deleted by a range edit (restored byte-identical) and the title count stale (fixed). Codex round 6 on the final tree aborted on a usage limit. Opus (worktree, every deleted line read) rounds 1-6: 1 HIGH (the population growth falsified the record's depth measurement; fixtures exempted, re-measured, now asserted), 5 MEDIUM, 10 LOW, 3 NIT, all closed; round 6 on this tree MERGEABLE with 0 new findings, mutants and by-function-name test diff verified by execution. No lost rejected design, harm, measurement or trap across ~1,100 deleted prose lines. Sweep: scripts/tests 1569 passed; web 1319 passed; check-doc-narrative --all 179 files / 1 known carve-out, --diff 0 warnings; decisions_validate OK.
timothy merged commit efadbec297 into main 2026-09-03 21:26:04 +02:00
timothy deleted branch fix/876-narrative-sweep-hooks-and-code 2026-09-03 21:26:06 +02:00
Sign in to join this conversation.