pipelines/FACTORY_CONTRACT.md
Status: ACTIVE v1.0.5 (minted 2026-07-27, window-plan rank 2.5; revised the same day by the lane-B
critic pass — R4 minted, the S2 rank scan corrected, sixteen ruling anchors repaired; v1.0.2
the story-depth Wave 3 arc-axis wiring 2026-07-29; v1.0.3 the ten-lane pipeline gap audit's
eleven content-class riders 2026-07-29 — this header still read v1.0.1 at v1.0.2, so the version
is now carried in one place and corrected here rather than left as a stale label; v1.0.4 the
twenty-eighth sitting item J4 — FR-082, the ally switch's uncontrolled-behaviour obligation,
with its migration_ledger row 2026-07-30; v1.0.5 the thirty-first sitting's pipeline-hardwiring
mandate 2026-08-03 — FR-083 to FR-087, the five art-asset riders for the concept-art PLATE lane,
which a recursive walk of the machine mirror found to have ZERO representation here against a
50-hit registry positive control). Tier: T99 operational — subordinate to
the CVD and to every tier doc. Machine mirror: docs/factory_contract.json. Tooth: gate 30
factory_contract (harness/check_factory_contract.py). Checklist emitter:
harness/emit_chapter_checklist.py.
This document sets no canon. A rider row is never the source of a rule — it is always a pointer to
one, and the ruling it points at is the authority.
Everything in the factory is keyed on a NODE or on a SYSTEM. The chapter-as-obligation axis had no key
at all: nothing in the repo answered "for Ch 23, what must be true?" Rulings reliably became canon and
reliably became gates; they became per-chapter factory behaviour only when a human remembered to edit
a prose bullet list, and that memory measurably failed.
The contract is the single accumulating per-chapter obligation register. One row per RIDER: a thing
that must be true of every chapter, or of every chapter of a class, as a consequence of a ruling. Two
things follow from that shape, and they are the whole design:
hand-maintained list reaches only the chapters someone remembered to edit.
OWNER: line and a rider row in the samecommit. Gate 30 fires the day a promise lands uncited, which is the anti-orphan doctrine made
executable rather than aspirational.
These are quoted exactly as they stand in docs/PRE_5090_BUILD_PLAN.md, which is the binding copy —
the window plan, not the charter, is what the factory reads. Gate 30 asserts this block is a verbatim
substring of the plan and that all four cited ranks resolve to real ranks.
Story-depth program freeze constraints (2026-07-27). (1) Rank 2.5 (factory contract) lands
BEFORE ranks 13-17 — the schema-freeze ranks emit rider rows rather than retrofit them.
(2) The arc schema (T0_Arc_Index / T0_Arc_Grid / T0_Arc_Grammar / T0_Promise_Ledger) lands
BEFORE rank 10 — the 264-seed typing pass assigns arc_id at typing time, which turns the
hub-and-spoke gap and the flat-SQ finding into one fix instead of two passes. (3)
T0_Chapter_Index.emotional_register lands BEFORE rank 8 — rank 8's music cue table has no
upstream mood source today. (4) Rank 11 (T0_Persona_Index) lands BEFORE any companion-arc
typing — typing arcs against personas that are about to change types them twice. Source: the
story-depth program charter; constraints are recorded here because the window plan, not the
charter, is what the factory reads.
The inputs below are the ruled systems inventory a chapter build reads before it authors anything.
Each is carried by at least one rider, so the list cannot rot independently of the register.
(FR-030).
that make the predecessor's end state this node's start state (FR-043, FR-054).
/spine-chapter manifest loads — recorded as two rows precisely because they have diverged
(FR-056, FR-057), with the 2026-07 combat and voice doctrine still outside the pack (FR-059).
region-as-relational-web reading (FR-044).
lanes read from (FR-035).
pass-2 deep-read batch (FR-031).
and poison lanes, presentation ladder, arena mutation, bonus tiers, imprints, loadout sets, the
balance doctrine, the role taxonomy and the ally stat model (FR-001 to FR-013).
node, every promise the node makes, every promise pointed at it, and how many of those arcs
still carry no declared disposition (FR-058).
entailment-verified (FR-047, FR-048, FR-049).
(FR-045, FR-046).
held, every promise pointed at the node paid or explicitly carried, and no arc with an
undeclared disposition resolved — authored at Step 3a-ARC, verified by the critic's arc lens
(FR-068, FR-069).
same commit, and the entry enrolled in the lint and anchors target lists (FR-050, FR-051).
(FR-032, FR-033).
non-kill and pip schema, the festival windows and the region's ambient and SFX rows (FR-034,
FR-036 to FR-039).
(FR-041, FR-042).
audio rows, its interiors as real enterable volume, its water as water, its weather and
time-of-day per beat, its item and material and gather bill, its vendors and the region's diegetic
exchange medium, its journal entries, its quest rows, its personas' schedules and the pooled
buckets its crowds draw on, its icon ids, and its cinematics sized before they are built
(FR-071 to FR-081). All eleven are SEED: they surface in every checklist and gate nothing yet,
and each names the register entry that owns its gap.
against the per-density-class floors by counted rows rather than assertion, Lane-G refused for
every living-tradition or protected subject, a resolvable licence record per generated plate, and
nothing published except through the marketing-clear query (FR-083 to FR-087). All five are SEED:
the plate lane was measurably outside this axis until 2026-08-03, and recording the obligation is
not the same as arming it.
build/factory/CH_NN.json, mapping rider id to artifact path, verdict andevidence (FR-067).
Field meanings: rider_id is stable forever; ruling_src points at the RULING, never a summary, as a
doc#anchor pointer gate 30 resolves rather than trusts;
obligation is one imperative sentence, per chapter; lane routes the work; scope is all, a
class: token derived from the live tree, or once; data_home is the registry column, path glob,
anchored doctrine file, the plates:<path>#<column> plate-table column (the concept-art lane's home
is docs/art_boards/PLATES.csv, a live status-bearing table that is not a registries/ registry),
an explicit NONE_YET(rank NN), or NONE_YET(GAP-NNN) naming the
DESIGN_GAP_REGISTER entry that owns the gap when no rank owns it yet; tooth is a gate name, a critic lens, or
NONE(reason); consumption_point is the real place a chapter build picks the rider up; status
is BUILT, PARTIAL, SEED or DEFERRED.
Only BUILT riders bind. SEED riders surface in every checklist and never fail the gate — the
contract records the whole obligation set, and only the proven part is binding. That is the answer to
the ossification objection: a fifty-row register is not a fifty-row bureaucracy unless every row
gates, and most rows do not.
The table below is GENERATED from docs/factory_contract.json by
python harness/emit_chapter_checklist.py --render-contract. Editing it by hand is a gate failure —
gate 30 re-derives it and compares.
<!-- RIDER-TABLE:BEGIN (generated -- python harness/emit_chapter_checklist.py --render-contract) -->
| rider | lane | scope | status | obligation | data home | tooth | consumption point | ruling |
|---|---|---|---|---|---|---|---|---|
| FR-001 | engine-code | all | SEED | Build this chapter's ability unlock set through the foundry stage — canon row to GAS binding via the cast-primitive system, then the counter-class and element hooks, then a per-ability Tier-1 test and capture station. | registry:T0_Ability_Tree_Registry#unlock_chapter_ref | NONE(no per-chapter foundry-completeness assertion exists; rank 13's ability data pass mints the unlock/cost/cooldown cells a tooth can read) | vol2:W9 | docs/COMBAT_PROGRAM_ADDENDUM.md#1-the-ability-foundry-the-185-buildout |
| FR-002 | engine-code | all | SEED | Resolve this chapter's element combos and familiar-bonded EAM pairings through the combo runtime — dual-pool cast validation, the element-matrix resolution with both parents' attacker_axis inherited, and bond-state gating. | registry:T0_Ability_Tree_Registry#eam_pair_eligibility | NONE(the 21 Layer-B combos are authored data with no runtime; the tooth arms with the W9-tail build) | vol2:W9 | docs/COMBAT_PROGRAM_ADDENDUM.md#2-the-combo-eam-runtime-fusion |
| FR-003 | schema-data | all | SEED | Keep every operator-rune creation slot this chapter grants inside the mastered-proficiency palette — the palette gate is what holds custom abilities inside the vril doctrine by construction. | registry:T0_Rune_Registry#operator_family | gate:rarity_firewall | vol2:W9 | docs/COMBAT_PROGRAM_ADDENDUM.md#2b-the-rune-forge-the-player-facing-ability-crea |
| FR-004 | schema-data | all | SEED | Give every status this chapter applies a row in the status grid with its application rule, cure or counter hook, and per-creature immunity — shapes now, magnitudes at Phase-5M. | registry:T0_Status_Table#status_family | NONE(rank 25 mints the canon status grid, the cure/antidote chains and the status_immunity column a per-chapter tooth would read) | plan:rank25 | docs/COMBAT_PROGRAM_ADDENDUM.md#3-the-status-effect-framework |
| FR-005 | engine-code | all | SEED | Wire this chapter's healing, revival and poison beats through the healing verb family and the cure loop — revival costs scale per the no-cheap-death rule, and NPC/companion healing hooks read the same lane. | registry:T0_Status_Table#cure_material_refs | NONE(the healing verb family has no runtime; the tooth arms with the W9 tail and the herbalism cure loops) | vol2:W-LW3 | docs/COMBAT_PROGRAM_ADDENDUM.md#4-the-healing-poison-lanes |
| FR-006 | art-asset | all | SEED | Carry a presentation tier on every ability family and weapon class this chapter surfaces, so the mastery ladder renders as tiered animation and VFX variants rather than one asset — presentation only, never a hidden power scale. | registry:T0_Ability_Tree_Registry#presentation_tier_ref | gate:registry_extensions | plan:rank13 | docs/COMBAT_PROGRAM_ADDENDUM.md#5-the-proficiency-presentation-ladder-new-system |
| FR-007 | engine-code | class:boss | SEED | Give this chapter's boss arenas a mutation vocabulary drawn from the arena's own affordance list — hazard actors both sides can use, per-phase arena state, and presence rules that let a boss create the medium its element needs. | registry:T0_Environment_Grammar_Registry#attack_verbs | NONE(the environment-grammar registry holds 2 rows; rank 7 authors the EG_ rows for every slice combat surface) | plan:rank7 | docs/COMBAT_PROGRAM_ADDENDUM.md#6-the-arena-mutation-framework-boss-environmenta |
| FR-008 | schema-data | all | PARTIAL | Give every ability this chapter unlocks its tier-bonus rows in both lanes — the incremental sharpening and the quest-gate transformative bonus that changes what the ability is. | registry:T0_Bonus_Pool_Registry#pool_id | gate:build_space | plan:rank14 | docs/COMBAT_PROGRAM_ADDENDUM.md#7-the-ability-progression-bonus-system-ruled-jos |
| FR-009 | schema-data | all | PARTIAL | Roll this chapter's gear imprints inside the rarity ladder — rarity-and-proficiency-gated crafting, sigma-bounded rolls, and the boss-drop tie-in riding the part-break and carve loop. | registry:T0_Imprint_Affix#rarity_token_min | gate:rarity_firewall | plan:rank14 | docs/COMBAT_PROGRAM_ADDENDUM.md#8-the-gear-imprint-rune-lane-ruled-josh-2026-07 |
| FR-010 | schema-data | all | PARTIAL | Let this chapter's vril sites serve as loadout sanctums — save, recharge and quick-change between the purchased second and third gear-plus-ability sets, with companion loadouts mirrored and the gear returned when a companion departs. | registry:T0_Loadout_Set_Definition#switch_venue_class | gate:build_space | plan:rank14 | docs/COMBAT_PROGRAM_ADDENDUM.md#9-build-agency-selectable-bonuses-loadout-sets-s |
| FR-011 | qa-teeth | all | PARTIAL | Keep this chapter's additions inside the AAAAA balance doctrine — mathematically strong builds are allowed, meta-collapse is not, and every pool option this chapter adds must be reachable by a viable build in the sweeps. | registry:T0_Bonus_Pool_Registry#pick_class | gate:build_space | plan:rank14 | docs/COMBAT_PROGRAM_ADDENDUM.md#10-universal-pools-the-aaaaa-balance-doctrine-ru |
| FR-012 | schema-data | all | PARTIAL | Tag this chapter's new build components against the role taxonomy so the build-space sweeps can measure viability breadth per role axis. | registry:T0_Role_Axis_Registry#role_axis_token | gate:ally_build | plan:rank14 | docs/COMBAT_PROGRAM_ADDENDUM.md#11-the-endgame-build-role-taxonomy-companion-fam |
| FR-013 | schema-data | all | PARTIAL | Give every companion or familiar this chapter introduces a player-shaped stat spread on the shared point budget, so intelligence competes with the combat stats exactly as ruled. | registry:T0_Familiar_Bond_Ability#grants_class | gate:ally_build | plan:rank14 | docs/COMBAT_PROGRAM_ADDENDUM.md#12-companion-familiar-stat-builds-the-ai-intelli |
| FR-014 | engine-code | class:boss | SEED | Give this chapter's bosses per-part hitzones with damage-type multipliers and break thresholds, so the monster body itself is the tactical surface. | NONE_YET(rank 16) | NONE(rank 16 mints the hitzone-part rail the tooth would read) | plan:rank16 | docs/DESIGN_GAP_REGISTER.md#10-per-part-hitzones-part-breaks |
| FR-015 | schema-data | class:boss | SEED | Give every boss attack in this chapter a recovery window beside its telegraph and counter, so the read-counter-punish loop has data to stand on. | registry:T0_Boss_Attack_Rail#recovery_seconds | gate:counter_class_coverage | plan:rank16 | docs/DESIGN_GAP_REGISTER.md#11-boss-punish-recovery-windows-as-data |
| FR-016 | engine-code | class:boss | SEED | Give every boss arena in this chapter an unlockable shortcut back to the nearest recharge well, so deep progress converts into permanent convenience. | NONE_YET(rank 7) | NONE(the shortcut clause is a W-SPACE grammar affordance with no data column today) | plan:rank7 | docs/DESIGN_GAP_REGISTER.md#12-shortcut-loopback-clause-in-the-arena-grammar |
| FR-017 | engine-code | all | SEED | Split this chapter's combatants by respawn class — named and persona'd NPCs stay permanently dead, ambient and fauna and construct combatants renew on rest at a well. | registry:T0_Creature_Roster#spawn_rate | NONE(the split is a runtime model; the community-ripple half is persona-gated on rank 11) | vol2:W9 | docs/DESIGN_GAP_REGISTER.md#13-combatant-respawn-model-split-by-class |
| FR-018 | engine-code | all | SEED | Draw this chapter's creature movesets from the shared windup-active-recovery attack library with per-creature tag-driven variety, never one reused pattern. | registry:T0_Boss_Attack_Rail#attack_kind | NONE(variety is measured per creature; the rail holds 0 rows until rank 16) | vol2:W9 | docs/DESIGN_GAP_REGISTER.md#14-telegraphed-attack-moveset-library-per-creatu |
| FR-019 | engine-code | all | SEED | Wire at least one predator-prey clash into this chapter's crossroads from the fauna substrate the region already carries. | registry:T0_Creature_Roster#trophic_role | NONE(no runtime reads predator_prey_relationships today) | vol2:W-LW3 | docs/DESIGN_GAP_REGISTER.md#15-ecology-clashes-turf-wars-at-arena-crossroads |
| FR-020 | engine-code | all | SEED | Give each arena in this chapter one or two diegetic hazards the player can turn on a boss. | registry:T0_Environment_Grammar_Registry#tactical_affordance_class | NONE(rank 7 authors the EG_ rows; the affordance count per arena is checkable once they exist) | plan:rank7 | docs/DESIGN_GAP_REGISTER.md#16-environmental-combat-affordances-per-arena |
| FR-021 | canon-author | all | SEED | Give this chapter an earned way to read an enemy weakness through shape and behaviour tells and the clue lane, never a stat sheet. | NONE_YET(rank 17) | NONE(rank 17 completes the element matrix and the per-enemy weaknesses the read channel exposes) | plan:rank17 | docs/DESIGN_GAP_REGISTER.md#17-diegetic-weakness-read-channel |
| FR-022 | engine-code | all | SEED | Let a bonded familiar be summoned into this chapter's hard fights as the diegetic easing lever — aggro split at a resource cost, never a settings menu. | registry:T0_Familiar_Bond_Ability#command_permission | NONE(the familiar combat wave is post-slice) | vol2:W9 | docs/DESIGN_GAP_REGISTER.md#18-familiar-summon-as-the-diegetic-easing-lever |
| FR-023 | engine-code | all | SEED | Give this chapter's populated areas the immediate consequence loop — witness, local alarm, response, decay — feeding the antagonist-network escalation. | NONE_YET(rank 30) | NONE(no witness/alarm worldstate variable exists today) | vol2:W-LW3 | docs/DESIGN_GAP_REGISTER.md#19-local-alarm-consequence-loop-wanted-analog |
| FR-024 | canon-author | all | SEED | Write every player-facing line in this chapter as something a person said or the protagonist thought — the quest log is a memory of conversations, never a system's summary. | path:docs/spine/player_strings/*.csv | critic:does a person say this | skill:normalize-doc#rubric | docs/NATURAL_VOICE_DOCTRINE.md#1-the-voice-rule-every-player-facing-line-sounds |
| FR-025 | canon-author | all | SEED | Ground this chapter's names and speech in the culture's own conventions — how a person of this place speaks presents their people, sourced from the region page's substrate and the persona and voice registries. | registry:T0_Voice_Registry#voice_substrate | critic:does this carry the culture | skill:normalize-doc#rubric | docs/NATURAL_VOICE_DOCTRINE.md#2-the-cultural-register-names-and-speech-carry-t |
| FR-026 | canon-author | all | SEED | Make every progression-path puzzle in this chapter solvable by an attentive player in reasonable time from in-world information — mysterious is allowed, unfun is not. | path:build/spine_rows/CH_*/clues.csv | NONE(solvability is proven by the QA loop's attempt budget; no static assertion can prove it) | plan:rank29 | docs/NATURAL_VOICE_DOCTRINE.md#3-clues-mysterious-is-allowed-unfun-is-not |
| FR-027 | canon-author | all | PARTIAL | Route this chapter's genuinely hard or time-consuming challenges to the completionist, Layer-3, no-kill and easter-egg tiers — a hard puzzle is a prize, never a wall on the progression path. | doctrine_only:docs/NATURAL_VOICE_DOCTRINE.md | gate:no_dead_end | skill:spine-chapter#Step 3a | docs/NATURAL_VOICE_DOCTRINE.md#4-the-difficulty-routing-rule-ruled |
| FR-028 | canon-author | class:boss | SEED | Name this chapter's bosses the way the people there name them — the village's word for the night-hunter, the healer's name for the bound serpent. | registry:T0_Boss_Encounter_Registry#boss_name | critic:does this carry the culture | NONE_YET(rank 11) | docs/NATURAL_VOICE_DOCTRINE.md#2-the-cultural-register-names-and-speech-carry-t |
| FR-029 | canon-author | all | SEED | Author the quest-giver conversations this chapter's quest log then remembers — the NPC dialogue lane is per chapter, not a one-time pass. | NONE_YET(rank 11) | critic:does a person say this | NONE_YET(rank 11) | docs/NATURAL_VOICE_DOCTRINE.md#5-execution-the-next-session-s-first-canon-lane |
| FR-030 | canon-author | all | BUILT | Drive this chapter's build from its spine entry and its RCM section — those two are the canon input, and everything downstream cites them. | path:docs/spine/CH_*.md | gate:lint | p5:machinery | docs/ROADMAP_POST_5090_TO_SHIP.md#machinery-it-runs-on-cited-the-factory-is-the-ph |
| FR-031 | canon-author | all | BUILT | Acquire this region's must-acquire anchors and deep-research the rest, then run the region's pass-2 deep-read batch before the chapter's L2 content is called done. | doctrine_only:docs/BOOK_ACQUISITION.md | NONE(acquisition is an action in the world; the deep-read batch is contracted in DEEP_BOOK_PROCESSING_CONTRACT section 4.3) | p5:machinery | docs/ROADMAP_POST_5090_TO_SHIP.md#machinery-it-runs-on-cited-the-factory-is-the-ph |
| FR-032 | engine-code | all | BUILT | Build this chapter's region through the parameterized terrain and staging drivers — bbox, terrain fetch, landscape import with a nonzero weightmap assertion, dress, stage. | doctrine_only:docs/ROADMAP_POST_5090_TO_SHIP.md | NONE(the drivers and their assertions live in the game repo, which this gate never reaches across) | p5:machinery | docs/ROADMAP_POST_5090_TO_SHIP.md#machinery-it-runs-on-cited-the-factory-is-the-ph |
| FR-033 | engine-code | all | BUILT | Run the W-SPACE pass on this chapter, always — the slope and space audit, arena pads sculpted to the zone catalog's own bounds, the amplification doctrine applied, graded golden-path trails, and the permanent teeth under every encounter volume. | doctrine_only:docs/ROADMAP_POST_5090_TO_SHIP.md | NONE(the slope assertion and navmesh continuity teeth are game-repo side) | p5:machinery | docs/ROADMAP_POST_5090_TO_SHIP.md#machinery-it-runs-on-cited-the-factory-is-the-ph |
| FR-034 | schema-data | all | PARTIAL | Type this chapter's seeds through the housing ledger so every seed has a home, an owner and a route. | registry:T0_Quest_Seed_Registry#chapter_anchor | gate:seed_housing | p5:machinery | docs/ROADMAP_POST_5090_TO_SHIP.md#machinery-it-runs-on-cited-the-factory-is-the-ph |
| FR-035 | schema-data | all | SEED | Flesh a complete persona on every entity this chapter surfaces — the 13-field persona is what the natural-voice and living-world lanes read from. | NONE_YET(rank 11) | gate:entity_taxonomy | p5:machinery | docs/ROADMAP_POST_5090_TO_SHIP.md#machinery-it-runs-on-cited-the-factory-is-the-ph |
| FR-036 | canon-author | all | PARTIAL | Author this chapter's spoiler-safe player strings sidecar — beat objectives, fork options and site display names — and pass the reveal critic before staging consumes it. | path:docs/spine/player_strings/*.csv | gate:reveal_discipline | p5:machinery | docs/ROADMAP_POST_5090_TO_SHIP.md#machinery-it-runs-on-cited-the-factory-is-the-ph |
| FR-037 | canon-author | all | PARTIAL | Author this chapter's discovery clue rows per encounter from the legal-source enum — a clue is legibility, never a gate. | path:build/spine_rows/CH_*/clues.csv | NONE(the clue surface has no registry home until rank 29 re-homes it into DT_Clue) | p5:machinery | docs/ROADMAP_POST_5090_TO_SHIP.md#machinery-it-runs-on-cited-the-factory-is-the-ph |
| FR-038 | schema-data | class:boss | PARTIAL | Populate the non-kill and pip schema on every boss in this chapter — has_nonkill_path, pip_count, pip_reveal_threshold and defeat_protected per the ratified template. | registry:T0_Boss_Encounter_Registry#win_condition | gate:counter_class_coverage | p5:machinery | docs/ROADMAP_POST_5090_TO_SHIP.md#machinery-it-runs-on-cited-the-factory-is-the-ph |
| FR-039 | canon-author | all | PARTIAL | Author this chapter's festival windows and the region's ambient and SFX rows as part of the staging pass, not as a later sweep. | registry:T0_Festival_Registry#chapter_range | NONE(no per-chapter festival or ambient coverage assertion exists; rank 8 authors the cue table) | p5:machinery | docs/ROADMAP_POST_5090_TO_SHIP.md#machinery-it-runs-on-cited-the-factory-is-the-ph |
| FR-040 | art-asset | all | SEED | Run this chapter's asset passes as drop-ins over the asset-path contract, so a generated surface replaces a placeholder without touching canon data. | registry:T0_Vril_Site_Registry#mesh_pipeline_type | NONE(asset completeness is a post-5090 window check) | p5:machinery | docs/ROADMAP_POST_5090_TO_SHIP.md#machinery-it-runs-on-cited-the-factory-is-the-ph |
| FR-041 | qa-teeth | all | SEED | Run the QA fleet loop on this chapter to the same zero-bug bar before it is called shippable. | doctrine_only:docs/ROADMAP_POST_5090_TO_SHIP.md | NONE(the P3 loop is post-5090; rank 1 authors the kill-test and benchmark harness set) | p5:machinery | docs/ROADMAP_POST_5090_TO_SHIP.md#machinery-it-runs-on-cited-the-factory-is-the-ph |
| FR-042 | qa-teeth | all | PARTIAL | Score this chapter on all five scorecard row classes — content budget, structure completeness, test coverage, care and reveal, and rider completeness. | NONE_YET(rank 1) | gate:factory_contract | p5:scorecard | docs/proposals/STORY_DEPTH_PROGRAM.md#4-3-the-artifact-docs-factorycontract-md-docs-fa |
| FR-043 | canon-author | all | BUILT | Assemble the enrich pack first and build this chapter inside it — the pack is the single grounded context, and anything not derivable from it is flagged rather than guessed. | path:harness/enrich.py | NONE(the pack's completeness is the author's precondition and is proven by Step 1 running clean) | skill:spine-chapter#Step 1 | .claude/skills/spine-chapter/SKILL.md#step-1-assemble-the-pack-the-single-grounded-con |
| FR-044 | canon-author | all | BUILT | Run the significance-lens pass before authoring this chapter's region blocks — every surfaced site and web connection clears at least one of the 33 lenses and the relevance filter. | doctrine_only:docs/proposals/SIGNIFICANCE_LENSES.md | critic:Significance-lens coverage | skill:spine-chapter#Step 3a | .claude/skills/spine-chapter/SKILL.md#step-3a-the-significance-lens-pass-run-before-au |
| FR-045 | canon-author | all | BUILT | Deliver all three player layers in this chapter — a self-contained L1 loop, the real culture shown on its own terms at L2, and the vril metaphysics felt at L3 and never declared. | path:docs/spine/CH_*.md | gate:layer_register | skill:spine-chapter#Step 3 | .claude/skills/spine-chapter/SKILL.md#standing-rules-bind-every-step-not-just-the-one |
| FR-046 | canon-author | all | BUILT | Hold reveal discipline in this chapter — no House-of-Velheim pattern before roughly Ch 38 and no pre-Ch-76 Grand Sage hint, in prose or in any player-facing string. | path:docs/spine/CH_*.md | gate:reveal_discipline | skill:spine-chapter#Step 3 | .claude/skills/spine-chapter/SKILL.md#the-20-block-order-author-top-to-bottom |
| FR-047 | canon-author | all | BUILT | Anchor every load-bearing claim in this chapter to a resolvable source and enrol the entry in the anchors target list in the same commit. | path:docs/spine/CH_*.md | gate:anchors | skill:spine-chapter#Step 5 | .claude/skills/spine-chapter/SKILL.md#step-5-lock-scatter-baseline-enrollment-ssbl-ste |
| FR-048 | canon-author | all | BUILT | Write this chapter's entry in the CVD formatting register — H2 to H4 only under one H1 title, plain prose, single-level dashed bullets, no code fences. | path:docs/spine/CH_*.md | gate:lint | skill:spine-chapter#Step 5 | .claude/skills/spine-chapter/SKILL.md#step-3-author-docs-spine-chnn-md-to-the-v2-5-anc |
| FR-049 | qa-teeth | all | BUILT | Entailment-verify this chapter's anchored prose claims — a resolving anchor that does not support the sentence is invented canon the anchor gate cannot see. | path:harness/extract_claims.py | critic:Entailment-verify | skill:spine-chapter#Step 4 | .claude/skills/spine-chapter/SKILL.md#step-4-fresh-context-critic-gate-ssbl-step-10 |
| FR-050 | schema-data | all | BUILT | Scatter this chapter's structured fields to the live registries with the csv module and refresh the fidelity baseline in the same commit. | registry:T0_Chapter_Index#spine_status | gate:fidelity | skill:spine-chapter#Step 5 | .claude/skills/spine-chapter/SKILL.md#step-5-lock-scatter-baseline-enrollment-ssbl-ste |
| FR-051 | qa-teeth | all | BUILT | Enrol this chapter's entry in both the lint and the anchors target lists — an entry absent from them is unguarded canon. | path:harness/gates_config.json | gate:index_freshness | skill:spine-chapter#Step 5 | .claude/skills/spine-chapter/SKILL.md#step-5-lock-scatter-baseline-enrollment-ssbl-ste |
| FR-052 | canon-author | all | BUILT | Set every NPC, site and boss name this chapter introduces through the naming method's deep-dive and adversarial screens, and leave no working name pending across a Range Review. | doctrine_only:docs/NAMING_METHOD.md | critic:NAMING_METHOD | skill:spine-chapter#Step 3 | .claude/skills/spine-chapter/SKILL.md#standing-rules-bind-every-step-not-just-the-one |
| FR-053 | canon-author | class:hard_line | BUILT | Pre-draft the Stage-2 canonical-question set before authoring a hard-line chapter, and carry the cultural-depiction tier through to the critic. | registry:T0_Chapter_Index#hard_line_status | gate:care_scope | skill:spine-chapter#Step 2 | .claude/skills/spine-chapter/SKILL.md#step-2-hard-line-chapters-only-pre-draft-the-sta |
| FR-054 | canon-author | all | BUILT | Start this chapter from the predecessor's end state on all seven carry-forward fields — age, companions, familiars, homes, found family, identity hiding, path states. | registry:T0_Chapter_Index#identity_hiding_status_start | gate:spine_graph | enrich:CONTINUITY_FIELDS | .claude/skills/spine-chapter/SKILL.md#step-0-preflight-ssbl-steps-1-2 |
| FR-055 | qa-teeth | class:rr_node | BUILT | Close the Range Review window at this node before any forward build — the multi-grid audit, L1 completeness, the L3 naming finalization, the L2 transition pass, and the consistency audit. | path:docs/spine/range_reviews/*.md | NONE(the review is a judgment pass; its enrolment rides the lint and anchors target lists) | skill:spine-chapter#Range Review | .claude/skills/spine-chapter/SKILL.md#range-review-every-10-chapters-gating |
| FR-056 | spec-doc | all | BUILT | Hand this chapter's author the design-system docs through the pack, not through a human remembering to name them. | path:harness/enrich.py | gate:factory_contract | enrich:SYSTEM_DOCS | docs/proposals/STORY_DEPTH_PROGRAM.md#4-2-every-dangling-wire-with-its-fix |
| FR-057 | spec-doc | all | SEED | Carry the enhancement-program docs the skill manifest loads into the pack as well, so the canon surface and the pack surface cannot diverge. | path:harness/enrich.py | gate:factory_contract | enrich:SYSTEM_DOCS | docs/proposals/STORY_DEPTH_PROGRAM.md#4-2-every-dangling-wire-with-its-fix |
| FR-058 | schema-data | all | BUILT | Show this chapter's author every open promise pointed at this node, every promise this node makes, and each touching arc's stage — not just the predecessor's end state. | registry:T0_Arc_Grid#progression_stage | gate:arc_continuity | enrich:ARC_PACK_SOURCES | docs/proposals/STORY_DEPTH_PROGRAM.md#4-5-the-single-highest-leverage-change-in-the-en |
| FR-059 | spec-doc | all | SEED | Carry the 2026-07 combat and voice doctrine into the pack, so a chapter author inherits the rulings rather than the rulings waiting for an author who happens to know them. | path:harness/enrich.py | gate:factory_contract | enrich:SYSTEM_DOCS | docs/proposals/STORY_DEPTH_PROGRAM.md#4-2-every-dangling-wire-with-its-fix |
| FR-060 | spec-doc | once | SEED | Point every factory-bearing doc's DOC_MAP consumer column at rider ids rather than restating its wiring in prose. | path:docs/DOC_MAP.md | gate:factory_contract | NONE_YET(rank 2.5) | docs/proposals/STORY_DEPTH_PROGRAM.md#4-2-every-dangling-wire-with-its-fix |
| FR-061 | spec-doc | all | SEED | Hold continuity by default in this chapter's presentation — the lens is one continuous presence, and a hard cut is legal only for the schema-keyed beat classes. | NONE_YET(rank 19) | NONE(the cut-class schema is minted by the presentation-doctrine brief at rank 19) | plan:rank19 | docs/spine/DECISIONS_PENDING_JOSH.md#fork-a-ruled-same-sitting-recorded-here-per-the |
| FR-062 | engine-code | all | SEED | Give this chapter's defeat moments the ruled shape — hold-on by default with a let-go countdown, and an ally revival that is out-of-combat and countdown-bounded. | registry:T0_Worldstate_Variables#variable_id | NONE(the defeat-axis brief is Josh-pending in the Vol2 decisions register) | vol2:D-DEFEAT-AXIS | docs/spine/DECISIONS_PENDING_JOSH.md#fork-b-shape-b-staged-adopted-with-josh-s-reshap |
| FR-063 | canon-author | all | SEED | Build this chapter's travel as playable navigable segments — geography accurate, distance compressed, and the important crossings staged as real dungeons. | NONE_YET(rank 21) | NONE(rank 21 mints the route-leg data a traversal tooth can read) | plan:rank21 | docs/spine/DECISIONS_PENDING_JOSH.md#fork-c-tiered-traversal-adopted-with-josh-s-desi |
| FR-064 | schema-data | all | SEED | Type this chapter's inbound and outbound seams T0 to T3 so every crossing declares its treatment. | NONE_YET(rank 21) | gate:spine_graph | plan:rank21 | docs/spine/DECISIONS_PENDING_JOSH.md#fork-c-tiered-traversal-adopted-with-josh-s-desi |
| FR-065 | spec-doc | once | BUILT | Declare an OWNER line and a rider row in the same landing as any per-chapter promise — a promise without a row is an orphan by construction. | path:docs/factory_contract.json | gate:factory_contract | gate:factory_contract | docs/proposals/STORY_DEPTH_PROGRAM.md#4-4-the-tooth-gate-30-factorycontract-three-self |
| FR-066 | qa-teeth | all | BUILT | Derive this chapter's build checklist from the contract rather than hand-typing it, so a new rider reaches every future chapter automatically. | path:harness/emit_chapter_checklist.py | gate:factory_contract | gate:factory_contract | docs/proposals/STORY_DEPTH_PROGRAM.md#4-3-the-artifact-docs-factorycontract-md-docs-fa |
| FR-067 | qa-teeth | all | SEED | Write this chapter's consumption manifest at build time — rider id to artifact path, verdict and evidence. | NONE_YET(rank 1) | NONE(the manifest is written by the build; the scorecard's fifth row class arms with it) | NONE_YET(rank 1) | docs/proposals/STORY_DEPTH_PROGRAM.md#4-3-the-artifact-docs-factorycontract-md-docs-fa |
| FR-068 | canon-author | all | BUILT | Advance every arc this chapter stages or state the hold, pay every promise pointed at this node, and never resolve an arc whose disposition is undeclared. | registry:T0_Arc_Grid#stage_role | gate:arc_continuity | skill:spine-chapter#Step 3a-ARC | docs/proposals/STORY_DEPTH_PROGRAM.md#wave-3-the-authoring-input-highest-leverage-per |
| FR-069 | qa-teeth | all | BUILT | Verify this chapter's staged arcs against its grid rows -- a claimed stage the prose does not stage, a payoff with no setup, or a resolved undeclared arc is a finding. | registry:T0_Promise_Ledger#edge_state | critic:Arc continuity and promise discipline | skill:normalize-doc#rubric | docs/proposals/STORY_DEPTH_PROGRAM.md#wave-3-the-authoring-input-highest-leverage-per |
| FR-070 | schema-data | once | BUILT | Author the arc layer the schema declares non-derivable -- the ANCHOR disambiguation and the class-grammar stage_role -- once, under the carried token discipline, and re-emit the carry-forward baseline in the same commit. | registry:T0_Arc_Grid#derivation_source | gate:arc_continuity | skill:arc-pass#Step 3 | docs/proposals/STORY_DEPTH_PROGRAM.md#2-5-the-strongest-objection-and-the-structural-a |
| FR-071 | canon-author | all | SEED | Author this chapter's audio rows as part of its staging pass -- the footstep, ambient, creature-voice and effect cues the chapter actually plays, each with its category, track and production state, not a path string standing in for all four. | registry:T0_SFX_Registry#chapter_anchor | NONE(no per-chapter sfx coverage assertion exists; the registry implements 1 of its 21 ratified columns, so there is no category, track or generation-state cell for a tooth to read until the reconcile named by GAP-141) | plan:rank8 | docs/DESIGN_GAP_REGISTER.md#gap-141-critical-audio-sfx-ambience-t0sfxregistr |
| FR-072 | art-asset | all | SEED | Build this chapter's interiors as real enterable volume where its region page already specifies one -- footprint, storeys, below-grade depth and room count carried as data, under the culture's own architectural grammar. | NONE_YET(GAP-142) | NONE(the space audit grades DEM slope and graded a 220x180x60 karst interior OK at 0.0 degrees -- it measures the ground above the cave; a tooth that refuses terrain slope as evidence for an interior volume is GAP-142's extension) | NONE_YET(GAP-142) | docs/DESIGN_GAP_REGISTER.md#gap-142-critical-world-terrain-interiors-the-wor |
| FR-073 | engine-code | all | SEED | Represent this chapter's water as water -- class, depth band, current, navigability, seasonal state and shore type -- wherever a beat, arena or mechanic stands on it, rather than on a placeholder plane. | NONE_YET(GAP-142) | NONE(no water class, depth, current or navigability column exists anywhere; the only water in the tree is the FloresOcean placeholder plane, so there is nothing a per-chapter assertion could read) | plan:rank27 | docs/DESIGN_GAP_REGISTER.md#gap-142-critical-world-terrain-interiors-the-wor |
| FR-074 | schema-data | all | SEED | Declare this chapter's weather and time-of-day per beat, and what each does -- a sky vocabulary with no effect model and no per-beat authority cannot stage a storm the player feels. | registry:T0_Region_Index#weather_cycle_profile | NONE(weather_cycle_profile is populated 4 of 76 and a positive-controlled scan of all 62 registries returns ZERO time_of_day columns, so per-beat weather has no cell; the effect model is unowned) | plan:rank30 | docs/DESIGN_GAP_REGISTER.md#gap-134-critical-cross-lane-factory-contract-the |
| FR-075 | schema-data | all | SEED | Name this chapter's item bill -- the wearables, consumables and craft materials it introduces, and the gather nodes its region actually carries -- so the gather-to-craft-to-trade loop has stable ids to stand on. | registry:T0_Equipment_Registry#canonical_chapter_acquisition | NONE(the QT-17 content-budget vector enumerates ten axes and none is item, loot, material, gather-node or vendor, so a chapter passes the density check with zero items; the axes are GAP-138's addition) | plan:rank14 | docs/DESIGN_GAP_REGISTER.md#gap-138-critical-items-economy-the-item-economy |
| FR-076 | schema-data | all | SEED | Declare what this chapter's region accepts in trade and who accepts it -- the diegetic exchange medium and the vendor's stock and accepted goods -- with the trade-value lens displayed and never stored or spendable. | NONE_YET(GAP-138) | NONE(a positive-controlled scan of all 62 registries returns ZERO columns matching vendor, currenc or exchange, so the ruled medium_of_exchange token has no cell to live in and no tooth to read it) | plan:rank30 | docs/DESIGN_GAP_REGISTER.md#gap-138-critical-items-economy-the-item-economy |
| FR-077 | canon-author | all | SEED | Write this chapter's journal entries as the story object Pillar 6 rules them to be -- the protagonist's own record, not a system log -- and carry the canonical beats the pillar names. | NONE_YET(GAP-135) | NONE(no journal column exists in any of the 62 registries and the CVD-named T0_Journal_Entry_Template_Registry has never existed, so Pillar 6's own executable test cannot be evaluated on any node) | NONE_YET(GAP-135) | docs/DESIGN_GAP_REGISTER.md#gap-135-critical-quest-dialogue-runtime-ui-ux-th |
| FR-078 | canon-author | all | SEED | Decompose this chapter's main-story and side-bucket quests into rows -- one per quest, with its stages, giver and completion condition -- so the quest log names quests that exist. | registry:T0_Quest_Definition_Registry#chapter | NONE(no per-chapter quest-row assertion exists; rank 15 populates the execution columns on the 16 rows already there and mints no row for any slice chapter, so the count a tooth would check has no owner until GAP-135 lands one) | plan:rank15 | docs/DESIGN_GAP_REGISTER.md#gap-135-critical-quest-dialogue-runtime-ui-ux-th |
| FR-079 | schema-data | all | SEED | Give this chapter's inhabitants a day -- a schedule state, a home site, a work site and a presence window per named persona, and a pooled bucket per ambient crowd, with a population band for every settled zone. | NONE_YET(GAP-139) | NONE(the SCHEMA home now exists -- ENTITY_PERSONA_SYSTEM 5.2.1, the GAP-139 amendment of 2026-07-30 -- but no gate asserts a persona's day: the eight index columns and the T0_Persona_Schedule / T0_Persona_Bucket tables are minted at rank 11, and the tooth that arms with them is a check_no_dead_end.py extension requiring presence_nongating_class to read always_present or alternate_reach_declared on every progression-critical persona. The population half IS rowed today: T0_Region_Index.ambient_population_band_default plus the per-zone Zone Catalog ambient_population_band, both blank pending rank 5's crowd budgets) | plan:rank11 | docs/DESIGN_GAP_REGISTER.md#gap-139-critical-npc-simulation-rank-11-s-person |
| FR-080 | art-asset | all | SEED | Give every entity this chapter surfaces on a player screen an icon id -- abilities, weapons, statuses, runes, materials and trades -- so the icon bill is a query rather than a later inventory of screenshots. | NONE_YET(GAP-144) | NONE(exactly ONE icon column exists corpus-wide, T0_Status_Table.icon_class on 10 rows and itself with no consumer, so there is no rail a coverage tooth could read; the icon_id_ref mint is GAP-144's proposal) | plan:rank13 | docs/DESIGN_GAP_REGISTER.md#gap-144-critical-ui-ux-the-player-facing-ui-has |
| FR-081 | art-asset | all | SEED | Size this chapter's moving image before it is built -- every scene row carrying its shot count, duration class, production track and cinematic tier, and the seam into the next chapter carrying its bridging scene. | registry:T0_Scene_Spec_Registry#chapter | NONE(the scene registry holds 16 rows against 450 authored scenes and none of its columns is duration, shot count, complexity or production tier, so no per-chapter cinematic obligation is measurable until GAP-140 mints them) | plan:rank6 | docs/DESIGN_GAP_REGISTER.md#gap-140-critical-animation-cinematics-the-moving |
| FR-082 | schema-data | all | SEED | Give every ally this chapter fields the uncontrolled-behaviour data the ally switch depends on -- the behaviour-policy rows that apply to it and the intelligence tier that selects them -- so an ally the player switches away from still acts as its own character instead of going inert. | registry:T0_Ally_Behavior_Policy#autonomy_band | gate:ally_build | plan:rank22 | docs/COMBAT_PROGRAM_ADDENDUM.md#13-the-ff7r-switch-direct-ally-control-the-chara |
| FR-083 | art-asset | all | SEED | Key every concept plate this chapter's art leg produces on a LIVE canon id -- the density class selects the registry, the canon id is a primary key in exactly that registry, and the plate row carries the id, the registry and the canon_ref token list so the plate is addressable from the row it realizes. | plates:docs/art_boards/PLATES.csv#canon_id | gate:art_pointers | art:3.2 The path form and the canon-id law | docs/CONCEPT_ART_PRODUCTION_PROGRAM.md#3-2-the-path-form-and-the-canon-id-law |
| FR-084 | art-asset | all | SEED | Deliver this chapter's art leg against the per-density-class floors the density model sets, COUNTED from the plate rows by class and stage rather than asserted -- a draft candidate sweep is not delivered work. | plates:docs/art_boards/PLATES.csv#density_class_id | NONE(the per-class production ledger does not exist: no artifact joins density_model.csv's floors to counted PLATES.csv rows, so 'how far is D1-01 against its floor of 180' has no answer a gate could read; harness/art_production_ledger.py emitting docs/concept_art/art_production_ledger.csv is the named mint, and until it exists this tooth reads NONE rather than a green it did not earn) | art:6. PRIORITY ORDER FOR THE PROLOGUE | docs/CONCEPT_ART_PRODUCTION_PROGRAM.md#3-2e-the-stage-discipline-four-candidates-are-on |
| FR-085 | art-asset | all | SEED | Refuse Lane-G generation for every art subject this chapter carries whose care tier is in the living-tradition set or whose site row is protected -- the composer emits a Lane-R reference request instead, and the refusal reads off columns on the plate row rather than out of a commit message. | plates:docs/art_boards/PLATES.csv#care_tier | gate:boards | art:7.3 EXHAUSTIVE | docs/proposals/CONCEPT_ART_PROGRAM.md#4-4-where-the-human-and-josh-sit |
| FR-086 | art-asset | all | SEED | Write a per-artifact licence record for every plate this chapter's art leg generates and point that plate row's generation_licence_ref at the record's repo-relative path, so the weights licence the outputs inherit is recorded where a gate can resolve it. | plates:docs/art_boards/PLATES.csv#generation_licence_ref | gate:generation_lifecycle | art:5.3 What an approval becomes | docs/CONCEPT_ART_PRODUCTION_PROGRAM.md#5-3-what-an-approval-becomes |
| FR-087 | art-asset | all | SEED | Publish this chapter's art only through the marketing-clear query -- every previz plate carries its directional label, reveal-gated rows never publish, and the public region page emits rows whose computed marketing_clear is true rather than walking a directory. | plates:docs/art_boards/PLATES.csv#directional_label | gate:boards | art_boards:The site is a QUERY | docs/spine/DECISIONS_PENDING_JOSH.md#the-concept-art-site-is-public-marketing-no-acce |
<!-- RIDER-TABLE:END -->
python harness/emit_chapter_checklist.py CH_NN emits the rider set filtered by scope, ordered by
lane, split into binding and advisory, each with an evidence slot. This is the artifact that answers
"for Ch NN, what must be true?" and it is the brief a chapter-build agent is handed.
Scope classes are derived from the live tree, never from a re-typed list: class:slice is the ruled
Prologue-to-Ch-13 vertical slice, class:hard_line and class:boss come from T0_Chapter_Index,
class:realm from T0_Region_Index node kinds, and the two care classes are parsed out of
harness/enrich.py so the care vocabulary has exactly one home. A chapter that gains a boss gains the
boss riders with no edit anywhere — though as measured on 2026-07-27 all 79 chapter rows already carry
a primary_boss_id, so class:boss currently selects the same set as all and nothing is left to
gain one. The deriver is live and correct; the cardinality is recorded here and in the json so a
future reader does not mistake that class for a filter that is currently narrowing anything.
build/factory/CH_NN.json maps rider_id to artifact path, verdict and evidence. The P5 per-chapter
scorecard's four row classes — content budget, structure completeness, test coverage, care and reveal
— gain a fifth: rider completeness.
factory_contractSix rulers plus a vacuity guard, all deterministic and offline. Severity follows status: a BUILT
rider fails, a PARTIAL rider fails on its home and warns on its consumption, a SEED or DEFERRED
rider warns. R1 is the exception — an uncited promise is a FAIL at any status, because losslessness is
the property the whole register rests on.
OWNER: line in the declared doc set is cited by at least one rider, and every promise-phrase occurrence is cited too. The primary net is structured: an OWNER: line is a
machine token an author cannot paraphrase away. The phrase net is the secondary catch for landings
that promise per-chapter behaviour with no OWNER: line at all, and it is reviewed at every wave
boundary — a phrase-list addition is a one-line change, never a redesign.
data_home resolves: the registry and column exist, or the glob is non-empty, or the doctrine file exists, or it is NONE_YET with a live window-plan rank
cited or a real DESIGN_GAP_REGISTER entry id cited. The register form exists because the rank
form rots silently: FR-029 cited rank 11 for a dialogue home that rank does not deliver, so the
rider read legitimately-pending forever while this ruler stayed green. Every tooth names a registered gate, a critic lens that appears on a declared critic
surface, or NONE(reason) with a real reason — a lens that lives only in a doctrine file is run by
whichever agent happens to know it, which is the same rot in a different costume.
consumption_point names a real place AND that place actually cites the rider's subject through its declared citation token. A BUILT rider must declare a
citation token that resolves.
ruling_src resolves: the doc exists and the anchor is reachable,either as a unit head under the anchor rule or as the slug of the real line the rider cites. This
ruler exists because section 1 rests the whole design on a rider row being a pointer, and nothing
checked the pointer — sixteen anchors were unreachable at mint, nine of them longer than the
48-character truncation the rule itself declares, so no input could ever have produced them. R4 is
WARN-scoped at v1 and reports the pointers that resolve to a cited line rather than a unit head
under DECLARED NOT-ARMED on every run.
the json. The human view can never drift from the machine view.
docs/PRE_5090_BUILD_PLAN.md, rank2.5 is greppable there, and every rank the four constraints cite resolves to a real rank in the
window plan. The scan is case-insensitive and decimal-aware, and it reads the whole block rather
than its first paragraph — constraints (1) and (4) open with a capital Rank, so a case-sensitive
scan saw neither, and rank 11 was asserted by nothing while looking exactly like a clean check.
declared doc set yields zero OWNER: lines, or if it matches zero promise phrases — a regex that
can no longer match reports zero and looks exactly like a clean repo.
Every ruler ships must-fire and must-not-fire fixtures, runnable with --self-test, which the gate
also runs on every real invocation and exits 2 if a ruler rotted.
DECLARED NOT-ARMED (2026-08-03): R2 does not yet resolve the plates: home form. R2's
data_home branches are hardcoded in harness/check_factory_contract.py, so the five art riders
FR-083 to FR-087 are reported as an *unrecognised data_home form* at WARN — SEED severity, so gate 30
stays green — until a prefix branch plus its must-fire fixture lands there. The form is declared in
docs/factory_contract.json under data_home_kinds, and it is recorded this way on purpose: the
alternative was to downgrade the five riders to path:docs/art_boards/PLATES.csv, which resolves the
FILE while leaving the COLUMN unchecked and would have read green without checking anything. A WARN
that names the exact one-line arming step is the honest state; a green that checks nothing is not.
Losslessness claim for the critic: every OWNER: line and every promise-phrase occurrence in the
declared doc set maps to at least one rider, and every rider cites a real ruling anchor. The
measurements below were taken on 2026-07-27 against the live tree.
| source | measured | riders |
|---|---|---|
docs/COMBAT_PROGRAM_ADDENDUM.md OWNER: lines | 13 | FR-001 to FR-013 |
docs/DESIGN_GAP_REGISTER.md OWNER: lines | 10 | FR-014 to FR-023 |
docs/NATURAL_VOICE_DOCTRINE.md | 5 sections | FR-024 to FR-029 |
docs/ROADMAP_POST_5090_TO_SHIP.md P5 machinery (the BUILT baseline) | 13 | FR-030 to FR-042 |
.claude/skills/spine-chapter/SKILL.md canon-side obligations | 13 | FR-043 to FR-055 |
| the pack riders including the divergence | 5 | FR-056 to FR-060 |
| the ruled forks A, B and C including seam typing | 4 | FR-061 to FR-064 |
| the charter applied to itself | 3 | FR-065 to FR-067 |
| the story-depth Wave 3 arc-axis wiring (measured 2026-07-29) | 3 | FR-068 to FR-070 |
| the ten-lane pipeline gap audit (measured 2026-07-29; register v1.8 GAP-133 to GAP-207) | 11 | FR-071 to FR-081 |
docs/COMBAT_PROGRAM_ADDENDUM.md section 13 (twenty-eighth sitting item J4) | 1 | FR-082 |
the four-lane art compatibility pass (measured 2026-08-03; docs/CONCEPT_ART_PRODUCTION_PROGRAM.md §3.2 + docs/art_boards/README.md) | 5 | FR-083 to FR-087 |
Known secondary surfaces, declared rather than silently widened: entries 1 to 9 of
docs/DESIGN_GAP_REGISTER.md use a lowercase Owner: token (9 lines) instead of the machine token,
and they sit outside R1's primary net at v1 by design — folding them in means normalising the token
in the source doc, which is a v1.1 item. docs/ROADMAP_POST_5090_TO_SHIP.md carries one more
lowercase Owner: line, measured the same day.
Two surfaces outside the declared doc set carry live factory promises and are named here rather than
silently omitted. docs/DOC_MAP.md carries three promise-phrase occurrences — "joins the P5 factory"
and "the factory's authored lanes" and "the factory inherits" — and it is both the surface FR-060
obligates and the surface the charter records as rotted in both directions, so it is the first entry
in the v1.1 harvest. The rest of that harvest: Vol2's status block, QA_WATCHING's pillars, the
realm-design class:realm riders, and the progress ledger's "riders noted" lines, which are the most
fragile home of all.
OWNER: line and a rider row in the samecommit. A promise without a row is an orphan by construction.
docs/factory_contract.json, then run the render command. Never hand-edit the rider table ora per-chapter checklist.
data_home resolves, its tooth names something that runs, and its consumption_point is a place that actually cites it.
SEED to PARTIAL to BUILT, each promotion carrying the commit or ledger entry that made it true in the evidence field.