docs(773): round-churn is a property, not a class — and review scope is the 4th sampling target
PR Gates / CI image pin matches docker/ci (pull_request) Successful in 9s
PR Gates / Docs update reminder (pull_request) Successful in 13s
PR Gates / decisions lifecycle (pull_request) Successful in 17s
review-verdict/h10 Exempt: docs-only change (no code, no protected path)
Review verdict / Set review-verdict status (pull_request_target) Successful in 13s
Build ErsatzTV Image / Build & test (.NET) (pull_request) Canceled after 1m30s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (pull_request) Canceled after 0s
Build ErsatzTV Image / Functional E2E (curl + UI contracts) (pull_request) Canceled after 0s
Build ErsatzTV Image / Build & push image (amd64) (pull_request) Canceled after 0s
Build ErsatzTV Image / API docs in sync (OpenAPI + endpoint index) (pull_request) Canceled after 0s
Build ErsatzTV Image / Formatting (changed .cs conform to .editorconfig) (pull_request) Canceled after 0s
PR Gates / Script tests (pytest) (pull_request) Canceled after 1m38s

Prompted by a direct question: is "each fix round introduces the next defect"
a new shape, or one already recorded? Measured rather than argued.

ROUND-CHURN IS MIS-SCOPED IN THIS DOCUMENT. It inherited #773's "string-
predicate churn", which names a substrate. Counting records that narrate >=3
review rounds: 18 of 69, spread across EVERY family — A=5, C=3, E=3, D=2,
identity=2, and one each in B, overclaim and string-predicate. Only 1 of the 18
sits in the class named after the phenomenon. #697 settles it independently:
three BLOCKED rounds on credential scoping, no parser involved. So it is a
modifier riding on another failure, like overclaim — new 3.7 says so, and the
2 and 3.6 rows now point at it.

THE FOURTH SAMPLING TARGET. 3 named three things sampled instead of enumerated
— the fix, the verification, the guard. Review scope is the fourth: a re-review
briefed to check the reported finding samples, while the text written to fix the
last round is unreviewed by construction. This session is the demonstration —
rounds 2 and 3 were briefed on the delta and each shipped a new defect; round 4
was briefed to sweep the whole file and came back clean. 4 now lists it as the
one detector with no build step.

TWO LIMITS STATED. The count pattern-matches narrative prose, so 18 is a floor,
not a total. And #767 — the eight-round case that motivates this whole issue —
is absent from the corpus entirely, because it was still open and has no
closing record. The headline example is invisible to the measurement meant to
characterise it.

Refs #773

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-13 20:40:48 +02:00
co-authored by Claude Opus 5
parent 7a8e0e09d3
commit 0916b3b770
+44 -2
View File
@@ -65,7 +65,7 @@ first reported, which if anything strengthens the backward result.
| 5 | **Environment divergence** | 7 | 10% | Behaviour differs by interpreter/provider/hardware, untested there |
| 6 | **Wrapper drift** | 5 | 7% | A hand-maintained mirror drifted from the contract it mirrors |
| 7 | **Overclaim / stale claim** | 3 | 4% | An assertion stronger than its evidence, or since gone false |
| 7 | **String-predicate churn** | 3 | 4% | A regex/grep predicate needing repeated rounds |
| 7 | **String-predicate churn** | 3 | 4% | A regex/grep predicate needing repeated rounds — but see §3.7: the *rounds* are cross-cutting, only the *substrate* is string-shaped |
| 9 | **Identity-not-capability** | 2 | 3% | Authorization scoped by *who*, not by *what is being changed* |
| 10 | **Masking guards** | 1 | 1% | Two guards on one condition; one hid the other's total failure |
@@ -225,7 +225,7 @@ which are cross-era classes drawn from the pre-convention sample and are *not* m
| **E** environment divergence | 7 | 10% | |
| **D** check-and-use race over mutable state | 5 | 7% | 4 rated `NEW` + #632 rated twin-missed with the race secondary |
| — overclaim / stale claim | 3 | 4% | no detector — see §4 |
| — string-predicate churn | 3 | 4% | no detector proposed |
| — string-predicate churn | 3 | 4% | no detector proposed; see §3.7 — the round-churn it is named for is cross-cutting |
| — identity-not-capability | 2 | 3% | |
| — unmerged singletons | 4 | 6% | #60, #503, #586, #688 — real, but one instance each |
| **Total** | **69** | — | the **n** column is exact; percentages are rounded to the nearest point and sum to 99% |
@@ -241,6 +241,44 @@ raters split on. And per §1 limit 2, these are proportions **over a recent, gua
the backward sample establishes that the shapes existed before, not that they occurred in these
ratios.
### 3.7 Round-churn is a property, not a class — and the fix text is the fourth sampling target
The ranked table lists **string-predicate churn** as a class, inherited from #773's own taxonomy
("a parser / string-matching predicate needing repeated rounds"). That name identifies a *substrate*
when the evidence identifies a *cross-cutting property*. Counting records that narrate three or more
review rounds:
| Family | records with ≥3 rounds |
|---|---|
| A — population via a sample | 5 (#496, #633, #644, #650, #726) |
| C — two copies of one thing | 3 (#510, #649, #754) |
| E — environment divergence | 3 (#647, #648, #668) |
| D — check-and-use race | 2 (#622, #632) |
| identity-not-capability | 2 (#697, #698) |
| B, overclaim, **string-predicate** | 1 each (#751, #651, #629) |
| **Total** | **18 of 69, spread across every family** |
**Only 1 of the 18 sits in the class named after the phenomenon.** So repeated-round churn should be
read the way §2 reads overclaim — a modifier that rides on another failure, not a class with its own
detector. #697 settles it independently: three BLOCKED review rounds on a credential-scoping issue,
with no parser anywhere near it.
**Why the rounds happen, which is the part that generalises.** §3 Family A names three things that
get sampled instead of enumerated — the fix, the verification, the guard. There is a fourth: **the
review scope.** A re-review briefed to "check the reported finding" samples; the population is the
whole changed artifact, and the text written to *fix* the last round is unreviewed by construction at
the moment it is written. That is why each round's defect lands in the newest prose rather than in
the text under review.
**Two limits on this section, since it is the one making a claim about its own production.**
- The ≥3-rounds count comes from pattern-matching narrative prose, not from a structured field. It
under-counts records that ran rounds without narrating them, so 18 is a floor.
- **#767 — the eight-round case that motivates #773 — is not in this corpus at all.** It was still
open when the corpus was drawn, so it has no `## Closing record`. The headline example of the
phenomenon is invisible to the measurement characterising it, which is worth stating plainly rather
than letting the 18 stand as though it covered the worst case.
---
## 4. Detectors
@@ -267,6 +305,10 @@ four different names. Two honesty notes on that ranking, because it drives #774'
the shape predates that corpus; it does not show the *proportion* holds across eras. Read it as
"the largest family in the work we have been doing lately," which is still the right basis for
prioritising the next change, but not as a timeless property of the project.
- **Detector A also applies to review scope, which is free.** Per §3.7, a re-review briefed to
"check the reported finding" samples the artifact. Briefing it to sweep the whole changed artifact
enumerates it. This costs one sentence in a review brief and is the only detector here with no
build step at all.
- **Detector D is weaker than its neighbours in this table and is listed anyway.** A, B, F and G
each name a check that fails when violated. D names a *fix pattern* with no general lint — you
cannot mechanically spot "this code should have pinned a sha." What makes it actionable is that