SEAM_TYPING_SPEC.md

music/SEAM_TYPING_SPEC.md

TRAVEL SEAM TYPING — CONSOLIDATION SPEC (REVISED, post-critic)

CANON SUBORDINATION — this document is PROPOSAL-TIER: it serves canon and never outranks it.
The canon: the CVD · the T1 foundation docs · the T0 registries (registries/) · the spine
(docs/spine/CH_*.md) · the region pages (_source/02_Tier_2_Region_Pages/). Authority order: docs/DOC_MAP.md § 0.
Canon served (scanned from this document's own citations — widen it by hand where it is thin):
T1_Combat_System_Spec · T1_World_Geography_Master · T0_Chapter_Index · T0_Character_Index · T0_Cross_Cultural_Link_Graph · T0_Dungeon_Class_Reference · (+4 more t0) · docs/spine/CH_05.md
READ THAT CANON FIRST — open it and derive from it before you build anything from this document.
If this document disagrees with canon, CANON WINS and this document is the defect — fix the
document, never the canon. Nothing here is applied until it is ratified into canon.

Tier: PROPOSAL (design contract for the engine; nothing here enters a build pack or a registry

until ratified). Authority: CVD greater than T1 greater than T0. Engine work is SPEC-ONLY at this

date — the runtime lands on the 5090 machine; this document is what that runtime implements.

Scope: the 78 inter-node travel seams of the 79-node spine (Prologue through Epilogue), their type

assignment, their data home, their composition with the ruled realm traversal layer and the ruled

rift-dungeon economy, and the verification teeth that keep the assignment honest.

Revision: this is the post-critic revision of SEAM_TYPING_SPEC.md against the W3_TRAVEL_SEAMS

verdict (GO-WITH-FIXES, three MAJOR and six MINOR). Every finding is applied; the applied list is

section 12. Where a finding offered options, the critic's recommended option was taken.

0. Verdict, and the three corrections this pass had to make first

The consolidation is buildable today. Three things had to be corrected before it could be written,

and each one is a correction to an assumption, not to Josh's ruling.

0.1 The tier semantics in circulation are wrong — the record says something different

The working shorthand "T0 cut / T1 compressed-playable / T2 full segment / T3 dungeon-crossing"

does not match the artifact Josh ruled on. The ruled ladder, verbatim from the brief that carried

the ruling (docs/pipeline_review/FORKC_TRANSITIONS_BRIEF_2026-07-27.md lines 281-284, Option 4,

the RECOMMENDED option adopted at docs/spine/DECISIONS_PENDING_JOSH.md line 785), is:

within-realm seams (canon: no spatial move). Asset cost zero.

beat-free traversal connectors (the Kra Isthmus portage, passes, defiles) and short hops. Asset

cost one corridor kit, re-skinned.

itself and the player cannot steer. Applies to the water seams and the Vimana seams. Asset cost

one rig, a few skins.

Applies to multi-month legs and any destination exceeding the stream budget (Angkor is the named

case). Asset cost the journal screen.

Note what T0 is NOT: it is not "a cut." A cut is the opposite of what T0 means — T0 is the tier

where nothing happens because the player never left. The cut-versus-continuity question was ruled

separately and in the other direction the same sitting (FORK A, DECISIONS_PENDING_JOSH.md line

782: continuity by default, a hard cut legal only for schema-keyed beat classes). A spec that

typed T0 as "cut" would have inverted two rulings at once.

0.2 Josh's ruling added a fifth treatment the four-tier table does not contain

The ruled sentence (DECISIONS_PENDING_JOSH.md line 785, restated in the ledger at

docs/PRE_5090_BUILD_PLAN.md lines 1161-1164) carries three clauses: playable

compressed-geography crossings (compress duration, never accuracy — the West Texas principle);

the important travel segments become real staged or open DUNGEONS; and all 78 seams type T0-T3

on SeamlessTravel with the screen surviving only as the honest failure state.

The dungeon clause has no home in the four-tier table. It is also the most expensive treatment in

the ruling and the ladder is otherwise ordered by cost, so it cannot simply be appended without

either breaking the ordering or re-defining a ruled tier. This is a genuine design fork and it is

presented as one in section 3 rather than decided here. Its composition with the already-ruled

dungeon economy is settled and is section 3.4 — that half is not a fork, because the dungeon

economy already has one ruled owner.

0.3 Zero seams are typed today, and the adjacency data a typing pass would key against is incomplete

exactly 78 ### entries, each a five-part entry (Departure, Passage, Arrival, Transition

sequence, Continuity). The count is exact, not approximate.

single incidental hit is a school reference in TRANSITIONS_CH62_71.md line 24). The typing pass

exists as a plan line, not as data.

they are perfectly clean (56 of 79 rows filled; zero dangling targets; zero disagreements with

row order). But 23 rows carry BOTH links empty: CH_PROLOGUE, CH_01, CH_13, CH_14, CH_15, CH_22,

CH_62 through CH_77, and CH_EPILOGUE. The adjacency chain a seam registry would foreign-key

against is therefore broken at both ends of the arc and across the entire realm road. Repairing

those 23 rows is a prerequisite to arming the bijection tooth, and it is a data repair with a

deterministic answer (the row order is already correct), not a canon question.

1. Inventory — what exists against what the ruling requires

The ruling requiresWhat exists todayGap
78 seams, enumerable78 authored five-part prose entries across 8 filesnone — the set is exact and complete
each typed T0-T3zero typedthe whole typing pass
a per-seam data homenone; the type has nowhere to be writtensection 4 of this spec
SeamlessTravel + TransitionMap as the universal mechanismproven in the game repo only as OpenLevel cross-map seams with a travel card (PG-2, plan line 1430)the seamless mechanism itself is unbuilt
important crossings become dungeonsno crossing-weight axis exists; the dungeon economy itself IS ruled and owned (section 3.4)section 3's fork, delegating to the ruled owner
the screen as the honest failure state onlythe travel card exists and is honest-minimal (plan line 1435)it must be re-declared a yield target, not a destination
per-realm crossing characterT0_Realm_Ruleset_Registry.traversal_class populated on 10 of 11 rows with entry / exit / character / fail / envelope termsalready landed — compose, do not rebuild
Pattern-A terrace intensity envelopecarried on every realm row's traversal_class envelope term, plus T0_Chapter_Index.intensityalready landed — read, do not copy
adjacency to key againstprev_chapter_link / next_chapter_link, 56 of 79 filled23-row repair
a gateno seam gate in harness/gates_config.jsonsection 9's teeth

