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
|
|
@ -13,6 +13,7 @@
|
|||
"draft — full prose expansion against the gated spine; may span sessions (Step 3b)",
|
||||
"consistency-quality — threads, premise→conclusion arc, AI-slop removal, formatting dose (Step 4)",
|
||||
"factcheck-sweep — risk-sorted, guilty-until-disproven, verification log (Step 5)",
|
||||
"editorial-review — editor's craft gate: prose-craft (em-dash density, verbatim repetition, postulated numbers, contradictions, versal-tic) + narrative-architecture (concrete instantiation, theory-anchored hypotheses, series-title symmetry, equal action per addressee, un-overloaded conclusion), ≤10 flags BLOCK/REWORK/NICE, operator-gated via SendUserFile BEFORE the persona sweep (Step 5.5)",
|
||||
"persona-sweep-prelock — reader jury, primary wins, convergence to clean YES (Step 6)",
|
||||
"annotation — optional annotatable review HTML for a manual pass (Step 7)",
|
||||
"visual-assets — cover (+ optional inline figures) or carousel deck: brief → generate → operator-gate → approve, BEFORE lock so build-linkedin.mjs picks them up (Step 7.5)",
|
||||
|
|
@ -21,6 +22,7 @@
|
|||
"scheduling — register edition in plugin queue/state for native LinkedIn scheduling (Step 10)"
|
||||
],
|
||||
"articleStatusValues": ["pending", "in-progress", "locked", "scheduled"],
|
||||
"editorialReview": "Per-article editorial-review record written by Step 5.5 (editorial-review phase). Runs AFTER fact-check (Step 5) and BEFORE the persona sweep (Step 6): the editorial-reviewer agent judges CRAFT (prose-craft + narrative-architecture), not reader-response, mirroring the Maskinrommet skrivekontrakt §C2. The report (≤10 flags, each with kategori P1–P5/A1–A5, quote/line-ref, direction, severity BLOCK/REWORK/NICE) is surfaced to the operator via SendUserFile; the operator decides which flags fold in. Shape: { reportPath, flagCount, byAxis: { prosa, arkitektur }, bySeverity: { block, rework, nice }, foldedIn, waived, status }. status ladder: pending → reviewed → folded. null until Step 5.5 runs. This is the craft companion to factcheckLog (truth) and personaSweep (response).",
|
||||
"visualAssets": "Per-article visual-asset record written by Step 7.5 (visual-assets phase). Runs BEFORE lock because render/build-linkedin.mjs picks up linkedin/NN/cover.png + the edition-config credit/caption when it builds POST.html — generating images after lock would force a re-render. Shape: { format: \"standard\" | \"carousel\"; cover: { brief, route, candidates[], approved, status }; figures: [ { id, brief, placement, status } ]; carousel: null | { source, pdf, status } }. format \"standard\" = cover + optional inline figures (cover.png is mandatory per the KTG cover-directive); format \"carousel\" = typografisk deck via render/build-carousel.mjs instead of cover+inline (cover/figures stay empty). route: \"mcp-image\" (default, via mcp__mcp-image__generate_image) | \"external\" (DALL·E / Midjourney / photographer → linkedin/NN/cover-raw.png). status ladder: pending → briefed → generated → approved. candidates[] holds the cover-v<N>-kandidat.png attempts; approved is the fixed approved name (\"cover.png\") once the operator-gate passes. figures[].id = \"fig1\"..; placement = section reference in NN-utkast.md (figures are referenced in the draft via  and uploaded manually in the LinkedIn editor — build-linkedin.mjs does NOT embed them). Naming convention: cover.png (approved, fixed — what build-linkedin.mjs reads) | cover-v<N>-kandidat.png (attempts) | cover-raw.png (optional external pre-edit source) | fig<N>.png (inline). credit + caption are recorded in <serie>/linkedin/image-credit-caption.md and flow into edition-config.json coverCredit + captions[NN]."
|
||||
},
|
||||
"schemaVersion": 1,
|
||||
|
|
@ -38,6 +40,7 @@
|
|||
"status": "pending",
|
||||
"immutableRules": null,
|
||||
"factcheckLog": null,
|
||||
"editorialReview": null,
|
||||
"personaSweep": {
|
||||
"skeleton": null,
|
||||
"resonance": null,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue