# Long-form Review-Pass Overlap Measurement — Steg 20 _Remediation Voyage, Wave 4 / S5. Measures whether the long-form review stack carries redundant gates, and trims **only** where a gate catches nothing the others don't. Written 2026-05-30, SOLO (no subagent fan-out)._ ## The question and the trim rule The long-form pipeline runs **seven** review agents. Endring 9 (v3.1.0) added a cold/headless package (`content-reviewer`, `language-reviewer`, `fact-reviewer`) whose agent prompts argue, in their own words, that they overlap the in-session gates **on purpose** (`fact-reviewer`: «the redundancy is load-bearing, not waste»; `language-reviewer` anti-pattern: «'De-duplicate' yourself against editorial-reviewer — the overlap is the cold re-take»). Steg 20 tests that claim against evidence instead of taking it on faith: > **Trim a gate ONLY where it catches nothing the others don't** (then merge/remove > it + update the count contract). **If the redundancy is justified, record that > and keep it. If the fixture is insufficient to decide, record «inconclusive; > redundancy retained» and do NOT trim.** (Step 20 On-failure = skip the trim.) ## Method — and its honest limit I measured the **documented catch-sets**: each agent's check taxonomy (the agent `.md`) cross-referenced against its in-repo **fasit fixture** (`agents/fixtures/*-cases.md`). I did **not** run the agents live: every fixture's own *live-run note* states a live cold run needs (a) a session reload and (b) read access to the frozen Del 4 draft in the **Maskinrommet series folder** — cross-repo, explicitly out of scope this session. By each fixture's own declaration the fasit is «the gold-standard of record» until both hold, so the fasit catch-sets are the legitimate measurement surface. **The lucky break that makes this more than taxonomy-reasoning:** four of the six fixtures target the **same edition** — Del 4 (Security Champions, Maskinrommet). `editorial-reviewer` reviewed v5 (2026-05-28, in-session); the cold trio (`content`/`language`/`fact-reviewer`) re-read the **frozen/pivoted** version (2026-05-29). That shared edition lets me compare what each gate *actually caught on one piece* — a real cross-gate overlap measurement, not just a boundary restatement. | Fixture | Edition under review | Cases | Enables shared-edition compare? | |---------|---------------------|-------|----------------------------------| | `editorial-reviewer-cases.md` | **Del 4 v5** (28.05, in-session) | 8 | ✅ yes | | `content-reviewer-cases.md` | **Del 4 frozen/pivoted** (29.05, cold) | 6 | ✅ yes | | `language-reviewer-cases.md` | **Del 4 frozen** (29.05, cold) | 6 | ✅ yes | | `fact-reviewer-cases.md` | **Del 4 frozen/pivoted** (29.05, cold) | 6 | ✅ yes | | `persona-reviewer-cases.md` | separate jargon-wall sample (+ documented Del 4 behaviour) | 6 axes | partial | | `fact-checker-cases.md` | 3 generic reference claims (not Del 4) | 3 | role only | | `voice-scrubber` | **NO FIXTURE** | — | ❌ inconclusive | ## The seven agents — axis map | Agent | Step | Axis (the one question it answers) | When | Fixture | |-------|------|-------------------------------------|------|---------| | `fact-checker` | 5 | factual truth — *is it true?* | in-session, **moving draft** | generic (3 claims) | | `editorial-reviewer` | 5.5 | prose craft + narrative architecture — *is it well-made?* | in-session | Del 4 v5 | | `persona-reviewer` | 2.5/6/9 | reader response — *does it land?* | in-session | sample + Del 4 behaviour | | `voice-scrubber` | 4 | de-AI + chronicle voice drift — *does it sound like the author?* | in-session (**applies** edits) | none | | `content-reviewer` | 6.5 | argument integrity — *does the reasoning hold?* | **cold/frozen** | Del 4 frozen | | `language-reviewer` | 6.5 | Norwegian language — *does it read clean?* | **cold/frozen** | Del 4 frozen | | `fact-reviewer` | 6.5 | factual truth, re-verified — *is every claim, incl. pivot, true?* | **cold/frozen+pivoted** | Del 4 frozen | ## Per-reviewer catch table (what each gate caught on the fixtures) Legend: **U** = unique catch (no other gate's fixture surfaces this defect) · **O** = overlaps another gate's catch (overlap analysed in the matrix below). ### `editorial-reviewer` — Del 4 v5 (8 catches) | # | Check | Defect caught | Sev | U/O | |---|-------|---------------|-----|-----| | 1 | A1 | abstract figure never instantiated (craft/vividness) | REWORK | O → content C4 (adjacent) | | 2 | P3 | postulated number, no source/hedge — *flags absence, no search* | REWORK | O → fact-reviewer F3 | | 3 | A2 | trust-effect hypothesis with no SDT/theory anchor | BLOCK | **U** | | 4 | A3 | broken series-title symmetry (part floats free) | REWORK | **U** | | 5 | A4 | small-business addressee stranded — no usable action | BLOCK | O → content C5 (adjacent) | | 6 | P2 | verbatim repetition | REWORK | O → language L1 | | 7 | P1 | em-dash over-density | REWORK | **U** | | 8 | P4 | prose-level internal contradiction (two passages) | BLOCK | O → content C3 (adjacent) | ### `content-reviewer` — Del 4 frozen (6 catches) — argument-integritet | # | Check | Defect caught | Sev | U/O | |---|-------|---------------|-----|-----| | 1 | C2 | Security-Champions **pivot premise** asserted unsupported | BLOCK | **U** | | 2 | C5 | unanswered «what about small orgs?» objection | BLOCK | O → editorial A4 (adjacent) | | 3 | C1 | logical hole «Champions finnes» → «dømmekraft bevart» | REWORK | **U** | | 4 | C4 | role section needs **one concrete org** for the argument | REWORK | O → editorial A1 (adjacent) | | 5 | C3 | recommendation **delegates the judgment** the series premise rules out | BLOCK | **U** | | 6 | C2 | gevinst assumes widespread org maturity | REWORK | **U** | ### `language-reviewer` — Del 4 frozen (6 catches) — norsk-språkkvalitet | # | Check | Defect caught | Sev | U/O | |---|-------|---------------|-----|-----| | 1 | L4 | quote error «Vi» vs «Vi i Nav» (wording misrepresents source) | BLOCK | O → fact-reviewer F2 | | 2 | L2 | anglicism «adressere problemet» | REWORK | **U** | | 3 | L2 | anglicism «på en daglig basis» | REWORK | **U** | | 4 | L1 | verbatim repetition 3× across §1/§4/§6 | REWORK | O → editorial P2 | | 5 | L3 | «det vises til» kanselli-stil in a personal chronicle | REWORK | **U** | | 6 | L5 | monotone cadence (5 same-length sentences) | NICE | **U** | ### `fact-reviewer` — Del 4 frozen/pivoted (6 catches) — faktisk-korrekthet (cold) | # | Check | Defect caught | Verdict | U/O | |---|-------|---------------|---------|-----| | 1 | F1 | **pivot premise never met Step 5** (PIVOT-RISK headline) | 🔴 | **U** | | 2 | F1+F2 | misattribution to wrong originator | 🔴 | **U** | | 3 | F2 | quote precision «Vi» vs «Vi i Nav» (vs source) | 🟡 | O → language L4 | | 4 | F3 | postulated number, no provenance — *searches, finds none* | 🟡 | O → editorial P3 | | 5 | F1 | «Security Champions» as a settled standard that **varies per org** (PIVOT-RISK) | 🔴 | **U** | | 6 | F4+F3 | secondary source for a precise figure («~a third» ≠ «37 %») | 🟡 | **U** | ### `fact-checker` — role on Del 4 (generic fixture, 3 claims) Catches truth defects **cheaply and early, on the moving draft** (Step 5). Its fixture is 3 generic ground-truth claims (EU AI Act 🟢 / GPT-4-by-Anthropic 🔴 / unverifiable 37 % 🟡), not Del 4. Its measured **role** on Del 4 is documented by the `fact-reviewer` fixture: the Security-Champions pivot arrived **after** the Step 5 sweep, so `fact-checker` structurally **never saw** the pivot premise. It is necessary (early/cheap truth gate) but **provably insufficient** — which is the entire reason `fact-reviewer` exists. **U** by pipeline position. ### `persona-reviewer` — resonance/response On Del 4 the persona sweep returned **15 flags across 3 personas and every persona PASS / ready-to-publish** (per the editorial fixture). Its own fixture (jargon-wall sample) shows the 6 response axes (Krok IKKE, Leder-takeaway IKKE, …). Catches **reader-response** defects no other gate measures. **U** by axis. ### `voice-scrubber` — de-AI + chronicle voice drift **No fixture exists.** Its axis (mechanical AI-tells + Norwegian-chronicle voice drift, judged against approved Norwegian editions) is measured by no other gate, and uniquely it **applies** edits (Pass 1) and maintains a drift-log — it is not even part of the review-report package. Overlap **inconclusive from in-repo fixtures**; see decision below. ## Cross-gate overlap matrix (the shared Del 4 edition) Four genuine overlaps surface on Del 4. The decisive test for each: **does either gate's catch-set subsume the other's?** In every case — **no**. | # | Defect | Gates that catch it | Same defect or same symptom? | Subsumption? | Justification | |---|--------|---------------------|------------------------------|--------------|---------------| | O1 | verbatim repetition | editorial **P2** (in-session, v5) ↔ language **L1** (cold, frozen) | same defect | **neither** | **Cold re-take.** Editorial caught it in-session sharing the author's framing; language re-caught it cold on the frozen version. The agent prompts mandate this overlap explicitly. The value is the independent reading, not a second checklist. | | O2 | quote «Vi» vs «Vi i Nav» | language **L4** (BLOCK) ↔ fact-reviewer **F2** (🟡) | same defect, **two operations** | **neither** | language flags the *wording* misrepresenting the source **without web access**; fact-reviewer *verifies against the actual source via web search*. Different tools, different severities — one catches it if the source is unreachable, the other if the wording reads clean but the source differs. | | O3 | postulated number | editorial **P3** (REWORK) ↔ fact-reviewer **F3** (🟡) | same symptom, **two operations** | **neither** | editorial flags the **absence** of a source/hedge (no search); fact-reviewer **searches for provenance and finds none**. The prompts draw this boundary by hand. A bare number with a *findable* source passes editorial (it has none inline) but is exactly what fact-reviewer's search resolves. | | O4 | small-orgs thread | editorial **A4** (stranded addressee) ↔ content **C5** (unanswered objection) | **adjacent — different defects** | n/a | Same surface topic (small orgs) decomposes into two genuinely different defects: A4 = «the small-business reader leaves with no *action*» (architecture); C5 = «the *argument* never meets the obvious counter and collapses for that class» (logic). Not redundancy — two gates needed to see both faces. | Plus the **fact-checker ↔ fact-reviewer time-axis overlap** (deliberate, not in the matrix because it spans pipeline stages, not one defect): Step 5 runs in-session on the **moving** draft; Step 6.5 re-runs cold on the **frozen/pivoted** draft. **Case 1 (pivot premise) is the proof it's load-bearing** — the pivot arrived after Step 5, so only the cold re-run could catch it. Collapsing the two would re-open the exact gap that motivated Endring 9. Adjacent (not overlap) pairs the prompts separate by design and the Del 4 cases confirm as distinct defects: editorial **P4** (prose contradiction) vs content **C3** (argument-logic contradiction); editorial **A1** (vividness) vs content **C4** (a load-bearing claim a skeptic won't *believe* abstractly). ## Unique catch per gate — none is a subset of another Every one of the seven has **≥1 catch no other gate's fixture surfaces**: - **fact-checker** — early/cheap truth on the moving draft; provably *insufficient* alone (never saw the pivot), which is the case for keeping `fact-reviewer`. - **editorial-reviewer** — **A2 theory-anchor** and **A3 series-title symmetry** are pure blind spots no other gate measures (and were persona-blind on Del 4). - **persona-reviewer** — reader response (Krok/resonans/takeaway); the only gate on that axis. The «PASS yet 8 editorial + 6 argument + 6 language points» result is the whole motivation for the stack. - **content-reviewer** — argument logic (C1/C2/C3/C5 all unique); the only gate that asks *does the reasoning hold?* - **language-reviewer** — anglicisms, kanselli-stil, cadence; the only gate on Norwegian idiom/register/rhythm. - **fact-reviewer** — the **pivot-risk** catches (Cases 1, 5); the only cold post-pivot truth re-run. - **voice-scrubber** — de-AI tells + chronicle voice drift; the only gate that *applies* edits and keeps a drift-log. ## Trim decision — NO TRIM **No gate catches nothing the others don't.** Every gate has ≥1 unique catch on the fixtures, and every one of the four genuine overlaps (O1–O4) is justified — a cold re-take (O1), the same symptom via a different operation (O2, O3), or two distinct defects sharing a surface topic (O4) — with **no subsumption in any direction**. The fact-checker ↔ fact-reviewer overlap is load-bearing by construction (proven by the pivot-premise catch). Per the Steg 20 rule this is the **«redundancy is justified — record and keep»** case for all measurable gates. **`voice-scrubber` specifically:** no in-repo fixture, so its overlap cannot be *measured* here → **«measurement inconclusive; redundancy retained pending a real edition»** (Step 20 On-failure = skip the trim). Its axis is orthogonal by design and it is not part of the review-report package, so there is no redundancy claim to adjudicate even in principle. **Consequence for the count contract:** **no gate removed → counts unchanged.** | Count | Value | Touched? | |-------|-------|----------| | Agents | **19** | no | | Commands | **27** | no | The count contract (`EXPECT_AGENTS=19`, the CLAUDE.md/README agent tables) is **not modified** this step — there is nothing to update because nothing was trimmed. Steg 21 (version bump + count recompute) inherits an unchanged 19/27 baseline. ## Verification - `test -f docs/remediation/overlap-measurement.md` → present (this file). - Per-reviewer **catch** table present (one per gate) + cross-gate overlap matrix. - No gate removed → count contract untouched; `EXPECT_AGENTS` stays 19. (The trim branch's `test-runner.sh exit 0 + same-commit count update` is N/A — no trim.) - `bash scripts/test-runner.sh` run for hygiene regardless → expect exit 0 (repo green, nothing changed but a doc).