Two related artifacts exist and are NOT superseded by this spec. docs/TRANSITION_TREATMENT.md

defines the three authoring layers (Layer 1 intra-chapter traversal in the body, Layer 2 the

inter-chapter seams, Layer 3 naming finalization) — this spec types Layer 2 and touches neither of

the others. docs/DESIGN_GAP_REGISTER.md L327 (the MISSING-list item 24, distinct from the

claim-board table row 24, which is Photography / observation mode) records the DIFFERENT problem of

intra-chapter between-site traversal — between-site traversal has no authored design, 13-23 km legs

carry zero content, the DEV teleport is the stopgap, window-plan rank 21. That is Layer 1 and is out

of scope here. Keeping those two apart matters: a seam is an edge between chapters; a 17 km leg

inside Ch 39 is not a seam and must never be typed as one.

2. The four tiers as gameplay contracts

Each tier below states the player's experience, the engine mechanism, the earning criterion, the

forbidden behaviours, and the yield behaviour. The tier definitions are the ruled ones; everything

added here is the contract that makes them implementable, and every addition is derived from the

ruling's own clauses rather than invented.

2.1 T0 CONTINUOUS

fade, no camera hand-off, no music turn.

world state persists, and the level does not change. Where the boundary coincides with a quest

reload on the same map, the reload is invisible.

directly (line 325: T0 is free and is the presumption; a seam must earn a treatment by being a

real journey in canon). A seam is T0 unless a higher tier is justified by a citation.

is the general rule: any presentation here is invented discontinuity, and FORK A forbids it.

2.2 T1 THRESHOLD

the player traverses under their own control while the destination streams behind it. The

companion talks across it. It reads as a place, not as a corridor.

the far side. The mechanism is universal and paid once; the marginal engine cost per T1 seam

after the first is approximately zero.

the Kra Isthmus portage is the named exemplar (CH_05.md line 15, restated at

PRE_5090_BUILD_PLAN_VOL2.md line 1156 as a real corridor hosting no primary beat).

transitions files' governing-constraints blocks bind every seam, and several carry hard

constraints by name (the Ch 4 to Ch 5 seam forbids water and falling-water imagery because

CH05_B01 plants the Borobudur waterfall cue one beat later under HL_0043, payoff Ch 76-77).

is considered. The card is the second resort.

2.3 T2 CONVEYANCE

the deck, talk to the captain, watch the coast go by, look after the familiar. The craft follows

a spline and drives itself.

and the destination streaming underneath. This is the single technical gate on the whole tier

(brief line 436: moving-platform character attachment, two known approaches).

authored as a typed traversal beat, a captain already rowed in T0_Character_Index, a bond

formed on the water.

and every other element of the post-79 Watercraft system. The deck is not a vehicle. This is the

discipline that makes the tier affordable and that honours Josh's Watercraft deferral; when the

real Watercraft system lands post-79, the deck rig becomes its interior rather than being thrown

away.

on the road. The player owns no craft until T0_Vehicle_Registry VH_002 at CH_08 and no caravel

until CH_33, and controlled flight arrives only at Ch 55 — so the early water seams are legal T2

only as NPC-crewed passage, with the player cast as crew (canon's own phrase: a passenger who can

hold a rope). Non-water T2 media carry no ownership floor at all: the arc's one dimensional

passage (Ch 1 to Ch 2, transport_medium = dimensional_fall) is a moving frame nobody crews, and

conveyance_ownership = none is its correct and legal value. The row must declare which it is;

see the tooth in section 9.6, whose pre-CH_08 clause is scoped to water media exactly because the

reason behind it — no watercraft yet — is a statement about watercraft and about nothing else.

defect, and the card names it honestly.

2.4 T3 RITUAL ELISION

child's journal from Ch 13 onward, since that is when the journal goes live. Play the arrival.

time honestly, and it is the only tier whose asset is a screen.

exceeds the stream budget. Angkor is the named stress case (377 MB, 20.58 s median load) and the

brief says it should be typed T3 from the start.

the exit beat's existing player_objective rather than being written fresh (brief line 325).

Using T3 as a convenience for a seam canon actually authored — that is the tier-inflation failure

the earning tooth exists to catch.

elision with played heads and tails. The loading screen is the separate yield target that Josh

ruled survives only as the honest failure state. Collapsing the two would quietly re-authorise

the thing the ruling demoted.

2.5 The screen — not a tier

The travel card is a yield target and never a destination. It appears when the stream outruns the

traversal, it lifts its line from the exit beat rather than composing one, and it is quality-built

so that when it does appear it is not an apology. It is a field on every seam row

(fallback_policy), never a value of seam_tier.

3. THE OPEN FORK — where does the dungeon crossing go?

Josh ruled two things in one sentence: 78 seams typed T0-T3, and the important crossings become

real staged or open dungeons. The four-tier enum cannot express the second. Three shapes resolve

it; the numerical/naming half (whether the ruled token set stays four values) is Josh's, so this

section presents rather than decides. What is NOT a fork, under any of the three options, is who

owns the dungeon itself — that is settled in section 3.4.

3.1 Option A — redefine T3 as DUNGEON CROSSING and demote elision

T3 becomes the dungeon-crossing tier; RITUAL ELISION drops out of the enum and becomes a yield

state alongside the card.

player investment (nothing, corridor, deck, dungeon), which is how a scheduler wants to read it.

Matches the plain reading of Josh's sentence, where the dungeon is the top of the ladder.

"T3" in the brief and the ledger inverts meaning. Leaves the multi-month legs and Angkor with no

assigned treatment — the exact seams the ruling's own stress case named. Loses the one tier that

is honest about the parts of the road canon deliberately left blank.

validation target — untypeable, which is a bad sign for a taxonomy.

3.2 Option B — add T4 DUNGEON CROSSING

The enum grows to five values.

cost tier. Simple to read.

canon, which is exactly the class this repo does not change silently. It also conflates two

