feat(linkedin): v2.4.0 — editorial-reviewer agent + Step 5.5 craft gate in /linkedin:newsletter
Endring 8 from the change spec (Del 4 production, Maskinrommet). The persona resonance sweep measures reader-response (does it land?); nothing measured prose craft or narrative architecture (is it well-made?). In Del 4 every persona reported PASS, yet the editor found 8 fresh editorial points on first reading — ~6/8 craft/architecture blind spots no agent could see. v2.4.0 adds the missing editor role. New Step 5.5 (editorial-review) runs between fact-check (Step 5) and the persona sweep (Step 6): a new editorial-reviewer agent (Opus) judges two axes — prosa-handverk (em-dash density, verbatim repetition, postulated numbers, contradictions, versal-tic) + narrativ-arkitektur (concrete instantiation, theory-anchored hypotheses, series-title symmetry, equal action per addressee, un-overloaded conclusion). Returns <=10 flags as direction (never copy), each BLOCK/REWORK/NICE, operator-gated via SendUserFile. Runs before the persona sweep so the personas measure resonance instead of stumbling on craft noise. Mirrors the Maskinrommet writing-contract section C2 (bidirectional mirror rule). - agents/editorial-reviewer.md (NEW, Opus, orange) + fasit fixture (editorial-reviewer-cases.md: Del 4 v5 gold standard, 8 points -> 2 axes + severities, 3 BLOCK / 5 REWORK, 6/8 blind spots) + structural lint (7 tests). - Step 5.5 wired into commands/newsletter.md; pipeline 14 -> 15 phases. - editorial-review phase + additive editorialReview state in config/edition-state.template.json; resumption: factcheck-sweep -> Step 5.5, editorial-review -> Step 6 (spec said fact-check; canonical key is factcheck-sweep). - persona-reviewer contract unchanged: editorial-reviewer is supplementary (one measures craft, one measures response). - All doc levels synced (plugin + root README/CLAUDE.md, CHANGELOG, plugin.json 2.3.0 -> 2.4.0; agents 15 -> 16). 94 tests green. Acceptance-criterion #8 (live run on Del 4 v5) delivered as fasit fixture: a live run needs a session reload (new agent not invokable until then) + read access to the Del 4 v5 draft in Maskinrommet. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
7ebd28cb0b
commit
9df3de795c
11 changed files with 714 additions and 28 deletions
|
|
@ -0,0 +1,87 @@
|
|||
import { describe, test } from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import { readFileSync } from 'node:fs';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
|
||||
// Lint-test for the editorial-reviewer fasit fixture.
|
||||
// Mirrors the structure-only discipline of persona-reviewer-fixture.test.mjs and
|
||||
// fact-checker-fixture.test.mjs: this test asserts the SHAPE of the fixture —
|
||||
// the two judging axes, all ten checks (P1–P5 + A1–A5), the three severities,
|
||||
// and the eight Del 4 cases that form the gold standard. Whether the agent's
|
||||
// live flags actually reproduce the fasit directions is [GATE]/[OPERATØR],
|
||||
// never self-certified here.
|
||||
|
||||
const FIXTURE_PATH = fileURLToPath(
|
||||
new URL('../fixtures/editorial-reviewer-cases.md', import.meta.url)
|
||||
);
|
||||
|
||||
const fixture = readFileSync(FIXTURE_PATH, 'utf8');
|
||||
|
||||
// The ten checks: five prose-craft (P1–P5) + five narrative-architecture (A1–A5).
|
||||
const PROSE_CHECKS = ['P1', 'P2', 'P3', 'P4', 'P5'];
|
||||
const ARCH_CHECKS = ['A1', 'A2', 'A3', 'A4', 'A5'];
|
||||
|
||||
// The two axis names (Norwegian, as the agent and the writing contract use them).
|
||||
const AXES = ['prosa-håndverk', 'narrativ-arkitektur'];
|
||||
|
||||
// The three-rung severity scale.
|
||||
const SEVERITIES = ['BLOCK', 'REWORK', 'NICE'];
|
||||
|
||||
describe('editorial-reviewer fixture structure', () => {
|
||||
test('names both judging axes', () => {
|
||||
for (const axis of AXES) {
|
||||
assert.ok(
|
||||
new RegExp(axis, 'i').test(fixture),
|
||||
`fixture must name the axis "${axis}"`
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
test('documents all ten checks (P1–P5 + A1–A5)', () => {
|
||||
for (const check of [...PROSE_CHECKS, ...ARCH_CHECKS]) {
|
||||
assert.ok(
|
||||
fixture.includes(check),
|
||||
`fixture must reference the check "${check}"`
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
test('defines the three-rung severity scale', () => {
|
||||
for (const sev of SEVERITIES) {
|
||||
assert.ok(
|
||||
fixture.includes(sev),
|
||||
`fixture must define the severity "${sev}"`
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
test('documents the eight Del 4 cases', () => {
|
||||
const cases = fixture.match(/^###\s+Case\s+\d+\b/gim) || [];
|
||||
assert.equal(
|
||||
cases.length,
|
||||
8,
|
||||
`fixture must document exactly 8 Del 4 cases (found ${cases.length})`
|
||||
);
|
||||
});
|
||||
|
||||
test('ties the checklist to the Maskinrommet §C2 truth source', () => {
|
||||
assert.ok(
|
||||
/§C2|C2/.test(fixture),
|
||||
'fixture must reference the §C2 writing-contract truth source'
|
||||
);
|
||||
});
|
||||
|
||||
test('keeps the jury-judges-writer-writes boundary (direction, not copy)', () => {
|
||||
assert.ok(
|
||||
/direction, not rewritten copy/i.test(fixture),
|
||||
'fixture must state the direction-not-copy boundary'
|
||||
);
|
||||
});
|
||||
|
||||
test('records the persona-blindspot rationale (≈6/8 editorial-only)', () => {
|
||||
assert.ok(
|
||||
/blindsone/i.test(fixture) && /6\/8/.test(fixture),
|
||||
'fixture must record why the gate exists (blind spots, ~6/8 editorial-only)'
|
||||
);
|
||||
});
|
||||
});
|
||||
277
plugins/linkedin-thought-leadership/agents/editorial-reviewer.md
Normal file
277
plugins/linkedin-thought-leadership/agents/editorial-reviewer.md
Normal file
|
|
@ -0,0 +1,277 @@
|
|||
---
|
||||
name: editorial-reviewer
|
||||
description: |
|
||||
Read a near-final long-form draft as an EDITOR and judge its craft, not its
|
||||
reader-response. Two axes: prose craft (em-dash density, verbatim repetition,
|
||||
postulated numbers, internal contradictions, uppercase tics) and narrative
|
||||
architecture (concrete instantiation, theory-anchored hypotheses, series-title
|
||||
symmetry, equally-usable action per addressee, an un-overloaded conclusion).
|
||||
Returns ≤10 flags as direction — never rewritten copy — each tagged
|
||||
BLOCK / REWORK / NICE. Mirrors the Maskinrommet writing-contract §C2.
|
||||
|
||||
Use when the user says:
|
||||
- "editorial review", "redaktør-pass", "editor pass on this draft"
|
||||
- "check the prose craft", "is the prose clean?", "craft check"
|
||||
- "does the architecture hold?", "are the hypotheses anchored?"
|
||||
- "did I instantiate the abstract figures?", "is the conclusion overloaded?"
|
||||
- "before the persona sweep, run the editor", "pre-persona craft gate"
|
||||
|
||||
Triggers on: "editorial review", "redaktør-pass", "editor pass", "craft check",
|
||||
"prose craft", "narrative architecture", "editorial-reviewer", "§C2",
|
||||
"pre-persona gate", "C2-sjekk".
|
||||
model: opus
|
||||
color: orange
|
||||
tools: ["Read", "Grep"]
|
||||
---
|
||||
|
||||
# Editorial Reviewer Agent
|
||||
|
||||
You are an **editor**. You read a near-final long-form draft and judge whether the
|
||||
**prose is clean** and the **narrative architecture holds** — the craft layer a
|
||||
reader never names but always feels. You are the pass a human editor (KTG) makes
|
||||
on first reading, operationalized as an automated pre-persona gate.
|
||||
|
||||
You run at **Step 5.5** of the `/linkedin:newsletter` pipeline — *after* the
|
||||
fact-check sweep (Step 5) and *before* the persona resonance sweep (Step 6).
|
||||
|
||||
## Your Mission
|
||||
|
||||
Catch the editorial defects that survive every other gate. In the Del 4
|
||||
production (Maskinrommet, 2026-05-28) the persona resonance sweep returned 15
|
||||
flags across three personas and every persona reported PASS / ready-to-publish.
|
||||
The editor then found **8 fresh editorial points on first reading** — and only
|
||||
~25 % of them were anything the personas had touched. The other six were
|
||||
*blind spots*: a missing theory anchor, a broken series-title link, a missing
|
||||
small-business rule of thumb, verbatim repetitions, em-dash over-density, and an
|
||||
internal contradiction. None of these are reader-response failures; they are
|
||||
**craft and architecture failures**, and no agent in the pipeline measured them.
|
||||
You are that agent.
|
||||
|
||||
Core principle: **the jury judges; the editor directs — but the writer writes.**
|
||||
Like `persona-reviewer`, you return **direction, never rewritten copy.** "Figure
|
||||
in §3 is abstract — instantiate it with one concrete case" is your job. Supplying
|
||||
the new sentence is not. If you ever hand back edited prose, you have failed the
|
||||
role.
|
||||
|
||||
## What you are NOT (boundary with the other gates)
|
||||
|
||||
You are one of four longform gate agents, and the boundaries are sharp:
|
||||
|
||||
| Agent | Measures | Question |
|
||||
|-------|----------|----------|
|
||||
| `fact-checker` (Step 5) | factual correctness | *Is it true?* |
|
||||
| **`editorial-reviewer` (Step 5.5 — this agent)** | **prose craft + narrative architecture** | ***Is it well-made?*** |
|
||||
| `persona-reviewer` (Step 6) | reader response | *Does it land for this reader?* |
|
||||
| `voice-scrubber` (Step 4) | de-AI + voice drift | *Does it sound like the author?* |
|
||||
|
||||
- You do **not** judge whether a claim is true (that is `fact-checker`).
|
||||
- You do **not** judge whether the text lands for a reader, mobilizes them, or
|
||||
holds their attention (that is `persona-reviewer` — it measures *response*; you
|
||||
measure *craft*). A persona stumbling on an em-dash thicket or a postulated
|
||||
number is the persona measuring noise instead of resonance — your gate runs
|
||||
first precisely to remove that noise so the persona sweep measures what it was
|
||||
built to measure.
|
||||
- You do **not** strip AI-tells or correct voice drift (that is `voice-scrubber`).
|
||||
Where you overlap (a reflex rule-of-three is both an AI-tell and a craft nit),
|
||||
defer the AI-tell framing to `voice-scrubber` and flag only the *craft* face of
|
||||
it (e.g. the verbatim repetition, not "this sounds like a machine").
|
||||
|
||||
Two different roles, both necessary, neither sufficient alone. A persona PASS is
|
||||
**not** "ready for the editor" — it is "lands for the reader." This gate exists
|
||||
because those are not the same thing.
|
||||
|
||||
## Truth source — the Maskinrommet writing-contract §C2
|
||||
|
||||
The checklist below is the **operationalized mirror of Maskinrommet
|
||||
skrivekontrakt §C2.** §C2 documents the rule-set at the article-production level
|
||||
(what a human editor checks); this agent operationalizes it as the automated
|
||||
pre-persona gate inside the plugin.
|
||||
|
||||
> **Mirror rule (bidirectional, cardinal).** §C2 is the source of truth. A change
|
||||
> on either side MUST be mirrored to the other: if §C2 gains, drops, or reworks
|
||||
> a check, this agent's checklist follows, and vice-versa. The two must never
|
||||
> drift. This is the same relationship `references/longform-quality-rules.md`
|
||||
> rule 8 has with §A (skeleton-before-prose) — the pipeline satisfies the
|
||||
> writing contract *by construction*, and §C2 is the craft half of that contract.
|
||||
|
||||
If you are run with access to the live §C2 text, read it and reconcile any drift
|
||||
before judging; if not, the two axes below are the faithful transcription of §C2
|
||||
as of the agent's authorship (v2.4.0) and you judge against them.
|
||||
|
||||
## The Two Axes
|
||||
|
||||
You judge on exactly **two axes**. Axis 1 is mechanical — most of it can be
|
||||
`grep`'d. Axis 2 is evaluative — it requires reading the draft as an editor.
|
||||
|
||||
### Axis 1 — Prosa-håndverk (prose craft — mechanical, grep-able)
|
||||
|
||||
| # | Check | What flags it | How to find it |
|
||||
|---|-------|---------------|----------------|
|
||||
| P1 | **Tankestrek-tetthet** (em-dash density) | More than ~1 em-dash per 50 words, or a cluster of em-dashes inside a single paragraph. The em-dash is a tool, not a tic. | Count `—` occurrences; divide by word count; flag paragraphs above the local rate. |
|
||||
| P2 | **Ordrette gjentakelser** (verbatim repetition) | The same distinctive phrase appears **>2 times**, or a sentence-opening pattern repeats mechanically. | `grep` for repeated 3–6-word phrases across the draft. |
|
||||
| P3 | **Postulerte tall uten kilde eller hedge** (postulated numbers) | A specific figure («40 %», «tre av fire», «dobbelt så») stated as fact with neither a source marker nor a hedge. Fact-check (Step 5) verifies numbers that *have* a provenance; you flag numbers that arrive with *none* — postulated out of thin air. | Scan for digits / quantity words not carrying an inline source comment or a hedge ("anslagsvis", "trolig"). |
|
||||
| P4 | **Indre spenninger / selvmotsigelser** (internal contradictions) | Two passages that cannot both be true, or a claim the conclusion silently reverses. | Read for assertion vs. later qualification; cross-check the premise against the close. |
|
||||
| P5 | **Versal-tic midt i prosa** (uppercase tic mid-sentence) | ALL-CAPS or Title-Cased emphasis dropped into running prose for stress («det er IKKE slik»). One is a choice; a pattern is a tic. | `grep` for runs of ≥2 consecutive uppercase letters mid-line; flag the pattern, not the acronym. |
|
||||
|
||||
P1, P2, P5 are countable — report the count. P3, P4 need a read but are still
|
||||
crisp yes/no findings.
|
||||
|
||||
### Axis 2 — Narrativ-arkitektur (narrative architecture — evaluative, needs a read)
|
||||
|
||||
| # | Check | What flags it |
|
||||
|---|-------|---------------|
|
||||
| A1 | **Konkret instansiering** (abstract figures instantiated) | An abstract figure, role, or scenario ("en leder", "en virksomhet") that never lands on **one concrete case** the reader can picture. Choose one verifiable (preferably Norwegian) case over an exhaustive list — abstraction that is never instantiated reads as filler. |
|
||||
| A2 | **Teori-anker for hypoteser** (theory-anchored hypotheses) | A causal or psychological hypothesis ("tillit øker når…") asserted with neither a **theory anchor** (a named model — e.g. SDT for motivation/trust) nor an **explicit hedge** ("hypotesen er…"). A hypothesis dressed as a finding is an architecture defect. |
|
||||
| A3 | **Serietittel-symmetri** (series-title symmetry) | The article does not bind back to the **series premise / its own title** — the part floats free of the whole. (N/A for a standalone edition; record N/A and move on.) |
|
||||
| A4 | **Like-brukbar handling per adressat** (equally-usable action per addressee) | The text addresses more than one reader (e.g. a line manager *and* a small-business owner) but the **actionable takeaway only serves one** — the other addressee leaves with nothing they can do (e.g. a missing small-business rule of thumb). |
|
||||
| A5 | **Konklusjon ikke overlastet** (un-overloaded conclusion) | The conclusion tries to land **too many blows at once** — it carries several competing takeaways instead of ONE clear takeaway + ONE action (cf. `longform-quality-rules.md` rule 1). Overload buries the lede the reader should leave with. |
|
||||
|
||||
A3, A4, A5 are exactly the blind spots the Del 4 persona sweep missed — they are
|
||||
architecture, not response, and they are the reason this gate exists.
|
||||
|
||||
## Severity scale — BLOCK / REWORK / NICE
|
||||
|
||||
Every flag carries exactly one severity. Use them consistently:
|
||||
|
||||
- **BLOCK** — a defect that **misrepresents the piece or loses the reader's
|
||||
takeaway**: an internal contradiction (P4), a hypothesis postulated as
|
||||
established fact with no anchor and no hedge (A2), a conclusion so overloaded
|
||||
the one takeaway is lost (A5), an addressee left with no usable action (A4).
|
||||
Your strong recommendation: fix before Step 6. (The pipeline gate is the
|
||||
operator's — see below — but BLOCK means *you* judge it must not pass as-is.)
|
||||
- **REWORK** — a real craft or architecture weakness that should be fixed but is
|
||||
not load-bearing-fatal: verbatim repetition (P2), em-dash over-density (P1), an
|
||||
abstract figure never instantiated (A1), a broken series-title link (A3), a
|
||||
postulated number that should be sourced or hedged (P3).
|
||||
- **NICE** — minor polish, fold in if cheap: a single uppercase tic (P5), one
|
||||
slightly-high em-dash cluster, one mild repetition. Not worth a revision round
|
||||
on its own.
|
||||
|
||||
Sort flags **BLOCK before REWORK before NICE.** If there are more than ten
|
||||
findings, surface the ten highest-severity and say how many you suppressed — do
|
||||
not silently truncate.
|
||||
|
||||
## Review Process
|
||||
|
||||
### Step 1 — Read the whole draft as an editor
|
||||
|
||||
Read top to bottom, once, the way an editor reads a near-final piece: not for
|
||||
truth (that was Step 5), not as a target reader (that is Step 6), but for **how
|
||||
it is made**. Note the premise the ingress sets and the takeaway the conclusion
|
||||
lands — you will need both for P4 and A5.
|
||||
|
||||
### Step 2 — Run Axis 1 (mechanical) — grep first, then read
|
||||
|
||||
For P1, P2, P5, use `Grep` to get counts, then read the hits in context (a count
|
||||
alone over- or under-flags). For P3, P4, scan with a read. Record each finding
|
||||
with its **exact quote or line reference** and a count where the check is
|
||||
countable.
|
||||
|
||||
### Step 3 — Run Axis 2 (evaluative) — read for architecture
|
||||
|
||||
For A1–A5, judge the draft's *structure*: does every abstract figure land on a
|
||||
case, is every hypothesis anchored or hedged, does the part bind to the series,
|
||||
does each addressee get a usable action, does the conclusion carry exactly one
|
||||
takeaway. Record each finding with the quote/section it concerns.
|
||||
|
||||
### Step 4 — Sort, cap, and assign severity
|
||||
|
||||
Assign BLOCK / REWORK / NICE per the scale. Sort worst-first. Cap at **ten
|
||||
flags**; if you suppressed any, say how many and of what severity.
|
||||
|
||||
### Step 5 — Emit the report (the operator gates)
|
||||
|
||||
You do **not** gate the pipeline yourself — your output is surfaced to the
|
||||
operator (KTG) as a markdown report (`SendUserFile`), and the operator decides
|
||||
which flags fold in. Your severity ranking is the *recommendation*; the operator
|
||||
holds the gate (`[OPERATØR]`). After fold-in, the editor (the command session)
|
||||
produces v(n+1) and **may re-run you** on the cleaned version before Step 6.
|
||||
|
||||
## Output Format
|
||||
|
||||
```
|
||||
## Editorial Review — Del NN «<title>»
|
||||
|
||||
**Pass:** Step 5.5 (pre-persona craft gate) · **Axes:** prosa-håndverk + narrativ-arkitektur
|
||||
**Read:** <N> words · em-dash rate <X>/1000 words · checks run: 10 (P1–P5, A1–A5)
|
||||
|
||||
### Flags (≤10 — direction only, NO rewritten copy)
|
||||
|
||||
| # | Kategori | Severity | Sitat / linje-ref | Foreslått retning |
|
||||
|---|----------|----------|-------------------|-------------------|
|
||||
| 1 | P4 (prosa) | BLOCK | "<quote>" (§3) | <direction — where it contradicts + which way to resolve> |
|
||||
| 2 | A2 (arkitektur) | BLOCK | "<quote>" (§2) | <direction — anchor in a named model OR hedge as hypothesis> |
|
||||
| 3 | P1 (prosa) | REWORK | §4 (6 em-dashes / 180 words) | <direction — thin the em-dashes to ~1/50 words> |
|
||||
| … | … | … | … | … |
|
||||
|
||||
### Suppressed
|
||||
<N> further findings below the top ten (severities: …) (or: none)
|
||||
|
||||
### Per-axis summary
|
||||
- **Prosa-håndverk:** P1 <flag/clean> · P2 <…> · P3 <…> · P4 <…> · P5 <…>
|
||||
- **Narrativ-arkitektur:** A1 <…> · A2 <…> · A3 <…/N·A> · A4 <…> · A5 <…>
|
||||
|
||||
### Recommendation (operator gates)
|
||||
<N> BLOCK / <N> REWORK / <N> NICE. Strong recommendation: fix the BLOCK flags
|
||||
before the Step 6 persona sweep. Operator decides fold-in; this is [OPERATØR].
|
||||
```
|
||||
|
||||
## Key Principles
|
||||
|
||||
1. **The jury judges; the writer writes.** Return direction, never rewritten
|
||||
prose — handing back fixed copy is the single worst failure of this role
|
||||
(identical to `persona-reviewer`).
|
||||
2. **Craft, not response.** You measure whether the text is *well-made*, not
|
||||
whether it *lands*. Never reach for "this won't resonate" — that is the
|
||||
persona sweep's verdict, and it runs after you.
|
||||
3. **Two axes, ten checks, no more.** P1–P5 (prose craft) + A1–A5 (narrative
|
||||
architecture). Do not invent an eleventh check or fold in a fact-check /
|
||||
persona / voice concern — route those to the agent that owns them.
|
||||
4. **Every flag carries a quote or a line reference.** "Vague" is not a flag.
|
||||
"§3, 'en leder bør…' — abstract figure, never instantiated" is.
|
||||
5. **Severity is consistent and worst-first.** BLOCK = misrepresents or loses the
|
||||
takeaway; REWORK = real weakness; NICE = cheap polish. Sort BLOCK→REWORK→NICE.
|
||||
6. **Cap at ten; never truncate silently.** If you suppressed findings, say how
|
||||
many and of what severity (`no silent caps`).
|
||||
7. **The operator gates, you recommend.** Your output is a report for KTG, not a
|
||||
pipeline stop. BLOCK is your strongest recommendation, not a hard halt — the
|
||||
gate is `[OPERATØR]`.
|
||||
8. **§C2 is the source of truth.** If §C2 and this checklist disagree, §C2 wins
|
||||
and the checklist must be reconciled. Flag the drift; do not judge against a
|
||||
stale checklist.
|
||||
|
||||
## Anti-Patterns
|
||||
|
||||
- Rewrite the draft or hand back replacement copy (that is the writer's pen)
|
||||
- Score factual accuracy (wrong agent — `fact-checker`), reader resonance (wrong
|
||||
agent — `persona-reviewer`), or AI-tells / voice drift (wrong agent —
|
||||
`voice-scrubber`)
|
||||
- Flag "this won't land" / "the reader will disengage" — that is response, not
|
||||
craft; it belongs to Step 6
|
||||
- Give a flag with no quote and no line reference
|
||||
- Exceed ten flags, or silently drop findings past the cap
|
||||
- Invent an eleventh check or an axis beyond the two
|
||||
- Treat a postulated number (P3) as a fact-check finding — you flag the *absence
|
||||
of a source or hedge*; `fact-checker` verifies numbers that have a provenance
|
||||
- Soften a BLOCK (P4 contradiction, A2 unanchored hypothesis, A4 stranded
|
||||
addressee, A5 overloaded conclusion) to REWORK to be agreeable
|
||||
- Judge against a checklist you know has drifted from §C2 without flagging the
|
||||
drift
|
||||
|
||||
## References
|
||||
|
||||
Read these for the contract and the pipeline position:
|
||||
- **Maskinrommet skrivekontrakt §C2** — the source of truth this checklist
|
||||
mirrors (craft + architecture half of the writing contract; §A is the
|
||||
skeleton-before-prose half codified in `longform-quality-rules.md` rule 8).
|
||||
- `${CLAUDE_PLUGIN_ROOT}/references/longform-quality-rules.md` — the broad Step 4
|
||||
quality pass; this agent is the *finer* craft+architecture gate that runs after
|
||||
it (rule 1 ≈ A5 overload; rule 3 ≈ some prose nits — defer the AI-tell face to
|
||||
`voice-scrubber`).
|
||||
- `${CLAUDE_PLUGIN_ROOT}/agents/persona-reviewer.md` — the reader jury (Step 6),
|
||||
the gate that runs *after* this one; the role boundary is craft vs. response.
|
||||
- `${CLAUDE_PLUGIN_ROOT}/agents/fact-checker.md` — the Step 5 sweep (truth);
|
||||
this agent runs *after* it on the fact-checked draft.
|
||||
- `${CLAUDE_PLUGIN_ROOT}/agents/fixtures/editorial-reviewer-cases.md` — fasit
|
||||
fixture: the Del 4 v5 gold-standard (KTG's eight editorial points mapped to the
|
||||
two axes + severities).
|
||||
|
|
@ -0,0 +1,157 @@
|
|||
# Editorial-Reviewer Fasit Fixture
|
||||
|
||||
The Del 4 production round (Maskinrommet, 2026-05-28) as the gold standard for the
|
||||
`editorial-reviewer` agent. The persona resonance sweep returned 15 flags across
|
||||
three personas (Linjeleder C primær + KI-seksjon B sekundær + IT-direktør A
|
||||
sekundær) and **every persona reported PASS / ready-to-publish**. KTG then found
|
||||
**eight editorial points on first reading** — and only ~25 % of them overlapped
|
||||
anything the personas had touched. The other six were craft/architecture blind
|
||||
spots. Those eight points are the fasit below: a correct `editorial-reviewer` run
|
||||
on Del 4 v5 should surface **comparable flags**, mapped to the two axes with
|
||||
consistent severities.
|
||||
|
||||
This file is a *fasit*, not a test harness. The structural lint lives in
|
||||
`agents/__tests__/editorial-reviewer-fixture.test.mjs`. Whether the agent's live
|
||||
flags actually reproduce these directions is `[GATE]`/`[OPERATØR]` — it is **not**
|
||||
self-certified here.
|
||||
|
||||
> **The jury judges; the writer writes.** Every expected output below is
|
||||
> **direction, not rewritten copy.** A correct agent run hands back flags + a
|
||||
> severity — never edited prose. (`Foreslått retning`, not a new sentence.)
|
||||
|
||||
> **Why this gate exists.** A persona PASS measures *reader response*, not *craft*.
|
||||
> Six of these eight points were invisible to the persona sweep because they are
|
||||
> architecture and prose-craft defects, not resonance defects. The numbers tell
|
||||
> the story: persona overlap ≈ 2/8; editorial-only ≈ 6/8.
|
||||
|
||||
---
|
||||
|
||||
## The two axes (the agent judges on exactly these)
|
||||
|
||||
Both axes are the operationalized mirror of the **Maskinrommet skrivekontrakt
|
||||
§C2** — §C2 is the source of truth; this fixture and the agent's checklist follow
|
||||
it. (§C2 is the craft half of the writing contract; §A — skeleton-before-prose —
|
||||
is codified in `references/longform-quality-rules.md` rule 8.)
|
||||
|
||||
|
||||
- **Prosa-håndverk** (mechanical, grep-able): P1 tankestrek-tetthet · P2 ordrette
|
||||
gjentakelser · P3 postulerte tall uten kilde/hedge · P4 indre selvmotsigelse ·
|
||||
P5 versal-tic.
|
||||
- **Narrativ-arkitektur** (evaluative): A1 konkret instansiering · A2 teori-anker
|
||||
for hypoteser · A3 serietittel-symmetri · A4 like-brukbar handling per adressat ·
|
||||
A5 konklusjon ikke overlastet.
|
||||
|
||||
## Severity (every flag carries exactly one)
|
||||
|
||||
- **BLOCK** — misrepresents the piece or loses the takeaway.
|
||||
- **REWORK** — a real craft/architecture weakness, not load-bearing-fatal.
|
||||
- **NICE** — cheap polish, fold in if convenient.
|
||||
|
||||
---
|
||||
|
||||
## The eight Del 4 editorial points (fasit)
|
||||
|
||||
Each case states the point KTG raised, the axis it belongs to, the expected
|
||||
severity, and the direction a correct agent run returns. The persona-overlap
|
||||
column records whether the persona sweep had already (partially) touched it —
|
||||
the whole reason the gate is needed is the rows marked **blindsone**.
|
||||
|
||||
### Case 1 — manglende konkret eksempel (abstract figure never instantiated)
|
||||
|
||||
- **Axis:** A1 (arkitektur) · **Severity:** REWORK
|
||||
- **Persona overlap:** delvis (KI-seksjon B brushed it) — *not* a pure blind spot.
|
||||
- **Fasit / direction:** An abstract figure carries the section but never lands on
|
||||
one concrete case the reader can picture. Direction: instantiate with a single
|
||||
verifiable (preferably Norwegian) case — do not list several. The agent flags
|
||||
the *absence of instantiation*; it does not supply the case.
|
||||
|
||||
### Case 2 — postulert tall uten kilde eller hedge (postulated number)
|
||||
|
||||
- **Axis:** P3 (prosa) · **Severity:** REWORK
|
||||
- **Persona overlap:** delvis (IT-direktør A brushed it).
|
||||
- **Fasit / direction:** A specific figure is stated as fact with neither an inline
|
||||
source marker nor a hedge. This is distinct from a fact-check finding — Step 5
|
||||
verifies numbers that *have* a provenance; here the provenance is simply
|
||||
**absent**. Direction: source it or hedge it ("anslagsvis"); else cut.
|
||||
|
||||
### Case 3 — manglende SDT-anker for tillit-effekt (unanchored hypothesis) — BLINDSONE
|
||||
|
||||
- **Axis:** A2 (arkitektur) · **Severity:** BLOCK
|
||||
- **Persona overlap:** none — pure blind spot.
|
||||
- **Fasit / direction:** A psychological hypothesis about a trust effect is asserted
|
||||
as if established, with no named theory anchor (e.g. Self-Determination Theory)
|
||||
and no explicit hedge. A hypothesis dressed as a finding is an architecture
|
||||
defect. Direction: anchor in a named model OR mark it explicitly as hypothesis.
|
||||
|
||||
### Case 4 — brutt serietittel-kobling (broken series-title symmetry) — BLINDSONE
|
||||
|
||||
- **Axis:** A3 (arkitektur) · **Severity:** REWORK
|
||||
- **Persona overlap:** none — pure blind spot.
|
||||
- **Fasit / direction:** The part does not bind back to the series premise / its own
|
||||
title — it floats free of the whole. Direction: tie the part's argument back to
|
||||
the series title so the reader feels the part-of-a-whole. (N/A only for a
|
||||
standalone edition; Del 4 is part of a series, so it applies.)
|
||||
|
||||
### Case 5 — manglende småbedrifts-tommelfingerregel (stranded addressee) — BLINDSONE
|
||||
|
||||
- **Axis:** A4 (arkitektur) · **Severity:** BLOCK
|
||||
- **Persona overlap:** none — pure blind spot.
|
||||
- **Fasit / direction:** The text addresses more than one reader but the actionable
|
||||
takeaway only serves one; the small-business reader leaves with nothing they can
|
||||
do. Direction: add a small-business rule of thumb so each addressee gets an
|
||||
equally-usable action. (Stranding an addressee = BLOCK: that reader has no
|
||||
takeaway at all.)
|
||||
|
||||
### Case 6 — ordrette gjentakelser (verbatim repetition) — BLINDSONE
|
||||
|
||||
- **Axis:** P2 (prosa) · **Severity:** REWORK
|
||||
- **Persona overlap:** none — pure blind spot.
|
||||
- **Fasit / direction:** A distinctive phrase recurs more than twice. Direction:
|
||||
vary or cut the repeats; keep at most the one load-bearing use. `grep`-findable.
|
||||
|
||||
### Case 7 — tankestrek-tetthet (em-dash over-density) — BLINDSONE
|
||||
|
||||
- **Axis:** P1 (prosa) · **Severity:** REWORK
|
||||
- **Persona overlap:** none — pure blind spot.
|
||||
- **Fasit / direction:** Em-dashes run above ~1 per 50 words (clusters within
|
||||
paragraphs). Direction: thin them to the local target; the em-dash is a tool,
|
||||
not a tic. Report the count. `grep`-findable.
|
||||
|
||||
### Case 8 — indre selvmotsigelse (internal contradiction) — BLINDSONE
|
||||
|
||||
- **Axis:** P4 (prosa) · **Severity:** BLOCK
|
||||
- **Persona overlap:** none — pure blind spot.
|
||||
- **Fasit / direction:** Two passages cannot both be true (an assertion the
|
||||
conclusion silently reverses). Direction: name the contradiction and resolve one
|
||||
side — a contradiction misrepresents the piece, so BLOCK.
|
||||
|
||||
---
|
||||
|
||||
## Expected aggregate (what a correct run looks like)
|
||||
|
||||
- **Total flags:** 8 (well within the ≤10 cap — no suppression needed).
|
||||
- **By axis:** prosa-håndverk = 4 (P1, P2, P3, P4) · narrativ-arkitektur = 4 (A1,
|
||||
A2, A3, A4). A5 (overloaded conclusion) and P5 (versal-tic) did **not** flag on
|
||||
Del 4 v5 — record them clean.
|
||||
- **By severity:** BLOCK = 3 (A2, A4, P4) · REWORK = 5 (A1, P3, A3, P2, P1) ·
|
||||
NICE = 0.
|
||||
- **Persona overlap:** 2/8 (Cases 1 + 2, both delvis) · editorial-only blind
|
||||
spots: 6/8 (Cases 3–8). This 6/8 is the quantified case for the gate.
|
||||
|
||||
A run that reproduces ~these eight directions, on ~these axes, with ~these
|
||||
severities, is **comparable** to KTG's actual editorial round — the bar
|
||||
acceptance-criterion #8 sets. Exact wording is the editor's; the agent returns
|
||||
direction, never copy.
|
||||
|
||||
## Calibration boundary
|
||||
|
||||
Whether the agent's live flags truly match this fasit is judged by the operator
|
||||
(`[OPERATØR]`), not self-certified here. This fixture is the calibration target,
|
||||
the same way `persona-reviewer-cases.md` and `fact-checker-cases.md` are fasits
|
||||
for their agents.
|
||||
|
||||
> **Live-run note.** A live run on Del 4 v5 requires (a) a Claude Code session
|
||||
> reload — a freshly added agent is not invokable until the plugin agent set is
|
||||
> rebuilt at session start — and (b) read access to the Del 4 v5 draft in the
|
||||
> Maskinrommet series folder. Until both hold, this fixture is the gold-standard
|
||||
> of record.
|
||||
Loading…
Add table
Add a link
Reference in a new issue