Two new pipeline phases gate the spine before any prose is written: - Step 2.5 — Skeleton + section pitch: writes <serie>/NN-skjelett.md with the five-line spine (premiss / problem / anbefaling / gevinst / vei videre) + one-line section pitches. Operator-gate (JA / REVIDER / NEI) AND parallel persona-skjelett-sweep must both return JA before the pipeline can advance. - Step 3a — Spine prose: one paragraph per section against the gated skeleton, ~20-30% of final edition length. Operator-gate on whether the axis lands now that there is prose on it. Old Step 3 (Draft) split into 3a (spine) and 3b (full expansion); 3b owns the multi-session draft-cursor logic. Third persona-reviewer mode added: skjelett (alongside resonans + konverter). Five spine axes scored HOLDER / TVILER / MANGLER, max 3 direction-only flags, per-pitch section-pay-in check. Reads the skeleton + pitches only. Pipeline grows from 11 to 13 phases; commands (24) and agents (14) counts unchanged. Encodes the Maskinrommet writing-contract section A discipline (premiss / problem / anbefaling / gevinst / vei videre) into the pipeline. Empirically motivated by the Seres-serien Del 3 + Del 4 production: a spine error caught at the skeleton stage costs 5-15 min, the same error caught at Step 6 (resonance) costs 4-12 h, post-lock it costs a day of cascading rework (delingstekst, hooks, carousel, doc refs). Backward-compatible: existing editions stop at currentPhase: "research" and now resume at Step 2.5 instead of Step 3 — an intended deterministic improvement, never a contract break. Steps 1, 2, 4-10 bit-for-bit unchanged. Renderers (build-html.mjs, build-linkedin.mjs) untouched. New phase strings in edition-state.template.json _doc.phases: - skeleton-pitch (between research and draft) - spine-prose (between skeleton-pitch and draft) Files changed (10): - plugin.json: 2.0.0 -> 2.1.0 - CHANGELOG.md: new [2.1.0] entry - CLAUDE.md (plugin + marketplace): pipeline 11->13 phases noted - README.md (plugin + marketplace): What's New v2.1.0 + version row - agents/persona-reviewer.md: third mode skjelett added; resonans + konverter unchanged - commands/newsletter.md: Step 2.5 + 3a + 3b sections, resumption + pipeline tables - config/edition-state.template.json: 11 -> 13 phases in _doc.phases - references/longform-quality-rules.md: Rule 8 (Skjelett foer prosa) Verification: 9/9 criteria PASS pre-commit. Phase strings consistent across template + command + resumption table. Renderer files git-untouched. All 11 original step headings preserved (Step 0/1/2/4-10). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
46 lines
2.9 KiB
JSON
46 lines
2.9 KiB
JSON
{
|
|
"_doc": {
|
|
"purpose": "Schema for edition-state.json — deterministic resumption state for a newsletter edition in production. Holds the current phase + per-article status so /linkedin:newsletter (Step 0) can resume exactly where a prior session stopped.",
|
|
"decision": "G — production state lives in the serie-mappe (e.g. /Users/ktg/repos/maskinrommet/serier/<slug>/linkedin/edition-state.json), NOT in the plugin. This file is the schema-defining TEMPLATE only; copy + fill it in the serie-mappe when producing an edition.",
|
|
"complements": "edition-config.json (static: calendar, freshness, captions) and the human-readable edition-HANDOVER.md (narrative state, fasit §5.2). edition-state.json is the lightweight machine-readable companion for deterministic resumption.",
|
|
"lifecycle": "/linkedin:newsletter reads this in Step 0 and rewrites it at every phase transition. Article keys mirror edition-config.json (zero-padded strings: \"01\", \"02\", ..., or \"samle\").",
|
|
"phases": [
|
|
"load-context — read state/HANDOVER, voice profile, persona library, series brief (Step 0)",
|
|
"brief-calibration — angle, voice, audience personas, key points, leader-takeaway (Step 1)",
|
|
"research — parallel scoped mandates → verified notes, triangulation (Step 2)",
|
|
"skeleton-pitch — five-line skeleton (premise/problem/recommendation/payoff/forward) + section pitches, operator gate + persona-skjelett-sweep BEFORE prose (Step 2.5)",
|
|
"spine-prose — one paragraph per section against the gated skeleton, operator gate BEFORE full expansion (Step 3a)",
|
|
"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)",
|
|
"persona-sweep-prelock — reader jury, primary wins, convergence to clean YES (Step 6)",
|
|
"annotation — optional annotatable review HTML for a manual pass (Step 7)",
|
|
"lock-delivery — LOCK → POST.html all-in-one-place deliverable (Step 8)",
|
|
"hook-conversion-gate — persona gate on distribution text post-lock: would YOU click? (Step 9)",
|
|
"scheduling — register edition in plugin queue/state for native LinkedIn scheduling (Step 10)"
|
|
],
|
|
"articleStatusValues": ["pending", "in-progress", "locked", "scheduled"]
|
|
},
|
|
"schemaVersion": 1,
|
|
"series": {
|
|
"slug": "<series-slug>",
|
|
"title": "<Series title>"
|
|
},
|
|
"currentArticle": "01",
|
|
"currentPhase": "load-context",
|
|
"updatedAt": "<ISO-8601 timestamp>",
|
|
"articles": {
|
|
"01": {
|
|
"title": "<Article 1 title>",
|
|
"phase": "load-context",
|
|
"status": "pending",
|
|
"factcheckLog": null,
|
|
"personaSweep": {
|
|
"resonance": null,
|
|
"conversion": null
|
|
},
|
|
"locked": false,
|
|
"scheduled": null
|
|
}
|
|
}
|
|
}
|