independent axes: a dungeon crossing is still mechanically a walked connector or a conveyance —

the dungeon-ness is content weight, not transport mechanism — so a five-value enum would carry

two dimensions in one column and lose the ability to say "an open dungeon you sail into."

adjudicated into a two-value care_tier plus a SEPARATE duty column precisely because a single

overloaded column could not carry two axes (docs/pipeline_review/REALM_CARE_TIERING_2026-07-28.md,

the 14 director adjudications). Option B repeats the overload that adjudication rejected.

3.3 Option C — RECOMMENDED — keep the ruled four tiers as the transport axis and add a separate crossing-weight axis

seam_tier stays exactly T0, T1, T2, T3 with the ruled meanings. A second column carries how much

authored level the crossing holds: none, dressed, staged_crossing, open_crossing.

The token names matter and were changed in this revision. The earlier draft used staged_dungeon

and open_dungeon, and open_dungeon collided head-on with the ruled Class B name AUTHORED OPEN

in a repo that keys on tokens. staged_crossing and open_crossing say the same thing about the

seam without borrowing a token that already means something else one registry over.

invented. Composes rather than duplicates — a staged crossing is a T1 you walk into or a T2 you

sail into, and the engine reads the mechanism from one column and the content budget from the

other. Follows the repo's own ratified precedent for splitting a conflated column. Keeps the

crossing dungeons routed to the dungeon/level pipeline (where the boss, encounter, and zone

registries already live) rather than through the seam mechanism, which is where they belong.

Makes "important" an explicit, citable, auditable field rather than an adjective.

could under-read a crossing dungeon as cheap — mitigated by the budget tooth in section 9.4,

which requires the two columns to be consistent.

written, and it is the one that survives the next question — a crossing that is both a conveyance

and a dungeon, which the road already contains (the Vimana-carried threshold crossing into

Atlantis is a conveyance whose destination is a staged encounter).

Under Option C, "important" gets a definition rather than a vibe: a crossing earns weight when the

seam's own prose entry stages a named encounter, a named contest, or a named site the player must

work through — which is a condition a script can test against the five-part entry, not a taste

call. The named candidates on the road today are the Realm Road crossings (section 5), the Kra

Isthmus portage, and the Ch 74 to Ch 75 re-rooted crossing home, which canon already describes as a

crossing that must be repaired before it opens.

3.4 The dungeon-economy composition contract — one owner, and it is not this spec

DIRECTOR RULING, applied here rather than presented: crossing_weight DELEGATES to the rift

spec's five-class taxonomy and to the universal meter-credit invariant — the CLASS VOCABULARY and

that one invariant, and nothing else. The delegation is deliberately NOT to the rift INSTANCE

registry, because a crossing dungeon is not a rift: the rift spec's §1.1 invariant rules that no

rift dungeon is a crossing and that rift dungeons never cross to realms, so a crossing resolving

into a rift instance row would breach that invariant on the data layer. There is one owner of the

CLASS taxonomy — the rift-dungeon scaffolding spec — and this spec never mints a second. The

critic's MAJOR finding was that a crossing dungeon would otherwise grant nothing and violate the

meter-credit invariant by omission, and the scoped delegation is the fix.

Where the class rows live, so the delegation has a target that is not a rift row: the five classes

sit in an authored-dungeon CLASS table, T0_Dungeon_Class_Reference, standing ABOVE both the rift

instance registry and this seam registry. It carries one row per class (AUTHORED_BOUNDED,

AUTHORED_OPEN, EASTER_EGG, EVENT, POPUP_TEMPLATE) with the derived

counts_toward_cleansing_meter, and the rift spec owns its vocabulary. A crossing dungeon reads

its CLASS from that table and homes its INSTANCE on this travel and seam surface; it is never a

rift row and never appears in the rift instance registry.

The ruled ground this composes with, cited rather than restated: the five classes are CLASS A

AUTHORED_BOUNDED (exactly twenty across the arc, ten Vril and ten Health capacity pieces; twelfth

sitting, T1_Combat_System_Spec L63), CLASS B AUTHORED_OPEN (authored dungeons beyond the bounded

twenty), CLASS C EASTER_EGG, CLASS D EVENT, and CLASS E POP-UP. The universal meter-credit

invariant is that every authored dungeon grants meter credit regardless of stat lane, and the

no-lockout law is that neither progression nor the completionist 100 percent may be gated by an

integrity path or an absorb choice (ninth sitting JB-2; X-2).

The contract:

counts toward the cleansing meter. This is not a new grant; it is the universal invariant applying

to a row that already qualifies. The seam registry states no meter arithmetic, no reward class,

and no capacity-piece count — those columns live on the CLASS row and are read from there.

beyond the bounded twenty. It is a default and not a mint — where a crossing coincides with one of

the bounded twenty, the ref points at the AUTHORED_BOUNDED class row and the class is read there.

No sixth class is declared, requested, or implied by this spec.

sigma-spawned and a seam crossing is neither; a dungeon_class_ref resolving to a D or E row is

a failure, not a configuration.

T0_Dungeon_Class_Reference — never to a rift instance row, whose own rift_class column keys

the same vocabulary for rifts only. This spec follows whatever the rift spec ratifies as the class

vocabulary and hard-codes no registry name into the engine view. Every staged_crossing and

open_crossing row carries the ref; a none or dressed row leaves it empty. The tooth is

section 9.9.

are named in the "Explicitly NOT columns" list of section 4.3 so that a future reader finds the

omission declared rather than discovers it as a hole.

design preference. RLM_0009 records the crossing as the one that must be REPAIRED BEFORE IT OPENS,

with the winning verb RE_ROOT. That is a progression gate, stated in the realm registry, on the

main-line story road. The no-lockout law governs the cleansing meter and the completionist 100

percent — it is not a law against main-line story gates, and the crossing does not gate either the

meter or completion. The row records this explicitly in notes with the RLM_0009 citation, so the

exception is visible to any auditor rather than looking like a violation nobody noticed.

4. The per-seam data model

4.1 Where the 78 rows live — options and recommendation

off-by-one would sit exactly where the Prologue and Epilogue confusion already lives. The seam

needs eight to twelve fields, bolted onto a registry that already carries 52 columns and is

