feat(linkedin): v2.2.0 — harden longform gates from 2nd production run

Implements the 6-change spec from the Seres-serien production
(linkedin-plugin-endringsspec.md). All acceptance criteria met.

1. Avoid-patterns (modell-/navne-katalog, completeness-over-reader-action,
   self-referential overhead openings) → longform-quality-rules.md (rule 1+3)
   + user-profile.template.md.
2. Persona gate now BLOCKING with explicit hard-fail list (primær mistet meg /
   doesn't own action / sjargong-mur / modell-navne-katalog → BLOCK;
   "JA med store forbehold" = NEI) → persona-reviewer.md + personas.template.md.
3. Fact-check declared orthogonal to narrative strength + post-cutoff
   web-search mandate + high-frequency-error checklist → fact-checker.md.
4. NEW agent voice-scrubber.md (Opus) — de-AI scrub + Norwegian-chronicle
   voice-drift; gold standard = approved Norwegian editions, NOT the English
   post corpus. Wired into newsletter.md Step 4.
5. Operator gates = render+annotate rounds (build-html.mjs to file://) as
   primary flow, AskUserQuestion as receipt/fallback → newsletter.md 2.5+3a.
6. Edition state reconciled with STATE.md (ONE-system). edition-HANDOVER
   template deleted; narrative to <serie>/STATE.md, machine data
   (factcheckLog, personaSweep, immutableRules) to edition-state.json.

Agents 14 to 15; commands unchanged (24). Backward-compatible (additive
state-shape only). Docs updated across all three levels + CHANGELOG.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-05-28 20:50:56 +02:00
commit 4ed9717627
15 changed files with 494 additions and 152 deletions

View file

@ -30,6 +30,12 @@ they will do about it.
about it.
- If the reader cannot state the takeaway in one sentence, the text is not done —
tighten until they can.
- **Serve what the reader can DO, not what the author knows.** The text exists to
give the *primær* reader (the non-technical line manager) something they can act
on from their own chair — not to demonstrate the author's breadth. Completeness
is not a virtue: if a passage exists to be thorough rather than to move the
reader's decision forward, cut it. Choose ONE concrete, verifiable (preferably
Norwegian) case over an exhaustive list.
**Pass/flag:** PASS when the one-takeaway + one-action is stated and unmistakable;
FLAG when the text carries two competing takeaways or ends without a concrete
@ -61,8 +67,20 @@ Norwegian):
content actually enumerates three things)
- «i en stadig mer kompleks verden» (and equivalent throat-clearing openers)
- tacked-on summary sentences that restate what was just said
- **modell-/navne-katalog** — reeling off product names, model names, or
benchmarks (Qwen3-14B, Ministral 3, SWE-bench, Arena, «parametere», «vekter»)
for completeness' sake. A list of names is a jargon wall to the primær reader;
pick ONE concrete, verifiable case instead (see rule 1). This is a **hard fail
for the primær persona**, not a stylistic nit — it is the failure mode that
nearly shipped in the Seres process.
- **selvrefererende overhead-åpning** — meta-commentary about what the text will
or will not do, warm-ups, and openers like «Det er bra. Det er ikke det denne
teksten handler om». Start on the reader's problem, not on the text's own
framing.
**Pass/flag:** PASS when none appear; FLAG (with count) and remove each occurrence.
**Pass/flag:** PASS when none appear; FLAG (with count) and remove each
occurrence. A modell-/navne-katalog or a sjargong-mur is a hard fail (treat as
BLOCK-level for the primær reader in the persona sweep), not a soft flag.
### 4. Generell, ikke etat-/person-spesifikk (general, not org-/person-specific)