music/SEAM_TYPING_SPEC.md
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.
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.
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.
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.
docs/spine/transitions/ carry 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.
T0_Chapter_Index carries prev_chapter_link and next_chapter_link, and where they are filledthey 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.
| The ruling requires | What exists today | Gap |
|---|---|---|
| 78 seams, enumerable | 78 authored five-part prose entries across 8 files | none — the set is exact and complete |
| each typed T0-T3 | zero typed | the whole typing pass |
| a per-seam data home | none; the type has nowhere to be written | section 4 of this spec |
| SeamlessTravel + TransitionMap as the universal mechanism | proven 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 dungeons | no 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 only | the travel card exists and is honest-minimal (plan line 1435) | it must be re-declared a yield target, not a destination |
| per-realm crossing character | T0_Realm_Ruleset_Registry.traversal_class populated on 10 of 11 rows with entry / exit / character / fail / envelope terms | already landed — compose, do not rebuild |
| Pattern-A terrace intensity envelope | carried on every realm row's traversal_class envelope term, plus T0_Chapter_Index.intensity | already landed — read, do not copy |
| adjacency to key against | prev_chapter_link / next_chapter_link, 56 of 79 filled | 23-row repair |
| a gate | no seam gate in harness/gates_config.json | section 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.
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.
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.
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.
UWorld::SeamlessTravel into a TransitionMap holding the connector, then outthe 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.
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.
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.
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.
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.
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.
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.
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.
seam_tiercould 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.
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:
staged_crossing or open_crossing IS an authored dungeon and thereforecounts 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.
dungeon_class_ref, a foreign key from the seam row to the CLASS row in 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.
T0_Chapter_Index. The type rides the departing chapter's row.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.
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.
Authored fields:
seam_id — the key above.from_node_id, to_node_id — foreign keys to T0_Chapter_Index.chapter_id, both required.seam_tier — one of T0, T1, T2, T3. Required. The ruled enum, closed.crossing_weight — one of none, dressed, staged_crossing, open_crossing (Option C). Required. The tokens are deliberately not staged_dungeon / open_dungeon, to avoid colliding
with the ruled Class B name AUTHORED OPEN.
dungeon_class_ref — foreign key to the authored-dungeon CLASS row in 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).
earned_by — the citation that justifies any tier above T0 and any weight above none. Requiredwhenever 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.
transport_medium — the diegetic medium: on_foot, riverine, coastal_sail, open_sea, caravan,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.
conveyance_ref — foreign key to T0_Vehicle_Registry where a craft is named; empty otherwise.conveyance_ownership — player_owned, npc_crewed, or none. Required on T2. none is legal on anon-water T2 medium and is the correct value for the dimensional fall.
realm_crossing_ref — foreign key to T0_Realm_Ruleset_Registry.realm_id on any seam touching arealm; empty otherwise. See section 5.
fallback_policy — yield_target on every row. A single-value column today, and deliberately acolumn rather than a constant so that the day someone wants a second value, the change is visible
in a diff and takes a ruling.
stream_budget_class — short, medium, long, over_budget. The engineering read that decideswhether the assigned tier can actually cover the load; over_budget is the condition that earns
T3 on stream grounds rather than canon grounds.
string_status — schema parity with the sibling T0_Realm_Ruleset_Registry, which carries thiscolumn 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.
lifecycle — schema parity with the same sibling. Carries the section 6.1 authoring state(UNTYPED, TYPED, RATIFIED, BUILT, VERIFIED) so the state machine is data rather than commentary.
prose_ref — file plus heading anchor into docs/spine/transitions/.notes — free text for the declared exceptions of section 7.Derived-and-never-authored (populated by script, present so the engine has one place to read):
is_realm_crossing, is_within_realm, node_order_index, transition_map_id.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).
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.
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.
seam_tier), its content weight (crossing_weight), its conveyance, and its stream budget. The realm registry never states any
of them.
realm_crossing_ref. A realm seam without it fails; a seam row that populates aforbidden 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.
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.
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.
ws.*) is 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.
local.* reset completes; the save point is legal. 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.
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.
npc_crewed (the playerowns 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.
stream_budget_class = over_budget;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.
staged_crossing weight, and theonly 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.
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.
registries/T0_Travel_Seam_Registry [DRAFT v0.1]/Sheet1.csv — 78 rows, the schema ofsection 4.3.
docs/fidelity_baseline.json — the new registry declared under added_registries in the samecommit that creates it, per the standing rule that any registry edit refreshes the baseline in
the same commit or the gates go red.
docs/fk_spec.json — four foreign keys registered: from_node_id and to_node_id to 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.
registries/T0_Chapter_Index [ACTIVE v1.2]/ — DATA repair only, no schema change: fill 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.
harness/check_travel_seams.py — new gate hosting the teeth of section 9, with --self-testfixtures and a scorecard, on the established pattern.
harness/gates_config.json — the gate registered, PASS-on-empty and LOUDLY DECLARED while rowsare UNTYPED, with every not-yet-armed assertion printing its reason under DECLARED NOT-ARMED on
every run.
harness/emit_travel_seam_view.py — the deterministic markdown-to-registry parity extractor and the DT_TravelSeam emitter.
docs/DOC_MAP.md — a row for this spec and a row for the registry. A new doc is not done untilit is listed there.
docs/spine/transitions/*.md — UNCHANGED. The prose home keeps its five-part entries; the typeis 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_Realm_Ruleset_Registry, T0_Vehicle_Registry, 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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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:
CH05_B01 sequence 1 is borobudur, Samosir is beat5). Open blocker, owned by the slice.
OpenLevel with a card is proven today.T0_Vehicle_Registry carries three rows and the earliest watercraft is CH_08, so the crossingcraft the slice actually uses is unminted.
dungeon_class_ref cannot be foreign-keyed until T0_Dungeon_Class_Reference lands carrying therift spec's ratified class vocabulary; tooth 9.9 stays DECLARED NOT-ARMED and prints the reason
every run until it does.
docs/DESIGN_GAP_REGISTER.md L327, the MISSING-list item24, window-plan rank 21) remains a separate, unsolved problem. This spec does not touch it and
must not be read as covering it.
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.
T0_Cross_Cultural_Link_Graph rows and 27 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.
string_status and lifecycle added to 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.
docs/DESIGN_GAP_REGISTER.md L327 (theMISSING-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.