ACTIVE and fidelity-baselined, so every seam edit would shift the baseline of the most-read

registry in the repo. The known Chapter_Index narrative-lag defect would now also be a seam

defect.

assumed this (line 446: a one-column mechanical pass over existing entries). Against: markdown is

not queryable by the DataTable importer that the engine consumes, the fields are more than one

column, and the gate would have to parse prose to verify anything.

drift class this repo has already been burned by.

RECOMMENDATION — Option 2: a new T0_Travel_Seam_Registry holding 78 rows, with the transitions

markdown remaining the sole PROSE home (the five-part entry, unchanged) and the registry the sole

STRUCTURED home. No field is authored in both. The registry carries a prose_ref pointing at the

markdown anchor, and a tooth asserts the two sets are in exact bijection.

Reasoning: the repo already has an edge registry and it works — T0_Cross_Cultural_Link_Graph

carries 184 live foreign-key-clean edge rows and was built exactly this way (Gate C, Phase 0; the

count is read from the live CSV, not from a doc label). Edges get their own table. A new registry

also isolates the churn: seam typing can iterate without touching the fidelity surface of

Chapter_Index, and the new registry declares itself in docs/fidelity_baseline.json under

added_registries — the mechanism already exists and already carries 27 declared live-only

registries, so this is a declared, gate-clean move rather than a new exception.

4.2 The row key

seam_id of the form SEAM_<from_node>_<to_node> using the canonical node ids — for example

SEAM_CH_PROLOGUE_CH_01, SEAM_CH_04_CH_05, SEAM_CH_77_CH_EPILOGUE. The key is derivable, is

self-describing in a diff, and makes an accidental chord (a seam between non-adjacent nodes)

visible on sight rather than only under the tooth. A sequential SEAM_0001 key is rejected because

renumbering after an insertion would silently re-point every reference.

4.3 The columns

Authored fields:

Required. The tokens are deliberately not staged_dungeon / open_dungeon, to avoid colliding

with the ruled Class B name AUTHORED OPEN.

T0_Dungeon_Class_Reference, never to a rift instance row. Required on staged_crossing

and open_crossing, empty otherwise. The class, the meter credit, and the reward routing are read

there and are never restated here (section 3.4).

whenever either is above its floor; must resolve to a real anchor (a spine file plus section, a

WGM section, or a Chapter_Index cell). Empty is legal only on a T0 / none row.

mount, vimana_flight, vimana_dimensional, realm_road, non_spatial, dimensional_fall. Read against

T1_World_Geography_Master Travel Methods by Arc, which already binds the arc-by-arc legality.

The water media are exactly riverine, coastal_sail, and open_sea; section 9.6's pre-CH_08 clause

is scoped to that set.

non-water T2 medium and is the correct value for the dimensional fall.

realm; empty otherwise. See section 5.

column rather than a constant so that the day someone wants a second value, the change is visible

in a diff and takes a ruling.

whether the assigned tier can actually cover the load; over_budget is the condition that earns

T3 on stream grounds rather than canon grounds.

column on every row. It records whether any player-facing string sourced from this row is drafted,

reviewed, or final, and it is the hook the no-mode-taxonomy tooth (section 9.7) reads.

(UNTYPED, TYPED, RATIFIED, BUILT, VERIFIED) so the state machine is data rather than commentary.

Derived-and-never-authored (populated by script, present so the engine has one place to read):

Explicitly NOT columns, because they are read from their owning registries and duplicating them

would create a second source of truth: intensity (Chapter_Index intensity plus the Pattern-A

terrace envelope on the realm row), the crossing's dramatic character, its entry and exit framing,

and its fail behaviour (all four live in T0_Realm_Ruleset_Registry.traversal_class), the dungeon

class and the cleansing-meter credit and the reward class and the capacity-piece count and the

rarity routing (all five live on the authored-dungeon CLASS row and are reached through

dungeon_class_ref — DELEGATED, per section 3.4, and listed here so the omission reads as declared

rather than as forgotten), the age and companion and concealment ledgers (the transitions markdown's

through-line ledgers), and any world-state key (T0_Worldstate_Variables).

4.4 The generated engine view

One deterministic emitter produces DT_TravelSeam from the registry, over the DataTable seam

already proven at 79 and 281 rows. The engine reads seam_tier to pick a mechanism,

crossing_weight to pick a content budget, dungeon_class_ref to reach the class row when the

weight calls for one, transition_map_id to pick a map, and nothing else. No engine code reads

the markdown, and no engine code computes meter credit from a seam row.

5. Realm-crossing composition — compose, never duplicate

T0_Realm_Ruleset_Registry already carries, on ten of its eleven rows, a populated

traversal_class with a fixed term grammar: class:per_realm followed by entry:, exit:,

character:, fail:, and envelope: terms. That column is the landed product of the fourteenth

sitting's ruling (DECISIONS_PENDING_JOSH.md line 268: option (b), PER-REALM crossing character

inside the Pattern-A terrace intensity envelope). Every realm row's envelope term names

pattern_a_terrace, and RLM_0001's carries the scope explicitly — the intensity string itself is

CH_70-77.

The composition contract:

and intensity envelope. The seam registry never restates any of them.

(crossing_weight), its conveyance, and its stream budget. The realm registry never states any

of them.

forbidden field fails. Both halves are one tooth (section 9.5), because a join that is only

checked in one direction lets duplication back in through the other.

5.1 The FIFTEEN realm-touching seams, derived from the realm rows' chapter_refs

The count is fifteen, not fourteen. The earlier draft's fourteen was arithmetic drift in two

directions at once: CH_74 to CH_75 was counted twice (once inside the ten road crossings and again

as "the one that is different"), and CH_77 to the Epilogue was omitted even though section 7 already

discusses it and RLM_0010's chapter_refs carries both CH_77 and CH_EPILOGUE. Fifteen is what the

tooth's own rule produces from the live rows, and a tooth that hard-asserted fourteen would fire RED

on correct data — worse, it would train the typing pass to blank realm_crossing_ref on the

Epilogue seam to make the gate green, which is precisely the defect the tooth exists to prevent.

The count below is therefore illustrative of a DERIVED set, never a literal the tooth asserts

(section 9.5).

