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.
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).
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
`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
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
--- 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
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)
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** |
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.
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
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.
(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>):
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.
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.
"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.
"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.
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.pyH10_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.
## 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(-)
```
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.
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).
"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".
(#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)
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]
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 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 daedf003efix(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).
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 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`.
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.
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)
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):
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.
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).
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").
Rejected design (hand-written ShouldBe mirror) kept with its concrete harm (silent drift, ersatztv#779/#754); the rejected design IS the actionable content.
"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.
"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.
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.
Dropped "THE round-4 killer. That revision..."; kept the finding (bounding the Id keyspace degrades capacity linearly with deletion ratio) as a stated mechanism.
Tested-and-rejected fixture pair ("Zulu"/"Éclair") kept so nobody reintroduces a pair that can't distinguish the two orderings; paradigm carve-out case.
Sequence of tested-and-rejected attribute lists, each with its concrete failure mode (TestCase-only / Theory fixture falsely reddened); prevents re-narrowing the vocabulary.
"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):
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.
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 main2026-09-03 21:26:04 +02:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Closes #876.
docs.no-session-narrativereaches every durable artifact; its detector scanned onlydocs/**/*.mdand 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 residualsin the same files. Like #812, no closure over a phrasing space is claimed: the manifests' sites were
remediated, and the detector's
--allover the grown population returns only the one docs carve-out#812 already recorded.
.claude/,.gitea/,.husky/,docker/andscripts/(non-test)scripts/tests/web/design-system/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 orreferences a title.
The detector grows to the process corpus
scripts/check-doc-narrative.pynow scans every tracked file under.claude/,.gitea/,.husky/and
scripts/regardless of extension, minus itself and its own test (exempt by NAME — their fixturesare the phrasings);
--alllists tracked REGULAR files, so a tracked symlink (this repo's cross-repo.claude/skills/jellyfinlink) 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 wayhere:
--diffsees only ADDED lines, and 287 of the 453 sites were under 30 days old — this iswhere 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 outon 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/hooksseconds, 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 bystartswithinstead of by name (a.py.bakaxis in the cross product is what sees it), dropscripts/,add
web/, drop the fixtures exemption, list only*.mdin--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 insiderun:block scalars; shell, C#, TypeScript and jq equal with comment linesstripped. The stated exceptions: the detector and its test, the 26 vitest titles, two registry
notestrings in
pageSizeCallSites.guard.test.ts, and the prose fields ofmutation_manifest.py(noclause=orreplacement=touched).Verification
scripts/tests: 1569 passed, 3 skipped (final head);ruff check+format --checkon all 39 changed Python files;
bash -non every changed shell file;yaml.safe_loadon everychanged 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.ddbe9d811— Codex (cross-family, read-only; 2 MEDIUM / 2 LOW / 1 NIT) andan 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
Per-site manifest — hooks, workflows, scripts (non-test)
Line numbers are from the pre-edit tree (
fb5592971);## Round 2rows 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).adjacentrows are sites found in the ±10-linecomment block around a listed site and handled under the same rules.
reasonstring; runtime session, and a displayed stringaskmessage naming the review to performCLAUDE.mdexemption kept(ersatztv#849 round 3)is a provenance pointer into the issue thread(#849 round 4)citation keptmain)evil); the count structures the recordjq -esafe-by-accident rejection and the reasoning the rule exists to retire(ersatztv#763, round 2)is a provenance pointerCreatorID == 0) without the draft chronology(ersatztv#849, round 2); the surrounding text is the finding, not chronology::warning::with its three concrete defects; the round count is the withdrawal reason(ersatztv#849, round 2)provenance pointer(ersatztv#849 round 3)provenance pointerstate = successtest kept as "one branch too narrow", with the pending-path harm(ersatztv#849 round 3)provenance pointer(#629 round 5)provenance pointernojob/norunid/1default kept with the silent-PASS harmreport; runtime sessionexec(violated eight lines below a single statement)denyharmif ! fgating plus the measured fail-open it producestrap … EXITkept with the leaked-directory consequenceCounts
15 files edited; 11 slice files untouched (all-KEEP).
Verification
Comment-only check: of the changed lines in these 15 files, every one is either a
#comment lineor 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, andcold 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, themainvsm*example, "The hardened path was dead code and the unhardened one was live."check-doc-narrative.pyPATTERNS and WARNING — untouched (KEEP-fixture). The only edit in thatfile is the module docstring's "WHY PYTHON AND NOT SHELL" paragraph, which keeps the rejected bash
parser and all four of its defects.
git status(C#, web/, docs/, scripts/tests/, and the decision recorditself) 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.tsvduplicate 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
adjacentsites the whole-file sweep turned up.echo "Changed files in this PR:"::error::stating the commit-the-artifacts ruleecho "Changed .cs files in this PR:"::error::stating the fix-as-you-touch ruleelsebranch ends with a successfulecho"; the false-open kept in fullcommand not found, the dead PROTECTED branch and the three blind tests kept(ersatztv#849 round 3)citation ten lines above(ersatztv#706, round-3 review)— issue-anchored locator, no discovery verbecho "Changed files in this PR:"::warning::stating the parity-doc rule--no-mergessilently skipped the trailer::notice::stating what the job does and does not assertpytest.ini… disarms the entire gate"; both disarm shapes and the harm keptRound 2 counts
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.ymlande2e-functional.share all-KEEP and untouched.Round 2 rule applied for
round-NcitationsSevered 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 injq-preflight.sh, where the round-1/2/3 sequence IS therecurrence argument the block exists to make.
Round 2 verification
Cumulative
git diff --statfor my files (rounds 1 + 2)Comment-only check re-run over all 19: 25 changed lines are not
#comments, and all 25 are Pythonmodule-docstring prose in
check-doc-narrative.py,decisions_validate.pyandmcp_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)
Per-site manifest — scripts/tests part 1
Line numbers are from the pre-edit tree (
fb5592971);## Round 2rows 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).adjacentrows carry the pre-edit linenumber found by a broader marker sweep over the same 15 files.
"$SHA"-twice defeat stays; only the finder is removed#742kept as the provenance pointer; "first draft of" removedersatztv#803kept; "round 2" and "found by hand while re-reading the diff" droppedexit 1defeat kept#751kept as the pointer#751survives in the next paragraph""resolution and the greened-rejection harm keptdocs.no-session-narrativeif false/ exit 5 / still-prints-unreadablemeasurement keptbranch_nameshort-circuit and both payload shapes kept.husky/pre-commit:7mention-vs-invocation trap kept verbatimdependency-scan.ymlkeptAdjacent rows (found beyond the slice, same files, same rules)
adjacentadjacentfiles?page=1&limit=50evasion keptadjacent[]leaves the type gate unexercised — kept as the harmadjacentadjacentposted is Nonereasoning and the FORGED-verdict inversion keptadjacentadjacentjq - e '.'token split keptadjacentadjacentadjacentersatztv#751kept as the pointeradjacentadjacentadjacentadjacentadjacentadjacentadjacentadjacentadjacentadjacentrecords/README.mdhole keptadjacentadjacentadjacentadjacentadjacentadjacentCounts
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
AST equality proof (comments/docstrings only — no code, assertion, regex or identifier changed):
The single difference is ONE string constant — the embedded
ghstub script at line ~950. Itsdiff was inspected line by line: every changed line inside it begins with
#(a comment in theembedded script). No executable line of the stub changed.
(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 outstill match 8 lines inthese 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-narrativerecord 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,:6851were already dispositioned in round 1 (all KEEP-carveout orKEEP-false-positive) and are unchanged.
test_pr_changed_files.py:478and:4042are assertionmessage strings, not comments — KEEP-fixture, not touched.
test_guard_populations_derive_from_git.py:401is "in this process", a false positive of thein this PRpattern — KEEP-false-positive.New round-2 dispositions
command not found/ dead PROTECTED branch / three tests green anyway all keptstate = successis one branch too narrow" keeps bothFurther same-class sites met in round 2 (not on either list)
adjacentadjacentadjacent<= p95-><survivor stays as the evidenceadjacentadjacentadjacentadjacentadjacentadjacentRound 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
AST equality (docstrings stripped,
ast.dumpcompared againstHEAD:<file>):The one difference is the same embedded
ghstub string constant as in round 1; every changed lineinside it begins with
#.test_ci_image_paths_pin_agreement.pyis 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 (thetrap-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 themutant-precision statement (
:5372); 1 is "in this process"; andtest_decisions_validate.py:83is left because its
previouslycannot be shown still-true or not-true without re-deriving thevalidator, and the brief forbids fabricating a replacement.
Per-site manifest — scripts/tests part 2
Line numbers are from the pre-edit tree (
fb5592971);## Round 2rows 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
:-fallback mechanism kept.:left this file green".-evs-efargument kept.mktemp" → "also reachable by stubbingmktemp"; trigger kept.TypeErrortrap and its "broken, not stricter" harm kept.cwdpasses identically for every shape, crashes included.adjacentcwdis being ignored") is stated in the same sentence.adjacentadjacentscripts/tests/test_merge_consent_required_check.py
rule_name; the AUTO-GRANT harm kept.release/26.4path-separator 404 read as "unprotected" is the trap that retired the encoding test.*)to setbp_code=200left the suite green".scripts/tests/test_ci_dropped_step_guard.py
build's two payloads moved intoenv:, which brought it into the ban" — the do-not-narrow instruction kept.GITHUB_RUN_ATTEMPT=1, a domain term, inside a displayed assertion message.false-blindness fact is already recorded at GATE_VALUES_IN_THE_WILD.adjacentLC_ALL,${{x}}spacing, red blocks every merge) kept.adjacentmarker_pathadjacentscripts/tests/test_image_build_delegates_the_spa_suite.py
npm tselector gap kept.npm t -- --runsweep escape kept.run: >fold and the swallowed-suite consequence kept.adjacentadjacentadjacentscripts/tests/test_ci_release_path_scan_job.py
always()finding and "Nor isneeds:…" kept.adjacentadjacentadjacent$GITHUB_ENVfourth tier, its measurement, and the ban-rather-than-model rule.scripts/tests/mutation_manifest.py
Checked before editing:
test_mutation_harness.pyasserts only thatwhyis non-empty and thatUNDECLAREDvalues exceed 60 characters. Noclause,replacement,targetorUNDECLAREDvaluewas touched.
scripts/tests/test_check_doc_narrative.py
NARRATIVEconstant — the detector's sample input.truth()'s predicate — executable code, not prose.docs/case.md.scripts/tests/test_post_review_verdict.py
Review-verdict: MERGEABLEwith no status" — the false-consent harm kept.adjacentcheck-review-verdict.sh"; the undisclosed-loss finding kept.adjacentscripts/tests/test_worktree_ownership_guard.py
$CLAUDE_PROJECT_DIR… worked only while the hooks read that variable" — no-op-control harm kept.scripts/tests/test_ci_image_pin_population.py
container:block.MARKED_JOBSfor exactly this and then ships the same shape" — the self-criticism kept.scripts/tests/test_optional_request_members.py
ArtworkContentTypeModelmiss; the pair is the evidence for deriving the guard._resolveresolves and NOT the universal 'anywhere in the request graph'" — the false universal kept as a caution.DELETEcounterexample kept.scripts/tests/hook_fire_isolation.py
scripts/tests/conftest.py
scripts/tests/test_docs_only_detector_clone_depth.py
--depth=200is inert" — the no-production-consumer statement kept.scripts/tests/test_merge_consent_base_change.py
scripts/tests/test_review_verdict_vocabulary.py
scripts/tests/test_ci_toolchain_image_resolves.py
scripts/tests/test_merge_consent_exemption.py
scripts/tests/test_migration_equivalence.py
docs/decisions/… is the wrong base"; both wrong bases and the 105-link measurement kept.scripts/tests/test_workflow_persist_credentials.py
Counts
Slice sites (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):Verification
ruff checkandruff format --checkwere run from the worktree root on every edited file, and onceover the whole directory:
Change-shape proof — every changed line in my 20 files is a comment or docstring line:
(the one line the filter does not classify begins
1 —, a docstring continuation of "gives pytestexit / 1 — a real test failure"). No code, assertion, regex, identifier, fixture literal or
displayed message was changed.
git diff --statfor my 20 files: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 exactrepeat 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:706was 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.
cwd=$HOMEmechanism kept whole.os.fspathreason and the green-on-deletion measurement kept.os.fspathalone leavesos.path.joinraising on mixing str with bytes" — the trap kept as a rule._anchored) instead of when it shipped.docs/case.md. Duplicate of round 1.marker_pathdefaulting tonojob/norunid/1uses names every run shares"; the silent-PASS harm kept.TOOLCHAIN_JOBS/BARE_RUNNER_JOBS) and their #789 replacement.builditself is wrong on two counts"; both counts kept.os.fspathreason and removed-rather-than-proved decision kept.startswith("[")test here is dead code"; theraise-poisoning measurement kept.vitestis a SELECTOR"; all four short-goings kept...finding was an anchor subversion"; both surviving anchor mutants kept.endswithbranch below would make the assertion unfalsifiable" — the mechanism kept.branch_protections/{name}lets a base likerelease/26.4inject a path separator and 404".docs/tree would make this a one-shot"; the whole one-shot harm kept.attempt 1; both live silent drops and the column layout unchanged.attempt 2; theArtworkContentTypeModelmiss and its reachability kept.then/elsein the conjunctive list … is the polarity error"; the mutual-exclusion reason kept.total_count), the measured ORDER, and the unproducible conclusion.Further same-class sites met during the whole-file sweep (not on either list)
${…}/$NAMEtest" is the finding and stays.$CLAUDE_PROJECT_DIR… reads as harmless"; the two-roots confident-table harm kept.Confirmed-KEEP residuals the sweep re-surfaced and did not touch:
test_ci_dropped_step_guard.py:761(
GITHUB_RUN_ATTEMPTdomain term in a displayed message),hook_fire_isolation.py:56and:112(pytest-session referent),
test_check_doc_narrative.py:26/:44/:466(detector fixtures andpredicate),
mutation_manifest.py:418/:419(clause=/replacement=mutation strings),test_post_review_verdict.pyH10_REVIEWERS/"reviewer" occurrences andtest_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'skey could not be resolved from the catalog, so naming it would be fabrication (brief: KEEP and say why).
Round 2 counts
Listed sites (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
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 --statfor my 20 files after round 2:Per-site manifest — web/
Line numbers are from the pre-edit tree (
fb5592971);## Round 2rows come from the wider phrasing sweep. Rows marked as duplicates restate a round-1 site.Manifest — slice D (
web/), ersatztv #876 narrative sweepWorktree
/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.eachargument): gradedKEEP-fixture, not renamed — rename proposals are listed in a separate section below.declare moduleblock silently overwrites a schema); dropped the attribution.Complete<>off the wrapper, retype the test fixture) fully kept; only "Cold review demonstrated" removed..test.-only form is false; the dated measurement ("measured on 4.1.9") stays on the next line.&/`(#650 follow-up round 4); the rejected plant-a-file verification and why it pins nothing are untouched.(#650 follow-up round 3 MEDIUM finding)→(#650 follow-up); issue pointer kept, review chronology dropped.b90f8a3b, these 4 prove nothing) and the pointer to the fixture test; dropped "where the review asked for it" and "this round's".it.eachTITLE string (displayed test output). Rename proposed below, not applied.(#819 round 6)→(#819); the "not derived fromtrackedon both sides" finding is untouched.b90f8a3b; "a round-3 review found" dropped. Which fixtures are contract vs regression pins is kept in full.b90f8a3b"; the verified fixture list is unchanged.(#650 follow-up round 3 MEDIUM finding)→(#650 follow-up).(#650 follow-up round 3 MEDIUM)→(#650 follow-up).(#650 follow-up round 3 MEDIUM)→(#650 follow-up).(#651 round 8)→(#651); relative time "until now it was only exercised indirectly" → "screen tests exercise it only indirectly".itTITLE string. Rename proposed below, not applied.#578 / #651 review round 2:→#578 / #651:; the LCG derivation and why a recomputed divisor proves nothing are untouched.(#651 round 4 HIGH-1)→(#651); the cross-namespace harm stays.#651 review round 4:→#651:.(#651 round 7)→(#651); the int32-binding harm stays.(#651 round 7)→(#651).(#651 round 6)→(#651); the container-vs-contents finding is untouched.(#651 round 8)→(#651).(#651 round 4 HIGH-1)→(#651).(#651 round 4 MEDIUM-5)→(#651).(#651 round 5 MEDIUM-2: …)→(#651: …); the request-storm harm inside the parenthesis is kept.(#651 round 3, MEDIUM)→(#651).(#651 round 5 MEDIUM-2)→(#651).(#651 round 5 MEDIUM-3)→(#651).(#651 round 5 MEDIUM-3, round 6)→(#651).(#651 round 2 BLOCKER 2, round 4 HIGH-1)→(#651).(#651 round 7)→(#651).(#651 review round 3, HIGH)→(#651); the one-gate-per-commit-path rationale is untouched.(#651 review round 2, BLOCKER 3)→(#651).(#685 review round 3 — …)→(#685 — …).(#685 review round 4)→(#685).(#685 review round 4)→(#685).(#685 review round 3)→(#685); the live-region trap is untouched.(#685 review round 4)→(#685).(#651 round 8)→(#651).#651 review round 3.→#651.; the "add the guard WITH the test that reaches it" rule is untouched.(#651 round 4 HIGH-2)→(#651).#651 round 9:→#651:.(#651 round 9)→(#651); the contradictory-label finding is untouched.(#651 round 9)→(#651).(#651 round 4 HIGH-2)→(#651).(#651 round 6)→(#651), and relative "now"; the fixture trap (a mock without an ETag exercises a force-write path) is kept.(#651 round 3 HIGH, round 5 redesign)→(#651); "prevented structurally rather than by a merge rule" kept.(#651 round 4 HIGH-2)→(#651).#651 review round 5:→#651:.(#651 round 7 HIGH)→(#651); the empty-ETag force-write harm is untouched.(#651 round 7)→(#651).#651 round 8:→#651:.(#651 round 8 — the boundary, not the site)→(#651 — the boundary, not the site).(#651 round 7 HIGH)→(#651).NOTE (#651 review round 5):→NOTE (#651):; the no-reconciliation-machinery prohibition is untouched.(#651 round 4 HIGH-2)→(#651).(#651 round 7)→(#651).(#651 round 6)→(#651).(#651 round 4 MEDIUM-4, now structural rather than guarded)→(#651 — structural rather than guarded).(Codex review, PR #242)→(PR #242)— the brief's own example: keep the number, drop the attribution.#819 round 6:→#819:; the cancellation argument is untouched.(#819 round 6)→(#819).Adjacent rows (found inside the ±10-line window of a slice site)
.spec.tsbypassisProductionSourceabove.(#685).(#685); the measured harm (rows wiped whileselectedstill held them) is kept.(#685).(PR #242), same rule as line 430.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— dropround 4from(#650 follow-up round 4)ChannelBuilder.test.tsx:845, 1220, 1342— dropround 3;:1263— dropround 4pickers.test.tsx:310— drop theBLOCKER 3 / round 3:prefix;:341— dropround 3 HIGH:;:512— drop(round 6)pageSizeScan.test.ts:42, 74—not a round-1 regression pin→not a regression pin against the prior scannerPlaylistsScreen.test.tsx:366, 410— drop theround 9:prefixRerunCollectionsScreen.test.tsx:974, 1000— drop theround 8:prefixRerunCollectionsScreen.test.tsx:364, 390— drop(round-3 review)/, round-3 reviewPlaybackTroubleshootingScreen.test.tsx:361— drop(Codex race fix)pageSizeCallSites.guard.test.ts:195—the #685 round-3 review finding→the #685 findingSame-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 headerno 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 atcompleteAnnotationScan.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 calledisScannableSourceFileNameon this side too … MEASURED: …" [SEVER — keep the cancellation harm and both measurements]pageSizeCallSites.guard.test.ts:1130— "the anti-vacuityexpect(...)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 → dropround-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/.tsxonly — 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 inCollectionsScreen.tsx. No added line exceeds 118 columns.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.tsxandPlexSourceScreen.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.tsvrows 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.tsordocs/filters or names any of these titles.web/package.json's script isa bare
"test": "vitest",vite.config.tsselects by FILE glob only, and there is no-t/--testNamePatternanywhere in the repo. Grepping each title's distinctive fragment repo-widereturned 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.
(#650 follow-up round 4)→(#650 follow-up).(#650 follow-up).BLOCKER 3 / round 3:,round 3 HIGH:and(round 6)labels; descriptions unchanged.not a round-1 regression pin→not a regression pin; the body comment now names the prior scanner.round 9:prefix.round 8:prefix.(round-3 review)and, round-3 review;(seqRef guard)kept.(Codex race fix); the behaviour description carries the test.Proposal 14 was NOT a title — correction to Round 1.
pageSizeCallSites.guard.test.ts:195is aREGISTRY
notestring (prose data, asserted only asentry.note.length > 20, never rendered in afailure message). It is handled as a prose SEVER below instead.
Applied edits (decision 2)
(the #819 round-5 finding …)→(the #819 finding …).round-3 MEDIUM finding:, rule width preserved by padding the trailing dashes.(round-3 review F2)→(#644 follow-up F2); issue MEASURED fromgit log -S(commitdaedf003efix(644)), not guessed.(#644 follow-up F2).(round-3 review F3)→(#644 follow-up F3), matching the#644 follow-up F4two lines above.pickers.tsxgives it.usableEtag's trim"; it stays a regression guard.(#651 rounds 6 and 7)→(#651).KEEP rows (43 sites, no edit)
Rock && RollPRODUCT regression the test pins.BLOCKER 2:/BLOCKER 3:tests, which were NOT renamed — stripping them breaks a live cross-reference.describeTITLE strings; rename candidates.F1is a finding id used as a defect name inSchedulesScreen.tsxtoo.merged.slice(0, 50)dropping up to 100 rows is the measured harm of the removed clamp.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 bypickers.tsx:321, so rename both together or neither),:385(HIGH-1:),:426(MEDIUM-5:),:473/:541(MEDIUM-3:);PlaylistsScreen.test.tsx:324andRerunCollectionsScreen.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 JSXblock-comment continuation (4), a test-TITLE string (17), or one of the 2 REGISTRY
noteprosestrings. Enumerated exhaustively — the 21 added lines that are not
//-prefixed are exactly those17 + 2 + 2. No added line exceeds 118 columns.
git status --porcelain -- web/lists 29 files, all inside the 36-file owned set. Seven owned filesare untouched (all-KEEP):
LocalLibraryEditScreen.tsx,PlexSourceScreen.test.tsx,trakt.ts,useDirtyGuard.ts,PlayoutsScreen.tsx,PlayoutsScreen.test.tsx,SchedulesScreen.test.tsx.Per-site manifest — C# and design-system
Line numbers are from the pre-edit tree (
fb5592971);## Round 2rows come from the wider phrasing sweep. Rows marked as duplicates restate a round-1 site.Manifest — slice_EF (ersatztv#876 narrative sweep)
(#70, found by adversarial review of PR #402)→(#70, PR #402); kept both issue/PR numbers per brief instruction.GetOrAddFoldercalls in the same test), not session chronology.Adjacent (found beyond the slice's grep hits, same rule applied)
Counts by disposition
Verification
All 19 slice sites are in
.csfiles except site 19 (.md). Per the brief's.ts/.tsx/.csrule, no build/run needed for comment-only edits.head -c3 <file> | xxd -p) run before and after editing on all 15.csfiles in the slice: none startedefbbbfbefore, none startedefbbbfafter (all began757369=using, matching.csfile starts). No BOM was introduced.git diff --statfor the edited files (5 of 16 slice files touched: 4.cs+ 1.md):git difffor 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.git add/commit/stash/checkoutrun in the worktree.Round 2 (round2_EF.tsv — whole-file scope, wider phrasing sweep)
ShouldBemirror) kept with its concrete harm (silent drift, ersatztv#779/#754); the rejected design IS the actionable content.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 asadjacent/KEEP-false-positive in round 1).Round 2 counts by disposition
Round 2 verification
head -c3 <file> | xxd -p) run before and after on the 2.csfiles touched this round (GetSearchFieldValuesHandler.cs,GetSearchFieldValuesHandlerTests.cs): both began and remained757369(using) — no BOM introduced.git diff --statfor round-2-touched files (both already appeared in round 1's file set; totals below are the FILE'S cumulative diff across both rounds):git difffor both files: every changed hunk is inside a///XML-doc comment or a//line comment; no code, attribute, string literal, or identifier was touched.git add/commit/stash/checkoutrun in the worktree.Review-verdict: MERGEABLE @
a7d91bfSix 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.