pipelines/STORYDEPTH_STORY_CRAFT_LENS_FAMILY_2026-07-27.md
Axis owner: read-only design-research analyst, 2026-07-27. Scope: design the lens family that audits
DRAMATURGY (promises, arc shape, motif, emotional curve) as opposed to DESIGN (systems, feel, economy,
presentation), which is what all 40 rostered lenses audit today. Every claim below is cited to a file
read this session; every absence claim is positive-controlled. Nothing here is applied — this is the
design brief the lens waves and the schema passes execute from.
Provenance of the question: Josh, 2026-07-27 — "how can we make sure we get the appropriate passes and
lenses and enrichments and enhancements for the story line of each and every arc, side story, main
story, relationship, etc. so they all hold depth and they all flow end to end? How's everything been
getting wired up here so everything we've worked on makes it into the factory?" — asked immediately
after he authored the Prologue/Ch-1 emotional spine in-conversation (the amulet chain, the mother's
death, the birth-guilt engine, the grudge, the dumb fight, the run, the fall). The brief's job is to
make THAT class of depth a guaranteed, measured, automated property of all 79 nodes and every arc that
crosses them, not a thing that happens when Josh is in the room.
---
Read this session: docs/proposals/SIGNIFICANCE_LENSES.md (33 lenses, the design-lens framework),
docs/proposals/COMPARATOR_LENS_PROGRAM.md (the 40-lens roster + 24 uncovered cells + the wave plan),
docs/DESIGN_GAP_REGISTER.md (45 entries, v1.1), docs/SPINE_SCHEMA_v3.md (the v3.1 beat/fork/state
grammar), harness/gates_config.json (29 gates), harness/check_spine_graph.py,
harness/check_chapter_topography.py, harness/check_layer_register.py, harness/check_seed_housing.py,
harness/check_weave_lifecycle.py, harness/extract_spine_rows.py, docs/CASCADE_RUNBOOK.md,
docs/spine/range_reviews/RR_42.md, docs/spine/CH_13.md (a live node end to end),
docs/proposals/WHOLE_ARC_CONNECTIONS_PASS.md, docs/proposals/WHOLE_ARC_CONNECTIVE_WEB_INVENTORY.md,
docs/proposals/RECASCADE_PUNCHLIST.md, docs/proposals/AMULET_PROVENANCE_BRIEF.md,
docs/spine/companion_cast_designs/{COMPANION_NTALA,PARTY_STRUCTURE}.md,
docs/PRE_5090_BUILD_PLAN.md (the ranked window queue), plus the live registry CSVs.
Corpus scale, measured (not estimated), across docs/spine/CH_*.md:
mark_write … forward_track [...] declarationsin 74 of 79 nodes.
T0_Chapter_Index is 79 rows × 52 columns. intensity 79/79 populated (peak 24 · standard 47 · valley 5 · relief 3). mode_variety_check 79/79. music_mood_tags reads 79/79 filled and is
0/79 real — every cell is the literal `[POPULATE→T8_Region_Pages Section 10 AIVA composition
briefs] placeholder. type` is 33/79 real.
\bMcKee\b, \bTruby\b, \bEgri\b, Save the Cat, John Yorke, Syd Field, Chekhov, Planescape, Firewatch, Life is Strange = 0 files across
docs/ + _source/. Control: \bCampbell\b = 17 files, Aristotle present, Disco Elysium /
Outer Wilds / Pentiment / Kentucky Route Zero / Edith Finch / Nier / Undertale /
Mass Effect all return hits. The matcher works; the zeros are genuine.
rg -F -i "Egri" returns 377 files — every one a substring hit inside intEGRIty/INTEGRITY. Word-bounded \bEgri\b = 0. Recorded here because it
is exactly the class named in memory a-search-that-cannot-match-reports-zero, inverted: a search
that matches EVERYTHING also lies. Any future roster claim about craft teachers must be word-bounded.
source for the fiction, and (b) an explicitly cautioned interpretive overlay —
docs/ESOTERIC_GROUNDING.md §A.7 names the monomyth "a debated universalizer; use for resonance,
not as an ethnographic claim about any single culture." He has never been a pipeline craft
teacher. This matters for §5's strongest objection.
register. intensity is action-intensity (its own gate docstring binds it to HL_0048's peak/valley
pacing rule). type is a structural taxonomy. music_mood_tags is a placeholder. Controls:
the same scan finds intensity, dominant_combat_mode, care_band, reveal, layers immediately.
---
This is not a quality gap. It is an instrumentation gap, and that distinction drives every
recommendation below.
The dramaturgy is already there and it is genuinely good. docs/spine/CH_13.md's body prose runs
two clocks against each other (100,000-year Blombos ochre vs. an apartheid-era mine), gives the
antagonist a clean-handed diary that makes him worse than the Congo machine, and lands the journal as
"the chapter's quiet center of gravity." WHOLE_ARC_CONNECTIONS_PASS.md §3 names **65 cross-arc
through-line chains** across six connection types, plus a verified-PAID protect-list and nine true
orphans. WHOLE_ARC_CONNECTIVE_WEB_INVENTORY.md carries ECV-01…ECV-12 and IR-1… with early-anchor →
late-payoff, mechanic, dependency, no-dead-end, and grounding on every row. The amulet brief
reconciles a newly-authored emotional spine against ten built beats, two hard lines, a two-clock
model, and a registry seam, and finds the one ordering decision that makes it all hold.
And none of it is machine-visible. Concretely:
| dramaturgical fact | where it lives today | machine-readable? | a gate can fail on it? |
|---|---|---|---|
| 65 through-line chains | prose bullets in one proposal | no | no |
| 9 orphan/unpaid callbacks (TL-03…TL-25) | prose bullets + a punchlist | IDs exist, no table | no |
| the amulet chain (Prologue → Ch 2 → Ch 13+ → Ch 76) | a brief that is explicitly not applied | no | no |
| companion arc shape | 11 companion design docs, prose | no | no |
| per-node emotional register | nowhere | n/a | no |
| within-node emotional movement | body prose only | no | no |
| motif recurrence (journal, ochre, sealed letter, first vril gesture) | scattered across 79 files | no | no |
| community mark forward-tracks | 76 typed declarations, gate-checked | yes | yes |
That last row is the whole thesis of this brief. check_spine_graph.py already runs, at ERROR tier,
cross-file, teeth-verified: *every declared mark_write.forward_track target chapter must carry an
in:-line containing the community token.* **That is a promise→payoff continuity tooth that works
today.** It is scoped to exactly one promise class (community marks). Everything in §2 below is, at
bottom, the argument that generalizing that one working mechanism — rather than inventing a parallel
one — is the highest-leverage move available.
COMPARATOR_LENS_PROGRAM.md §"the governing principle" is binding: an aspect no lens has audited is an
uncovered surface. Its 24 uncovered cells include #19 ("prose at 30M words… no lens teaches prose as
the primary play surface") and #15 (dread register). But the roster's frame is *title × aspect* where
every title is a shipped game and every aspect is a system. Cell #19 is the closest thing to a
dramaturgy cell and it is scoped to *voice and failure-as-content*, not to setup/payoff, arc shape,
motif, or emotional curve. DESIGN_GAP_REGISTER #26 comes closest in the other direction — "Side
content has no narrative-craft gate — seeds pass on evidence/lens/arc/layer/care, never on
reversal/cost/moral residue" (window-plan rank 9) — and it is scoped to seeds only, not to the 79
main-spine nodes, not to arcs, and not to the whole-arc flow.
So the honest verdict: the story-craft family is a genuine sixth surface, and rank-9's narrative-craft
gate is its first tooth arriving early and small. The right move is not to build rank 9 standalone
and then build this later — it is to build rank 9 as SC-1's seed-side tooth so the seed gate and
the spine gate share one vocabulary from birth. That is a sequencing recommendation, not a scope grab.
SIGNIFICANCE_LENSES.md §4's five gates ask, of every candidate: is the tie real, does it register
under a lens, does it serve an arc mechanism, does it fit a layer, is it representable with care. Those
are inclusion gates — they decide what earns a place. Not one of them asks whether the thing that
earned its place is *set up*, *paid off*, *shaped*, or *felt*. A chapter can pass all five gates with a
perfect score and still be a museum tour. Group G ("the game-specific arc lenses") gets closest with
G8 protagonist-arc-and-progression significance, but it measures *durable kit and durable idea*, which
is progression, not dramaturgy. The two families are complements, and the story-craft family should be
explicitly declared the dramaturgical twin of the significance family in both docs so neither
absorbs the other.
---
Naming convention follows the roster's kebab-case: promise-payoff-ledger,
arc-grammar-relationship, motif-foreshadow-discipline, emotional-pacing-curve,
storycraft-teacher-set. Each is specified as **what it measures · data home · teeth · where it rides
· teachers · honest limit · strongest objection**.
A rule that binds all five, taken from the noisy-gate lesson and check_layer_register.py's TIER-A /
TIER-B split: a story-craft gate FAILs only on structural facts (a row exists / an FK resolves / a
count / an ordering / a spacing). Everything requiring taste is emitted as TIER-B advisory into a
scorecard the fresh-context critic reads. A dramaturgy gate that fails on taste would produce exactly
the 42-false-positives-concealing-3-real-errors failure that the bali pass already paid for once.
---
promise-payoff-ledger — every setup tracked to its payoff across 79 nodesWhat it measures. For every dramatic PROMISE the corpus makes — an object placed, a debt incurred,
a threat named, a skill taught, a person introduced with a future, a question posed — that (a) a payoff
exists, (b) it lands in a later node, (c) the payoff is EARNED (its setup exists and precedes it), and
(d) neither the seeding nor the paying violates the reveal bindings the promise crosses.
Four defect classes, all currently invisible:
TL-25 (the Realm-Road allies never return), TL-09 (Baal-Hadad never re-encountered), TL-16 (the
Personal Dimension never framed as the birthright-home), TL-03, TL-06, TL-13, TL-14, TL-04.
WHOLE_ARC_CONNECTIONS_PASS finds two by hand:TL-13 the contest ladder ("capstone built before its rungs") and TL-14 the vehicle line ("narrated,
never ownable"). These are the harder class to catch by reading, because a payoff always *reads* fine
in its own chapter.
calls this "THE #1 MISSED WEB": Ch 75/76/77/Epilogue render the Truly-Good roster on every path while
the Ch-65 lock resolved the 22nd slot three ways and companions leave on corrosive runs.
sink and Ch 75-77 is where it would happen.
Data home — reuse-first, in two layers.
*Layer 1 (authored, in the spine, mandatory-with-none).* One new field on the v3.1 beat row,
placed and enforced exactly like the existing reveal: field, which is the working precedent for a
per-beat discipline field the gate demands present-or-none on all 891 beats:
- layers: {L1|L2|L3} · reveal: {HELD(...)|LIFTED(...)|none} · promise: {SEED PR_nnnn | PAY PR_nnnn | ECHO PR_nnnn | none} · [SRC: …]
SEED opens a promise, PAY closes it, ECHO re-touches it without closing (the motif lane, §SC-3).
Multiple tokens per beat are legal. This is the same shape as mark_write.forward_track, generalized
off communities and onto a first-class id.
*Layer 2 (derived, the ledger).* registries/T0_Promise_Ledger — generated, never hand-typed, by
extending harness/extract_spine_rows.py (which already emits seven typed CSVs per node from the same
spinelib.parse_file the gate validates with, so ledger and gate structurally cannot drift). Columns:
`promise_id · promise_name · promise_class · magnitude · seed_node · seed_beat_id · seed_surface ·
carrier_ref · payoff_nodes · payoff_beat_ids · status · path_sensitivity · layer · reveal_binding ·
care_band · source_chain_ref · [SRC:]`
promise_class (closed enum, seeded from the six connection types the whole-arc pass alreadyproved out, so the taxonomy is inherited rather than invented): `object · debt · threat · skill ·
person · question · place · vow`. Examples-not-limits — the roster expands by ruling.
magnitude reuses the fork enum verbatim: FOUNDATIONAL | SUBSTANTIAL | ACCUMULATIVE | SIGNATURE.status (derived, never authored): PAID · PARTIAL · ORPHAN · UNEARNED · PATH_FLAT · DEFERRED.path_sensitivity: path_invariant | band_reading | fork_reading — the column that makes thePATH-FLAT class checkable at all.
source_chain_ref back-links to the already-authored chain ids (TL-08, ECV-02, IR-1, D2, ER-3, T-L3-01) so the ledger is provably a typing of existing verified work, not new canon.
Bootstrap is free and it is the point. The seed corpus already exists, adversarially verified:
65 named chains (5 beast spines · 6 deity chains · 9 era-rhymes · 11 L3-literal chains · 27 callback
pairs · 7 system spines), 12 ECV rows, the IR set, the TL-NN punchlist, and the verified-PAID
protect-list. Typing them is a zero-new-canon transcription pass, which is exactly the class the
deterministic-transform method handles well (script applies, fresh-context critic gates content).
Teeth — harness/check_promise_ledger.py, gate #30. PASS-on-empty with LOUD DECLARATION on the
no_dead_end scaffold pattern; ships must-fire and must-not-fire fixtures runnable via --self-test,
which it also runs on every real invocation, exiting 2 if a ruler rotted (the standing gate law).
SEED PR_nnnn has ≥1 PAY PR_nnnn in a strictly later node.PAY PR_nnnn resolves to a SEED in a strictly earlier node.This is the class no human read reliably catches.
ECHO may sit anywhere between seed and payoff; nothing may precede itsseed. Prologue/Ch-1 build-order versus chapter-order is handled by the same predecessor logic
enrich.py::_build_order_predecessor already implements, so the two-clock oddity does not break it.
crosses, the seed beat must carry reveal: HELD(...). This is the tooth that would mechanically
hold the amulet brief's single sharpest hazard: an amulet seeded at CHPRO_B07 and read at Ch 8 must
be HELD at the seed under HL_0095, and the Ch-1 fall must not acquire an omen register under
HL_0116. Today that is guarded only by a critic's attention.
FOUNDATIONAL promise declares apayoff window and must pay inside it or carry an explicit long-arc declaration in its row. Stops
"it pays at Ch 77" from being the universal excuse.
band_reading or fork_reading must have at least one payoff beat whose in: line reads a ws.* key the seed's fork wrote. This is the
mechanical form of the #1 missed web, and it is checkable because both halves already exist as
typed state keys.
because the endgame legitimately carries more.
disk byte-for-byte — cloned directly from check_seed_housing.py assertion 2, which is the proven
anti-orphan pattern ("a ledger whose only consumer is a human remembering to look IS the orphan it
exists to prevent, so this gate is that consumer").
Where it rides.
/spine-chapter step 9 authoring: the author writes promise: per beat; step 10's normalize-doc critic gains a promise section; step 11 regenerates the ledger and
refreshes the fidelity baseline in the same commit.
window, which closed, which are now overdue.* RRs already run 5 machine + 6 judgment grids
(RR_42.md), so this is an added row in a proven structure, not a new ceremony.
promise dropped during expansion is invisible today; the ledger makes the definition-of-done for a
chapter's expansion include "every promise the spine declared still has its beat."
has an object to sweep. Today "you're missing a LOT" is a judgement; with the ledger it is a
query.
Teachers. Craft: Chekhov's gun as the named discipline (a principle, not a purchase); John Yorke
*Into the Woods* (payoff-shape across acts). Shipped: widen the proposed-new
knowledge-progression-decipherment lens (Outer Wilds + Obra Dinn) to carry setup/payoff *ordering*
— those two games are the medium's purest promise-tracking machines and they are already on the roster
for a neighbouring reason; widen the in-flight witcher-3 brief to carry contract-quest promise
closure. Net new game lenses: zero.
Honest limit. The gate proves a payoff EXISTS and is EARNED and READS STATE. It cannot prove the
payoff LANDS. That is the judgment grid's job, permanently.
Strongest objection. Typing 891 beats with promise tokens is real authoring cost, and an
over-tagged corpus (every object a "promise") degenerates into noise that hides the nine real orphans.
Answer: bind the tagging floor to magnitude — FOUNDATIONAL and SUBSTANTIAL promises are
mandatory, ACCUMULATIVE optional. The 65 already-named chains are the initial population; anything
that did not survive the whole-arc pass's own bar does not need a row.
---
arc-grammar-relationship — what shape each relationship class must trace, verified per arcWhat it measures. That every relationship arc traverses the required stages of its class, in order,
across its declared span — with a beat actually staging each stage.
The six classes and their grammars (stage names are proposals; the shapes are derived from what
the corpus already does at its best, then checked against the teacher set):
MEET → PROVE → COST → RUPTURE_RISK → CHOICE → LANDING → FINALE_READ. COST = the first thing the bond takes from the player. RUPTURE_RISK = a test that could
genuinely end it. This grammar is the mechanical form of register #41 ("companion personal-quest
arcs are required by PARTY_STRUCTURE Tier-1 but have no bucket/class/FK/row"): the missing quest
bucket is precisely the missing PROVE/COST stages having nowhere to live. Ntala's own design doc
is already grammar-shaped (Ch-3 silent watcher → Ch-13 join/journal → Ch-23 integrity departure
point → Ch-38 journal transfer → Ch-65 Departure/Continuation → Ch-71/75 present at the war), which
is strong evidence the grammar is a description, not an imposition.
BIRTHRIGHT → LOSS → ABSENCE → INHERITED_OBJECT → RECKONING. Josh'sauthored spine instantiates all five: the amulet passed at CHPRO_B07, the mother's death, the
townspeople's grudge across the time jump, the ward carried and given away, the Ch-76 father
encounter between "two people who lost the same two people."
THE_MARK → THE_RIPPLE. THE_MARK already exists as a typed structure (mark_write` with
{community_id, valence, persistence, forward_track}), so three of five stages are already
machine-visible. This class is nearly free.
→ THE_PERSON → THE_ANSWER`. Reveal-critical by construction; the grammar's stage boundaries ARE the
reveal boundaries (no House pattern before ~Ch 38, no Cassius before Ch 76, no Grand Sage before
Ch 77), which means this class's gate is partly already built as check_reveal_discipline +
check_grand_sage_silence and should cite them rather than duplicate them.
BOND → LOSS → SUBSTITUTE_BONDS → REUNION → THE_STAND. ECV-02 is theworked instance and is explicitly the exemplar Josh named.
downtime/crew scene_type to stage it"). Grammar: NOTICE → FRICTION → ALIGNMENT_OR_NOT. This is the
one class with no existing instance anywhere, and it is the cheapest large win in the family,
because the mothership already supplies the venue that BG3's camp supplies.
Data home — two tables, one authored and tiny, one derived.
registries/T0_Arc_Grammar (authored, ~6 rows): `class_id · class_name · required_stages(ordered) · optional_stages · min_beats_per_stage · span_rule · tier_applicability · [SRC:]`.
Six rows. This is the whole spec.
registries/T0_Relationship_Arc (derived + thin authored header): `arc_id · class_id · entity_a ·entity_b · span_start_node · span_end_node · stage_map · tier · status · [SRC:]`. Instances are
largely derivable today: every beat carries actors: [...], every fork option carries a
relationship/faction column, PARTY_STRUCTURE declares tiers, and T0_Character_Index has 163
rows. The authored part is one arc_stage: token per beat, and only on beats that stage a stage —
far lighter than SC-1's tagging.
Dependency to state honestly: this lens is the natural rider on window-plan rank 11 (mint
T0_Persona_Index + complete personas on every slice entity). It should not launch ahead of it, or it
will type arcs for entities whose personas are about to change.
Teeth — harness/check_arc_grammar.py, gate #31.
required_stage of its class, with ≥ min_beats_per_stage beats. A stage with zero beats is a hole in the arc.
PARTY_STRUCTURE Tier-1 companion has an arc row of class companion. This single assertion closes register #41.
span_end_node precedes Ch 65 carries a LANDING; one that survives the lock carries a FINALE_READ — and a FINALE_READ must read a ws.* key (this is
SC-1's P6 aimed at relationships, and it is the second half of the #1 missed web).
Tier-1 crew, at least N pairs must diverge on a declared axis (loyalty_belief_axis — which register
#39 says currently has no computational surface, so this tooth also gives #39 its first consumer).
leave | die | become_enemybranch handling — register #40's missing third arm.
Where it rides. Cascade (arc stages tagged at authoring); RRs (a per-window arc-advance grid —
which arcs moved, which stalled ≥10 nodes); the companion cast design docs become the class spec's
[SRC:] (they are already written, they simply have no consumer, which is an anti-orphan violation in
its own right); the factory (a companion's personal-quest bucket becomes a required, FK'd row).
Teachers. Shipped, widen three that are already rostered or in flight: baldurs-gate-3
(in flight — widen per #41/#42, the approval + camp-scene + personal-quest architecture),
persona-disco-curriculum-voice-ui (Persona's confidant ranks are the medium's most explicit
*required-stage* relationship grammar — this is the single best-fitting existing lens on the whole
roster and it is currently scoped to curriculum/UI), and creature-collection-ally-ai's Dragon Age
tactics cluster. One genuinely new game lens: Mass Effect 2 loyalty missions — the canonical
companion-personal-quest-arc grammar, with a shipped failure mode (loyalty as a checkbox) that is
itself the lesson. Craft: **Lajos Egri, *The Art of Dramatic Writing*** — character-as-premise and the
orchestration rule; the highest-value book-tier teacher in the family, and (per §0.1) the word
"Egri" appears zero times in the corpus while appearing to appear 377 times.
Honest limit. A grammar risks formula. Mitigation is built in: the grammar declares *required
stages*, never *required scenes*, and min_beats_per_stage defaults to 1. The gate says "there is no
beat anywhere where this bond costs the player anything," which is a defect in any register; it never
says how that cost should be staged.
Strongest objection. Imposing a stage grammar on 12 side questlines, 22 threads, and a Tier-1 crew
risks making every relationship trace the same curve — the exact meta-collapse failure the AAAAA
balance doctrine bans on the build side. Answer: apply the doctrine's own remedy. The grammar is a
*coverage floor*, and the TIER-B orchestration tooth (A5) actively rewards divergence: an arc set where
every arc hits its stages at the same node spacing should itself be flagged. Uniformity is the defect
the lens hunts, not the state it enforces.
---
motif-foreshadow-discipline — recurring images, objects, phrases, tracked as dataWhat it measures. That declared motifs recur enough to register, are spaced so they neither vanish
nor hammer, change meaning across recurrences, and resolve into a promise. The amulet is now the
archetype: seeded at the birth, worn unidentified across the Ch-1/Ch-2 seam, unreadable until Ch 8,
given away at Ch 13-or-later, and thematically answered at Ch 76. Others already load-bearing: the
evidence journal, Blombos ochre, the Sealed Letter, the first vril gesture (ECV-12's ring closure at
Ch 77), the two clocks, the waterfall.
Data home. registries/T0_Motif_Registry: `motif_id · motif_name · motif_class {object · image ·
phrase · gesture · sound · place} · first_node · recurrence_nodes · variation_axis {register · scale ·
meaning · owner} · payoff_promise_id (FK → T0_Promise_Ledger) · reveal_binding · protected_status ·
[SRC:]. Beat-side, motif touches ride SC-1's promise: field via the ECHO` token — deliberately, so
there is one authored vocabulary, not two.
Teeth — harness/check_motif_discipline.py, gate #32. Structural teeth FAIL; textural teeth advise.
should not claim motif status — this keeps the registry honest rather than aspirational.
same motif. **This is the defect direction nobody currently guards, and it is the one an automated
authoring pipeline will actually commit** — a fan-out told "the amulet is important" will put the
amulet in all 79 nodes. Over-use is the machine's characteristic failure; absence is the human's.
The forgotten-motif tooth.
variation_axis. Partlylexical, therefore advisory, and read by the critic.
T0_Promise_Ledger row. No decorative motifs. a player-facing surface. Do not build this — check_layer_register.py already implements exactly
this analysis with a TIER-A/TIER-B classifier over player-facing versus authorial H2 blocks. M6 is a
call into that gate's existing machinery with a motif-scoped object list.
Where it rides. The natural-voice rewrite pass (the next session's first wave — motif phrasing is
player-facing language and the two passes touch the same lines, so they should be one pass, not two);
the cascade; and docs/review/build_reel.py-adjacent prose review.
Teachers. Craft: Chekhov (the principle), and the close-third prose lane's own doctrine. Shipped:
widen persona-disco-curriculum-voice-ui for prose-motif recurrence; one new lens,
motif-object-recurrence, teachers = Nier: Automata, Outer Wilds, What Remains of Edith Finch —
objects that mean more each time they return. Note the corpus already mentions Nier (7 files),
Pentiment (2), Kentucky Route Zero (2), Edith Finch (1), so these are known-adjacent, not cold picks.
Honest limit. Recurrence and spacing are countable; resonance is not. M4 will always be advisory.
Strongest objection. A motif registry invites *retrofitting* — declaring existing repetition as
intentional motif to make the gate green. Answer: M5's FK is the defense. A motif with no promise
row and no payoff cannot be declared, so retrofitting costs more than authoring.
---
emotional-pacing-curve — the story-layer twin of the intensity curveWhat it measures. The felt register of each node and its movement, mapped Prologue → Epilogue, so
valleys and peaks are architected rather than accidental.
Why it is genuinely absent (positive-controlled in §0.1): intensity is action intensity, bound by
its own gate docstring to HL_0048's peak/valley rule; type is a structural taxonomy at 33/79 real;
music_mood_tags reads 79/79 filled and is 0/79 real. That last fact is itself the argument for this
lens's strictest tooth — a column can look populated for months while carrying nothing.
Data home — three columns on T0_Chapter_Index, no new registry. This clones the exact mechanism
the topography gate established: the gate docstring declares itself "the POPULATION CONTRACT" for the
three columns it validates, which were appended to the live CSV and declared in
docs/fidelity_baseline.json added_columns. Same path, same declaration, same re-baseline discipline.
emotional_register — the dominant felt colour. Closed enum, seeded at eight and expandable by ruling (examples-not-limits): wonder · grief · dread · fury · tenderness · wry · awe · resolve.
emotional_valence_arc — the movement WITHIN the node: rise | fall | rise_fall | fall_rise | flat.This is the column that makes it a curve instead of a tag, and it is McKee's scene-value charge
applied at node grain.
cost_ledger — what the node TAKES: `none | a_person | a_place | a_belief | a_capability |innocence`. This is the axis Josh's authored spine actually moves on: the Prologue now takes a
mother, Ch 1 takes the ceiling, Ch 13 takes the last of being unwitnessed. Without it the curve
measures mood; with it, it measures stakes.
Second consumer, worth naming because it converts this from a canon nicety into a build unblock:
emotional_register is the upstream source music_mood_tags never had, which is window-plan
rank 8 (the Section-10 machine cue table + Theme/Scene music columns, the P2 Audio socket) and
register #22's empty T1_Audio_Spec. Authoring the register column feeds the audio lane directly.
**Teeth — harness/check_emotional_curve.py, gate #33, built to check_chapter_topography.py's exact
shape** (sequence-ordered rules, docs/emotional_curve_baseline.json waivers, stale waiver FAILs).
emotional_register (topography R1's analogue).fall; no 5 consecutive flat. The firstis the grimdark tooth, the second the tourism tooth.
intensity: peak and emotional_valence_arc: flat isspectacle without movement. Advisory, because a deliberately cold climax is a real choice.
none cost per declared window; and never 3 consecutive a_person. The second half is a genuine craft guard against the failure the amulet brief
already names by hand ("the fridging objection") — encoded once, checked 79 times.
[POPULATE…] placeholder allfail. Copied verbatim from the topography gate's never-green-by-vacuity rule, and it is precisely the
rule that would have caught music_mood_tags reading full while being empty.
Where it rides. Cascade landing step (three cells per landing node — the same cadence the
Chapter_Index narrative-lag deferral already uses, refreshing only the landing node); RRs (the window
curve is a judgment-grid input — an RR should be able to say "this window was four griefs and a dread");
the audio lane; the factory; and the QA/feel critics, who finally have a stated intent to compare a
played build against.
Teachers. Craft: **Robert McKee, *Story*** (the scene-value charge — the direct source of the
valence column) and John Yorke. Shipped, all widens: god-of-war (in flight — GoW 2018 is the
best-shipped long-form emotional curve in the medium and it is already launched, so this costs
nothing); gtav-rdr2 (already run — RDR2's Chapter-6 register collapse is the canonical long-arc
emotional descent); hades-death-run-realm-identity (proposed-new — widen to carry between-run
emotional cadence). Net new game lenses: zero.
Honest limit. One register per node is coarse for a 100-200h game. Accepted deliberately: node
grain is where the existing pacing rules live (HL_0048/0049/0050), so the curve is comparable to them.
Finer grain belongs on the beat, and can be added later without moving the columns.
Strongest objection. Enum-tagging emotion is reductive and risks authors writing to the tag.
Answer: the column is a *derived description authored after the node*, not a brief authored before
it — same relationship mode_variety_check has to a chapter's actual beats. And E1-E3 only ever fire
on *sequences*, never on a single node's choice, so no individual node is ever told what to feel.
---
storycraft-teacher-set — the teacher roster, widen-firstWhat it measures. Whether each story-craft lens has a named teacher whose shipped or published
practice the audit can cite — the roster's own governing principle turned on the new family.
The finding. All 40 rostered lenses are games, and every one audits a system. Dramaturgy has
teachers the roster structurally cannot hold, because they are not games. So SC-5 proposes a **second
teacher class**: craft-title alongside shipped-title, with its own handling rules.
The widen-first ledger (per the standing wave rule that recommendations are reuse-first):
| lens | widen (existing/in-flight) | genuinely new |
|---|---|---|
| SC-1 promise-payoff | knowledge-progression-decipherment (Outer Wilds + Obra Dinn) · witcher-3 (in flight) | — |
| SC-2 arc-grammar | baldurs-gate-3 (in flight) · persona-disco-curriculum-voice-ui · DA:O tactics cluster | Mass Effect 2 loyalty missions |
| SC-3 motif | persona-disco-curriculum-voice-ui (prose lane) | motif-object-recurrence (Nier · Outer Wilds · Edith Finch) |
| SC-4 emotional curve | god-of-war (in flight) · gtav-rdr2 (run) · hades-death-run-realm-identity | — |
| SC-5 craft class | — | **craft-title class: McKee · Egri · Yorke · Chekhov (principle) · Le Guin *Steering the Craft*** |
Two new game lenses, four widens, one new teacher class. That is a deliberately small footprint against
a roster that already has 21 cluster-designed lenses pending and three waves queued.
The craft-title handling rules (all three matter).
1. Never ingest craft books into the substrate RAG index. The book pipeline exists to serve
cultural and historical grounding; putting dramaturgy doctrine into the same vector space as
region-keyed cultural chunks risks a region query returning screenwriting advice, and the substrate
region-key ruling assumes every chunk is culturally keyed. Craft titles live in the **lens program's
audit prompts**, exactly as the shipped-title teachings do.
2. Craft titles are pipeline teachers, never in-world sources. They never enter the RCM, never
generate an L2 shelf, never appear on a player-facing surface. The firewall is the same one that
separates the authorial anti-fringe layer from player content.
3. They are also not book-acquisition items. BOOK_ACQUISITION.md's ~158 MUST-ACQUIRE set is
specialist cultural anchors; craft doctrine is well-covered by deep-research synthesis and needs no
purchase.
The strongest objection in the whole brief, and it belongs here. *Importing story-craft teachers
will flatten 79 culturally-specific nodes into a Western three-act monomyth — the precise failure the
corpus is engineered to prevent.* This is not hypothetical: ESOTERIC_GROUNDING.md §A.7 already flags
Campbell's monomyth as "a debated universalizer," and Frame A (§19.7) exists to stop exactly this shape
of homogenizing move.
**Answer, and it should be pre-registered as a DIVERGENT-BY-DESIGN declaration so no future lens
re-litigates it:**
with scholarly caution, and a boss/threshold-guardian resonance frame. He is explicitly barred from
the craft-teacher class.
greys, stakes every N nodes). It never prescribes where a midpoint or a climax goes. The arc-level
shape stays Josh's spine.
Egri contributes the orchestration assertion; Yorke contributes the payoff-span rule; Chekhov
contributes P1/P2. None contributes a beat, a scene, or a shape.
Ntala's built arc and Josh's authored family arc — then checked against the teachers, never derived
from them. If a grammar stage cannot be evidenced from a built Humanity arc, it does not enter the
class spec.
---
Josh's second question is the operational one, and it deserves a direct answer: **today, work makes it
into the factory when a document has a consumer, and stalls in a proposal when it does not.** The
anti-orphan doctrine already says this ("every artifact needs a consumer AND a DOC_MAP row"), and the
story-craft surface is the largest current violation of it — 65 verified through-line chains, 12 ECV
convergence rows, 11 companion design docs, and a fully-reconciled amulet brief, all with **no machine
consumer**. The five lenses are, functionally, five consumers.
The full ride table:
| lens | cascade / re-cascade | Range Reviews | P5 factory (per-chapter) | QA / feel loop | gate |
|---|---|---|---|---|---|
| SC-1 promise-payoff | promise: per beat at step 9; ledger regen + baseline at step 11 | new machine grid #6 + judgment grid: opened / closed / overdue | expansion DoD: no promise loses its beat | — | #30 promise_ledger |
| SC-2 arc-grammar | arc_stage: on staging beats | per-window arc-advance grid (stalled ≥10 nodes) | companion personal-quest bucket becomes an FK'd row (#41) | ally-behaviour observation | #31 arc_grammar |
| SC-3 motif | motif touches via ECHO; merged into the natural-voice rewrite pass | motif spacing over the window | prose expansion honours variation | image critics read recurring objects | #32 motif_discipline |
| SC-4 emotional curve | 3 cells on the landing node | window curve as judgment-grid input | audio cue table (rank 8) + T1_Audio_Spec (#22) | the stated intent a played build is compared against | #33 emotional_curve |
| SC-5 teachers | audit prompts at wave launch | — | factory-stage charters (the WAVE-P2 output form) | watch rubrics | — (roster doc) |
Gate count 29 → 33. Every one PASS-on-empty with LOUD DECLARATION, self-testing rulers, must-fire and
must-not-fire fixtures — the pattern gates 26-29 already established.
Anti-orphan closure required at landing: DOC_MAP rows for the two new proposal docs and the four
new registries; registry_extensions.json + docs/fidelity_baseline.json refreshed via
--emit-baseline in the same commit as any registry edit; gates_config.json roster entries; and
back-references added into SIGNIFICANCE_LENSES.md §5 and COMPARATOR_LENS_PROGRAM.md (declaring the
story-craft family the dramaturgical twin, so the two lens families cite each other instead of drifting
into overlap).
---
The COMPARATOR_LENS_PROGRAM's FREEZE GATE binds: no P1 lens launches against an already-frozen
schema. Story-craft's schema surfaces are the spine beat row, T0_Chapter_Index, and the quest-seed
typing vocabulary — and two of the three are in the window plan's next fortnight. So the ordering is
forced, not chosen:
DESIGN_GAP_REGISTER v2's ASPECT×LENS matrix as fivenew aspect rows (WAVE-0's declared job) so the dramaturgy surface is *visible as uncovered* from this
moment, per the governing principle.
sharing SC-1's promise_class vocabulary. Rank 9 is already sequenced BEFORE the rank-10 264-seed
typing pass; making it SC-1-shaped costs nothing extra and buys one vocabulary instead of two.
emotional_register column, because rank 8 authors the musiccue table and Theme/Scene music columns and currently has no upstream mood source.
T0_Persona_Index mint (arc rows key off personas).natural-voice phrasing are the same lines and must not be two passes over one surface.
punchlist is a deterministic transcription of already-verified work; the content still takes the
fresh-context critic and the full gate suite, per the standing rule that no registry or canon edit is
ever "trivial mechanical" for review purposes.
at each boundary anyway.
---
This is the answer to "guarantee THAT class of depth everywhere," made concrete against the material he
authored on 2026-07-27.
PR_0001 the mother's ward — class object, magnitude FOUNDATIONAL, seed CH_PROLOGUE / CHPRO_B07, path_sensitivity: fork_reading, reveal_binding: HL_0095, payoffs at
the Ch-2 seam (worn, unidentified), the gift beat (Ch 13+, staging open), and the Ch-76 reckoning.
P4 fires if the seed beat is not reveal: HELD. P2 fires if the Ch-2 continuity anchor keeps
its no-inventory start state while the amulet exists — which is precisely the seam contradiction the
amulet brief found by hand, at §10's CH_02 edit-point. A gate finds it in future without a brief.
family class: BIRTHRIGHT (the passing) → LOSS (the catastrophe) → ABSENCE (the grudge across the time jump) → INHERITED_OBJECT (the ward carried, then given) → RECKONING
(Ch 76). A1 fires on the current built corpus, where three of five stages have no beat.
MO_0001 the ward — first node CH_PROLOGUE, variation_axis: owner (mother → child → the healer's child), FK to PR_0001. M3 fires if the ward goes dark for more than the declared
gap between Ch 2 and its gift beat — the exact "sixty chapters of a non-combatant unprotected"
coverage question §7 of the brief raises, converted from a discussion into a measurement.
register: wonder, valence: rise_fall, cost: a_person — and the brief's owncraft caution ("the Prologue must not become a tragedy chapter; its first ninety per cent is
splendour") is *literally the rise_fall value*, which is what a typed column buys: a caution
becomes a checkable assertion. Ch 1: register: tenderness, valence: fall, cost: a_capability.
E5's no-3-consecutive-a_person guard is the fridging objection §8 raises, encoded once and
enforced 79 times.
rise_fall is the right shape for the Prologue (the value-charge mustturn); Egri supplies why the King's never-resentment is load-bearing (character revealed under
maximum pressure); Chekhov supplies P1/P2. None of them supplied one word of the content — Josh did.
That is the shape of the whole proposal: **the craft teaches the teeth; the teeth measure Josh's
vision; the vision stays entirely his.**
---
Per the standing decision protocol and the delegated-care calibration, everything in this brief is
execution within the locked vision — no pillar, no numerical/naming/hard-line/§17 canon, no chapter
assignment. The loop rules and applies, and shows the path. Nothing here is a Josh fork.
Three items are worth *reporting* at landing rather than asking about, because they are visible
consequences rather than decisions:
derived/generated).
T0_Chapter_Index gains three declared columns via the same population-contract mechanism thetopography columns used; the fidelity baseline is refreshed in the same commit.
emotional_register ×8, cost_ledger ×6, promise_class ×8, the six arcgrammars) are seeded and examples-not-limits — each expands by ruling, and a never-used enum
member is itself a finding, on the same logic that makes a never-picked pool option a balance defect.
The one thing that would be a genuine fork, and is therefore explicitly not proposed: any
act-structure or monomyth template imposed across the 79 nodes. §SC-5 pre-registers that as
DIVERGENT-BY-DESIGN so no later lens re-opens it.
---
magnitude floor (SC-1) and stage-only tagging (SC-2), but it is the largest honest cost in the brief.
fresh-context critic pass over the generated ledger is not optional, and the ledger's freshness
assertion (P8) only proves regeneration, never correctness.
tooth ships TIER-B first and is only promoted to ERROR after it has run clean across the full 79 —
the graduation pattern SELF_IMPROVING_QUALITY_LOOPS §3.1 already defines.
T0_Persona_Index would type arcs againstentities about to change. Named here so the wave planner does not launch it early.
spaced. Whether it *moves* a player remains the fresh-context critic's judgement and, ultimately,
Josh's at the P3-exit gate. The family raises the floor; it does not touch the ceiling.