The realm-referenced node set today is CH_66 through CH_74 (RLM_0001 through RLM_0009, one chapter

each), plus RLM_0010's six: CH_PROLOGUE, CH_01, CH_75, CH_76, CH_77, CH_EPILOGUE. RLM_0000 carries

the non-node token CH_02_ONWARD, which is handled by the allowlist in section 9.5.

Vimana in its dimensional-space operational mode — a T2 conveyance whose destination is a staged

encounter, and the cleanest live argument for Option C), then 66 to 67, 67 to 68, 68 to 69, 69 to

70, 70 to 71, 71 to 72, 72 to 73, 73 to 74, and 74 to 75. CH_74 to CH_75 is named ONCE, here, as a

member of this set; it appears again below as the weight exemplar and not as an eleventh crossing.

records as within-realm on foot (T0 by canon's own words — the brief's T0 line already names the

Ch 70-77 within-realm seams as the tier's home case), and CH_77 to CH_EPILOGUE, the exit seam,

which is realm-touching on both ends by RLM_0010's own chapter_refs and carries the declared

arrival contract of section 7.

handled as declared edge cases in section 7.

The weight exemplar, drawn from the ten above rather than added to them: CH_74 to CH_75, which the

seam prose calls THE crossing and the window's one medium change, and which RLM_0009 records as the

only crossing on the road that must be REPAIRED BEFORE IT OPENS, winning verb re-root. That is a

staged_crossing weight sitting on a threshold mechanism, and it is unrepresentable under Options A

or B without losing one half. Its progression gate is canon-sourced and declared per section 3.4.

6. The state machine

6.1 Authoring lifecycle (per seam row)

The state rides the lifecycle column (section 4.3), so it is queryable rather than narrative.

UNTYPED — the state all 78 rows are in today. No seam_tier.

TYPED — seam_tier and crossing_weight set, earned_by cited where required,

dungeon_class_ref set where the weight calls for one. Proposal tier; the enum and earning teeth

arm here.

RATIFIED — the row's assignment survives the fresh-context critic pass and, where it touches

numerical or naming canon, Josh's ruling. Only ratified rows enter a build pack.

BUILT — a transition_map_id resolves to a real map and the mechanism is implemented for that

tier.

VERIFIED — the seam has been traversed headlessly end to end with the arrival state matching the

arriving node's continuity anchor, captured under the visual-verification directive.

A row may never skip from UNTYPED to BUILT. The gate reports the population of each state every

run, so a stalled typing pass is visible rather than silent.

6.2 Runtime (per traversal)

persisted and chapter-scoped state (local.*) is marked for reset. This ordering is already

proven in the game repo's cross-map seams and is not new work.

walk for T1; the deck loop for T2; the elision surface for T3. The stream is asynchronous and its

completion is polled, never assumed.

carrying a line lifted verbatim from the exit beat's player_objective. Exiting YIELD returns to

PASSAGE's tail, never to ARRIVAL directly, so the arrival always plays.

control.

Where the seam carries a dungeon_class_ref, the meter credit is granted by the dungeon's own

runtime on its own row, not by the seam's COMMITTED step — the seam never writes the meter.

Failure handling: a stream failure in PASSAGE routes to YIELD and, if the load ultimately fails,

to an honest error rather than a silent teleport. A crash between ARMED and COMMITTED resumes at

ARMED — the seam is idempotent by construction, which is what makes the checkpoint honest.

Two hard runtime invariants, both from the ruling: the two large maps are never co-resident (the

whole reason the mechanism is SeamlessTravel with a TransitionMap rather than two loaded levels);

and no path exists from DEPARTURE to ARRIVAL that skips PASSAGE, because that path is the loading

screen returning as a destination.

7. Edge cases — the nine seams that will break a naive pass

the earlier draft resolved this by argument against a ruled criterion, which is one place too many

to decide).

fall itself, uncontrolled and disorienting), so it is not elision. RECOMMENDATION: T2 with

transport_medium = dimensional_fall and conveyance_ownership = none — full character control

on a thing the player cannot steer is the T2 contract exactly, and a fall is the ideal stream

cover. none is legal here because section 9.6's pre-CH_08 ownership floor is scoped to water

media, which a dimensional fall is not; the carve-out is proven by a must-PASS fixture rather than

assumed. Hard constraints ride this row: nothing on the departure side may warn, and no surface

may present the chase or the ward coming off the neck as the cause.

cross-map seam. T0, weight none, and the correct build action is to ensure nothing is ever

authored there.

owns no craft until CH_08), both on water media so both inside the section 9.6 floor. Ch 4 to Ch 5

carries a live blocker recorded in the brief: the seam lands on SamosirToba but CH05_B01

sequence 1 is borobudur and Samosir is beat 5, so the player is currently delivered into the

middle of the chapter. The arrival target is fixed before the seam is typed BUILT, not after.

intra-chapter and its canon route doubles back. It is the best prototype ground in the project

and it must not be typed as a seam row, because doing so would put an intra-chapter route into an

inter-chapter registry and quietly break the bijection. Recorded here so the boundary is explicit.

typed T3 from the start and validated last.

Korean-peninsula there-and-back are in-chapter excursions off the onward line, and the traveled

route resumes where it left the coast. Same boundary as the belt.

only crossing that must be repaired before it opens. It is the load-bearing case for Option C, it

carries a dungeon_class_ref under section 3.4, and its canon-sourced progression gate is

declared in notes with the RLM_0009 citation.

both ends by RLM_0010's chapter_refs, so it carries a realm_crossing_ref and belongs to the

derived set of section 5.1. Flagged because the Epilogue is the completionist and endgame surface

rather than a chapter, so the arrival contract differs from every other row and should be spelled

out in notes rather than assumed.

7.1 Prologue to Ch 1 — an OPTIONS block, not a decision

The passage is generational and of viewpoint, inside one realm, with no spatial move. It is also

mechanically a T3 shape — the departure plays (the King carrying the heir out), the middle elides (a

fairy childhood), the arrival plays (the child). The journal does not exist yet (HL_0070: the

journal begins at Ch 13), so the elision surface cannot be the journal. Two readings are live and

both sit on real ground, so this goes to Josh with the elision-surface name (section 11) rather than

