Part of epic #2164. Independent of other phases (complements #2172, which covers prose-level anti-patterns; this covers the story-level doctrine upstream of prose). Design record: docs/plans/2026-07-04-creative-writing-quality-engine.md
Coverage audit finding: PortOS built the editor — the 68-check registry polices craft violations after drafting — but not the curriculum. autonovel's CRAFT.md injects craft doctrine into every generation prompt before the writer model drafts, and weighted worldbuilding at 40% of its foundation score. Prevention up-front is far cheaper than detect-and-revise later, especially in autonomous runs where nobody is watching the intermediate output. Since Series Autopilot calls these same generation stages, landing doctrine here automatically upgrades autonomous mode.
Gaps confirmed by audit (2026-07-04)
- Sanderson's Laws appear NOWHERE — not in
universeBuilderExpand.js buildExpansionPrompt, not as an editorial check.
universe-character-expand.md asks for motivations/fears but no Ghost→Wound→Lie→Want→Need chain, no Three Sliders, no declared arc type — the arc.*/character.* checks infer what they could reconcile.
- Try-fail rhythm is detection-only (
plot.structure-momentum flags a "sagging middle with no try-fail rhythm") — no prompt mandates it at generation.
- Beat rules ("Catalyst must be external; Break Into Two must be a choice; All Is Lost includes a death") and MICE thread-nesting are absent.
Tasks
Worldbuilding doctrine (biggest gap — absent on BOTH generation and review sides)
Character framework (generation-side)
Structure rules at generation
Migrations + hygiene
Part of epic #2164. Independent of other phases (complements #2172, which covers prose-level anti-patterns; this covers the story-level doctrine upstream of prose). Design record:
docs/plans/2026-07-04-creative-writing-quality-engine.mdCoverage audit finding: PortOS built the editor — the 68-check registry polices craft violations after drafting — but not the curriculum. autonovel's CRAFT.md injects craft doctrine into every generation prompt before the writer model drafts, and weighted worldbuilding at 40% of its foundation score. Prevention up-front is far cheaper than detect-and-revise later, especially in autonomous runs where nobody is watching the intermediate output. Since Series Autopilot calls these same generation stages, landing doctrine here automatically upgrades autonomous mode.
Gaps confirmed by audit (2026-07-04)
universeBuilderExpand.jsbuildExpansionPrompt, not as an editorial check.universe-character-expand.mdasks for motivations/fears but no Ghost→Wound→Lie→Want→Need chain, no Three Sliders, no declared arc type — thearc.*/character.*checks infer what they could reconcile.plot.structure-momentumflags a "sagging middle with no try-fail rhythm") — no prompt mandates it at generation.Tasks
Worldbuilding doctrine (biggest gap — absent on BOTH generation and review sides)
buildExpansionPrompt(server/services/universeBuilderExpand.js— code-built prompt, no template migration): limitations > powers (Sanderson's Second Law); magic/tech costs must DRIVE plot decisions, not decorate; solutions using established rules must be foreshadowed (First Law); iceberg depth (imply more than you state); interconnection ("pulling one thread should move everything"); 2–3 societal implications per major system; sensory signature per location.checkRegistry.js:world.unforeshadowed-solution(a plot problem solved by a rule/power the reader was never shown — deus ex machina's worldbuilding sibling) andworld.cost-free-power(an ability used at a decisive moment with no cost/limitation on the page). Series scope, LLM kind, reconciled against universe canon so an established-and-planted rule is NOT flagged.Character framework (generation-side)
data.reference/prompts/stages/universe-character-expand.md+ the Story Builder characters step to elicit: Ghost → Wound → Lie → Want → Need chain (with the checkable tests: "can you state the Lie in one sentence? is the Truth its direct opposite? does the Ghost causally explain the Lie?"), Three Sliders (proactivity/likability/competence 1–10 with the rule: HIGH on ≥2, or HIGH on one with clear growth; all-low = boring, all-high-from-start = Mary Sue), declared arc type (positive/negative/flat), ≥2 secrets.server/lib/storyBible.js) + Zod parity + character sheet UI fields; optional (older records without them stay valid — compatibility across installs).arc.transitions/arc.regression/arc.climax-agency/character.consistencyreceive the authored Lie/Want/Need/arc-type when present so verdicts compare plan vs delivery instead of inferring both.Structure rules at generation
pipeline-season-episodes.md/ beat-sheet prompts: try-fail mandate ("60%+ of middle scenes end 'Yes, but' or 'No, and' — clean successes stall momentum"), beat rules (Catalyst external; Break Into Two is a protagonist choice; All Is Lost includes a death — literal or of a hope/relationship/identity), and climax = the protagonist's hardest ACTIVE choice between Want and Need.pipeline-arc-overview.md: MICE-style thread nesting guidance — threads close in reverse order of opening; name the opening/closing thread per season.server/lib/styleGuide.js→ prompt injection): style is not ornament, it creates the world; prefer strong nouns/verbs over adjective-noun clichés ("ancient wisdom", "piercing gaze", "heavy silence").Migrations + hygiene
universe-character-expand.md,pipeline-season-episodes.md,pipeline-arc-overview.md) needscripts/migrations/NNN-*.jskeyed on old shipped hash + thesetup-data.jsdrift-warning mirror, line-ending-normalized (stage-prompt migration rule).server/lib/promptTemplate.js.