STORYDEPTH_STORY_CRAFT_LENS_FAMILY_2026-07-27.md

pipelines/STORYDEPTH_STORY_CRAFT_LENS_FAMILY_2026-07-27.md

The STORY-CRAFT LENS FAMILY — the dramaturgy audit the 40-lens roster has never had

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.

---

0. Method, and the positive controls that make the absence claims real

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:

in 74 of 79 nodes.

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.

0.1 Positive controls (the searches CAN match, so the zeros are real)

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.

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.

---

1. The finding: the corpus has world-class dramaturgy and zero dramaturgical instrumentation

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 factwhere it lives todaymachine-readable?a gate can fail on it?
65 through-line chainsprose bullets in one proposalnono
9 orphan/unpaid callbacks (TL-03…TL-25)prose bullets + a punchlistIDs exist, no tableno
the amulet chain (Prologue → Ch 2 → Ch 13+ → Ch 76)a brief that is explicitly not appliednono
companion arc shape11 companion design docs, prosenono
per-node emotional registernowheren/ano
within-node emotional movementbody prose onlynono
motif recurrence (journal, ochre, sealed letter, first vril gesture)scattered across 79 filesnono
community mark forward-tracks76 typed declarations, gate-checkedyesyes

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.

1.1 Why the 40-lens roster cannot close this

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.

1.2 The 33 significance lenses are the wrong instrument for this, by construction

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.

---

2. The five lenses

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.

---

SC-1 · promise-payoff-ledger — every setup tracked to its payoff across 79 nodes

What 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.

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_Ledgergenerated, 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:]`

proved 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.

PATH-FLAT class checkable at all.

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).

This is the class no human read reliably catches.

seed. 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.

payoff 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.

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.

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 magnitudeFOUNDATIONAL 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.

---

SC-2 · arc-grammar-relationship — what shape each relationship class must trace, verified per arc

What 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):

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.

authored 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.

worked 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.

(ordered) · optional_stages · min_beats_per_stage · span_rule · tier_applicability · [SRC:]`.

Six rows. This is the whole spec.

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.

min_beats_per_stage beats. A stage with zero beats is a hole in the arc.

companion. This single assertion closes register #41.

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).

branch 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.

---

SC-3 · motif-foreshadow-discipline — recurring images, objects, phrases, tracked as data

What 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.

lexical, therefore advisory, and read by the critic.

a player-facing surface. Do not build thischeck_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.

---

SC-4 · emotional-pacing-curve — the story-layer twin of the intensity curve

What 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.

ruling (examples-not-limits): wonder · grief · dread · fury · tenderness · wry · awe · resolve.

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.

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).

is the grimdark tooth, the second the tourism tooth.

spectacle without movement. Advisory, because a deliberately cold climax is a real choice.

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.

fail. 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.

---

SC-5 · storycraft-teacher-set — the teacher roster, widen-first

What 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):

lenswiden (existing/in-flight)genuinely new
SC-1 promise-payoffknowledge-progression-decipherment (Outer Wilds + Obra Dinn) · witcher-3 (in flight)
SC-2 arc-grammarbaldurs-gate-3 (in flight) · persona-disco-curriculum-voice-ui · DA:O tactics clusterMass Effect 2 loyalty missions
SC-3 motifpersona-disco-curriculum-voice-ui (prose lane)motif-object-recurrence (Nier · Outer Wilds · Edith Finch)
SC-4 emotional curvegod-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.

---

3. The wiring answer — "how does everything make it into the factory?"

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:

lenscascade / re-cascadeRange ReviewsP5 factory (per-chapter)QA / feel loopgate
SC-1 promise-payoffpromise: per beat at step 9; ledger regen + baseline at step 11new machine grid #6 + judgment grid: opened / closed / overdueexpansion DoD: no promise loses its beat#30 promise_ledger
SC-2 arc-grammararc_stage: on staging beatsper-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 motifmotif touches via ECHO; merged into the natural-voice rewrite passmotif spacing over the windowprose expansion honours variationimage critics read recurring objects#32 motif_discipline
SC-4 emotional curve3 cells on the landing nodewindow curve as judgment-grid inputaudio cue table (rank 8) + T1_Audio_Spec (#22)the stated intent a played build is compared against#33 emotional_curve
SC-5 teachersaudit prompts at wave launchfactory-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).

---

4. Sequencing — folded into the existing waves, not a parallel program

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:

new 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.

cue table and Theme/Scene music columns and currently has no upstream mood source.

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.

---

5. The worked example — the five lenses against Josh's authored spine

This is the answer to "guarantee THAT class of depth everywhere," made concrete against the material he

authored on 2026-07-27.

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.

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.

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.

craft 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.

turn); 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.**

---

6. Ruling posture

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).

topography columns used; the fidelity baseline is refreshed in the same commit.

grammars) 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.

---

7. Residual risks, stated plainly

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.

entities 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.

Generated by harness/site/structure_site.py — the URL path is the repo path. review root