being settled here.

move," and this passage meets it verbatim; RLM_0010's traversal_class independently states that

the passage is not spatial at all. Pros: it applies a ruled criterion as written, needs no new

elision-surface vocabulary, and costs nothing. Cons: T0's player-experience contract is "the

player keeps walking," and here years pass and the viewpoint changes person — a T0 with an

authored departure and arrival is not what T0 describes.

non_spatial`, with a declared elision surface that is not the journal, and a record that the T3

elision-surface vocabulary needs one more value than the brief named. Pros: it matches the seam's

actual authored shape (played head, elided middle, played tail), and it keeps the departure and

arrival playable, which Option 1 would have to smuggle in under a tier that forbids presentation.

Cons: it types against the letter of the ruled no-spatial-move criterion, and it spends a

vocabulary value the brief did not budget.

matches it word for word; choosing T3 is a spec preferring a mechanism read over a ruled criterion,

which is exactly the move this repo asks to be surfaced rather than made. That is why it is

surfaced.

8. Registry and repo touches

section 4.3.

commit that creates it, per the standing rule that any registry edit refreshes the baseline in

the same commit or the gates go red.

T0_Chapter_Index.chapter_id, realm_crossing_ref to T0_Realm_Ruleset_Registry.realm_id,

conveyance_ref to T0_Vehicle_Registry, and dungeon_class_ref to

T0_Dungeon_Class_Reference once that class table lands carrying the rift spec's ratified class

vocabulary. Token patterns are full-match anchored, per the hardened spec.

prev_chapter_link and next_chapter_link on the 23 rows that carry both empty. Deterministic

from existing row order; a script transform, then the critic and the full gate suite, because a

registry edit is never trivial-mechanical for review purposes.

fixtures and a scorecard, on the established pattern.

are UNTYPED, with every not-yet-armed assertion printing its reason under DECLARED NOT-ARMED on

every run.

the DT_TravelSeam emitter.

it is listed there.

is not written there. This is a deliberate divergence from the brief's assumption (line 446, the

typing lands in the transitions doc), and the divergence is recorded so a later reader does not

read it as drift.

T0_Worldstate_Variables, T1_World_Geography_Master, and T0_Dungeon_Class_Reference, the

authored-dungeon class table (section 3.4 reads it and never writes it). The rift INSTANCE

registry is not a consumer here at all — this spec never reads it and never writes it.

9. The teeth

Nine, each with the must-fire fixture that proves the ruler is armed. All are deterministic and

offline. The pattern follows harness/check_realm_ruleset.py: every tooth is named, every unarmed

tooth declares itself every run, and a tooth whose search cannot match is a failure and not a pass.

9.1 T-SEAM-BIJECTION — 79 nodes to 78 seams

The registry's rows form exactly one simple path over the 79 nodes. Concretely: row count is

exactly 78; every from_node_id and to_node_id resolves to a real Chapter_Index row; the

multiset of to values contains every node except the first exactly once; the multiset of from

values contains every node except the last exactly once; the induced graph is connected, acyclic,

and has no vertex of degree greater than two; and every (from, to) pair is adjacent in the

canonical node order. Must-fire fixtures: delete a row (77); duplicate an edge; insert a chord

CH_02 to CH_05; reverse one edge; splice the path into two components. Vacuity guard: zero rows

fails, and a run where the node set is empty fails rather than passing trivially.

Prerequisite: the tooth's adjacency half reads Chapter_Index links and cannot arm until the 23-row

repair of section 8 lands. Until then that half prints under DECLARED NOT-ARMED with the count of

missing links, and the order-independent half (78 rows, one path, no chords by id form) arms

immediately.

9.2 T-SEAM-PROSE-PARITY — the two homes agree

The ### headings across docs/spine/transitions/*.md and the registry rows are in exact

bijection, and each heading parses to the same (from, to) pair as its row's prose_ref.

The normalization is SPECIFIED, because an unspecified normalization is exactly the

search-that-cannot-match failure class this repo has been bitten by four times and which section 9.3

invokes by name. The live headings are human-register ("### Ch 1 to Ch 2 — the rift-fall arrival",

"### Ch 77 to the Epilogue — the summit to the closing frame", "### Prologue to Ch 1 — the King's

ceiling to the Child") while the keys are canonical node ids. The table:

em-dash clause is discarded before matching.

An unparseable heading is a FAILURE, never a skip — a heading the parser cannot read is a heading

nobody is checking, and silently skipping it is how a mis-typed seam ships. File glob order must

not affect the derived path: TRANSITIONS_PROLOGUE_01.md sorts LAST under a naive glob, so the

parser sorts by derived node order and never by filename, and the tooth asserts that a shuffled file

list produces an identical derived path.

Must-fire fixtures: rename a heading; add a 79th entry; point two rows at one anchor; delete a file;

present a heading the normalization table cannot resolve ("### Ch one to Ch two"), which must go

RED rather than be skipped; feed the parser its files in reversed and randomized order, which must

produce a byte-identical derived path. This is the tooth that makes the single-authoring-home rule

enforceable rather than aspirational.

9.3 T-SEAM-TIER-ENUM — the ruled enum stays the ruled enum

seam_tier is exactly one of T0, T1, T2, T3 on every row, never blank; crossing_weight is in its

declared enum (none, dressed, staged_crossing, open_crossing); fallback_policy is

yield_target on every row; lifecycle is in the section 6.1 set. Must-fire: introduce T4; blank a

tier; misspell a token; write open_dungeon (the retired pre-revision token, which must go RED

rather than be silently accepted as a synonym); set a second fallback value. Vacuity guard with

teeth: if fewer than two distinct tier values appear across 78 rows, the tooth FAILS — an all-T0

registry is indistinguishable from a typing pass that never ran.

9.4 T-SEAM-EARNED — T0 is the presumption, inverted into a check

Any row above T0, or above crossing_weight = none, carries a non-empty earned_by that resolves

to a real anchor (an existing file plus a heading that exists in it, or a Chapter_Index cell that

is non-empty). Any T0 row with weight none carries no authored transition asset. And the two

columns must be consistent: a row with crossing_weight of staged_crossing or open_crossing

may not sit on seam_tier T0, because a crossing dungeon you never enter is not a dungeon.

Must-fire: promote a seam to T2 with an empty citation; cite a heading that does not exist; put an

open_crossing on a continuous seam. This tooth is the anti-inflation ruler — it is what stops the

typing pass from drifting upward into a budget nobody approved.

9.5 T-SEAM-REALM-COMPOSE — the join is checked in both directions, against a DERIVED set

The expected set is DERIVED at runtime and never hard-coded. The tooth reads every realm row's

chapter_refs, splits on the pipe delimiter, and matches EXACT TOKENS against

T0_Chapter_Index.chapter_id — never a prefix match and never a substring match, both of which

would let RLM_0000's CH_02_ONWARD explode the tooth's scope to the entire arc. It then computes

the set of seams whose from_node_id or to_node_id is in that node set, PRINTS the derived set

and its cardinality in the scorecard, and asserts membership against the derived set. It asserts no

literal count. On today's live data the derived cardinality is fifteen (section 5.1); if a realm row

gains a chapter tomorrow, the tooth follows the data instead of firing red on it.

Token hygiene, so a typo is caught rather than silently ignored: every chapter_refs token must

either resolve to a node id or appear in a declared known-non-node allowlist. The allowlist today

contains exactly one entry, CH_02_ONWARD (RLM_0000, the human world, the shipped baseline). A

token that is neither a node id nor allowlisted is a FAILURE.

Both directions: every seam in the derived set carries a realm_crossing_ref resolving to the realm

that referenced it; and no seam row populates any field the realm registry owns (character, entry,

exit, fail, envelope, intensity) — those columns do not exist on the seam schema, and the tooth

additionally scans notes for the realm registry's own term tokens so a restatement cannot sneak in

as prose.

Must-fire: blank the ref on the Ch 69 to Ch 70 crossing; point a ref at the wrong realm; paste a

character: term into a seam row's notes; add an unrecognized non-node token to a realm row's

chapter_refs; switch the matcher to prefix mode, which must change the derived set and fail the

self-test. Must-PASS: the CH_77 to CH_EPILOGUE seam with a realm_crossing_ref of RLM_0010, which

the pre-revision fourteen-count would have rejected.

9.6 T-SEAM-CONVEYANCE-GATE — no craft before its chapter

Every T2 row names a conveyance_ownership; where it is player_owned, the referenced vehicle's

acquisition chapter is at or before the seam's from_node_id in node order; where the medium is

any Vimana form, the seam sits at or after Ch 55 (controlled flight arrives at Ch 55 per

T1_World_Geography_Master Travel Methods by Arc); and where the seam sits before CH_08 AND its

transport_medium is a WATER medium (riverine, coastal_sail, open_sea), conveyance_ownership must

be npc_crewed, because the player owns no watercraft until VH_002 at CH_08.

The water-media scope is the fix for a self-contradiction the critic caught: the earlier clause

applied to every pre-CH_08 seam regardless of medium, which meant the spec's own recommended row —

CH_01 to CH_02, a dimensional fall with ownership none — went red on day one under the spec's own

tooth. The tooth's stated reason is a statement about watercraft, so its scope is watercraft.

Must-fire: a player-owned caravel at Ch 5; a Vimana flight seam at Ch 41; a player-owned skiff at

Ch 3. Must-PASS, proving the carve-out rather than assuming it: dimensional_fall at CH_01 to

CH_02 with conveyance_ownership = none and no conveyance_ref, which must go GREEN. This tooth

catches the single most likely authoring error in the whole pass, because the early water seams are

the prototype and the temptation to give the child a boat is structural.

9.7 T-SEAM-FALLBACK-HONESTY — the screen never becomes a destination, and no internal token reaches a player

Where a row declares a card line, that line is a verbatim substring of the exit beat's existing

player_objective — a composed string fails. No row may carry a card as its PASSAGE content (a

card is reachable only from YIELD). And the tooth carries its own anti-vacuity clause: if zero rows

declare a card, the gate asserts that the card system is declared absent in the scorecard rather

than reporting a clean pass, because "no cards found" and "no card system wired" read identically

otherwise.

Arming the no-mode-taxonomy-on-player-surfaces law, which the earlier draft observed in spirit and

never armed: no seam-sourced player-facing string may contain a tier or weight token. The tooth

scans every string this registry can source onto a player surface — the card line and any

string_status-bearing field — for the tokens T0, T1, T2, T3, CONTINUOUS, THRESHOLD, CONVEYANCE,

RITUAL ELISION, staged_crossing, and open_crossing, word-boundary anchored so an unrelated

substring does not false-positive. Must-fire: put "T2 conveyance" into a card line, which must go

RED; put a tier token into a notes field flagged for player surfacing, which must go RED. Internal

routing tokens stay internal, exactly as the verbs do.

9.8 T-SEAM-STATE-CHAIN — no seam invents state

Every world-state key a seam row references is declared in T0_Worldstate_Variables, and a seam

never asserts a key neither adjoining node declares. This mirrors the discipline the transitions

files already hold themselves to in prose (TRANSITIONS_PROLOGUE_01.md closing note: the seam

asserts no ws.* key the Worldstate registry does not already declare) and turns it into a ruler.

Must-fire: reference an undeclared key; assert a key on a seam whose nodes do not carry it.

9.9 T-SEAM-DUNGEON-DELEGATION — the crossing dungeon has exactly one owner

Every row whose crossing_weight is staged_crossing or open_crossing carries a non-empty

dungeon_class_ref that resolves to a real CLASS row in T0_Dungeon_Class_Reference; every row

whose weight is none or dressed leaves it empty. A ref that resolves to a rift INSTANCE row is a

FAILURE, not a configuration — a crossing is never a rift, and the rift spec's own crossing tooth

(T-RIFT-4) is scoped to rift_class rows precisely so the two surfaces cannot collide. The

referenced class may not be CLASS D EVENT or CLASS E POP-UP. The seam schema carries no

meter-credit, reward-class, capacity-piece, or rarity-routing column, and the tooth asserts their

absence by name so a well-meaning later addition fails loudly rather than quietly minting a second

economy. Where the referenced class is AUTHORED_BOUNDED, AUTHORED_OPEN, or EASTER_EGG, the tooth

confirms that the CLASS row's counts_toward_cleansing_meter is TRUE — read off the class row and

never off a rift row, the universal meter-credit invariant read back from its owner rather than

computed here.

Must-fire: an open_crossing with an empty dungeon_class_ref; a dressed row that carries one; a

ref pointing at a CLASS E pop-up template; a ref pointing at a rift instance row; a meter_credit

column added to the seam schema; a ref whose class row carries counts_toward_cleansing_meter

FALSE. Declared-not-armed until T0_Dungeon_Class_Reference lands with the rift spec's ratified

class vocabulary, printing the reason every run.

10. Build order

The order is the brief's ship order, adjusted only where the inventory above changed a fact.

1. Repair the 23 Chapter_Index link rows. Zero-token, deterministic, unblocks the bijection tooth.

2. Mint the registry with all 78 rows at UNTYPED, plus the gate PASS-on-empty and loudly declared.

The parity and enum teeth arm immediately; nothing else can drift while the typing pass runs.

3. Run the typing pass. Script-emit the candidate assignment from the existing five-part entries

(transport medium and stream budget are largely mechanical from the Passage bullet), then have a

pass over the candidates with citations. T0 is the presumption; every promotion carries its

earned_by.

4. Land the mechanism with an empty TransitionMap. It works with a dummy world, so plumbing lands

before any art.

5. Claim Ch 2 to Ch 3 as T0. It is already continuous and it is free.

6. Prototype on the Ch 5 belt — three of its four maps are tiny stubs and nothing is being replaced.

It yields the T1 connector kit and the T2 deck rig at once.

7. Fix the Ch 4 to Ch 5 arrival target, then type the two slice water seams T2 npc_crewed.

8. Validate Angkor last, as the T3 over-budget stress case.

Sequencing note on the delegation: tooth 9.9 arms only after T0_Dungeon_Class_Reference lands with

the rift spec's ratified class vocabulary, so crossing_weight above dressed should not be typed

RATIFIED before that lands. Typing it

TYPED is fine and is expected; the ordering constraint is on ratification, not on drafting.

The single technical gate on the whole plan is moving-platform character attachment for T2. If it

fails, the fallback is stated in advance rather than improvised: those seams demote to T1 with a

dressed connector, and the tier column records the demotion with its reason.

11. What goes to Josh, and what does not

Genuine forks, presented and not decided:

touches the ruled token set, so it is his.

the ruled no-spatial-move criterion versus Option 2 T3 on the years-pass reading, recommendation

T3) and the elision-surface NAME it needs, which is one vocabulary value the brief did not name.

The earlier draft routed only the name and decided the typing; the typing sits against a ruled

criterion rather than in a gap, so it goes with the name.

Applied under the standing autonomy contract, path shown, no ruling needed:

it.

already-ruled artifacts and adds nothing.

the CLASS taxonomy, the rift spec, never two mints, with the crossing dungeon's INSTANCE home on

this surface and never on a rift row. It grants nothing new and removes a silent invariant

violation.

8), which is a data repair with a deterministic answer.

Named debts, recorded so they are not lost:

5). Open blocker, owned by the slice.

craft the slice actually uses is unminted.

rift spec's ratified class vocabulary; tooth 9.9 stays DECLARED NOT-ARMED and prints the reason

every run until it does.

24, window-plan rank 21) remains a separate, unsolved problem. This spec does not touch it and

must not be read as covering it.

12. Revision log — the critic findings and where each landed

CH_75 named once inside the ten road crossings and CH_77 to CH_EPILOGUE restored. Tooth 9.5 now

DERIVES the set from chapter_refs at runtime, prints it, and asserts membership against the

derived set with no literal count anywhere.

media (riverine, coastal_sail, open_sea), matching its own stated reason; section 2.3's conveyance

legality paragraph and section 4.3's conveyance_ownership entry carry the same scope; a must-PASS

fixture (dimensional_fall at Ch 1, ownership none) proves the carve-out.

under the DIRECTOR RULING: DELEGATE to the rift spec's five-class taxonomy and the universal

meter-credit invariant, one owner and never two mints. Default placement CLASS B AUTHORED_OPEN, no

sixth class; new dungeon_class_ref column; meter credit and reward routing added to the

"Explicitly NOT columns" list as DELEGATED; CH_74 to CH_75's progression gate recorded as

canon-sourced (RLM_0009) and outside the no-lockout law's scope; tokens renamed staged_crossing

and open_crossing to clear the Class B AUTHORED OPEN collision; new tooth 9.9 enforces the whole

contract, with the retired open_dungeon token made a must-fire RED in 9.3.

added_registries entries, both read from live data this pass.

unparseable heading a FAILURE rather than a skip, sorts by derived node order rather than filename

(TRANSITIONS_PROLOGUE_01.md sorts last under a naive glob), and adds both fixtures.

T0_Chapter_Index.chapter_id and adds the known-non-node allowlist containing exactly

CH_02_ONWARD, with an unrecognized token a failure and a prefix-mode self-test that must fail.

section 4.3 for parity with the sibling T0_Realm_Ruleset_Registry (verified live: both columns

present); tooth 9.7 extended with a word-boundary-anchored no-tier-token-on-player-surfaces

assertion and two must-fire fixtures.

ruled criterion versus T3 on the years-pass reading), existing reasoning kept as the

recommendation with its strongest objection stated, and folded into the section 11 Josh list

beside the elision-surface name.

MISSING-list item 24, distinct from the claim-board table row 24, Photography / observation mode).

scoped to the CLASS VOCABULARY plus the universal meter-credit invariant only; crossing dungeons

home on the NON-RIFT authored-dungeon class table T0_Dungeon_Class_Reference (the rift spec keeps

the class taxonomy, this surface keeps the crossing INSTANCES), and dungeon_class_ref, section

4.3, section 4.4, section 8, tooth 9.9, the section 10 sequencing note and the section 11 debt all

re-point to the class row, with tooth 9.9 reading counts_toward_cleansing_meter off the CLASS row

and a rift-instance ref made a must-fire RED. The rift spec's T-RIFT-4 is scoped to rift_class

rows in the same pass, so a crossing-class row can never trip the crossing invariant. The CH_74 to

CH_75 example reads consistently end to end under the change.

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