pipelines/gap_findings.json
{
"schema": "humanity.gap_audit.findings/1.0",
"workflow": "wf_d0ca605f-891",
"audited": "2026-07-29",
"lane_findings": 112,
"synthesis_merges": 12,
"absorbed": 49,
"standalone": 63,
"survivors": 75,
"synthesis": [
{
"index": 1,
"entry_id": "GAP-133",
"name": "The dialogue and voice lane has neither a data model nor a bill of materials — four universal hard lines are structurally unrepresentable and the speaking cast is 1 of 86",
"vision_rules": "T0_Hard_Lines HL_0039/HL_0040/HL_0041 (authority CVD §17.8, applies_to_chapter_range=universal, status=canonical): \"Every dialogue moment surfaces six options\"; \"All six... fully written and fully voiced. No procedural generation. No template-fill.\" T1_Build_Pipeline_Contracts [ACTIVE v1.0] §6.5 declares the logical model (dialogue_node_array: node_id, dialogue_type, six_option_array, branch_target_array); §4.6 declares voice_signature_ref + dialogue_dataset_ref as column adds on Character_Index / Antagonist_Network / Boss_Encounter / Chapter_Index / Region_Index; §4.9 makes both a BUILD HALT condition. D-VO-POLICY RULED PARTIAL VO (ROADMAP_POST_5090_TO_SHIP.md L565-567). T99_Translation_Audio Voice Step 1 requires a beat-actor roster feeding T0_Voice_Registry.",
"what_exists": "VERIFIED: §6.5's 'Physical file' clause pins the DD CSV at six flat columns (line_id, speaker_ref, trigger_beat, line_text, condition_expression, loc_namespace_key) — node_id, dialogue_type, six_option_slot and branch_target are not columns, so a six-option node and a branch edge are unrepresentable. docs/quest_dialogue/ DOES NOT EXIST (ls: No such file or directory; sibling docs/spine, docs/translation, docs/proposals all list). A positive-controlled header scan of ALL 62 registries returns ZERO columns matching dialogue_line, vo_tier, voice_signature_ref, generating_model, model_licence or bark — while the same scan returns T0_Status_Table.icon_class, T0_Theme_Registry.recurrence_anchors and voice_register_ref (on Ally_Behavior_Policy / Bonus_Option / Motif — NOT on T0_Voice_Registry), so the scan reads headers. T0_Character_Index = 164 rows × 33 cols carrying voice_signature_NOTES (prose) and mesh_id_ref/generation_status (the sibling §2.6 adds LANDED — positive control) and no voice_signature_ref, no dialogue_dataset_ref. T0_Voice_Registry = 23 rows × 19 cols (elevenlabs_voice_id_ref hardcodes one vendor). BOM measured from build/spine_rows/*/beats.csv: 206 distinct actor tokens arc-wide, 86 distinct in the slice (CH_PROLOGUE + CH_01..CH_13) — coverage is the protagonist plus four age variants, i.e. 1 speaking entity of 86; the 13 cultural_register rows carry speech_shape/translation_rule for TEXT and none of BPC §4.5's eight voice sub-fields.",
"delta": "[75 total survivors — 112 lane findings deduped: 49 collapsed into the 12 cross-lane merges below, 0 killed as already-covered by a live rank; 2 downgraded in scope by live coverage (rank 17 owns half the engine-authored-CSV gap; U11.15 owns the ability-only reveal field). Reported here: the top 12. Next tier of survivors, all MAJOR: no loudness/mix doctrine or audio perf budget · no music cue/stem/transition table (music_cue_id_ref is an FK to no table; the queued Appendix-S fix collides on cardinality) · CN5.2 shot grammar absent from the live plan · facial/lipsync uncounted · mocap-vs-keyframe routing unowned · 175 free-text faction tokens with no keyspace · attackability_tier 8/164 and node_class 5/76 unpopulated · companion out-of-combat life has no policy class · the trade product catalog and the six §9.1 cross-trade unlocks unhomed · no T1 doc owns items/economy · Attunements accessibility roster unenumerated · input-glyph substitution absent while shipped prompts hardcode keys · typography for 87 diegetic scripts · reveal-gate data for every non-ability screen · save-migration protocol structurally unimplementable (11 of 46 rows non-semver, 10 with no default) · no ship-build identity/patch/symbol posture · no Shipping fence on the agent plugins · zero cinematic/animation teeth in the 22-harness belt · QT-5 id collision · trade/familiar-bond arc anchors 0/10 and 0/21.] The lane's unit of work has no id, no table, no producing script and no speaker edge, at any grain. Q3.1 is queued to CREATE docs/quest_dialogue/ with the pinned six-column header — which bakes the defect as data. Separately the two post-ruling chain docs (T99_Translation_Audio §2.4, PIPE_VOICE_2026-07-29 §1) route D-VO-POLICY's \"stays subtitle\" classes to Kokoro synthesis with no ruling — an unflagged contradiction against a ratified decision.",
"severity": "CRITICAL",
"blocking": "Q3.1 (BUILD-NOW) lands the wrong header the moment it runs; Q3.2's six-option selection engine has no shape to read; the ratified §4.9 halt conditions guard columns that do not exist, so they can never fire. Hits at the first Prologue→Ch 13 dialogue authoring pass and at Gate 1 (Ch 2-13 P3 exit) — inside the pre-5090 window, with all 66 dialogue-anchored scene rows unbindable.",
"proposed_home": "Amend T1_Build_Pipeline_Contracts §6.5 to a node+line DD shape (or mint T0_Dialogue_Line with node_id / dialogue_type / six_option_slot / branch_target / vo_tier) BEFORE Q3.1 creates the directory; apply the §4.6 column adds across the five entity registries in one deterministic commit with fk_spec enrollment both directions; emit the voice roster from beats.actors via a harness script; fold the Kokoro-vs-D-VO-POLICY contradiction into the rank-18 bundled brief."
},
{
"index": 2,
"entry_id": "GAP-134",
"name": "The factory contract's chapter axis is blind to nine content classes — 70 riders with a verified zero for interiors, water, weather, vendors, currency, journal, icons, equipment, gathering, crowds, schedules, factions and cinematics",
"vision_rules": "docs/FACTORY_CONTRACT.md §1 states the design: \"The checklist is DERIVED. A rider added here reaches every future chapter automatically... A landing that makes a per-chapter promise declares an OWNER: line and a rider row in the same commit. Gate 30 fires the day a promise lands uncited.\" PRE_5090_BUILD_PLAN.md rank 2.5 mints it as \"the per-chapter obligation register... it answers 'for Ch NN, what must be true?' and makes every rank after it self-wiring\", with the ruled freeze constraint: \"Rank 2.5 lands BEFORE ranks 13-17 — the schema-freeze ranks emit rider rows rather than retrofit them.\" ROADMAP_POST_5090_TO_SHIP.md L489 promises per chapter that \"under-sized settlements expanded and interiors deepened\".",
"what_exists": "VERIFIED by machine count of docs/factory_contract.json: 70 riders. Token census over the rider set — interior 0 · water 0 · weather 0 · dwelling 0 · vendor 0 · currenc 0 · merchant 0 · journal 0 · icon 0 · equip 0 · consumable 0 · gather 0 · crowd 0 · villager 0 · schedule 0 · attackability 0 · faction 0 · cinemat 0 · audio 0 · music 0. POSITIVE CONTROL, same scan, same file: quest 8 · string 6 · dialogue 3 · sfx 2 · cue 1 — the pattern matches real rider text, so the zeros are real. The adjacent riders are vacuous or mis-pointed: FR-039's audio half declares data_home registry:T0_Festival_Registry#chapter_range (a FESTIVAL column) with tooth NONE; FR-033's amplification half cites source doctrine_only:docs/ROADMAP_POST_5090_TO_SHIP.md with verified-by NONE; FR-029 (the only NPC-dialogue rider) carries data_home NONE_YET(rank 11) and consumption_point NONE_YET(rank 11) while rank 11 delivers a PERSONA registry, not a dialogue home — so it reads legitimately-pending forever. Independently verified: grep -i interior returns 0 in docs/FACTORY_CONTRACT.md, 0 in docs/PRE_5090_BUILD_PLAN_VOL2.md, 1 in docs/ROADMAP_POST_5090_TO_SHIP.md (the doctrine sentence itself).",
"delta": "The single mechanism built to stop per-chapter promises from becoming orphans has no row for nine of the content classes the roadmap promises per chapter. Every gap below therefore recurs on all 79 nodes BY CONSTRUCTION, and gate 30 stays green because a rider that does not exist cannot fail. This is the highest-leverage single fix in the audit: it is the only artifact that converts a one-time finding into a permanent per-chapter obligation, and the ruled freeze order makes it materially cheaper now than after ranks 13-17.",
"severity": "CRITICAL",
"blocking": "harness/emit_chapter_checklist.py output for every Ch 2-13 node TODAY — the next chapter build silently inherits no interior, water, weather, item, vendor, journal, crowd or cinematic obligation. Then ranks 13-17, which emit their riders at freeze time: riders added after the freeze are exactly the retrofits rank 2.5 exists to prevent.",
"proposed_home": "One commit adding ~10 riders to docs/FACTORY_CONTRACT.md + docs/factory_contract.json with real registry:/path: data_homes and named teeth (chapter audio rows · interiors authored · region water bodies typed · weather/time-of-day per beat · chapter item + material/gather bill · vendor + accepted goods · exchange medium declared · journal entries · quest rows · persona schedules), re-point FR-029 at the gap-1 dialogue home, replace FR-039's festival data_home and FR-033's doctrine_only source, and re-run gate 30's R1/R2/R3 scan."
},
{
"index": 3,
"entry_id": "GAP-135",
"name": "The slice's authored content has no producer: zero quest rows for Prologue→Ch 13, an unminted Pillar-6 journal corpus, and 87 region seeds outside the one gate that guarantees no seed is lost",
"vision_rules": "The slice is RULED PROLOGUE→CH 13 — 14 nodes / 15 region-legs, and \"THE EA BOUNDARY — the full slice ships as the Early Access base; no early cut\" (PRE_5090_BUILD_PLAN.md SLICE RESCOPE). CVD §11.1: 22 buckets, each Trade/SQ bucket 1M+ words. CVD §5 Pillar 6 makes the journal a gated pillar with an executable test (\"Canonical beats Ch 13/38/57 missing = pillar violation\") and cross-refs T0_Journal_Entry_Template_Registry. docs/proposals/QUEST_SEED_HOUSING_LEDGER.md carries Josh's governing instruction (2026-07-22b): \"the seeds and weaves are headed for quest writing and must not be lost... UNROUTED is the default, so a seed nobody has placed shows up as an open row rather than as silence\", gated by harness/check_seed_housing.py.",
"what_exists": "VERIFIED. T0_Quest_Definition_Registry [ACTIVE v1.0] = exactly 16 rows, all endgame/prologue/epilogue (Ch 55/58/76/77/PROLOGUE/EPILOGUE) — ZERO rows for Ch 2-13. T0_Quest_Seed_Registry = 1 line, header only, ZERO rows (POSITIVE CONTROL: sibling T0_Source_Material_Registry reads 1915 lines by the same reader). No T0_Journal_Entry_Template_Registry exists — not among the 62 registry directories (POSITIVE CONTROL: the same listing returns all three T0_Quest* directories); journal_entry_id occurs once corpus-wide, inside WS_010's own description cell; and the positive-controlled 62-registry header scan returns ZERO journal columns anywhere. harness/rag/seed_housing_index.py sources exactly two trees — read directly: L28 QUEUE = docs/proposals/quest_seed_queue, L29 EXR_DIR = docs/book_extractions; quest_seed_queue/ holds 11 shelves (angkor-khmer, bali, cross-cutting, esoteric, fairy-literary, flores-indonesia, malay-world, rome-italy, sumatra-batak, sumatra_java, vietnam) and NONE of the eight Ch 6-13 slugs. POSITIVE CONTROL on the ledger: grep for the eight slugs across QUEST_SEED_HOUSING_LEDGER.md returns 2 hits, both the prose word \"Ethiopia\", while \"bali\" returns 56.",
"delta": "Ch 6-13 is 8 of the 14 slice nodes and 9 of the 15 region legs, and no ranked item, no VOL2 wave item and no R-3x item authors a quest row, a journal entry or a seed row for any of them. Rank 10 is scoped to the 264 seeds on the four BUILT regions; rank 15 populates Quest_Definition's execution COLUMNS on the existing 16 rows; rank 23 mints trade tier-gates. So the EA base ships with a quest registry naming no quest inside it, a journal shell (U11.18, correctly empty) with nothing to fill it, and 87 authored Section-13 seeds outside the exactly-once contract — the silent-loss class this repo has already been burned by (memory: silent-data-loss-chunk-id-collapse).",
"severity": "CRITICAL",
"blocking": "Gate 1 (Ch 2-13 P3 exit) and Gate 2 (full-slice exit, which opens P4). The seed half bites rank 10 directly — the pass that mints Quest_Seed rows cannot see 87 of the seeds it is meant to type. The journal half bites the Ch-13 closing beat (the amulet and journal passing to the healer's child at the departure), Gate-2 content with no data to render, and Q3.6's journal assembly has nothing to assemble from.",
"proposed_home": "Three landings: a new window-plan rank 'Ch 6-13 main-story quest decomposition + SQ stage rows' reading build/spine_rows/CH_06..CH_13 beats.csv into T0_Quest_Definition_Registry; mint T0_Journal_Entry_Template_Registry per the CVD Pillar-6 cross-ref with Ch 13/38/57 as hard anchors; extend seed_housing_index.py's source set to _source/02_Tier_2_Region_Pages/*.md Section 13 plus a check_seed_housing coverage assertion that every page with a Section 13 contributes ≥1 ledger row. All three enter the factory contract as riders (gap 2)."
},
{
"index": 4,
"entry_id": "GAP-136",
"name": "The canon→engine trunk has no cross-repo tooth: 23 registries with no row struct, 4 ws.* variables with no addressable tag, 32 DataTables with no C++ consumer",
"vision_rules": "CLAUDE.md authority chain item 4 + game-repo CLAUDE.md L27-28: \"The T0 registries (registries/**/*.csv) — structured canon. Consume via DataTables.\" docs/REGISTRY_ROW_STRUCT_SPEC.md §5 records the debt verbatim and forbids the bulk fix: \"62 registry CSVs against 48 generated headers (19 stale, 23 absent). Do NOT run gen_row_struct.py --all --apply until that backlog is reconciled deliberately.\" Source/Humanity/Public/Quest/GeneratedWorldstateSchema.h L7-8 states the tag contract: \"Each ws.* variable also gets a native gameplay tag \\\"Humanity.WS.<variable_name>\\\" so the durable UWorldStateSubsystem (FGameplayTag-keyed) is addressable by variable name with no hand authoring.\" Memory anti-orphan-wire-everything-doc-map: every artifact needs a consumer.",
"what_exists": "VERIFIED by count on both trees: registries/ = 62 CSVs; Source/Humanity/Public/Data/*.h = 48 row structs; Content/Data/Registries/DT_*.uasset = 46. The absent set carries 1,787 rows (Arc_Grid 1231, Promise_Ledger 125, Arc_Index 128, Element_Effectiveness 124, Composure_Routing 53, Festival 16, Ally_Behavior_Policy 14, Rarity_Grade 13, Bonus_Option 12, Realm_Ruleset 11, Status_Table 10, Bonus_Pool 7, Role_Axis 7, Arc_Grammar 6, Spec_Purpose 6, Dungeon_Class_Reference 5, Familiar_Bond_Ability 5, Imprint_Affix 5, Role_Composition_Rule 4, Loadout_Set 3, Equipment 1, Motif 1, Boss_Attack_Rail 0) — this set IS the eight rank-14 item/gear registries the items lane reported separately, deduped here. The invisibility is structural: Tools/registry_import_manifest.json derives its entries FROM the headers (count=46, entries=46), so a registry with no header reports 46/46 green. Worldstate: T0_Worldstate_Variables = 46 rows (verified; last row WS_046 item_instance_ledger) against exactly 42 UE_DECLARE_GAMEPLAY_TAG_EXTERN lines in GeneratedWorldstateSchema.h, whose own L2 self-declares \"(42 rows at generation)\" — WS_043..WS_046 (bonus_selection_state, bonus_respec_ledger, loadout_set_state, item_instance_ledger) have no native tag, so TagForVar() returns an invalid tag rather than a build error. POSITIVE CONTROL on the tooling zero: a machine scan of harness/gates_config.json (34 gates) returns 0 for every cross-repo term and 0 for gen_row_struct, while gen_row_struct is cited 53 times across 15 canon docs — the tool the trunk depends on has never been armed. Consumer direction: 17 DT paths are referenced from Source/, 3 of those assets do not exist (Clue, ElementMatrix, HollowTrickPalette — all honest, null-safe, TODO_CANON-flagged), leaving 14 of 46 with a C++ consumer. HONEST LIMIT: the Blueprint direction is unproven — a binary name-table scan cannot match (the control DT_BossPhase also returned zero), so the claim is 'no C++ consumer', not 'no consumer'.",
"delta": "1,787 canon rows have no engine home and no error, four ratified worldstate variables are unaddressable, and no gate in either tree reads the seam. Rank 2 covers the 19 STALE headers only (\"regenerate the 13 drifted row structs\") — not the 23 ABSENT — and the spec explicitly forbids the bulk apply that would create them. So rank 2 cannot land green as scoped: wiring gen_row_struct --check over --all goes red on 19 stale + 23 absent, a decision that rank does not own.",
"severity": "CRITICAL",
"blocking": "Rank 2 first (it cannot land green as written). Then rank 14, which is minting rows against WS_043-046 right now — the LOADOUT_SETS_SPEC / DEATH_CHOICE / RIFT_DUNGEON Wave-3 specs all home on ws.* keys, and zero engine symbols exist for LoadoutSet/BonusSelection/ImprintAffix/RarityGrade/SpecPurpose. Then ranks 13-17, which freeze schemas onto registries with no engine consumer to validate the freeze against.",
"proposed_home": "One harness/check_canon_engine_trunk.py gate asserting all four hops (registry↔struct, struct↔DataTable, registry↔manifest entry, ws.* row↔native tag) with the game tree read-only, enrolled in gates_config.json and landed BEFORE the reconciliation rank so the reconciliation has a scorecard to close against; register gen_worldstate_schema.py in DOC_MAP alongside gen_row_struct.py; widen rank 2 from 13-drifted to the full 62-vs-48 reconcile."
},
{
"index": 5,
"entry_id": "GAP-137",
"name": "The QA loop — ruled the ONLY player until the Josh gate — has no clock, no floors and no instruments: the nightly belt skips the suite, zero QA teeth are enrolled in any gate, and feel and frame time are unmeasured",
"vision_rules": "CLAUDE.md model seats: \"The AI QA loop + image/feel critics are the ONLY players until then — every play-quality claim carries its critic-read evidence trail.\" AI_QA_LOOP_ARCHITECTURE.md §4.1: \"Per-increment (I). On every commit: the Tier-1 functional pack plus the full accreted regression suite run headless\"; §4.2: \"Gates are non-zero-exit floors... a missing expected frame blocks the wave.\" VOL2 §11.5 QT-21/QT-22: \"is this bug back\" must be \"the regression test going red again, never an argument\", and the harnesses \"ride run_gates.py (canon-side, unpiped, green-before-land)\". QA_WATCHING_PROGRAM.md §1.5 rules six feel funnels; §2.1 rules that gating verdicts are sampled_invariant arithmetic, never critic prose. ENGINE_OPTIMIZATION_DOCTRINE.md §1.1 rules the frame-rate canon (30/60/120 fps with named ms budgets) and §1.5 requires two clauses verbatim in the ship spec: \"60 fps at 1080p internal... with frame generation off\" and \"60 fps HELD, not 60 fps average.\"",
"what_exists": "VERIFIED four ways. (1) THE CLOCK: Tools/run_soak.py L130 builds `cmd = [sys.executable, RUN_QA, \"--map\", map_key, \"--skip-tests\"]` for all seven belt maps — the only scheduled cadence disables the suite on every run. 67 automation tests / 79 test ids exist; no CI workflow, and the game .git hooks are Git-LFS stubs. POSITIVE CONTROL: --skip-tests is a real flag and Tools/run_tests_chunk.py executes the filter when it is absent, so a run WITHOUT the flag would have matched — none is scheduled. (2) THE FLOORS: machine scan of harness/gates_config.json = 34 gates, token census capture 0 · qa_ 0 · bug 0 · perf 0 · frame 0 · soak 0 · anim 0 · cinemat 0 · audio 0 · sfx 0 · cue 0 · quest 0 · journal 0 · icon 0 (POSITIVE CONTROL: the 34 canon-gate names print from the same file). So a red capture session, an invalid bug ledger or a stale verdict cannot block a landing in either repo. (3) THE VISUAL INSTRUMENT: seven capture scripts declare 50 shots; harness/qa/capture_expectations.json declares 9, all greybox_* — measured intersection 9 of 50, leaving 41 with nothing to judge them against, and read_captures.py's no-expectation path is a WARN that never fails. (4) THE FEEL AND PERF INSTRUMENTS: grep for RecordAttackPhase|RecordPlayerAnswer|RecordInputLatency|RecordHitStop|RecordStagger|RecordCameraSample across the game Source/ = ZERO hits (POSITIVE CONTROL: PlayHitStop resolves at four sites in HumanityCombatFeelSubsystem.cpp and five other Record* functions exist in CombatTelemetrySubsystem.h — both halves of the search can match). harness/qa/ holds exactly bug_record_schema.json, capture_expectations.json and fixtures/ — frame_record_schema.json (ruled QS-0, the declared precondition for all nine sequence teeth) is ABSENT, and bug_record_schema.json contains 0 occurrences of motion_class with additionalProperties:false, so the ruled anti-still-frame field is structurally rejected. In ROADMAP_POST_5090_TO_SHIP.md — the doc owning the zero-bug bar and the P4 exit — fps / frame time / p99 / profil all return 0 against zero-bug ×10. And verified zero InjectInputForAction call sites in the game tree (the one hit is a comment; control AddMappingContext resolves).",
"delta": "Every play-quality, feel, regression and performance claim rests on a human or agent remembering to invoke a script, and four of the instruments those claims cite do not exist. QT-22 is written in the present tense about machinery never built. The BUG-0010 failure (declared fixed from a frozen pose) and BUG-0012 (a boss inverted through a whole cycle while every still-frame tooth stayed green) are closed by one bespoke test, not by construction — and the ruled fix for both cannot be written into the schema that rejects it. The only player poses the game for photographs rather than playing it, so \"the machine played the build tonight\" and \"the machine photographed the build tonight\" produce identical artifacts.",
"severity": "CRITICAL",
"blocking": "Benchmark day is imminent (box arrives 2026-07-30) and KT-3 will emit verdicts against a four-class harness ladder whose mid_range_pc row pairs target_fps 60 with a p99 ceiling of 33.3 ms — the 30 fps frame time, exactly the \"60 average with hitches\" §1.5 forbids, with provenance canon_illustrative. Before that, every Ch 6-13 content wave lands into a slice whose regression signal is manual and whose 41 uncovered nightly shots warn silently. And Gate 1's premise — that the machine already played what Josh is about to — is unsupported.",
"proposed_home": "Five zero-model-spend landings: drop --skip-tests from the nightly belt (or add a full-filter leg writing a dated verdict); enroll qa_captures + qa_ledger teeth in gates_config.json with must-fire/must-not-fire fixtures; grow capture_expectations.json to one entry per declared shot and promote the WARN to FAIL at a declared floor; mint harness/qa/frame_record_schema.json (QS-0) plus motion_class + the typed regression_test_ref with all 23 bug records backfilled; add the six feel funnels at their existing call sites and a --perf leg sampling the live BenchSampler, then re-lock bench_criteria.json onto the ruled three-class ladder and add the two §1.5 clauses to the P3/P4 exits."
},
{
"index": 6,
"entry_id": "GAP-138",
"name": "The item economy has no content, no vendor side, and its ruled exchange model has no data home — Equipment is 1 row, materials cover 4 of 13 slice regions, medium_of_exchange exists in zero registries",
"vision_rules": "Ruled twice: VOL2 D-ECONOMY-MEDIUM (Josh, Opt B) — \"historically real mixed exchange per region... a medium_of_exchange token on Region_Index, vendor mechanics as a P2.6 inventory consumer\" — then sharpened at DECISIONS_PENDING_JOSH fourteenth sitting item 7: \"(b) — fully diegetic regional exchange media in-world + ONE presentation-only trade-value lens in the ledger UI (displayed, never stored, never spendable; the world only accepts goods).\" T1_Combat_System_Spec §13 names the imprint targets (\"weapons, armour, off-hand items, grenades and bombs, potions and poisons\") and §5 makes Alchemy potions one of only three health-restoration channels. T1_Trades_Master §9.2: \"Scarcity is real because materials are specific to geographic regions... solo players engage trade interdependence through NPC trader networks.\"",
"what_exists": "VERIFIED by direct row/column reads. T0_Equipment_Registry = 1 row (EQ_0001 Mother's Amulet, whose own notes say \"never rolled or crafted... never an imprint base\") against T0_Weapon_Registry's 72 — POSITIVE CONTROL: the same reader returns 72 weapons, 150 creatures, 281 bosses, so equipment is genuinely 1. medium_of_exchange occurs in exactly TWO files repo-wide (docs/PRE_5090_BUILD_PLAN_VOL2.md and docs/pipeline_review/MINT_DESIGN_B_ITEM_ALLY_2026-07-27.md) and in ZERO registries; T0_Region_Index's 26 columns were read in full and contain no economic field. The positive-controlled 62-registry header scan returns ZERO columns matching vendor, currenc or exchange (control hits in the same scan: Status_Table.icon_class, Theme_Registry.recurrence_anchors). The material spine was measured by grouping the live CSVs: T0_Mineral_Registry 19 rows, T0_Flora_Registry 25 rows and T0_Gather_Node_Registry 24 rows key EXCLUSIVELY to flores_island / bali / sumatra_java / angkor_khmer — nine of the thirteen slice regions have ZERO material or gather rows, while their eight region pages are measured ON DISK at 20/20 template sections each (rank 10's own rescope rider). T0_Imprint_Affix = 5 rows, all affix_name_text EMPTY, string_status placeholder. 15 merchant/trader characters exist in T0_Character_Index with no stock, accepted-goods or market row anywhere.",
"delta": "A ruled world rule with a named landing target has no column five days after the ruling, and VOL2's own EC-medium row still reads the pre-ruling state. Nothing sizes the item BOM the way 72 weapons was sized — CVD §17.12 numerical canon carries no item number and no Josh brief asks for one. VOL2's FL-2 and MN-2 are scoped \"the 4 regions\" by their own text, and no rank or wave extends the material spine to Ch 6-13, so the gather→craft→trade loop silently stops at Ch 5 while the build order runs Ch 2-13 first. The density instrument is blind to all of it: the QT-17 content-budget vector enumerates ten axes with live counts and contains no item, loot, material, gather-node or vendor axis — which is exactly why the four-region stop went unnoticed while the gates stayed green.",
"severity": "CRITICAL",
"blocking": "The first Ch 6+ build leg (DR-6 gather-node staging reads flora/mineral stable ids that do not exist for nine regions); the first buy/sell/barter beat and the first non-weapon reward in the slice; rank 26's RNG_Drop_Table rows, whose payload_kind enum includes `equipment` with an empty catalog to point at; and P2.6, which admits its own hole (\"Equip/stash/weight SPEC is a Josh gap\"). The Region_Index column should ride rank 30's environment-rail edit rather than becoming a second schema touch on a 76-row ACTIVE registry.",
"proposed_home": "A Josh-facing item-sizing brief on the 72-weapons precedent; medium_of_exchange + an ordinal trade_value_basis added with rank 30's rail, with the value lens specced presentation-only in rank 20; T0_Vendor_Registry keyed to the 15 existing merchant characters; a ranked pass extending Mineral/Flora/Gather to the nine remaining slice regions off each page's Section 2/9/14 prose; item/material/gather/vendor axes added to the QT-17 vector before check_slice_scorecard.py is written; mint T1_Items_and_Economy_Spec as the missing domain authority."
},
{
"index": 7,
"entry_id": "GAP-139",
"name": "Rank 11's persona mint — a LIVE P1-EXIT rank — omits the daily-rhythm, occupation and population axis its own queued consumers are specced to read",
"vision_rules": "ENTITY_PERSONA_SYSTEM.md L37 own_life: \"the entity's daily rhythm and independent existence... This is the field that makes the world feel populated rather than staged\"; L267's thirteen-field spine includes own_life. §2.3 tiers ambient entities to \"a persona bucket, not an individual bible\" citing \"a crowd of forty sharing six persona buckets\". §2.4.1 teaching_role names \"the trade home base... and the mastery-tier progression they gate\". VOL2 LW-9 orders \"author the slice's ambient/named personas (own_life daily-rhythm, web_edges)\"; DESIGN_GAP_REGISTER #2 recommends \"one shared schedule component with a 3-4 state enum (home/work/social/sleep)\". Memory regions-are-relational-webs-not-villages.",
"what_exists": "VERIFIED both ends. The mint spec omits the field: ENTITY_PERSONA_SYSTEM.md L218 enumerates the T0_Persona_Index columns as persona_id, anchor_ref, entity class, persona tier, care band, significance-lens set, persona-doc path, runtime class — own_life is NOT among them (it lives as prose in a persona doc, unreadable by a runtime component). The data layer has nothing: a positive-controlled header scan across ALL 62 registries returns ZERO columns matching schedule, routine, occupation, population or crowd — POSITIVE CONTROL, same scan, same files: it returned T0_Status_Table.icon_class, T0_Motif_Registry.recurrence_nodes, T0_Arc_Index.depth_grade and voice_register_ref on three registries, so the scan reads headers. T0_Character_Index's 33 columns (read in full) carry role (164/164 populated, with the occupational fact buried unnormalized in the slug — aksumite_coffee_ceremony_mistress, manggarai_cotton_ikat_weaver) and no occupation, trade, home_site or work_site field. The queued consumer states its own blocker: VOL2 LW-8 \"Ambient-NPC presence/schedule... no schedule field in Character_Index\". The Zone Catalog's 18 columns carry no occupancy field (footfall_surface is the false friend — walk-surface foley), and the only population metric in the QA budget counts NAMED personas (QT-17 reads \"personas (T0_Character_Index 163)\") — 164 rows for 79 nodes, ~7-8 per slice chapter.",
"delta": "Rank 11 is LIVE, ranked and a P1 EXIT criterion — and it is about to author complete personas on every slice entity against a column list that cannot hold the field LW-8, register #2 and the trade lane are all queued to read. A column added after the mint is a retrofit across every slice persona row; LW-8 at W-LW3 then stalls or ships mannequins. There is also no number anywhere for how many people a village, market, port or trade compound holds, and no bucket roster to pool ambient NPCs onto, so rank 5's crowd mesh/material budgets cannot be sized. This is the sharpest cost-asymmetry finding in the audit: the fix is a spec amendment to a rank that has not started.",
"severity": "CRITICAL",
"blocking": "Rank 11 itself — the last cheap moment. Then rank 5 (asset budgets need crowd counts), rank 23 (a trade home base with an upgrade ceiling and no practitioner roster reads as a prop), and W-LW3 staging, which would otherwise certify \"a lit ambient-village frame\" against no target.",
"proposed_home": "Amend ENTITY_PERSONA_SYSTEM §5.2 BEFORE rank 11 mints: add schedule_state_set (home|work|social|sleep), home_site_ref, work_site_ref, presence_window, occupation_ref/trade_ref, plus a child T0_Persona_Schedule table for multi-window personas and a T0_Persona_Bucket table keyed from each region page's Section-4 role prose; add ambient_population_band to the Zone Catalog rail; enroll all FKs in fk_spec.json in the same commit."
},
{
"index": 8,
"entry_id": "GAP-140",
"name": "The moving-image lane has no data home and no bill of materials — the RULED twelfth DR-2 animation class was never landed, 450 authored scenes are uncounted, and the ruled per-tier variant space is sized by the wrong denominator",
"vision_rules": "RULED: docs/pipeline_review/tech_research/STACK_CONFLICT_ADJUDICATIONS_2026-07-29.md C-13 (verified verbatim at L74-80) — \"ANIMATION's `Animation / montage` row (keyed ability_id + presentation_tier_ref) takes DR-2 ordinal 12\", with PC-5 ruled canon-row-authoritative and \"the QT-5 divergence check ships as a must-not-fire fixture before the first montage imports.\" RULED: Josh, fourteenth sitting, OPTION (A) FULL PER-TIER VARIANTS with the band-collapse recommendation OVERRULED — \"every spell and ability and movement needs to be beautiful and fluid art\" at full strength. ROADMAP_POST_5090_TO_SHIP.md P2.7 exit: the slice's cinematic events render as real cinematics with MRQ dailies read by critics. T99_Translation_Cinematic §3 routes seven scene categories through a director-in-loop vs autonomous two-track workflow. Fork C / DT-3 route the story load at every chapter seam to \"the authored bridging scene (chapter_bridging_cinematic)\".",
"what_exists": "VERIFIED. docs/ASSET_DROPIN_CONTRACT.md contains 0 occurrences of animation or montage (machine count) — the ruled twelfth row has no landing vehicle, and C-13's own consumers list does not name the DR-2 row, so nothing is queued to write it. The positive-controlled 62-registry header scan returns ZERO columns matching anim, montage, viseme or facial (control hits named above), so no animation-bearing id exists for the 5090 lane's dispatch (\"a script emits rows where generation_status='pending' on animation-bearing ids\"). The cinematic BOM: build/spine_rows/*/scenes.csv = 450 rows measured, census per_chapter_cutscene 210 · boss_encounter_resolution 91 · canonical_set_piece 38 · branch_decision_point 32 · boss_encounter_intro 29 · ambient_cinematic 21 · boss_encounter_phase_transition 15 · epilogue_cinematic 5 · prologue_cinematic 4 · architect_appearance 3 · convergence_node 2 — none of the 8 columns is duration, shot count, complexity or production tier, and T0_Scene_Spec_Registry carries only 16 rows (cinematic_status pending 16/16, mesh_refs '[]' 16/16), so 434 scenes have no registry row. chapter_bridging_cinematic is NOT among the 11 live scene_type values — independently re-verified here after FORKC_ANALYSIS's own positive-controlled grep — so all 78 chapter seams have zero bridging rows. The variant sizing is element-keyed: the ruled 248 live / 372 clamp is 31 elements × 8 tier values (verified against T0_Ability_Tree_Registry's 31 distinct element values), while the animation axis is 185 abilities × tiers plus 72 weapon movesets — unenumerated, with presentation_tier_ref declared and EMPTY on both rails (0/185, 0/72; POSITIVE CONTROL: tier_numerical and cast_pattern are 185/185 in the same file) — and the audio half of the same ladder is likewise unsized, with ability_sfx and vril_cast_sfx arrays 0/185.",
"delta": "A ruling with no vehicle, a 450-row content class with no arithmetic, and one number standing in for three different variant axes. Rank 6 populates scene_type/participant_refs/beat_ref and adds no count, duration or production tier; rank 13 writes ONE presentation_tier_ref per ability row — a single column cannot express a per-tier variant SET, so rank 13 closes green having populated the rail without creating the BOM. Nobody can say how many cinematics Ch 7 needs, which get the director-in-loop track, or what the 79-node total costs; and P5 — the 60-plus-chapter factory — carries zero cinematic or animation mentions against 27 chapter mentions, so the factory that builds the remaining 65 chapters has no moving-image lane at all.",
"severity": "CRITICAL",
"blocking": "The DR-2 clause commit / Batch 0 — the twelfth row must land before it, or the generation_* column family retrofits across twelve registries. C-13's own precondition is already reachable: PlayAnimation calls exist on boss and enemy today with zero notify binding. Then P2.7's stated exit, the first overnight animation batch, the first montage import, the Ch 2→3→4→5 seams (four of the 78), and the Ch 2-13 slice build where the 450-scene scope first bites.",
"proposed_home": "ASSET_DROPIN_CONTRACT §2 twelfth row plus the generation_* / asset_licence_ref column family on the ability, weapon, character, creature, boss and scene registries via Batch 0; a variant-key manifest with separate ANIM, VFX and AUDIO axes at a declared family grain, with register entry 97 amended and ASSET_DROPIN_CONTRACT L296 corrected to name which axis 248/372 sizes; scene_shot_count / scene_duration_class / production_track / cinematic_tier minted on T0_Scene_Spec_Registry with the 434-row scatter from build/spine_rows; a seam-typing pass writing chapter_bridging_cinematic rows for all 78 seams; a scenes dimension in QT-17 and a cinematic lane row in the P5 factory."
},
{
"index": 9,
"entry_id": "GAP-141",
"name": "T0_SFX_Registry implements 1 of its 21 ratified columns, the audio bill of materials is uncounted across 79 nodes, and audio has no tooth in the 34-gate suite",
"vision_rules": "T0_Schema_Dictionary [ACTIVE v1.3] §3.16 declares 21 required columns for T0_SFX_Registry (sfx_category enum, sfx_subcategory, mood_tags, terrain_substrate, weapon_trait_substrate, magic_effect_substrate, cultural_substrate, era_substrate, recurrence_anchors, track_assignment, generation_method, generation_prompt_hash, last_generated_timestamp, generation_status 7-state, build_asset_path, sound_designer_in_loop_required, regeneration_trigger, primary_source_array, canonical_anchor, hard_line_relevance, sfx_id), mirroring T1_Build_Pipeline_Contracts §10.5; §10.7 runs a 7-state machine on generation_status; §10.4.1 composes every prompt from the substrate columns. §10.2 enumerates the countable BOM (17 terrain × 5 protagonist-state = 85 footstep cues; 17 biome ambients with day/night pairs; wind 4 / water 7 / fire 6; vril-cast identity across twelve tiers); §10.6 declares ten per-registry sfx_id_ref arrays as its consumption homes. Gate 34's own description records the enforcement precedent: \"UNPOPULATED-IS-A-HARD-FAIL... the rule that would have caught music_mood_tags reading 79/79 filled while being 0/79 real.\"",
"what_exists": "VERIFIED by reading the live header. registries/T0_SFX_Registry [ACTIVE v1.0] = 30 rows × 20 columns: sfx_id, sfx_name, sfx_class, linked_entity_id, linked_entity_type, chapter_anchor, region_id, vril_density_modifier, integrity_band_modifier, cultural_depiction_required, special_asset_class, cultural_authenticity_source, hard_line_anchors, layering_role, spatial_attenuation, pipeline_consumer, populated_from, notes, extensions, ue_sound_asset_path. Of the 21 §3.16-required columns exactly ONE (sfx_id) is present; 20 are absent and 19 live-only columns stand in their place. sfx_class's four values share ZERO tokens with §10.2's six-value sfx_category enum, and placeholder-vs-final is encoded in a path-string suffix because no status column exists. POSITIVE CONTROL that this is SFX-only, not house style: T0_Theme_Registry's 28-column header was read in the same pass and carries its declared columns including generation_status and generation_prompt_hash. The BOM: 18 of 30 rows anchor to CH_02, so 67 of 79 nodes carry zero rows; the consumption arrays measure ability_sfx 0/185, vril_cast_sfx 0/185, weapon_sfx 0/72, boss_sfx 0/281, chapter_sfx 0/79, with only Region_Index env-ambient 8/76 and ritual 4/76 populated. The tooth: a machine scan of harness/gates_config.json (34 gates) returns sfx 0 · audio 0 · sound 0 · cue 0 · ambien 0 (POSITIVE CONTROL: music returns 1, inside gate 34's own description text), fk_spec.json enrolls only two scalar sfx FKs — none of the ten §10.6 arrays — and 8 of the 30 rows are referenced by nothing anywhere. No artifact multiplies §10.2's enumerations into a number. The positive-controlled 62-registry scan also returns zero creature-vocalization and zero time_of_day columns.",
"delta": "The divergence is already briefed as [DECISION NEEDED - JOSH] in docs/PIPELINE_ADAPTER.md (2026-07-03, recommendation Option A) and appears on NO live board — zero audio items in OPEN_BRIEFS_2026-07-28.md, zero in OPEN_DECISIONS_FOR_JOSH.md, no window-plan rank — while the registry grew 12→30 rows inside the unreconciled shape, so the migration priced at \"12 rows is cheap\" is now 2.5× larger and still unqueued. AU-13 is the only queued population item, scoped to \"Ch2-5 registry population\" with no count and no arc-wide scope, so the most-heard asset class in the game has no seat-hour estimate, no licence-vs-generate split, no 5090 batch sizing and no per-node coverage target. The zone vocabulary compounds it: footfall_surface is 84/84 populated with a 5-value set (stone/earth/water_edge/forest_litter/mixed) of which exactly one token overlaps §10.2's 17, and \"mixed\" cannot resolve a cue at all — the music_mood_tags failure class on a column that looks green.",
"severity": "CRITICAL",
"blocking": "Rank 8 writes cue rows NEXT into a schema that cannot record a cue's track, category, generation method, prompt hash or sign-off state, and it is scoped per-page and growing with rank 10's twelve-page queue — every page authored before the reconcile is a second pass. AU-13 lands unvalidated ids into the same shape; DR-2 Batch 2 then migrates paths with no state column to distinguish placeholder from final; and the 5090 SFX generation lane (DR-AU3) has no volume to plan against.",
"proposed_home": "Rule the 2026-07-03 PIPELINE_ADAPTER Option A as a window-plan schema-data rank landing BEFORE rank 8 writes cue rows (deterministic column add via registry_extensions.json + fidelity_baseline.json in one commit, sfx_class→sfx_category mapped, cultural columns carried, plus a creature_vocalization array and a seventh category for the 132-creature Krotos lane); a counted SFX_BOM artifact deriving from §10.2 × node/region/entity multiplicity; an sfx_coverage gate on the PASS-on-empty scaffold with fk_spec enrollment of the ten arrays; and the footfall vocabulary reconciled against §10.2 in the Zone-Catalog column contract."
},
{
"index": 10,
"entry_id": "GAP-142",
"name": "The world's non-heightfield space has no class, no column and no producer — 15 authored interior footprints live in prose, below-grade volume is ruled out of the terrain chain, and the space tooth certifies a flattened cave as OK",
"vision_rules": "T1_Region_Page_Template [ACTIVE v2.0] Section 17 requires \"environment areas, interiors, vegetation palette, NPC population\" per region. Josh RULED the AMPLIFICATION doctrine (PRE_5090_BUILD_PLAN.md L2081-2083): \"under-sized settlements EXPANDED into fuller living places guided by their own cultures' architectural grammar\" and \"caverns/ruins accurate at the mouth then vaster and more complex below\", carried into the per-chapter factory at ROADMAP_POST_5090_TO_SHIP.md L489. CVD §3 Component 6 makes interior volume constitutional (\"Internal structures harness vril through resonant geometric-substrate mechanisms\", anchors including \"Ch 58 Antarctica (underground facility)\"). T99_Translation_Terrain §5 D-MPV reserves the 1 m/vertex hero tier for \"caves, boss pockets, ritual grounds\".",
"what_exists": "VERIFIED. The demand is authored and unstructured: 11 of 12 slice region pages carry interior prose (machine count: sumatra_java 44, south_india 15, south_africa 14, central_africa_congo 12, ethiopia 9, swahili_coast 9, west_africa 8, bali 4, rift_valley 3, sri_lanka 3, flores_island 2), with measured footprints buried inside single free-text area_bounds cells (\"the mourning household interior 14×10\", \"two workable interiors ~14×10 each\", \"the night-court interior 45×35\", \"labor floor 180×120, superintendent's office deck 40×30\"). The positive-controlled 62-registry header scan returns ZERO columns matching interior, room, building, settlement, water, depth or time_of_day — POSITIVE CONTROL, same scan: it matched Status_Table.icon_class, Motif_Registry.recurrence_nodes and voice_register_ref, and a prior scan matched impossible_architecture_budget and weather_cycle_profile, so substring matching works. ASSET_DROPIN_CONTRACT §2's eleven classes carry one environment row (a single static mesh per vril site). Content/Maps/ holds 9 region/arena .umap files and no interior level. The vertical axis is ruled OUT: T99_Translation_Terrain §2 Step 7 imports \"classic heightfield Landscape, not UE 5.8's experimental Mesh Terrain\" — the only geometry that represents overhangs and caves — while T0_Vril_Site_Registry's 42 rows include 15 inherently-interior site_classes (pyramid 6, megalith 5, tomb 3, underground_facility 1) with zero spatial columns. And the tooth is DEM-only: Humanity/QA/SPACE_AUDIT_FLORES_POSTSCULPT.md L22 grades \"liang_bua_cave | Ch2 | 220x180x60 karst interior | 0.0 | 0.0 | 100% | OK\" — verified verbatim — i.e. it measures the slope of the ground ABOVE the cave, and the recorded fix was \"Liang Bua 21.3°→0.0° with a level cave-mouth terrace replacing the 27° opening.\" Water: TODO_CANON.md L395-398 records the FloresOcean placeholder plane with \"the real water pass (actual water system/material, shore interaction) remains open\" and L641 puts it on \"a later item\" that exists as no plan row. T0_Dwelling_Registry is a false friend at 2 rows, both PLAYER homes, with build_grammar_ref EMPTY — and T0_Trade_Registry's shared_build_grammar_ref resolves to that empty column.",
"delta": "Interiors, below-grade volume, the built-structure typology and water are four faces of one gap: the world's non-terrain space has no id, no row, no count, no asset class, no streaming home and no verifier — and its one instrument reports a flattened terrace as OK, a silent-success failure. VERIFIED absent from the queue: grep -i interior returns 0 hits in PRE_5090_BUILD_PLAN_VOL2.md, 0 in FACTORY_CONTRACT.md, 1 in ROADMAP_POST_5090_TO_SHIP.md (the doctrine sentence), and the three hits in PRE_5090_BUILD_PLAN.md are unrelated (rift-interior register, interior voice) — so no rank, no wave item and no rider owns any of it. The register's GTA row lists \"Enterable interior density\" as DIVERGENT-BY-DESIGN, but that is a verdict about ambient urban density being read as cover for the interiors the pages already require.",
"severity": "CRITICAL",
"blocking": "The Ch-2 AAAAA polish the JOSH GATE terminates on — Liang Bua is the slice's OPENING playable space and cannot be finished as a terrace. Rank 5 must classify slice assets in a taxonomy with no interior class; the Ch 7-8 staging waves reach the first interior-bearing regions (wootz forge, kalari, Kilwa) with nothing to build against; and rank 27 is a LIVE rank scheduled to build a baray-flow mechanic on a reservoir with no water representation, while the Ch-8 dhow boss set-piece stages on open water.",
"proposed_home": "A director brief (never bare — alternatives + recommendation) on the interior-geometry vector (Mesh Terrain re-target vs authored mesh-kit/level-instance interiors), then mint T0_Interior_Space_Registry (interior_id · parent zone_id FK · build-grammar ref · footprint + storey/below_grade_depth · enterable|referenced · room count · care_tier · kit_id · the assetgen block) plus T0_Structure_Registry for the settlement typology and a water block (water_class · depth_band · current · navigability · seasonal_state · shore_type); add spatial columns to T0_Vril_Site_Registry, a twelfth ASSET_DROPIN class row, an interior_authored value in zone_space_class, and a W-SPACE tooth extension that refuses DEM slope as evidence for an interior volume."
},
{
"index": 11,
"entry_id": "GAP-143",
"name": "The witness → memory → community-reaction engine and the NPC recognition layer have no spec home and no owner — 77 authored spine writes and five worldstate rows point at systems that do not exist",
"vision_rules": "CLAUDE.md content bar + memory violence-allowed-r17-no-genocide, ruled: \"killing ripples through the community and is remembered\", and systematic slaughter \"escalates diegetic response (settlement to region to hunted-across-the-world) so genocide is never progression-viable\" — the mechanism the care doctrine's anti-genocide floor leans on. docs/proposals/systems/attackability-and-consequence-model.md §The engine: \"Witness, memory, reputation — not a wanted meter... they witness, flee, warn others, and the community's disposition persists\", with the baker's empty stall and the child who now fears the player as its stated register. ENTITY_PERSONA_SYSTEM §3.2: \"an entity notices who the protagonist has become even without having observed her deeds — the disposition is generated fresh each encounter.\"",
"what_exists": "VERIFIED: doctrine only, deferring its own mechanism in a closed loop. attackability-and-consequence-model.md §Wiring targets pushes witness-memory, settlement disposition, community-resilience and the escalation ladder to \"the WS7 wiring task\"; WS7_WIRING_BUILD_PLAN.md L193 pushes it back (\"belongs to the reputation/integrity WS7 wiring task, NOT this attackability anchor — deliberately out of scope here\"). POSITIVE CONTROL on the only candidate home: docs/proposals/systems/reputation-prestige-nemesis.md is 51 lines and contains ZERO occurrences of witness, settlement, ripple, villager or bystander while \"reputation\" occurs throughout — it specs the faction ladder, prestige/NG+ and boss Nemesis AI, not community reaction. NPC_recognition_system is a phantom consumer: independently verified, it occurs ONLY in registries/T0_Worldstate_Variables (named on 5 rows — WS_001 integrity_score, WS_006 appearance_score, WS_008 relationship_history, WS_023 vril_polarity_signature, WS_025 identity_hiding_status) plus four docs (a lens draft, its critic — which independently calls it \"the NPC_recognition_system consumer that no system answers to\" — the connective-web inventory, and a 2026-07-20 brief). No spec, no thresholds, no per-band greeting/price/availability table, no resolution order, no authored fallback. WS_026's own row says \"full system spec deferred to post-cascade architecture gaps queue at T1_Personal_Dimension_Spec adjacent\" — and rank 24's T1_Personal_Dimension_Spec scope is marriage/dimension pocket/creature housing, which excludes propagation. Meanwhile the spine already writes reputation_biography_propagation 77 times across 31 nodes and relationship_history 83 times. FR-017 carries the doctrine as a SEED rider with tooth NONE. Engine side: no NPC, persona, companion or faction class exists anywhere in the game Source tree, and N8.2 \"AHumanityNpcCharacter persona runtime\" is BUILD-NOW with no spec to build against.",
"delta": "No document anywhere defines what a kill or harm event WRITES: witness set, propagation radius, decay, settlement mobilization, price/greeting/quest-availability deltas, repopulation cadence, or the escalation rungs — and the recognition layer is declared in DATA (which state it reads) while absent from DESIGN (what it does with it). 77 authored spine writes land in systems with no spec. The Hunted band already ships as a label on T0_Reputation_Ladder_Registry with nothing that hunts, so the ruled anti-genocide escalation is unimplementable as written. Not in ranks 1-30, not in R-31/R-32, not in VOL2's LW-* or N8 rows beyond N8.1's one-line \"community-ripple event on death\".",
"severity": "CRITICAL",
"blocking": "Rank 10 cannot type dark-track or succession seed variants without the ripple's write grammar (cheapest before it). Then W-LW3's first staged playthrough in which the AI QA loop kills a villager has no defined world response — i.e. Gate 1 would certify \"consequence\" that was never specced — and N8.2 plus the natural-voice NPC dialogue lane both require an NPC that reacts to integrity, appearance and concealment.",
"proposed_home": "A new docs/proposals/systems/COMMUNITY_CONSEQUENCE_ENGINE.md (witness model, WS_019/WS_026 write grammar in STATE_DELTA_GRAMMAR terms, a recognition chapter with per-band thresholds and resolution order, escalation rungs, repopulation cadence, and the hunted-response/bounty leg recovered from the GDD), with the NPC_recognition_system token either specced or retired from the five worldstate rows in the same commit, a factory-contract rider with a real tooth (gap 2), and a DOC_MAP row."
},
{
"index": 12,
"entry_id": "GAP-144",
"name": "The player-facing UI has no bill of materials and zero localization compliance — ~13 ruled screens and ~542 icons have no item, no id source and no owner, while the binding String-Table law is 100% unimplemented and its one test blesses the violations",
"vision_rules": "COMBAT_PROGRAM_ADDENDUM §9/§10 (RULED Josh 2026-07-26) assigns the owner for selectable bonus picks, 2nd/3rd loadout sets quick-changed at vril sites, spec purposes and companion parity: \"OWNER: the canon-lane schema pass + the post-slice runtime + W10's book screens (the build/loadout UI) + the factory\"; §2b makes the Rune Forge the player-facing ability creator. The localization-from-the-first-string law is binding and its cost documented: PRE_5090_BUILD_PLAN P2.5 \"Route every HUD/interaction/quest string through a String Table from the first widget\"; BUILD_PLAN_END_TO_END L149/L169 records that FText \"is legally load-bearing (ship-everywhere localization) and cannot be cheaply retrofitted once content references the strings\"; ROADMAP_POST_5090_TO_SHIP L302 rests the launch localization tier on that floor. NATURAL_VOICE_DOCTRINE (Josh 2026-07-26) \"binds every player-facing word\" and claims the HUD explicitly.",
"what_exists": "VERIFIED. THE SCREENS: VOL2 §11 itemises 32 UI items of which 13 are screens (front-end, pause, ability book, quest log, fork, journal, shell, map, travel-beat, dialogue/subtitle, photo/codex, loading) and a positive-controlled scan of the UI section for inventory|equip|loadout|rune|craft|forge|imprint|bonus|vendor|shop|minigame returns ZERO — while the same terms hit elsewhere in the same file, so the search matches and the section genuinely contains none. VOL1's own W7 fold list named \"quest-log/map/inventory/ability-book UMG\" and inventory dropped out of the fold. So ~13 further ruled screens (inventory/equipment, character sheet + the 120-gate mastery ladder, loadout manager, Rune Forge, imprint crafting, per-proficiency bonus selection, familiar roster + companion stat-build, reputation ladder, vendor/barter + the ruled ledger UI, personal dimension, vehicles/base building, achievements, festival calendar) have no build item, no IA and no denominator. THE ICONS: the positive-controlled 62-registry header scan returns exactly ONE icon column corpus-wide — T0_Status_Table.icon_class (10 rows, itself with no consumer) — against a countable ~542-icon BOM from live rows (Ability 185 + Weapon 72 + Creature 150 + Familiar 22 + Rune 19 + Rarity 13 + Flora 25 + Mineral 19 + Trade 10 + Status 10 + Imprint 5 + Bonus 12), and ASSET_DROPIN_CONTRACT's HUD-art row carries the prose id source \"UMG widget binding (authored, not generated)\" with generation_status N/A — so icons are tagged a 5090 workload with no prompt-composable id list. THE LOCALIZATION: verified on the game tree — grep for LOCTEXT|NSLOCTEXT|FStringTable|LOCTABLE returns ZERO matching files while FText::FromString returns 41 hits, so every player string is a hardcoded literal; no Content/Localization directory exists; and HumanityUIAutomationTests.cpp's MustPass list ENSHRINES two of them (\"Press 1, 2 or 3 to choose your path.\", \"Press F to continue.\"). The 34-gate scan returns no loc/string/UI tooth, and those same literals will lie the moment U11.9's rebinding lands.",
"delta": "Three failures of one shape: a ruling or a law with no countable surface and no tooth. DR-2 sized per-tier VFX variants to 248/372 because the every-surface-beautiful ruling demanded a countable variant space; the UI got the same ruling and no arithmetic at all — no screen roster, no icon count, no design tokens, no per-region/per-realm variation model. And a law whose retrofit cost is documented as uncheap has zero compliance on the one shipped surface, zero deterministic tooth in either tree, and an automated test that positively blesses the violating strings — while the game's shipped text locales have never been briefed to Josh.",
"severity": "CRITICAL",
"blocking": "Every §§7-12 schema-freeze rank (13-17, especially rank 14's tier-bonus pools / imprints / loadout sets / role tags) freezes columns with no consuming screen specified — the same both-ends failure that produced the P2.6 spec hole, and retrofitting screen IA after 30+ columns freeze costs a second schema pass. Every U11 widget authored from now deepens the localization debt (W10 already shipped 41 violations, carried as residue since 2026-07-24d with no rank). Rank 13 is the near-free moment to add icon_id_ref for 185 ability rows.",
"proposed_home": "A VOL2 §11i SCREEN ROSTER table (one row per screen: ruled source, data reads, reveal filter, controller-nav path, wave) authored as part of rank 20's T1_UI_UX_Spec with a factory rider so gate 30 resolves each screen's data_home; icon_id_ref minted on the ability/weapon/status/rune/rarity/trade/creature/flora/mineral registries inside ranks 13-14 plus a twelfth ASSET_DROPIN 2D/UI class row with a real id source and drop path; a gate-35 player_string_loc tooth (fails on any FText::FromString literal reaching a UMG SetText, must-fire/must-not-fire fixtures) landed with U11.1, the two blessed literals retired from the MustPass list, T0_UI_String minted as the chrome corpus home inside the Natural Voice Doctrine §5 pass scope, and the shipped-locale ring added to the rank-18 bundled brief."
}
],
"lanes": {
"ui-ux": [
{
"index": 1,
"entry_id": null,
"merged_into": "GAP-144",
"name": "No SCREEN bill of materials — the ruled build-agency, ledger and vendor screens have an owner named in doctrine and no item anywhere",
"vision_rules": "COMBAT_PROGRAM_ADDENDUM.md §9 (RULED Josh 2026-07-26) explicitly assigns the owner: \"OWNER: the canon-lane schema pass (the residue batch) + the post-slice runtime + W10's book screens (the build/loadout UI) + the factory\" — for SELECTABLE minor/major bonus picks, 2nd/3rd LOADOUT SETS quick-changed at vril sites, SPEC PURPOSES, and companion loadout parity. §10 extends selectable pools to \"EVERY skill, trait, weapon, trade, and any proficiency\". §2b makes the RUNE FORGE \"the player-facing ability creator\". OPEN_BRIEFS_2026-07-28.md §7 D-ECONOMY-MEDIUM was RULED option (b) — \"ONE presentation-only trade-value lens in the ledger UI\" — unblocking EC-medium/EC-vendor. PRE_5090_BUILD_PLAN.md P2.6 admits its own spec hole: \"*(Equip/stash/weight SPEC is a Josh gap.)*\"",
"what_exists": "PRE_5090_BUILD_PLAN_VOL2.md §11 itemises exactly 32 UI items (U11.1–U11.32, verified by id enumeration), of which 13 are screens: front-end U11.6, pause/options U11.5, ability book U11.14, quest log U11.16, fork U11.17, journal U11.18, Grimoire U11.19, screens shell U11.20, map U11.21, travel-beat U11.22, dialogue/subtitle U11.23, photo/codex U11.25, loading U11.26. POSITIVE CONTROL: awk over VOL2 lines 680-830 for inventory|equip|loadout|rune|craft|forge|imprint|bonus|vendor|shop|minigame returns ZERO, while the same terms grep non-zero elsewhere in the same file (rune/loadout at L871-874, L1507; inventory at L105/L1068/L1090) — so the search can match and the UI section genuinely contains none. VOL1 L314's own W7 fold list named \"quest-log/map/inventory/ability-book UMG\"; VOL2's fold table (L794-807) maps UI-1..10 → U11.1–U11.4 + U11.14–U11.20, dropping inventory in the fold",
"delta": "≈13 ruled player-facing screens have no build item and no owner: inventory/equipment, character sheet + the 12×10=120-gate mastery ladder, loadout manager (2/3 sets at vril sites), the Rune Forge creator, gear-imprint crafting, per-proficiency bonus selection, familiar roster (22 rows) + companion stat-build (INT-as-AI), reputation ladder, vendor/barter + the ruled ledger UI, personal dimension (T1_Personal_Dimension_Spec is a 48-byte stub), vehicles/base building, achievements + Games-Master medals, festival calendar. Doctrine points AT W10; W10's itemisation does not contain them. There is no screen roster, no per-screen IA, and no denominator to measure completeness against",
"severity": "CRITICAL",
"blocking": "Every §§7-12 schema-freeze rank (window ranks 13-17, esp. rank 14 \"mint the §§7-12 data homes: tier-bonus pools, imprints, loadout sets, role tags, ally stat spreads\") freezes columns with no consuming screen specified — the same both-ends failure that produced the P2.6 spec hole. Hits the moment rank 14 starts; retrofitting screen IA after 30+ columns freeze costs a second schema pass",
"proposed_home": "A new VOL2 §11i SCREEN ROSTER table (one row per screen: ruled source, data reads, reveal filter, controller-nav path, wave) authored as part of window rank 20's T1_UI_UX_Spec, with a factory_contract rider so gate 30 R2/R3 resolves each screen's data_home and consumption point"
},
{
"index": 2,
"entry_id": null,
"merged_into": "GAP-144",
"name": "Iconography bill of materials has no id source, no count, and no producing pipeline",
"vision_rules": "ASSET_DROPIN_CONTRACT.md §2 declares HUD art as the 11th asset class and requires every class to carry a \"Canon id source (registry.column)\". PRE_5090_BUILD_PLAN_VOL2.md §11 tag law: \"The only gated residue here is final HUD/icon **art** (`+5090-final`)\" and U11.14 is tagged \"BUILD-NOW (+5090-final icons)\" — so icons are a declared, scheduled 5090 workload. ROADMAP_POST_5090_TO_SHIP.md P2.6 makes HUD art a phase-exit surface at the AAA reference bar",
"what_exists": "ASSET_DROPIN_CONTRACT.md L81: the HUD-art row's id source is the prose \"UMG widget binding (authored, not generated)\" — no registry.column — and §2's closing note marks it `generation_status` N/A, so it rides none of the five-state generation machine that the other nine classes ride. POSITIVE CONTROL on the data home: a header scan of all 62 registry CSVs for ^icon|icon$|_icon|sprite|thumbnail|ui_|portrait|hud returns exactly ONE column — `T0_Status_Table.icon_class` (10 rows) — while the same scan prints the full Status_Table header, proving the scan reads headers. POSITIVE CONTROL on the pipeline: `grep -ci icon` across all six docs/translation/T99_Translation_*.md returns 0,0,0,0,0,0 while `grep -i icon` over docs/*.md returns 20+ hits — the search works; no pipeline contract mentions icons",
"delta": "The countable icon BOM is ~542 distinct icons from live rows alone (Ability 185 + Weapon 72 + Creature 150 + Familiar 22 + Rune 19 + Rarity 13 + Flora 25 + Mineral 19 + Trade 10 + Status 10 + Imprint 5 + Bonus_Option 12), plus per-platform input glyph sets, and NONE of it is counted, id-columned, or assigned a producing lane. `Status_Table.icon_class` is the mirror defect: the one icon column that exists has no consumer (no icon asset class resolves it, no widget reads it). The only tooth is QA-12, which AI_QA_LOOP_ARCHITECTURE.md §335 defines as a human/critic \"polish-wave protocol\", not a coverage denominator",
"severity": "CRITICAL",
"blocking": "The 5090 generative window: icons are tagged as a 5090 workload with no prompt-composable id list, so the box arrives with no icon work order — the same posture that left DR-2's per-tier VFX variants needing an emergency sizing pass (248 live/372 clamp). Also blocks rank 13 (ability registry data pass) which is the natural place to add `icon_id_ref` for 185 rows at near-zero marginal cost",
"proposed_home": "An `icon_id_ref` column minted on the ability/weapon/status/rune/rarity/trade/creature/flora/mineral registries inside window ranks 13-14, plus a 12th ASSET_DROPIN_CONTRACT row (2D UI/icon class) with a real id source and a `/Game/UI/Icons/<class>/T_<icon_id>` drop path, and an icon count in the DR-2 variant arithmetic"
},
{
"index": 3,
"entry_id": null,
"merged_into": "GAP-144",
"name": "The binding localization law is 100% unimplemented on every player surface and has zero teeth; the game's shipped-language ring is unruled",
"vision_rules": "The localization-from-the-first-string law is binding and repeatedly cited: PRE_5090_BUILD_PLAN.md P2.5 \"Route every HUD/interaction/quest string through a String Table from the first widget\"; REGISTRY_ROW_STRUCT_SPEC row in DOC_MAP L346 makes FText the display-text type by law; BUILD_PLAN_END_TO_END.md L149/L169 records that FText \"is legally load-bearing (ship-everywhere localization) and cannot be cheaply retrofitted once content references the strings\". ROADMAP_POST_5090_TO_SHIP.md L302 rests the launch localization tier on that floor: \"every player-facing string in a String Table from the first widget\"",
"what_exists": "POSITIVE CONTROL, game tree C:\\dev\\Humanity\\Humanity\\Source: `grep -rn \"LOCTEXT|NSLOCTEXT|FStringTable|LOCTABLE\"` = 0 hits, while `grep -rn FText` = 139 and `grep -rn \"FText::FromString\"` = 41 — the search matches, and every player string is a hardcoded literal (HumanityPlayerHUDWidget.cpp:404 \"The way ahead is clear.\", :417, :432, :612, :623, :644). No Content/Localization directory exists (ls returns nothing while Content/ lists 9 siblings); zero StringTable assets among 309 .uassets (the single ST_ hit, Combat/ST_BossPhases_Greybox, is a StateTree). No localization/culture lines in Config/*.ini. Teeth: harness/gates_config.json carries 34 gates and none is loc/string/UI-named (full roster enumerated). The game's only UI tooth, HumanityUIAutomationTests.cpp \"Humanity.UI.RevealTable\", ENSHRINES the literals — lines 82-83 list \"Press 1, 2 or 3 to choose your path.\" and \"Press F to continue.\" in its MustPass list. Language ring: MARKETING_WEB_PROGRAM.md §4 rules an i18n language ring for the SITE; ROADMAP_POST_5090_TO_SHIP.md L298 defers only spoken-VO tiering; no doc names the game's shipped text locales",
"delta": "A law with a named, documented, uncheap retrofit cost has (a) zero compliance on the one shipped surface, (b) zero deterministic tooth in either tree, and (c) an automated test that positively blesses the violating strings. U11.24/P2.5 are queued for the RUNTIME (RTL fonts, UI scale, subtitle standards) and the scaffold, but nothing is queued that FAILS a build when a widget string is a FromString literal, and no brief asks Josh which locales the game ships",
"severity": "CRITICAL",
"blocking": "Every U11 widget item (U11.1-U11.26) — each one authored now adds literals to a corpus the plan says cannot be cheaply retrofitted. It is already biting: W10 shipped 41 violations and the ledger's own residue list (VOL1 L2511 \"the STRINGTABLE localization rung\") has carried it since 2026-07-24d without a rank",
"proposed_home": "A gate-35 `player_string_loc` tooth (fails on FText::FromString / TEXT() literal reaching any UMG SetText call, with must-fire/must-not-fire fixtures on the gates_config PASS-on-empty pattern) landed in the same commit as U11.1's UMG framework; the shipped-locale ring added to the next bundled Josh brief (window rank 18)"
},
{
"index": 4,
"entry_id": "GAP-145",
"merged_into": null,
"name": "Attunements is ratified accessibility canon with no enumerated option roster, no data home, and no tooth on its one non-negotiable requirement",
"vision_rules": "BATCH1_RULINGS.md §4 \"Difficulty & accessibility — RATIFIED (architecture + all held items)\" — Josh agreed all six smaller items including \"colorblind vril-polarity multi-channel readability as an L1 requirement\"; \"Accessibility = **Attunements** (always-available, judgment-free)\". COMBAT_ENCOUNTER_SYSTEM.md §247 and §415 both state \"Vril-polarity multi-channel readability is a **non-negotiable L1-playability requirement**\". PRE_5090_BUILD_PLAN.md §12 #26 names \"accessibility breadth (subtitle formatting, UI scaling, remap breadth)\" as a spec with \"None exist as specs today\"",
"what_exists": "The entire ratified layer is 11 lines of prose: docs/proposals/DIFFICULTY_SYSTEM.md L82-92 names five option FAMILIES (colorblind/multi-channel readability, timing windows, input remaps, camera and motion options) and enumerates ZERO individual options. DECISION_DOSSIER.md §4 apply-action (5) directed it, back on 2026-07-03, to \"land the multi-channel ... polarity-readability requirement as the first real spec item in T1_UI_UX_Spec [DRAFT v0.1] (currently an empty stub)\" — that file is still 35 bytes on disk today (ls -la of _source/01_Tier_1_Foundation). POSITIVE CONTROL on the tooth: the 34-gate roster in gates_config.json contains no accessibility/colorblind/shape gate (full roster read); VOL2 CF-7 states the shape channel is \"designed, unrendered\". POSITIVE CONTROL on the data home: no registry among 62 carries an accessibility/attunement/option column (header scan). Queued coverage is thin and partial: U11.11 lists three input options only (hold-vs-toggle, sensitivity, invert-Y); U11.5's \"accessibility tab\" has no enumerated contents",
"delta": "A RULED, non-negotiable L1-playability requirement has no countable option roster (a shipping AAA set is ~25-40 toggles: subtitle size/background/speaker labels, UI scale, motion and camera-shake reduction, photosensitivity, aim assist, per-axis timing assists, menu narration), no settings-persistence schema, no per-option data home, and no automated tooth — the compliance surface is a critic process (QA-12) with no denominator. Window rank 20 routes the DOCTRINE prose here (DESIGN_GAP_REGISTER L529, entry 112); the roster, the schema and the tooth are unowned",
"severity": "MAJOR",
"blocking": "U11.5 (options framework) and U11.1 (HUD framework) — both build the surfaces the options must reach, and every one of the ~13 unowned screens in gap 1 inherits the UI-scale and colorblind contract. Also blocks the Gate-1 Ch-2-13 P3-exit honestly, since the AI QA loop is the sole player and cannot verify an unenumerated requirement",
"proposed_home": "A `T0_Attunement_Option` registry (option_id, family, default, persistence key, verify tooth) minted with the rank-20 T1_UI_UX_Spec fill, plus a gate-36 `attunement_coverage` tooth asserting every ratified family has ≥1 option row and that the shape/audio polarity channel renders independent of color"
},
{
"index": 5,
"entry_id": "GAP-146",
"merged_into": null,
"name": "The UI chrome string corpus has no canon home, no count, and is outside the Natural Voice Doctrine's own pass",
"vision_rules": "NATURAL_VOICE_DOCTRINE.md header: \"Josh ruling, 2026-07-26 — binds every player-facing word\", and §1 explicitly claims the HUD: \"Requirements/tracking speak plainly ... The HUD's short lines stay short but stay HUMAN.\" §5 adds a new critic lens (\"does a person say this?\") to the reveal-table test",
"what_exists": "NATURAL_VOICE_DOCTRINE.md §5 scopes the rewrite pass to \"the player strings ×4 chapters + boss display names + clue player_texts\" — content sidecars only. The actual chrome strings live as C++ literals authored by engine agents: HumanityPlayerHUDWidget.cpp:404/417/432/612/623/644 and HumanityPauseMenuWidget.cpp:34/154. POSITIVE CONTROL on the data home: a header scan of all 62 registries finds no string/label/tooltip/journal column (the same scan does find `T0_Status_Table.icon_class`, so it reads headers); T0_Voice_Registry covers VO lines, not UI labels. The only governance is the runtime reveal scanner (HumanityUIAutomationTests.cpp \"Humanity.UI.RevealTable\"), which checks for banned INTERNAL tokens and says nothing about voice, culture, or authorship",
"delta": "A doctrine that binds \"every player-facing word\" has no home for the several hundred words the player reads most often (menu and tab labels, tooltips, button prompts, toasts, empty-states, failure and edge-case strings). They are minted in the engine lane, outside the canon authority hierarchy, outside the natural-voice critic surface, uncounted, and — per gap 3 — unlocalizable. This is the both-directions failure: the doctrine consumes a corpus that does not exist as data",
"severity": "MAJOR",
"blocking": "The natural-voice rewrite pass (named in memory as \"the next session's first canon-lane wave\") will pass over sidecars and leave the chrome untouched, and every new U11 widget deepens the debt. Bites at U11.5/U11.6/U11.20 — the menu and shell items, which are almost entirely chrome text",
"proposed_home": "A `T0_UI_String` registry (string_id, surface, loc key, natural-voice status, reveal class) as the single authored home, consumed by the StringTable emitter from gap 3's tooth, and added to the Natural Voice Doctrine §5 pass scope"
},
{
"index": 6,
"entry_id": "GAP-147",
"merged_into": null,
"name": "No input-glyph substitution system — shipped prompts hardcode keyboard keys and will lie the moment rebinding and gamepad land",
"vision_rules": "PRE_5090_BUILD_PLAN.md §12 #26 requires an \"input/control-scheme (gamepad + KBM, the 7-mode + six-option wheel)\" spec; VOL2 U11.8 requires \"Gamepad bindings + KBM parity\" and U11.9 \"Rebinding UI + persistence — PlayerMappableKeySettings + UEnhancedInputUserSettings\". ROADMAP_POST_5090_TO_SHIP.md L424 puts Steamworks \"controller/input via the built Enhanced Input config\" on the ship path",
"what_exists": "Player-facing prompts hardcode KBM key names: HumanityPlayerHUDWidget.cpp:612 \"Press 1, 2 or 3 to choose your path.\", :623 \"Press F to continue.\", HumanityDebugHUD.cpp:418 \"[F] skip\", :466 \"press 1 / 2 / 3\". Both HUD literals are in the reveal test's MustPass list (HumanityUIAutomationTests.cpp:82-83), so the test certifies them as correct player strings. POSITIVE CONTROL: no glyph/prompt-token item exists in the 32-item U11 roster (full id enumeration U11.1–U11.32; U11.8/U11.9/U11.12 are bindings, rebind UI and dev-key graduation, none of them prompt rendering), and no registry carries a glyph or key-token column (62-registry header scan)",
"delta": "U11.9 makes bindings user-remappable and U11.8 adds gamepad, but nothing owns the dynamic key/glyph token that prompt strings must resolve through — so every rebind or controller switch turns a shipped prompt into a false statement, and the one automated test blesses the false form. The per-platform glyph BOM (KBM + Xbox + PlayStation + Switch/Steam Deck × ~30 inputs) is also uncounted, compounding gap 2",
"severity": "MAJOR",
"blocking": "U11.8 and U11.9 themselves, which ride the EARLY input wave (master W3, per VOL2 cohere H8) — the wave lands before the late UI wave, so the defect ships into W3 and every prompt authored between now and then must be rewritten",
"proposed_home": "A prompt-token convention ({INPUT:Interact}) resolved by a glyph provider, specified in U11.31's T99_Translation_UI.md and enforced by extending the existing FHumanityHudReveal scanner to fail any player string containing a literal key name — the cheapest possible home, since the scanner already walks every UTextBlock"
},
{
"index": 7,
"entry_id": "GAP-148",
"merged_into": null,
"name": "Typography and glyph BOM for 87 diegetic writing systems plus shipped locales does not exist in any form",
"vision_rules": "T0_Language_Script_Registry [ACTIVE v0.1] is 87 rows and ALL 87 carry a populated `layer_1_mechanic` AND `inscription_application_class` (verified by row scan) — i.e. every script is a player-facing L1 read surface, not lore. T0_Inscription_Spine [ACTIVE v0.1] carries 98 rows with `script_ids_referenced` and `trade_9_tier_gate`, and COMBAT_PROGRAM_ADDENDUM §3 names the \"inscription UI seam\". PRE_5090_BUILD_PLAN.md §12 #26 requires \"non-Latin/RTL fonts\" as part of the missing loc spec",
"what_exists": "POSITIVE CONTROL: `grep -i \"font|typeface\"` across all 20 _source/01_Tier_1_Foundation/T1_*.md returns ZERO hits, while `grep -ci script` on T1_Languages_and_Script_Master returns 131 — the search matches and no T1 doc mentions fonts. Across docs/*.md the only game-side hits are VOL2 U11.24 (\"non-Latin & RTL font runtime\") and §12 #26; HANDOFF_TO_CONTINUO L218 is about the marketing site's SVG icons. No registry carries a font, typeface, glyph, or fallback column (62-registry header scan). The script registry's own `decipherment_status` distribution (57 FULLY_DECIPHERED, 9 PHONETIC_ONLY, 3 FULLY_UNDECIPHERED, 15 ORAL_NOT_SCRIPT, 1 FAIRY_REALM_NATIVE) is a natural BOM axis and is used for none",
"delta": "U11.24 queues the RTL/non-Latin font RUNTIME; nothing counts or sources the fonts. Missing: which of the 87 scripts need a real renderable typeface vs stylized art vs a constructed glyph set (the FAIRY_REALM_NATIVE and VRIL_TRACE rows have no real-world font at all), the licensing lane (fonts carry licences exactly like the Sonniss audio library that already needed a licence read), the fallback chain, and the minimum type size that keeps an 87-script decode puzzle legible",
"severity": "MAJOR",
"blocking": "Q3.7 / MG-3's inscription-decode handlers (the twisted-proverb un-inversion at CH_03 B07 and the Borobudur numerology at CH_05 B03 are both slice content in wave WR3/WR5) — a decode minigame cannot be built or QA'd against a script with no glyph source. Also blocks U11.24 from having anything to load",
"proposed_home": "A `typeface_class` + `glyph_source` + `licence_ref` column trio on T0_Language_Script_Registry (populated in the same pass as window rank 13's data work), with the shipped-UI font stack and fallback chain specified in the rank-20 T1_UI_UX_Spec"
},
{
"index": 8,
"entry_id": "GAP-149",
"merged_into": null,
"name": "Reveal-gate DATA exists for abilities only, while the plan's own law binds every screen — and the ratified convergence-map lock has nothing to enforce it with",
"vision_rules": "PRE_5090_BUILD_PLAN_VOL2.md §11 header states the law: \"The ability book, Grimoire, and any perception HUD MUST filter by tier/arc so no late-arc name, description, or tier-6 read surfaces for a Neophyte ... A screen that cannot hide is not shippable — the gating IS the feature.\" BATCH1_RULINGS.md §3 ratifies a specific hard lock: \"Convergence-map show-don't-tell lock: **CONFIRMED** — shows the 22 threads converging as PATTERN only; never names or counts down to the point before the Ch 76-77 reveal (§17.9 / §15 hard lock)\"",
"what_exists": "U11.15 mints the reveal-ladder field for ONE registry: \"Ability-book data contract — reveal-ladder field (tier/arc/first-surface) so U11.14 can filter\", scoped to T0_Ability_Tree_Registry's 185-row invariant. The Grimoire (U11.19) reads T0_Cross_Cultural_Link_Graph — 22 columns × 184 rows, whose only visibility-ish column is `integrity_visibility` — and T0_Thread_Grid, which has SIX columns total (thread_id, chapter_id, progression_stage, content_summary, authoritative_paragraph_anchor, extensions) across 666 rows, with no reveal, first-surface, or spoiler field (both headers read directly). POSITIVE CONTROL: the ability registry's own 36-column header likewise carries no reveal field yet, which is exactly why U11.15 exists — so the field genuinely does not exist anywhere today",
"delta": "The plan's own shippability law is satisfiable for the ability book and unsatisfiable for every other screen it names. The Grimoire/22-thread convergence surface carries a ratified §17.9/§15 HARD LOCK with zero per-row data to filter on; the codex (150 creature rows), journal, and map screens are in the same position. This is the reveal-discipline class that memory records as \"gate-invisible MAJORs\"",
"severity": "MAJOR",
"blocking": "U11.19 (Grimoire) and U11.21 (map) cannot be built shippably — by the section's own definition — and U11.18's journal inherits it. Bites as soon as the W10 book-screen wave starts; also a hard-line surface, so it cannot be deferred to polish",
"proposed_home": "Widen U11.15's reveal-ladder field from a one-registry contract into a shared `reveal_class` + `first_surface_chapter` column pair minted on Cross_Cultural_Link_Graph, Thread_Grid, Creature_Roster and the journal home, with the existing gate-13 `reveal_discipline` tooth extended to assert every screen-read registry carries it"
},
{
"index": 9,
"entry_id": null,
"merged_into": "GAP-135",
"name": "The journal — a ruled story object and the ratified defeat payout surface — has no data home for its entry corpus",
"vision_rules": "The journal is load-bearing ruled canon on three axes: BATCH1_RULINGS.md §4 ratifies \"defeat writes a path-variable journal observation\" as canon; DECISION_DOSSIER.md §4 routes hint delivery through \"the journal voice (Pillar 6), so reaching for help deepens Layer 2 contact\"; the spine makes it a story object (CH_03 healer's-child seed → Ch-13 passing at the departure per the slice's ruled closing beat → Ch-48 \"the healer's-child journal's public-release deliberation\", START_HERE L159)",
"what_exists": "POSITIVE CONTROL: a header scan of all 62 registry CSVs for a journal column returns ZERO, while the same term returns 3 hits inside docs/spine/CH_03.md — the concept is live in the corpus and absent from the data layer. U11.18 ships only the container: \"Journal slice stub (empty-state by design) ... an empty journal shell that the Ch-3 healer's-child seed is the first to write.\" DESIGN_GAP_REGISTER entry 112 covers the DEFEAT read surface specifically (\"The only surface the death payout has ever had is the debug HUD\") and routes it to the rank-20 doc — it does not create an entry corpus",
"delta": "The shell is queued and correctly empty; the CONTENT model is absent — no entry rows, no per-chapter authoring obligation, no integrity-path variant axis (the ratified defeat observation is explicitly \"path-variable\"), no count. Nothing tells the factory that Ch NN owes N journal entries, so the shell stays empty past Ch 13 by default rather than by design",
"severity": "MAJOR",
"blocking": "The Ch-13 slice-closing beat (the amulet and journal passing to the healer's child at the departure) is Gate-2 content with no data to render, and window rank 2.5's factory contract cannot emit a journal rider against a non-existent data_home (gate 30 R2 would resolve it only as NONE_YET)",
"proposed_home": "A `T0_Journal_Entry` registry (entry_id, chapter_id, trigger class, integrity_path variant, reveal_class, natural-voice status) minted alongside gap 5's T0_UI_String home, with a per-chapter journal rider added to docs/FACTORY_CONTRACT.md so entries accrue chapter-by-chapter instead of awaiting a sweep"
},
{
"index": 10,
"entry_id": "GAP-150",
"merged_into": null,
"name": "No UI visual design system — the HUD-art class is one undifferentiated bucket with no tokens and no variation model",
"vision_rules": "Josh's presentation nod binds the look: COMBAT_PROGRAM_ADDENDUM §5/§10 records \"every spell and ability and movement needs to be beautiful and fluid art\" as standing doctrine, and the fourteenth sitting RULED OPTION (A) FULL PER-TIER VARIANTS, overruling the band-collapse recommendation — the every-surface-beautiful requirement stands at FULL strength (OPEN_BRIEFS_2026-07-28.md item 1). ROADMAP_POST_5090_TO_SHIP.md P2.6 requires the HUD to read \"at the AAA reference bar\". The realm directive requires realms to be \"the GRANDEST displays\"",
"what_exists": "ASSET_DROPIN_CONTRACT.md L81 collapses all UI art into a single row (\"HUD art skin\") with `generation_status` N/A and one verification tooth: \"legibility audit (QA-12); before/after captures\" — and AI_QA_LOOP_ARCHITECTURE.md §335 defines QA-12 as a per-milestone critic PROCESS, not a spec or a denominator. POSITIVE CONTROL on the doctrine home: window rank 19's presentation doctrine is explicitly scoped \"(camera/cut/transition covers)\" (PRE_5090_BUILD_PLAN.md L100) — it is not UI; and DOC_MAP.md has no row for T1_UI_UX_Spec at all (grep for UI_UX returns only the VOL2 and Continuo-handoff rows), so the lane's owning doc is not even indexed under the anti-orphan doctrine",
"delta": "DR-2 sized per-tier VFX variants to 248 live / 372 clamp because the every-surface-beautiful ruling demanded a countable variant space; the UI got the same ruling and no arithmetic at all. Missing: design tokens (type scale, colorblind-safe palette tokens, spacing, frame motif), the diegetic register per region and per realm, and a variation model answering whether ~13-26 screens look identical across 12 earthly regions and 5 realms — the exact failure class Josh named in the concept-art audit",
"severity": "MAJOR",
"blocking": "Rank 20's T1_UI_UX_Spec fill (it will document the shipped HUD rather than specify a system) and every screen in gap 1 — each built without tokens is a re-skin later. Also blocks the 5090 icon/art pass from having a style constraint block to prompt against",
"proposed_home": "A design-token section inside the rank-20 T1_UI_UX_Spec (palette with colorblind-safe token pairs, type scale, motif grammar) plus a per-region/per-realm variation declaration folded into the ASSET_DROPIN_CONTRACT's new 2D/UI class row from gap 2"
},
{
"index": 11,
"entry_id": "GAP-151",
"merged_into": null,
"name": "No controller-only navigability contract and no handheld/deck legibility target, despite an Early-Access Steam ship",
"vision_rules": "The ship posture is ruled: Early Access on Steam with the full 14-node slice as the EA base (PRE_5090_BUILD_PLAN.md SLICE RESCOPE, \"THE EA BOUNDARY\"), and ROADMAP_POST_5090_TO_SHIP.md L424 puts Steamworks \"controller/input via the built Enhanced Input config\" on the ship path. ENGINE_OPTIMIZATION_DOCTRINE.md RULE SG-3 anticipates the class: \"Config/<Platform>/ and -CustomConfig=<Directory> absorb console/handheld classes\"; the doctrine's spec ladder is defined at 1080p (L127-152)",
"what_exists": "POSITIVE CONTROL: `grep -i \"ally x|rog ally|steam deck|handheld|720p\"` across docs/*.md returns 12 hits and every game-side one is operational, not a target platform — the Ally X appears only as a UPS-notification target (5090_SETUP_RUNBOOK L443), a remote-access client (L460, L497), and the walkthrough narration device (5090_WALKTHROUGH_SCRIPT L9); the same grep returns \"console/handheld classes\" once, in a config-mechanism rule with no UI content. The engine doctrine's three spec classes are GPU-and-resolution rows with no UI-scale, safe-area, or minimum-type-size column. U11.8 covers gamepad BINDINGS and U11.11 three input options; no item requires that every screen be fully operable without a mouse",
"delta": "A ruled Steam EA ship has no controller-only navigability contract (focus order, back/confirm grammar, no mouse-only affordances) and no handheld legibility target (safe area, minimum type size at 7 inches, Deck-verified layout) — both of which are cheap as constraints declared before ~13-26 screens exist and expensive as a retrofit across all of them. Josh's own handheld is in the room and is documented only as a notification device",
"severity": "MAJOR",
"blocking": "U11.5, U11.6 and U11.20 — the options, front-end and screens-shell items that set the navigation grammar every later screen inherits. The retrofit cost scales with the gap-1 screen count, so the constraint has to precede the roster, not follow it",
"proposed_home": "A target-class table in the rank-20 T1_UI_UX_Spec (desktop 1080p / handheld 7-inch / controller-only) with a per-screen navigability rider in the gap-1 screen roster, and a QA-loop assertion that every screen completes its primary task under InjectInputForAction with gamepad-only input"
},
{
"index": 12,
"entry_id": "GAP-152",
"merged_into": null,
"name": "No save-slot or New Game+ presentation model behind a ruled prestige mode",
"vision_rules": "The prestige loop is ruled canon: BATCH1_RULINGS.md §4 names The Forgotten One as a \"Prestige/NG+ easter egg (SEPARATE, post-Drought unlock, Abyss-crossing rite) ... sole path to 100% / rarest loot / deepest substrate-truth lore\" with canon-native progression via the un-pruned seventh vril-seat. PRE_5090_BUILD_PLAN.md §12 #28 asks what carries across it: \"mastery, familiars, inventory, world-state, the un-pruned seventh vril-seat\". ROADMAP_POST_5090_TO_SHIP.md L423 puts Steam \"cloud saves over the existing WorldState SaveGame stack\" on the ship path",
"what_exists": "P2.7 is tagged \"DONE + EXTEND\" and is entirely serialization scope — \"extend the serialized set to inventory + progression + quest + reputation + integrity; native tags for WS_019/020/021/024; checkpoint actor SaveAsync\" — with no slot model and no UI. The only queued save surface is one clause inside U11.6: \"Continue (latest save)\". POSITIVE CONTROL: the 32-item U11 roster contains no save/load, slot, autosave-indicator, or NG+ item (full id enumeration), and §12 #28 remains an unruled decision that window rank 18's bundled brief does not name (rank 18 lists the 4 open DECISIONS items, composure routing, compang bbox, 5 trade pins, CVD §13.4 wording, the voice-row housekeeping and 3 unbriefed JOSH-calls)",
"delta": "A single-slot Continue is the whole model. Missing: the slot/profile model, autosave policy and its player-visible indicator, manual-save affordance, the cloud-save conflict surface Steam requires, and the NG+ entry/carry-over presentation — plus the §12 #28 ruling those depend on, which is not on any brief queue",
"severity": "MINOR",
"blocking": "U11.6 (front-end/boot flow) — it either invents a slot model or ships a single-slot Continue that later has to be replaced; and Steamworks cloud-save integration at the ship phase, which needs a conflict-resolution surface that does not exist",
"proposed_home": "A save/slot section in the rank-20 T1_UI_UX_Spec covering slot model, autosave indicator and cloud-conflict UI, with the §12 #28 NG+ carry-over question added to the next bundled Josh brief (window rank 18) so the NG+ entry surface has a ruling to build against"
}
],
"qa-feel-loop": [
{
"index": 1,
"entry_id": null,
"merged_into": "GAP-137",
"name": "The accreted regression suite has no clock — the only scheduled QA cadence explicitly skips it",
"vision_rules": "AI_QA_LOOP_ARCHITECTURE.md §4.1: \"Per-increment (I). On every commit: the Tier-1 functional pack plus the full accreted regression suite run headless.\" §5.3 + VOL2 §11.5 QT-21 (marked LIVE): \"is this bug back\" must be \"the regression test going red again, never an argument.\" QT-22 (VOL2 §11.5): non-zero exit on any Tier-1 failure blocks the wave. ROADMAP_POST_5090_TO_SHIP.md P3 exit (L355): \"the full accreted regression suite is green.\"",
"what_exists": "67 automation tests exist (grep IMPLEMENT_*_AUTOMATION_TEST over game Source/Humanity/Private/QA/*.cpp = 67; 79 distinct Humanity.* test ids). The ONLY scheduled cadence is the HumanityNightlySoak task driving Tools/nightly_soak.cmd → run_soak.py, and run_soak.py:130 builds `cmd = [sys.executable, RUN_QA, \"--map\", map_key, \"--skip-tests\"]` for all seven belt maps — the suite is disabled on every nightly run. Game-repo .git/hooks/pre-push and post-commit are Git-LFS stubs only; no .github/workflows directory exists. POSITIVE CONTROL on the zero: `--skip-tests` is a real flag (run_qa_pass.py:890) and the same runner does execute tests when it is absent (Tools/run_tests_chunk.py, 412 lines, BUG-0022's fixed filter-coverage assertion) — so a run WITHOUT the flag would have matched, and none is scheduled.",
"delta": "Between the 67 tests and any automatic clock there is nothing: no per-commit hook, no CI, and the one nightly job opts out by flag. Every never-relitigate claim, every \"suite green\" claim, and P3's exit criterion depend on a human or agent remembering to invoke the runner. A fix that re-breaks BUG-0012 or BUG-0021 can sit undetected for an arbitrary number of waves and no artifact would show it.",
"severity": "CRITICAL",
"blocking": "Every content wave from now, starting with the Ch 6-13 region legs and the P2 surface passes — each lands into a slice whose regression signal is manual. It also silently invalidates the P3 zero-bug exit, which arrives right after the 2026-07-30 handshake.",
"proposed_home": "Drop `--skip-tests` from Tools/nightly_soak.cmd's belt (or add a second nightly leg that runs the full filter), plus a pre-push hook or a scheduled `run_tests_chunk.py --all` writing a dated verdict under QA/regression/, and a canon-side gate reading the newest verdict's age (stale-verdict = red)."
},
{
"index": 2,
"entry_id": null,
"merged_into": "GAP-137",
"name": "No frame-time signal anywhere in the QA loop, and the ship bar carries no performance clause",
"vision_rules": "ENGINE_OPTIMIZATION_DOCTRINE.md §1.1 rules the frame-rate canon (minimum 30 fps/33.33 ms · recommended 60 fps/16.67 ms · high-end 120/8.33 ms) and §1.5 rules that two clauses \"must be written verbatim into the ship spec\": \"60 fps at 1080p internal … with frame generation off\" and \"60 fps HELD, not 60 fps average.\" DOC_MAP.md:106 also names \"the dev-on-5090-must-not-hide-recommended-spec-misses scalability rule.\"",
"what_exists": "The producer exists but is hardware-gated: UHumanityBenchSamplerSubsystem (Source/Humanity/Public/QA/HumanityBenchSamplerSubsystem.h:31-41) emits FrameMs/GameMs/RenderMs/GpuMs/DrawCalls/StreamingPoolMb per frame, and its only consumer is Tools/bench/kt3_wp_pcg_runtime.py (a 5090 benchmark-day kill test). The nightly soak samples nothing but process RSS (run_soak.py:10 \"the editor process PEAK memory (psutil…)\"). In ROADMAP_POST_5090_TO_SHIP.md — the doc that owns P0→P5, the zero-bug bar (L352-359) and the P4 Steam exit (L451) — occurrence counts are: \"fps\" 0 · \"frame time\" 0 · \"frame-time\" 0 · \"p99\" 0 · \"profil\" 0, against \"zero-bug\" 10. POSITIVE CONTROL: \"perf budget\" matches once (L82, the runtime-inference budget), so the file is greppable for perf language. No optimization/perf/profiling PASS row exists in any docs/*.md (grep \"optimi[sz]ation pass|perf pass|performance pass|profiling pass\" = 0), and ROADMAP_POST_5090_TO_SHIP.md never cites the doctrine (the citing docs are ASSET_DROPIN_CONTRACT, DESIGN_GAP_REGISTER, DOC_MAP, MARKETING_WEB_PROGRAM, PRE_5090_BUILD_PLAN).",
"delta": "The ruled frame-rate canon has no consumer on the ship path and no measurement cadence on the built slice. A content wave can double the frame cost of Ch 2-5 and every gate, scorecard and soak report stays green; the slice can reach the \"honest zero-bug bar\" and pass GATE 1 and GATE 2 having never been measured for frame time once. The 182 KB doctrine is the exact failure class: doctrine present, producing pipeline and gate absent.",
"severity": "CRITICAL",
"blocking": "Benchmark day itself (box arrives 2026-07-30 per 5090_ASBUILT_BENCHMARKS.md) — U-07's \"build one complete region, profile\" has no per-map baseline to compare against; and every P2 surface pass, which is where Nanite/Lumen/MegaLights cost actually enters.",
"proposed_home": "Enroll the BenchSampler in run_soak.py's per-map loop behind a `--perf` leg writing Saved/QA/Soak/perf_<map>.json + a committed per-map p99 baseline (drop-not-fail on an unstable clock, shapes-only per the tuning firewall); add a performance clause to the P3 exit and P4 store-spec rows in ROADMAP_POST_5090_TO_SHIP.md."
},
{
"index": 3,
"entry_id": null,
"merged_into": "GAP-137",
"name": "Nothing about FEEL is measured — zero of the six ruled feel-telemetry funnels exist",
"vision_rules": "QA_WATCHING_PROGRAM.md §1.5 rules six instrumentation funnels at sites \"already called\": RecordAttackPhase (four attack-phase transitions), RecordPlayerAnswer (parry/dodge/neutralize + pip mutation), RecordInputLatency (EnhancedInput trigger → first active frame), RecordHitStop (PlayHitStop + release), RecordStagger (EnterRecovery/part-break), RecordCameraSample (10 Hz). §3.2 makes the `greybox-feel` register conditional on a real measurement and names register inflation \"a logged defect class.\" §2.1 rules that gating verdicts are `sampled_invariant` arithmetic, never critic prose.",
"what_exists": "grep over the game Source/ for RecordAttackPhase|RecordPlayerAnswer|RecordInputLatency|RecordHitStop|RecordStagger|RecordCameraSample = ZERO hits. POSITIVE CONTROL both ways: the same search idiom finds PlayHitStop at four sites in Source/Humanity/Private/Combat/HumanityCombatFeelSubsystem.cpp (:109 definition, :217/:233/:248 callers — the funnels' intended anchors are live code), and the existing telemetry header declares five Record* functions (CombatTelemetrySubsystem.h:41/48/55/63/72 — RecordNodeBreak, RecordTellRead, RecordDialSample, RecordQuestEvent, RecordAudioCue). So both halves of the search can match; the six feel funnels genuinely do not exist.",
"delta": "Input latency, hitstop bracketing around the strike frame, stagger, and camera behaviour are unmeasured quantities. The feel critic that is supposed to replace Josh until the gate has no arithmetic at all — it has still frames and prose. Every \"it reads\", \"it lands\", \"the parry feels right\" claim in this lane is by construction a vibe or a pose, which is precisely the BUG-0010 failure (\"declared fixed from a frozen pose\") the program was written to close.",
"severity": "CRITICAL",
"blocking": "The parry primitive and chain-meter pip system already landed (game e1994ea) with difficulty-scaled timing bands and no latency/hitstop instrument; the P2.4 combat surface pass and RB-7's boss-feel rubric both exit against measures that have no producer.",
"proposed_home": "Extend UHumanityCombatTelemetrySubsystem with the six funnels (state-only, wall-clock, at the named existing call sites), landing QS-13..QS-18 as the first build slice after QS-0's schema; each new field enters as a diagnostic per §1.5's graduation rule."
},
{
"index": 4,
"entry_id": "GAP-153",
"merged_into": null,
"name": "The project's one locked performance gate measures against a spec-class ladder that is not the ruled canon",
"vision_rules": "ENGINE_OPTIMIZATION_DOCTRINE.md §1.1 rules THREE classes with named ms budgets (30 fps/33.33 ms · 60 fps/16.67 ms · 120/8.33 ms) and §1.2 anchors each to hardware (minimum RTX 2060 SUPER/RX 6600; recommended RTX 5060/4060 Ti/RX 7600 XT at 1080p High, 7.0 GB VRAM ceiling, 6c/12t). DOC_MAP.md:106 names \"KT-3's bars\" as the doctrine's first consumer.",
"what_exists": "Tools/bench/bench_criteria.json kill_tests.kt3_wp_pcg_runtime declares FOUR classes — steam_deck_minimum (target_fps 30, p99_frame_ms_max 50.0), mid_range_pc (60, 33.3), high_end_pc (60, 25.0), ultra (60, 25.0) — with provenance `canon_illustrative` and a `_note` reading: \"target_fps is harness-declared: canon names 'target frame rate' as a per-region field but rules no value -- logged in TODO_CANON.md.\" The criteria body is sha256-LOCKED at v1.2.0 (2026-07-28T04:22Z), i.e. locked AFTER the 2026-07-27 ruling. Game-repo TODO_CANON.md:1301 still carries the row \"no frame-rate NUMBER is ruled anywhere. The whole KT-3 frame budget derives from it.\"",
"delta": "Four harness classes versus three ruled classes, with no declared mapping — so a KT-3 PASS cannot be read as \"meets the ruled canon.\" Worse arithmetic: mid_range_pc carries target_fps 60 with a p99 ceiling of 33.3 ms, which IS the 30-fps frame time — exactly double the ruled 16.67 ms recommended budget, and exactly the \"60 average with hitches\" that §1.5 forbids. The doctrine's two verbatim ship clauses and its 15-row per-pass ms table (§2.2, each row with a `stat gpu` handle) appear in no gate at all; U-13 defers pinning the 5.8 pass names to \"benchmark day\" although capturing one frame needs no new hardware (the belt already drives seven maps nightly).",
"severity": "MAJOR",
"blocking": "Benchmark day (2026-07-30 onward) — KT-3 is scheduled first-week and will emit verdicts against the non-canon ladder, and once a bar is locked and cited it acquires authority (the doctrine's own §8.3 self-check names this failure mode).",
"proposed_home": "Re-lock bench_criteria.json kt3.spec_classes onto the §1.1/§1.2 three-class ladder with per-class ms budgets and a `canon_ruled` provenance + cites; retire the stale TODO_CANON.md:1301 row; file the §2.2 pass-name pinning as an ungated dev-box item, not a benchmark-day one."
},
{
"index": 5,
"entry_id": null,
"merged_into": "GAP-137",
"name": "The visual-verification instrument has expected content for 9 of the 50 shots it captures nightly",
"vision_rules": "The standing visual-verification directive (CLAUDE.md model-seats block; MEMORY.md visual-verification-standing-directive): game-side work is verified by LOOKING, critics READ the PNGs, and no play-term claim ships without a backing frame. AI_QA_LOOP_ARCHITECTURE.md QA-1/QA-6 make this mechanical via \"the per-shot expectation manifest\"; QA_WATCHING_PROGRAM.md §2.4 adds the director re-read gate over the deciding frames.",
"what_exists": "Seven capture scripts declare 50 shot entries (Tools/qa/capture_script_*.json — angkor 5, bali 6, borobudur 3, flores 18, greybox 10, palembang 3, samosir 5) and the nightly belt drives all seven maps. harness/qa/capture_expectations.json declares 9 shot expectations, ALL greybox_* (greybox_spawn, hud_wellspring, hud_forgotten, boss_closeup, direct_broken, phase_p2, feel_swing, lockon, break_moment) plus 2 cross_checks. Intersection computed: 9 of 50 declared shot ids have an expectation; 41 do not (angkor_opening, bali_besakih_site, borobudur_site, flores_boss_at_site, flores_caci_ch03, samosir_naga_mutation, …). harness/read_captures.py:120-122 is honest about it — it WARNs \"frame captured but nothing to judge it against\" — but WARN never fails: structural FAIL fires only on a missing or zero-byte PNG (:115-117, :159). DOC_MAP.md:376 still scopes the file to \"the C1.18 greybox capture set (6 shot_ids)\".",
"delta": "The instrument was built for the greybox arena and never grew with the six real region maps that ARE the slice (CH_02-05 across flores/bali/samosir/palembang/borobudur/angkor). 82% of the nightly capture surface is pixels with no content contract, warning quietly forever while the wave goes green — the visual directive is instrumented for 18% of what it photographs.",
"severity": "MAJOR",
"blocking": "The Ch 6-13 region legs (eight more region pages already on disk) multiply the uncovered surface immediately; every P2 surface-pass exit that cites a captured frame as evidence.",
"proposed_home": "Grow harness/qa/capture_expectations.json to one entry per declared shot id across all seven scripts (surface/expect/must_show/must_not_show), and promote read_captures.py's no-expectation WARN to a FAIL once a declared coverage floor is met, with the floor itself a scorecard number."
},
{
"index": 6,
"entry_id": null,
"merged_into": "GAP-137",
"name": "QS-0 — the one frame-record schema ruled to land before any C++ — does not exist, so all nine sequence teeth have no data contract",
"vision_rules": "QA_WATCHING_PROGRAM.md §1.1: \"`harness/qa/frame_record_schema.json` is the single definition both lanes consume\" — one root, one vocabulary, append-only JSONL, 4 KB per record; §6 build order item 1: \"QS-0 plus the `Json` module link — one schema, one parser, before any C++ in either lane\"; §10 lists it as a wiring obligation with a DOC_MAP row and a run_gates.py tooth. §2.2 defines nine permanent teeth (T-SEQ-PRESENCE/RENDERED/UPRIGHT/PHASE-ORDER/CLOCK/SOURCE-AGREE/HITSTOP-RELEASE/CAM-CONTINUITY/PIP-WIPE) that all read that record.",
"what_exists": "harness/qa/ contains exactly three entries: bug_record_schema.json (4,206 B), capture_expectations.json (14,854 B), fixtures/ (session_complete, session_missing_png, session_zero_byte). frame_record_schema.json: absent. POSITIVE CONTROL: grep \"frame_record_schema\" over the canon repo matches docs/proposals/QA_WATCHING_PROGRAM.md, docs/PRE_5090_BUILD_PLAN.md and docs/DOC_MAP.md — the string is greppable, so the file's absence is real. Related zeros: no `Json` link in the game module's declared dependencies for a JSON reader, and the whole motion class is guarded by one bespoke test (Humanity.Combat.BossUprightDuringAutonomousCycle) rather than a schema-backed tooth. The QS/T2/RB ids appear in NO ranked plan row: grep \"QS-0|QS-10|QS-20|T2-1|RB-1\" over docs/PRE_5090_BUILD_PLAN.md = 0 matches, and the 30-item window queue (§▶, L60-111) contains no sequence-capture rank.",
"delta": "The program's own first build item — declared a precondition for every other line of work in both its lanes — has no artifact, no rank, no owner and no date. Consequently there is no per-frame state record, no contact sheet, no min_body_up arithmetic, no three-source cadence cross-check, and the reference program's temporal leg (RB-3) consumes a schema that does not exist. The BUG-0012 class (a boss standing on its head through a whole autonomous cycle while every still-frame tooth stayed green) is closed by luck-of-one-test, not by construction.",
"severity": "MAJOR",
"blocking": "Any motion, animation, camera or timing claim made during the Ch 6-13 build and the P2 presentation-ladder passes — i.e. the animation/VFX work that is the hard 5090 requirement.",
"proposed_home": "Mint harness/qa/frame_record_schema.json with a DOC_MAP row and a run_gates.py tooth, and give the QS/T2/RB tables a ranked home in PRE_5090_BUILD_PLAN.md §11.5 (the §10 obligation that never landed)."
},
{
"index": 7,
"entry_id": "GAP-154",
"merged_into": null,
"name": "No agent can PLAY the build — zero input-injection call sites, and no charter or action data home",
"vision_rules": "CLAUDE.md model-seats: \"The AI QA loop + image/feel critics are the ONLY players until then.\" AI_QA_LOOP_ARCHITECTURE.md §2.1 Tier 2 and QA-4 rule the beta player as screenshot → decide → InjectInputForAction (packaged-valid). QA_WATCHING_PROGRAM.md §3.1 rules a deny-by-default vocabulary in a checked-in sidecar `Tools/qa/action_annotations.json` (an unannotated action makes the run RED), §3.2 rules the injection-ACK floor and the register field, §2.6 rules the charter schema.",
"what_exists": "grep InjectInputForAction|InjectInputVectorForAction over the game Source/, Tools/ and Plugins/NeoStackAI = ONE hit and it is a comment (Source/Humanity/Private/Input/HumanityInputConfig.cpp:108). POSITIVE CONTROL: the control query AddMappingContext hits Source/Humanity/Private/Core/HumanityCharacter.cpp:396 — the search reaches live input code, so the zero is real. Tools/run_qa_pass.py exposes no agent or sequence mode (its flags are --self-test, --skip-capture, --skip-tests, --timeout, --lock-wait, --map). Tools/qa/ holds index_bugs.py, check_site_map_binding.py, repro_bug_0022.py, seven capture_script_*.json and fixtures/ — no action_annotations.json, no charter files.",
"delta": "The only player until the Josh gate is a state-teleporting driver that poses the game for photographs. The mapping context, ability gate, input buffer, lock-on cycle, fork UI focus and traversal are untested by construction, and there is no coverage denominator of any kind — actions never injected, beats never advanced, sites never reached are all uncountable, so \"the machine played the build tonight\" and \"the machine photographed the build tonight\" produce identical artifacts.",
"severity": "MAJOR",
"blocking": "The Ch 6-13 traversal and between-site route work (window-plan rank 21) and the P2.11 character-creation entry architecture — both are input-path surfaces a pose-driver cannot reach; and GATE 1 at the Ch 2-13 P3 exit, whose whole premise is that the machine already played what Josh is about to.",
"proposed_home": "T2-1/T2-2/T2-3/T2-10 as a ranked qa-teeth item: the injection seam plus the checked-in Tools/qa/action_annotations.json sidecar and a charter file per slice chapter, proven by the briefed CH_02 spawn-to-first-site-marker walk with allow_dev_shortcuts:false."
},
{
"index": 8,
"entry_id": null,
"merged_into": "GAP-137",
"name": "The bug schema cannot hold the anti-still-frame rule that was ruled onto it",
"vision_rules": "QA_WATCHING_PROGRAM.md §2.3 rules three deliverables in terms (\"Ruled: add the field\"): `motion_class` as a closed enum (none|motion|animation|orientation|timing|camera) in harness/qa/bug_record_schema.json with all 17 records backfilled; `regression_test_ref` becomes a typed object {kind: automation_test|sequence_artifact|expectation|harness_selftest, ref}; and a must-fire fixture Tools/qa/fixtures/motion_class_still_ref. §10 repeats all three as wiring obligations. The rule they enforce: a motion/animation/orientation/timing/camera bug may not carry a single still frame as its regression reference.",
"what_exists": "harness/qa/bug_record_schema.json read in full (100 lines, mtime 2026-07-26 23:52 — before the 2026-07-27 program): no `motion_class` property; `regression_test_ref` is a plain string (:70-74); `additionalProperties: false` at :7, so a record that DID carry motion_class would fail validation in Tools/qa/index_bugs.py. Tools/qa/fixtures/ holds valid, fixed_without_regression, bad_enum, duplicate_id, filename_id_mismatch, malformed_json — no motion_class fixture. The live ledger is now 23 records (QA/bugs/BUG-0001..0023), so the backfill target grew past the ruled 17 and still has not run. POSITIVE CONTROL: grep \"motion_class\" over the canon repo matches PRE_5090_BUILD_PLAN.md, DOC_MAP.md and QA_WATCHING_PROGRAM.md — greppable, and absent from the schema.",
"delta": "A ruled ledger law is structurally unimplementable: the field it keys on does not exist, the schema actively rejects it, and the check has no fixture. BUG-0010's ruled migration (motion_class: orientation, ref retyped to the BUG-0012 automation test) never happened, so the record that started this whole program still closes on the evidence class the program forbids.",
"severity": "MAJOR",
"blocking": "Every motion or timing bug opened by the presentation-ladder and animation waves — the first one lands with no way to be typed, and the ledger's severity/status arithmetic feeds the P3 zero-bug bar.",
"proposed_home": "Add motion_class + the typed regression_test_ref object to harness/qa/bug_record_schema.json, ship Tools/qa/fixtures/motion_class_still_ref with the check, and backfill all 23 records in the same commit."
},
{
"index": 9,
"entry_id": null,
"merged_into": "GAP-137",
"name": "Not one QA tooth is enrolled in either gate suite — the green-before-land claim describes nothing",
"vision_rules": "AI_QA_LOOP_ARCHITECTURE.md §4.2: \"Gates are non-zero-exit floors. A Tier-1 functional failure, a DataValidation error, a crash, an unreachable beat, or a missing expected frame blocks the wave.\" VOL2 §11.5 QT-22: \"The QT harnesses ride `run_gates.py` (canon-side, unpiped, green-before-land)… non-zero exit on any Tier-1 or DataValidation failure blocks the wave.\" QA_WATCHING_PROGRAM.md §10 requires a run_gates.py tooth for the frame-record schema and the register↔board join.",
"what_exists": "harness/gates_config.json holds 34 gates and every one is a canon-data gate: stress, fidelity, scan, topography, layer_register, lint, anchors, graph, no_dead_end, boss_axes, spine_graph, lifecycle, reveal_discipline, registry_extensions, index_freshness, store_integrity, region_pages, ws_value_form, slice_coherence, seed_housing, build_readiness, entity_taxonomy, care_scope, grand_sage_silence, weave_lifecycle, build_space, rarity_firewall, counter_class_coverage, ally_build, factory_contract, realm_ruleset, arc_continuity, promise_ledger, emotional_curve. Substring probe over the whole file for capture / qa / read_captures / bug / perf / frame / soak / image_critic = False on all eight. POSITIVE CONTROL: the 34 names above are printed from that same file, so it is readable and matchable. read_captures.py and Tools/qa/index_bugs.py are director-invoked scripts; nothing runs them as a floor.",
"delta": "The QA loop's floors are advisory. A broken bug ledger, a missing expected frame, a red capture session, or a stale regression verdict cannot block a canon landing or a game commit, in either repo. QT-22 is written in the present tense about machinery that does not exist, which is the register-inflation defect class the program itself names.",
"severity": "MAJOR",
"blocking": "Every landing from now in both repos — and specifically the first landing where a capture session goes red while the canon suite goes green, which the nightly belt makes a matter of time.",
"proposed_home": "Enroll two canon-side teeth in harness/gates_config.json: `qa_captures` (read_captures.py over the newest session resolved via last_run.json) and `qa_ledger` (bug-record schema validity + fixed⇒regression_test_ref + verdict staleness), each with must-fire/must-not-fire fixtures per the self-testing-gate law."
},
{
"index": 10,
"entry_id": "GAP-155",
"merged_into": null,
"name": "The factory contract's per-chapter TEST-COVERAGE row class has an orphaned data home and no producer",
"vision_rules": "docs/factory_contract.json rider FR-042 (lane qa-teeth, scope all): \"Score this chapter on all five scorecard row classes — content budget, structure completeness, test coverage, care and reveal, and rider completeness,\" tooth gate:factory_contract, consumption_point p5:scorecard. VOL2 §11.5 QT-18: \"Per node, what fraction of that content is under an actual QT harness: beats with a reachability test (QT-7), bosses with an invariant test (QT-5), forks with a completability test (QT-7), minigames with a runtime test, care/reveal surfaces with a validator (QT-9), audio cues fired (QT-10).\" QT-5 sizes itself as \"one test per boss row × preset\" over DT_BossEncounter/DT_BossPhase (343 rows).",
"what_exists": "FR-042's own fields read status PARTIAL and `data_home: \"NONE_YET(rank 1)\"`. Window-plan rank 1 is \"[qa-teeth·L] Author the X9.5 kill-test/benchmark harness set\" (PRE_5090_BUILD_PLAN.md L60) and it LANDED (game 7d3de25) — producing Tools/bench/KT-0..KT-5 and bench_criteria.json, not a per-chapter QA scorecard. No coverage scorecard exists: ls harness/*coverage* and Tools/*coverage* return only check_counter_class_coverage.py + its scorecard (POSITIVE CONTROL — the glob matches when a coverage artifact exists). The 79 live test ids are overwhelmingly bespoke-per-chapter (CH02_*, CH03_*, CH05_*) rather than row-generalized, against denominators of 343 boss rows, 891 DT_Beat rows, 90 DT_Fork, 305 DT_ForkOption, 42 ws.* vars and 163 personas cited in VOL2 §11.5.8.",
"delta": "The factory's own definition of a finished chapter includes a test-coverage score whose data home points at a completed rank that never owned it, and whose producing script does not exist. So \"is Ch NN tested?\" is unanswerable as arithmetic — the 79 tests have no denominator, and 67 bespoke tests over a 343-boss / 891-beat corpus reads as coverage it is not.",
"severity": "MAJOR",
"blocking": "Rank 2.5's factory contract is the gate every later rank emits riders into; the first chapter to be scored at P5 (and the Ch 6-13 legs already queued) hits FR-042 with no producer, so the rider passes vacuously.",
"proposed_home": "Re-point FR-042.data_home at a new harness/check_test_coverage.py + build/qa/test_coverage_scorecard.json that joins the automation-test id list against the DT row inventories (QT-18), and enroll it as the gate the rider names."
},
{
"index": 11,
"entry_id": "GAP-156",
"merged_into": null,
"name": "The 60 fps promise has no machine it can be verified on, and no plan row acquires one",
"vision_rules": "ENGINE_OPTIMIZATION_DOCTRINE.md §1.2 anchors the ruled 60 fps to \"RTX 5060 / RTX 4060 Ti / RX 7600 XT class … 1080p output, High preset, upscaler Quality, NO frame generation, 7.0 GB VRAM ceiling, 6-core/12-thread CPU\"; §8.2 U-07 is \"THE HYPOTHESIS… Build one complete region, profile on RTX 5060-class\"; U-35 records that laptop thermal/power behaviour \"is not reproducible by downclocking a desktop part, so this closes only on the laptop reference machine\" and blocks printing a mobile part on a store page; DOC_MAP.md:106 names the dev-on-5090-must-not-hide-recommended-spec-misses rule.",
"what_exists": "The program's hardware is one RTX 5090 workstation (9950X3D, 32 GB VRAM, 128 GB RAM — docs/5090_ASBUILT_BENCHMARKS.md, arriving 2026-07-30) plus a ROG Ally X that appears only as the walkthrough narration terminal and UPS-notification target (5090_SETUP_RUNBOOK.md L443 \"the ROG Ally X appeared only as a UPS-notification target\", L460/L511; 5090_WALKTHROUGH_SCRIPT.md L9, L224). POSITIVE CONTROL on the zero: grep -i \"5060|4060 Ti|7600 XT|steam deck|rog ally\" across docs/*.md returns hits ONLY in ENGINE_OPTIMIZATION_DOCTRINE.md (the ruled ladder) and the Ally-as-terminal rows above — the search reaches both repos' hardware prose, and no verification-machine row exists. Note the harness already assumes a device nobody owns: bench_criteria.json's minimum class is literally named `steam_deck_minimum`.",
"delta": "Every ms budget, every p99 bar and the entire recommended-spec ship claim will be measured on a 5090 — the one machine the doctrine says must not be allowed to hide a recommended-spec miss. There is no ranked item to buy, rent, borrow or cloud-instance an RTX 5060-class or minimum-spec target, and no fallback protocol (locked clocks, resolution scaling, a declared-invalid stamp) for deriving a class verdict from the wrong machine. P4 will need published minimum/recommended specs for the store page that U-35 forbids printing unmeasured.",
"severity": "MINOR",
"blocking": "U-07's falsification test in the P0/P1 window (the first complete-region profile) produces a 5090 number that cannot verdict the ruled class; P4's store-page spec rows at ship.",
"proposed_home": "A ranked hardware row in PRE_5090_BUILD_PLAN.md's window plan (or a P0 handshake item): acquire or borrow one recommended-class target (RTX 5060 / 4060 Ti / RX 7600 XT, 16 GB RAM, 6c/12t) as the perf verification box, plus a written INVALID-CLASS stamp rule for any verdict measured on the 5090."
},
{
"index": 12,
"entry_id": "GAP-157",
"merged_into": null,
"name": "QT-10's audio event-fire harness has almost nothing to assert against — the producer exists, the expectation table does not",
"vision_rules": "VOL2 §11.5 QT-10: \"Audio event-fire … `cue_id`/`sfx_id_ref` arrays (§10.6, per registry)\" must catch \"a declared cue that never fires on its trigger; a MetaSound not consuming tempo/bar/stem-role; footfall not keyed to `footfall_surface`.\" AI_QA_LOOP_ARCHITECTURE.md §3 WS-6 requires a \"cue→trigger coverage matrix\" as the loop artifact. VOL2 §11.5 HEARING sense: \"no cue→trigger matrix in `harness/`.\"",
"what_exists": "The producer half is live: UCombatTelemetrySubsystem::RecordAudioCue(FName CueId) at CombatTelemetrySubsystem.h:72. The expectation half is absent: no cue or audio artifact in harness/ (ls harness/*cue* harness/*audio* = none; POSITIVE CONTROL — 27 harness/check_*.py exist and the same glob form finds them). And the denominator itself is nearly empty: a scan of all registries/**/*.csv finds 15 registries carrying cue_id or sfx_id_ref columns but only 40 non-empty cue/sfx reference tokens corpus-wide, with 7 of those 15 registries carrying any *trigger* column at all.",
"delta": "Built as specified, QT-10 would go green having asserted roughly forty cue tokens for a 79-node game — a harness whose denominator is so thin that a pass carries no information, which is the \"a check that cannot fail is not armed\" defect in data form rather than in code. Neither the coverage matrix nor the per-cue trigger declaration has a data home, so the audio surface has no measurable definition of done.",
"severity": "MINOR",
"blocking": "Window-plan rank 8 (the Section-10 machine cue table + Theme/Scene music columns, now unblocked by the emotional-register landing) is about to author cue rows into registries with no trigger column and no coverage instrument waiting — retrofitting the trigger declaration after four-plus region pages of cue authoring costs a second pass.",
"proposed_home": "Declare the trigger alongside the cue in rank 8's own schema (a `cue_trigger` column beside every cue_id/sfx_id_ref rail), and mint harness/check_audio_cue_coverage.py reading the RecordAudioCue telemetry stream against that declaration as the cue→trigger matrix."
}
],
"npc-simulation": [
{
"index": 1,
"entry_id": null,
"merged_into": "GAP-143",
"name": "The witness → memory → community-reaction engine has no spec home and no owner (the ruled \"killing ripples through the community\")",
"vision_rules": "CLAUDE.md \"Content bar\" + memory violence-allowed-r17-no-genocide: \"killing ripples through the community and is remembered.\" docs/proposals/systems/attackability-and-consequence-model.md §The engine L22 (\"Witness, memory, reputation — not a wanted meter... they witness, flee, warn others, and the community's disposition persists\"), L23 community resilience (defends/mourns/rebuilds/escalates settlement→region→hunted-across-the-world), L25 (the baker's empty stall, the grieving family, the child who now fears the player).",
"what_exists": "DOCTRINE ONLY, and it defers its own mechanism twice. attackability-and-consequence-model.md §Wiring targets L66 pushes \"witness-memory, settlement disposition, reputation, community-resilience/repopulation, escalation ladder, node-control handoff, quest re-skin per holder\" to \"the WS7 wiring task\"; docs/proposals/systems/WS7_WIRING_BUILD_PLAN.md L193 pushes it back out (\"belongs to the reputation/integrity WS7 wiring task, NOT this attackability anchor — deliberately out of scope here\"). POSITIVE CONTROL on the only candidate home: docs/proposals/systems/reputation-prestige-nemesis.md is 51 lines and contains ZERO occurrences of witness|settlement|ripple|villager|bystander while \"reputation\" occurs throughout — it specs the WoW-Exalted faction ladder, prestige/NG+, and boss Nemesis AI, not community reaction. Data keys exist with no writer grammar: WS_019 community_state_per_region is the RATIFIED mark_write home (T0_Worldstate_Variables row 19) and the spine already writes reputation_biography_propagation 77 times across 31 nodes and relationship_history 83 times (grep over docs/spine/*.md; control: integrity_score 418). Its own row WS_026 says \"full system spec deferred to post-cascade architecture gaps queue at T1_Personal_Dimension_Spec adjacent\" — and rank 24's T1_Personal_Dimension_Spec scope is \"marriage/partnership, dimension pocket, creature housing\" (PRE_5090_BUILD_PLAN L104), which excludes propagation. FACTORY_CONTRACT FR-017 carries the doctrine as a SEED rider with tooth \"NONE(the split is a runtime model; the community-ripple half is persona-gated on rank 11)\" (docs/factory_contract.json L312-320).",
"delta": "No document anywhere defines what a kill/harm event WRITES: witness set, propagation radius, decay or non-decay, settlement mobilization, price/greeting/quest-availability deltas, repopulation cadence, or the escalation rungs. 77 authored spine writes land in a system with no spec. Not in ranks 1-30, not in VOL2's LW-*/N8 rows (N8.1 names \"community-ripple event on death\" as a one-line first version, PRE_5090_BUILD_PLAN L2933).",
"severity": "CRITICAL",
"blocking": "Rank 10 (§7.5 housing-ledger typing over 264 seeds) cannot type dark-track/succession seed variants without the ripple's write grammar; and the first W-LW3 staged playthrough in which the AI QA loop kills a villager has no defined world response — i.e. Gate 1 (Ch 2-13 P3 exit) would certify \"consequence\" that was never specced. Cheapest before rank 10.",
"proposed_home": "New docs/proposals/systems/COMMUNITY_CONSEQUENCE_ENGINE.md (witness model, WS_019/WS_026 write grammar in STATE_DELTA_GRAMMAR terms, escalation rungs, repopulation cadence) + a factory_contract.json rider with a real tooth + a DOC_MAP row; spec-doc lane, before rank 10."
},
{
"index": 2,
"entry_id": null,
"merged_into": "GAP-143",
"name": "NPC_recognition_system is a phantom consumer — five worldstate rows name it, nothing specs, owns, or implements it",
"vision_rules": "ENTITY_PERSONA_SYSTEM.md §3.2: \"Because integrity is read as a real property, an entity notices who the protagonist has become even without having observed her deeds — the disposition is generated fresh each encounter.\" This is the whole NPC-reaction surface of the immersive-sim bar.",
"what_exists": "NPC_recognition_system is named as a runtime consumer on 5 rows of T0_Worldstate_Variables (WS_001 integrity_score, WS_006 appearance_score, WS_008 relationship_history, WS_023 vril_polarity_signature, WS_025 identity_hiding_status). POSITIVE CONTROL: repo-wide grep finds it ONLY in that CSV plus (a) docs/pipeline_review/lens_wave_2026-07-28/CRITIC_ac-traversal-stealth-legibility.md L117, which independently calls it \"the NPC_recognition_system consumer that no system answers to\", (b) one prose mechanic in WHOLE_ARC_CONNECTIVE_WEB_INVENTORY.md L106, (c) a 2026-07-20 decision brief — while the same grep found dialogue_resolver in 4 docs including WS7_WIRING_BUILD_PLAN. Engine side: C:\\dev\\Humanity\\Humanity\\Source\\Humanity\\Public has 12 dirs and Core holds HumanityCharacter/HumanityEnemyCharacter/HumanityBossCharacter/HumanityEnemyController — there is NO NPC, persona, companion, or faction class anywhere (find over the whole game repo for *npc*/*persona*/*companion*/*faction* returns one Saved/Telemetry json). N8.2 \"AHumanityNpcCharacter persona runtime\" is BUILD-NOW (PRE_5090_BUILD_PLAN L2934) with no spec to build against.",
"delta": "The reaction layer is declared in DATA (which state it reads) and nowhere in DESIGN (what it does with it): no recognition thresholds, no per-band greeting/price/dialogue-availability table, no concealment-vs-recognition resolution order, no authored fallback. Rank 11 personas and the natural-voice dialogue lane both assume it.",
"severity": "CRITICAL",
"blocking": "W-LW3 (LW-8/LW-10 staging) and the natural-voice NPC dialogue lane hit it first: an NPC on screen in the slice must react to integrity/appearance/concealment, and N8.2 has no contract. Also blocks honest QA scoring of \"the world reads you.\"",
"proposed_home": "Either a §recognition chapter of the new COMMUNITY_CONSEQUENCE_ENGINE doc or a T1_Integrity_Paths §8.7 extension, with the token either specced or retired from the 5 worldstate rows in the same commit (a named consumer that answers to nothing is the phantom-registry defect class already recorded in PHANTOM_REGISTRY_ROUTING_FINDING.md)."
},
{
"index": 3,
"entry_id": null,
"merged_into": "GAP-139",
"name": "The persona daily-rhythm has no column anywhere — rank 11's Persona_Index mint spec omits the field LW-8 is queued to read",
"vision_rules": "ENTITY_PERSONA_SYSTEM.md §2.2 own_life: \"the entity's daily rhythm and independent existence... This is the field that makes the world feel populated rather than staged.\" DESIGN_GAP_REGISTER #2 (L68-79) recommends \"one shared schedule component with a 3-4 state enum (home/work/social/sleep)\". VOL2 L1008 LW-9 explicitly orders \"author the slice's ambient/named personas (own_life daily-rhythm, web_edges)\".",
"what_exists": "ZERO structured home. POSITIVE-CONTROLLED header scan over all 62 registry dirs: no column in any registry matches schedule|routine|occupation|job|population|crowd, while the SAME scan matched trade/home/density columns in 19 registries (T0_Trade_Registry home_base_*, T0_Dwelling_Registry home_id, T0_Region_Index env_density_band_default). T0_Character_Index's 33 columns carry no schedule/home/work field. The queued build row states its own blocker: VOL2 L1040 LW-8 \"Ambient-NPC presence/schedule... no schedule field in Character_Index\". And the mint that is supposed to unblock it does not add one: ENTITY_PERSONA_SYSTEM §5.2 L218 enumerates the T0_Persona_Index columns as persona_id, anchor_ref, entity class, persona tier, care band, significance-lens set, persona-doc path, runtime class — own_life is NOT among them; it lives as prose in a persona doc. LW-12 (VOL2 L1042) adds a time_of_day ws key but no schedule table.",
"delta": "LW-8 (queued, W-LW3) and register #2's shared schedule component have no data source: the state enum, the per-persona home/work site refs, and the presence windows exist in no row and in no mint spec. The prose doc is unreadable by a runtime component.",
"severity": "CRITICAL",
"blocking": "Rank 11 itself (PRE_5090_BUILD_PLAN L88, a P1 EXIT criterion) is the last cheap moment — it authors complete personas on every slice entity, so a column added after the mint is a retrofit across every slice persona row; LW-8 at W-LW3 then stalls or ships mannequins.",
"proposed_home": "Amend ENTITY_PERSONA_SYSTEM §5.2 before rank 11 mints: add schedule_state_set (home|work|social|sleep), home_site_ref, work_site_ref, presence_window, plus a child T0_Persona_Schedule table if a persona needs multiple windows; enroll in fk_spec.json in the same commit."
},
{
"index": 4,
"entry_id": "GAP-158",
"merged_into": null,
"name": "The attackability / node-persistence system columns landed and were never populated — 8/164 and 0/76 — and no rider or rank owns the populate",
"vision_rules": "attackability-and-consequence-model.md §65 wires five tiers onto the persona schema plus \"a node-persistence schema (node_class: story-anchor / transferable / protected; a succession_chain listing the ordered successor factions; is_load_bearing on the narrow story-critical figures)\" — the mechanism that makes killing consequential without dead-ends (§44-51 node succession, quest re-skin per holder).",
"what_exists": "Columns exist, data does not. T0_Character_Index (164 rows): attackability_tier filled on 8 rows (5 bonded / 2 protected-collective / 1 hostile), is_load_bearing on 8, loyalty_model on 6, loyalty_belief_axis on 4 — while role and voice_signature_notes are 164/164 and seed_status 164/164, so the registry is richly authored precisely everywhere EXCEPT the system columns. T0_Region_Index (76 rows): node_class filled 5/76, succession_chain 0/76. The seeds are self-declared illustrative (WS7_WIRING_BUILD_PLAN L180-182 \"[ILLUSTRATIVE]\"), and population was handed off with no owner: FOUNDATION_COMPLETION_PLAN L19 \"values/population = re-cascade + Fable-5\". The per-chapter obligation register does not ask for it: docs/factory_contract.json holds 70 riders and grep counts attackability=0, faction=0, crowd=0, schedule=0, villager=0, census=0 (control: persona=9, ripple=1, witness=2). docs/spine/RULING_QUEUE_SWEEP.md A4 (L160) proposed the node_class populate; it has not landed and is in no rank.",
"delta": "156 of 164 named NPCs have no declared attackability tier and 71 of 76 regions no node class, so nothing in the data says who may be swung at, who is diegetically resilient, or who inherits a node when its holder falls. Not covered by rank 30 (which populates six 1-3-row system registries, not these ACTIVE 164/76-row tables).",
"severity": "MAJOR",
"blocking": "Rank 10's seed typing and the W-LW3 region staging hit it first — a dark-track seed variant needs succession_chain, and the QA loop's emergent-violence passes need attackability_tier on every NPC it can reach in Ch 2-13.",
"proposed_home": "A derive-from-spine populate pass (the ruled SELECT+RECOMMEND precedent) over Character_Index.attackability_tier/is_load_bearing and Region_Index.node_class/succession_chain, plus a factory_contract rider with an R2 tooth so no chapter can land with unassigned tiers."
},
{
"index": 5,
"entry_id": "GAP-159",
"merged_into": null,
"name": "No faction keyspace: 175 free-text faction tokens, 2 reputation rows, and no faction table for any FK to point at",
"vision_rules": "ENTITY_PERSONA_SYSTEM §2.4.2 makes faction one of the five authoring classes and \"the strategic heart of the generative layer\"; WS_021 faction_standing_per_faction is canon state keyed on faction_id; the succession chain is \"an ordered list of successor factions\" (attackability model §46); N8.4 is the per-faction standing subsystem feeding companion recruitment and quest availability (PRE_5090_BUILD_PLAN L2936).",
"what_exists": "T0_Character_Index carries faction_affiliations on 150 of 164 rows holding 175 DISTINCT free-text tokens (manggarai_village_flores_council, bali_brahmin_priesthood_lineage, caldh_inter_american_court_legal_coalition …). T0_Reputation_Ladder_Registry = 2 rows (FR_0001 House of Velheim, FR_0002 Swahili coast trade-guild), keyed faction_rep_id, with the ruled 9-band STANDING labels Hunted|Banished|Suspected|Cooled|Stranger|Welcomed|Honored|Revered|Exalted. NO faction registry exists — POSITIVE CONTROL: ls registries | grep -i faction returns nothing while the same grep matches trade and dwelling; corroborated by ENTITY_PERSONA_SYSTEM L75 \"there is no standalone faction registry today\" and WS7_WIRING_BUILD_PLAN L190 \"No FACTION registry exists yet, so succession_chain has no FK target.\" WS_021's faction_id therefore resolves to no table.",
"delta": "The join Character → faction → standing → succession → community reaction has no shared key: 175 authored social groups are unnormalized strings, the standing state has no domain, and succession chains cannot be authored even if someone wanted to. Rank 30 populating Reputation_Ladder rows would add rows to a table that is not the faction identity home.",
"severity": "MAJOR",
"blocking": "N8.4 and LW-10 (the relational-web play surface, W-LW3) hit it first; also blocks the ripple engine's settlement-disposition writes and any per-faction gate on quest availability.",
"proposed_home": "Mint T0_Faction_Index (faction_id PK, culture/region ref, class, care band, reveal-gating) + normalize the 175 tokens into it + repoint WS_021, Reputation_Ladder.faction_rep_id and Region_Index.succession_chain as declared FKs in fk_spec.json; schema-data lane, alongside or immediately after rank 11."
},
{
"index": 6,
"entry_id": null,
"merged_into": "GAP-139",
"name": "No ambient-population bill of materials: no per-zone occupancy anywhere, and the pooled persona buckets have no table",
"vision_rules": "ENTITY_PERSONA_SYSTEM §2.3 tiers ambient entities to \"a persona bucket, not an individual bible\" and cites the runtime model \"a crowd of forty sharing six persona buckets\"; regions-are-relational-webs-not-villages and the CVD \"unnamed members\" directive demand inhabited markets/villages; DESIGN_GAP_REGISTER #5 (L113-124) names density-as-sense-of-place.",
"what_exists": "NOTHING countable. The region-page Zone Catalog is 18 columns (flores_island.md L48: zone_id … footfall_surface, care_tier, asset_routing, environment_grammar_refs, zone_space_class) with no occupancy column — footfall_surface is the false friend (walk-surface foley). T0_Region_Index's 26 columns have no population field. The only population metric in the QA budget is a count of NAMED personas: VOL2 QT-17 (L1424) reads \"personas (T0_Character_Index 163)\" — and that whole named cast is 164 rows for 79 nodes, ~7-8 per slice chapter (Ch_02 Flores 6, Ch_03 7, Ch_04 7, Ch_05 8 … Ch_13 7). No bucket table exists: the header scan over 62 registries returns zero columns matching population|crowd|ambient occupancy (control: 19 registries matched trade/home/density). The spawner that would place them is wildlife-only (VOL2 FA-3).",
"delta": "There is no number for how many people a village, market, port, or trade compound holds, no bucket roster to pool them onto, and no per-chapter rider asking for either (factory_contract: crowd=0, villager=0, census=0 of 70 riders). The prose exists — flores_island Section 4 People and Culture plus the Section-12 role entries (mosalaki, 'ata madi, tuka timba mata dasi, tu'a teno) — with no row home.",
"severity": "MAJOR",
"blocking": "Rank 5 (asset_concept/morphology/asset_category/mesh_tags across the slice) hits it first: crowd mesh/material budgets cannot be sized without counts, and W-LW3 staging would otherwise certify \"a lit ambient-village frame\" against no target.",
"proposed_home": "An ambient_population_band column on the Zone Catalog + Region_Index rail, a T0_Persona_Bucket table (N buckets per culture, each with voice register, dress, occupation set, care band) keyed from the region page's Section-4 role prose, and a QT-17 scorecard metric that reads it."
},
{
"index": 7,
"entry_id": null,
"merged_into": "GAP-139",
"name": "NPCs cannot be shown working the trades: occupation exists only as free text inside role, with no trade FK, no work site, and no practitioner roster",
"vision_rules": "Pillar 9 / the 10-trade system with ancient and modern home bases and 120 quest gates; ENTITY_PERSONA_SYSTEM §2.4.1 teaching_role (\"the trade home base, ability, or worldview the person teaches... and the mastery-tier progression they gate\"); the immersive-sim bar's economy participation.",
"what_exists": "T0_Trade_Registry = 10 rows / 12 columns: trade_id, trade_name, ancient/modern home chapter+region, pillar_9 concept, twelve_tier_quest_gates, home_base_upgrade_ceiling, compound_membership, shared_build_grammar_ref, ceremony_quest_refs. compound_membership is a FACILITY class token (TRADE_01 = \"field_infrastructure\"), not a roster — no practitioner, staff, or work-site column exists. T0_Character_Index has no occupation or trade column among its 33; the occupational fact is buried unnormalized in the role slug (\"aksumite_coffee_ceremony_mistress\", \"stele_scribe_apprentice_under_monopoly\", \"manggarai_cotton_ikat_weaver_trade_6_seed_introduction\" — role is 164/164 filled). T0_Gather_Node_Registry (24 rows) is player-facing extraction with tool_or_trade_required; no NPC labor side. POSITIVE CONTROL: the registry header scan DID find trade_* columns in 19 registries, so the absence on Character_Index/Persona_Index is real, not a search artifact.",
"delta": "No structure answers \"who practises trade N here, at which site, on what rhythm\" — so a trade compound can be built and staffed by nobody, and the schedule component (gap 3) has no work_site to send anyone to. Rank 23 mints the 120 trade-gate quest rows and the Book-of-Trades data home, which is quests, not labour.",
"severity": "MAJOR",
"blocking": "Rank 23 and the W-LW3 region staging: a trade home base with an upgrade ceiling and no staff roster reads as a prop; also blocks the register-#8 profession-practice feedback loop.",
"proposed_home": "occupation_ref / trade_ref + work_site_ref columns on the rank-11 T0_Persona_Index (mirrored as a normalized token on Character_Index), plus a practitioner-roster column on T0_Trade_Registry's compound rows; schema-data lane with rank 11."
},
{
"index": 8,
"entry_id": "GAP-160",
"merged_into": null,
"name": "Companion out-of-combat life has no policy class and no assignment column — the ally policy registry is 14/14 combat rows",
"vision_rules": "COMPANION_MECHANICS_CONTRACT §8 (L313-334): \"companions travel aboard... VH_001's crew_station_object names the stations a companion can hold: helm; lookout; gunner; engineer; cook; menagerie; rigger. A companion's own_life aboard the mothership SHOULD bind to a crew station — this is where the 'lives aboard' obligation becomes concrete\"; ENTITY_PERSONA_SYSTEM §2.2 own_life applies to companions as much as villagers; memory companion-loyalty-integrity-system.",
"what_exists": "T0_Ally_Behavior_Policy = 14 rows / 21 columns, and every row is combat: domain is the closed §8.11.8 triad (awareness | pattern_detection | proactivity), condition_expr is all local combat flags (enemy_attack_telegraph_visible, threat_on_lower_durability_ally, ward_borne_and_holding), action_ref is attack_directed | interpose | peel | disengage | read_counter_class | lapse_concealment. The schema cannot host a non-combat behavior without a new domain value — the registry's own notes flag the enum as closed. POSITIVE CONTROL: COMPANION_MECHANICS_CONTRACT (439 lines, 12 interfaces) contains ZERO occurrences of camp|banter|idle|out-of-combat|downtime|rest scene while \"companion\" occurs 93 times. No per-companion station or residence assignment exists: crew_station_object is a text list on the VH_001 vehicle row, and WS_027 companion_roster_state carries loyalty fields only. Rank 22 is \"Ally survival/defeat model + ally combat-line class\" — combat-scoped.",
"delta": "Companions have a ruled bond ladder, departure arithmetic, and combat policies, and no specified existence between fights: no station/residence assignment, no downtime behavior rows, no banter or place-reaction surface, no schema slot able to hold one.",
"severity": "MAJOR",
"blocking": "The STORY_DEPTH order-5 companion-arc typing (blocked on rank 11) and W-LW3's aboard-the-mothership staging from Ch 08 hit it first; also the register-#9 rest/safe-site loop has no companion content to place.",
"proposed_home": "Add an out-of-combat domain (or a companion_presence policy class) to T0_Ally_Behavior_Policy with a declared legal set, plus crew_station_ref / dwelling_ref per member on WS_027 and a station-assignment column authored with the rank-11 personas."
},
{
"index": 9,
"entry_id": null,
"merged_into": "GAP-143",
"name": "The escalation / hunted response the doctrine ends on is unbuilt and unqueued — the Hunted band exists as a label with nothing that hunts",
"vision_rules": "attackability-and-consequence-model.md L23: systematic slaughter \"escalates diegetic response (settlement to region to hunted-across-the-world) so genocide is never progression-viable\"; Josh's own pre-Claude GDD specs the mechanism — docs/original_predclaude/extracted/GDD_Humanity_Game_Complete.md L24120 \"13.7 The Bounty System\" (operating independently of the Infamy and Renown scales) and L13698 \"2 — Hunted Multi-regional. Bounty hunters begin appearing. Movement requires more planning.\"",
"what_exists": "The band NAME shipped without the mechanism: T0_Reputation_Ladder_Registry's ruled STANDING labels begin \"Hunted|Banished|Suspected…\" (row FR_0001/FR_0002 tier_thresholds) and nothing spawns a hunter off them. docs/original_predclaude/INGEST_GDD.md L155 classifies the bounty system RECOVERED-NEW (\"Not in Reputation_Ladder or Tier_C spec; distinct mechanic worth recovering\") and L184 proposes \"a T0_Bounty_Registry seed\" — POSITIVE CONTROL: no bounty registry exists among the 62 registry dirs while the same listing matches trade and dwelling, and no rank 1-30, R-31/32, or VOL2 LW-*/N8 row names bounty, infamy, or hunted-response. The one hunter channel that exists is antagonist-driven (N8.3 Hunter-Trigger over T0_Antagonist_Network_Registry, 64 rows), not player-crime-driven.",
"delta": "The consequence ladder has a bottom rung (integrity slide) and a top label (Hunted) with no rungs between: no infamy accumulation, no regional spread rule, no hunter spawn or bounty resolution, so the anti-genocide escalation the care doctrine leans on is unimplementable as written and the recovered GDD mechanic is an unqueued orphan.",
"severity": "MINOR",
"blocking": "Post-window, but it is what the Ch-5 integrity-gated lethal fork, the gladiator chapters, and any emergent-violence QA pass escalate INTO; recovering it costs one spec pass now and a retrofit across authored reputation writes later.",
"proposed_home": "A hunted-response section appended to docs/proposals/systems/reputation-prestige-nemesis.md (or a T0_Bounty_Registry seed per INGEST_GDD L184), cross-wired to the community-consequence engine's escalation rungs and to N8.3's existing trigger machinery; queue as a POST-window item beside R-31/R-32 so it is never re-derived."
}
],
"engine-build-infra": [
{
"index": 1,
"entry_id": null,
"merged_into": "GAP-136",
"name": "The registry→struct→DataTable trunk has an ABSENT half that its own pipeline cannot see (23 registries / 1,787 rows)",
"vision_rules": "CLAUDE.md authority chain item 4 + game-repo CLAUDE.md L27-28: \"The T0 registries (registries/**/*.csv) — structured canon. Consume via DataTables.\" `docs/REGISTRY_ROW_STRUCT_SPEC.md` §5 L210-217 records the debt verbatim: \"62 registry CSVs against 48 generated headers (19 stale, 23 absent). Do NOT run gen_row_struct.py --all --apply until that backlog is reconciled deliberately.\"",
"what_exists": "Counted on disk: `C:/dev/humanity-forgotten/registries/` = 62 registry dirs / 62 CSVs; `C:/dev/Humanity/Humanity/Source/Humanity/Public/Data/*.h` = 48 row structs; `Content/Data/Registries/DT_*.uasset` = 46 real DataTables (+DT_ImportSmoke). Name-normalized diff → 23 registries with NO row struct, carrying 1,787 rows: Arc_Grid 1231, Promise_Ledger 125, Arc_Index 128, Element_Effectiveness 124, Composure_Routing 53, Festival 16, Ally_Behavior_Policy 14, Rarity_Grade 13, Bonus_Option 12, Realm_Ruleset 11, Status_Table 10, Bonus_Pool 7, Role_Axis 7, Arc_Grammar 6, Spec_Purpose 6, Dungeon_Class_Reference 5, Familiar_Bond_Ability 5, Imprint_Affix 5, Role_Composition_Rule 4, Loadout_Set 3, Equipment 1, Motif 1, Boss_Attack_Rail 0. The invisibility is structural: `Tools/registry_import_manifest.json` `_doc` states \"The registry entries come from line 2 (// Source:) of each Source/Humanity/Public/Data/*.h header\" — count=46, entries=46. The import pipeline's denominator IS the headers, so a registry with no header is never reported missing; it reports 46/46 green.",
"delta": "1,787 canon rows have no engine home and no error. Live plan ranks 13-17 (ability data, §§7-12 data homes, Quest_Definition columns, boss rails, element matrix) and the story-depth arc waves MINT rows into these registries — the canon-side lane is ranked, the engine leg (row struct + DataTable + manifest entry + gate) has no rank anywhere. Rank 2 covers only the 19 STALE headers (\"regenerate the 13 drifted row structs\"), not the 23 ABSENT ones, and the spec explicitly forbids the bulk apply that would create them.",
"severity": "CRITICAL",
"blocking": "Rank 2 first: the moment `gen_row_struct --check` is wired into `harness/gates_config.json` over `--all`, the new gate goes red on 19 stale + 23 absent, not the 13 it was scoped for — the gate cannot land green without a decision it does not own. Then ranks 13-17, which freeze schemas onto registries that have no engine consumer to validate the freeze against.",
"proposed_home": "A new plan rank in `docs/PRE_5090_BUILD_PLAN.md` ▶ WINDOW PLAN [engine-code·L] between ranks 2 and 13: \"Reconcile the 62-vs-48 row-struct backlog — per-registry review + generate + import + manifest entry for the 23 absent, then promote the bulk `--all --apply` exit to non-zero (the second named debt in REGISTRY_ROW_STRUCT_SPEC §5).\" Coverage tooth: extend `gen_row_struct --check --all` to enumerate registries, not headers."
},
{
"index": 2,
"entry_id": null,
"merged_into": "GAP-136",
"name": "The ws.* GameplayTag + worldstate schema generator is stale, undocumented and ungated — canon can mint a ws.* variable the engine physically cannot address",
"vision_rules": "`Source/Humanity/Public/Quest/GeneratedWorldstateSchema.h` L7-8 states the contract: \"Each ws.* variable also gets a native gameplay tag \\\"Humanity.WS.<variable_name>\\\" so the durable UWorldStateSubsystem (FGameplayTag-keyed) is addressable by variable name with no hand authoring.\" `T1_Build_Pipeline_Contracts [ACTIVE v1.0]` §9.5 (quoted in `harness/check_ws_value_form.py` docstring): \"ws.{name} is DURABLE and must resolve to a WS_NNN registry variable_name.\" `docs/DOC_MAP.md` L112 (LOADOUT_SETS_SPEC, Wave-3, double-critic-cleared) declares \"per-owner homing (WS_045 player / WS_027 companion / WS_012 familiar)\".",
"what_exists": "`registries/T0_Worldstate_Variables [ACTIVE v0.1]/Sheet1.csv` = 46 rows (WS_001–WS_046). `GeneratedWorldstateSchema.h` L2 self-declares \"(42 rows at generation)\" and contains exactly 42 `UE_DECLARE_GAMEPLAY_TAG_EXTERN` lines, last = `WS_banked_tell_reads` (WS_042). So WS_043 bonus_selection_state, WS_044 bonus_respec_ledger, WS_045 loadout_set_state, WS_046 item_instance_ledger have NO native tag and NO baked schema row — `TagForVar()` returns an invalid tag for all four. Their declared consumers are named engine classes that EXIST: WS_045's `consumers` cell reads \"vril_site_interaction (HumanityVrilRechargeZone)\" and `Source/.../HumanityVrilRechargeZone.h/.cpp` are on disk. POSITIVE CONTROL on the tooling zero: `gen_worldstate_schema` returns 0 hits across the entire canon repo (no DOC_MAP row, no gates_config entry, no runbook), while `gen_row_struct` returns 53 hits across 15 files — the search space is real and the generator is simply unregistered. `harness/gates_config.json` has 34 gates; `ws_value_form` validates VALUE heads against domains, nothing validates that a key is addressable.",
"delta": "The canon→engine ws.* tag pipeline exists only as a game-repo script with no canon-side registration, no drift gate, and a 4-row silent lag. A ratified Wave-3 spec (LOADOUT_SETS_SPEC) and the item ledger it depends on cannot be wired, and the failure mode is a silently-invalid FGameplayTag, not a build error. `ws.item_instance_ledger` is already written once by the spine (`docs/spine/CH_01.md:271`).",
"severity": "CRITICAL",
"blocking": "Rank 14 (\"Mint the §§7-12 data homes: tier-bonus pools, imprints, loadout sets, role tags, ally stat spreads, MYTHIC rarity\") is landing rows against WS_043-046 right now; the LOADOUT_SETS_SPEC / DEATH_CHOICE / RIFT_DUNGEON Wave-3 specs all list \"the 5090 engine implementation\" as consumer and every one homes on ws.* keys. Zero engine symbols exist today for LoadoutSet/BonusSelection/ImprintAffix/RarityGrade/SpecPurpose (grep = 0, positive-controlled against AbilitySystemComponent = 39 hits).",
"proposed_home": "Register `gen_worldstate_schema.py` in `docs/DOC_MAP.md` alongside `gen_row_struct.py`, and add a `worldstate_schema` gate to `harness/gates_config.json` that fails when the registry row count / variable set diverges from the generated header (the same shape as rank 2's `gen_row_struct --check` wiring — bundle the two into one rank so the trunk gets ONE cross-repo drift tooth, not two half ones)."
},
{
"index": 3,
"entry_id": "GAP-161",
"merged_into": null,
"name": "The ruled save-migration protocol has no structural home — its two required inputs are unpopulated canon-side, dropped by the generator, and absent from the save format",
"vision_rules": "`T1_Build_Pipeline_Contracts [ACTIVE v1.0]` §1.8 L209-214 rules the protocol in full: \"Once a build ships, player save files exist in the wild at the schema version of the shipping build… Migration protocol operates on schema_version_introduced metadata\"; \"schema_version_introduced — required column on T0_Worldstate_Variables for every variable… formatted as semver per §1.11\"; \"For variables whose schema_version_introduced is newer than the saved schema_version, save load populates the variable with default_value from T0_Worldstate_Variables. For variables removed from current schema, save load strips the variable with deprecation warning.\"",
"what_exists": "Canon side, measured on `T0_Worldstate_Variables/Sheet1.csv` (46 rows): `schema_version_introduced` is populated 46/46 but 11 rows carry the literal string `v0.2` — not semver, in direct violation of the §1.11 formatting §1.8 requires (WS_029-032, WS_033-039). `default` is populated 36/46 — 10 rows have NO default at all (WS_029, 030, 031, 032, 034, 035, 036, 037, 038, 039), so the ruled \"populate with default_value\" step has nothing to read for those. Engine side: the generated `FWsVarDef` struct (`GeneratedWorldstateSchema.h` L69-77) carries Name / Kind / Members / bHasRange / Lo / Hi — it drops BOTH `default` and `schema_version_introduced`. `WorldStateSaveGame.h` carries a single `int32 SaveVersion = 1` and the migration exists only as a comment: \"SaveVersion is carried so a future schema migration can detect and up-convert an old slot rather than mis-read it.\" There is no migration function, no per-var default repopulation, no strip-with-warning. POSITIVE CONTROL: searching the docs tree for `SaveVersion` / `save migration` / `up-convert` / `backward-compat` returns nothing on-point while `migrat` returns dozens of unrelated hits (5090_SETUP_RUNBOOK soak migration, CASCADE_RUNBOOK schema migration notes) — the search could match.",
"delta": "A fully ruled protocol with zero implementing structure and 11 of 46 rows already unable to satisfy it. The cost lands exactly at Early Access: `docs/ROADMAP_POST_5090_TO_SHIP.md` L441 rules the EA base as the full 14-node slice, and L503 rules that \"each finished chapter (or chapter batch) ships as a Steam content update through the P4 chain\" — every one of those updates is a ws.* schema bump against in-the-wild saves.",
"severity": "CRITICAL",
"blocking": "Cheap now, expensive the day the first player has a save — the same asymmetry the window plan already names for P2.11 character creation (\"The mechanical half is cheap NOW and expensive after players have saves\"). It blocks nothing pre-5090 and everything at P4 exit, whose stated criterion is \"a day-0 patch path exists and runs through the bug ledger\" (ROADMAP L453).",
"proposed_home": "Two pieces. (1) A zero-token canon fix folded into rank 14: normalize the 11 `v0.2` values to real semver and author the 10 missing defaults (the domain column already states every one of their shapes). (2) A `docs/proposals/systems/SAVE_MIGRATION_SPEC.md` in the Wave-3 spec family, plus the generator change to emit `Default` + `SchemaVersionIntroduced` into `FWsVarDef` and a `SchemaVersion` field on `UWorldStateSaveGame`."
},
{
"index": 4,
"entry_id": "GAP-162",
"merged_into": null,
"name": "Cook/package has no owning item row in the live item source, no packaging configuration surface, and the standalone Game target has never been compiled once",
"vision_rules": "`docs/ROADMAP_POST_5090_TO_SHIP.md` P4 L416-421 names the machinery by reference: \"Shipping-config builds and the cook/package/validation chain (PRE_5090_BUILD_PLAN.md W4.10 the RunUAT BuildCookRun headless per-region cook + -run=DataValidation; W4.9 the RowName + reveal-ladder + hard-line cook-time validators)\"; P4 exit L451: \"the Shipping build cooks clean with all DataValidation validators green\"; L465-467: \"launch-cert QA runs on the real Shipping build, not the editor, because the Shipping config is where a latent non-Shipping-module link would surface (the FunctionalTesting Developer-module lesson).\"",
"what_exists": "W4.9/W4.10 exist ONLY as rows in `PRE_5090_BUILD_PLAN.md` §6 (L2872-2873) — and that document's own header L34-48 declares §§3–11 SUPERSEDED as the item source: \"For item detail + wave assignment going forward, read Vol2, not §§3–11 here.\" In `PRE_5090_BUILD_PLAN_VOL2.md`, W4.9 and W4.10 appear only as dependencies of other items (QT-8 L1463 \"W4.9 UEditorValidatorBase\", QT-22 L1477 deps \"W4.10, QA-8\", W8/W11 handshake verified-by L315/L1538) — never as item rows with a wave. POSITIVE CONTROL: sibling W4.x items DID get Vol2 folds — W4.1 → RG.1 L1135, W4.8 → §F′ RM.1/RM.2 L1177-1183 — so the pattern exists and W4.9/W4.10 were the two that fell out. Config side, `Config/DefaultGame.ini` is 11 lines: `CommonUISettings`, three `ConsoleVariables`, `ProjectID`. No `[/Script/UnrealEd.ProjectPackagingSettings]`, no `ProjectVersion`, no maps-to-cook list, no chunking; `GameDefaultMap=/Game/Maps/GreyboxArena` (a dev map) is what a packaged build would boot. POSITIVE CONTROL: `ProjectPackagingSettings` / `ProjectVersion` / `bGenerateChunks` return 0 hits across `docs/` while the same sweep hits `analytics` elsewhere. Binaries: `Binaries/Win64/` contains only `HumanityEditor.target` + `UnrealEditor-*.dll/pdb` — no `Humanity.target`, no game executable; `Saved/Cooked` and `Saved/StagedBuilds` do not exist.",
"delta": "The EA ship target's entire cook/package lane is a dangling reference: two live QA items depend on items that have no owner row, and the 201-file runtime + 46 DataTables + GAS/StateTree stack has never been proven to LINK outside the editor target. `Humanity.Build.cs` does guard `FunctionalTesting`/`AutomationController` behind `Target.Configuration != Shipping`, so the discipline is there — but nothing has ever tested it, which is precisely the failure class the ROADMAP quotes as its own lesson.",
"severity": "MAJOR",
"blocking": "QT-22 (CI wiring + self-testing-gate integration, BUILD-NOW) and QT-8 (data-integrity harness, BUILD-NOW) both list an ownerless dependency. Sooner and cheaper: a single Development-config Game-target compile is a same-day zero-model-spend action that either proves the link or surfaces the editor-only dependency now instead of at P4 launch-cert.",
"proposed_home": "Restore W4.9 + W4.10 as real item rows in `PRE_5090_BUILD_PLAN_VOL2.md` §8 (QA-ORG) with a wave, and add a window-plan rank [engine-code·M] \"Build the standalone Game target (Development) + author ProjectPackagingSettings/ProjectVersion + a boot-map that is not GreyboxArena\" — the boot-flow UI half already has a home at Vol2 U11.6."
},
{
"index": 5,
"entry_id": "GAP-163",
"merged_into": null,
"name": "No build/version identity, no patch lane, and no shipped-build crash or symbol posture",
"vision_rules": "`docs/ROADMAP_POST_5090_TO_SHIP.md` P4 exit L453: \"a day-0 patch path exists and runs through the bug ledger.\" L503: \"each finished chapter (or chapter batch) ships as a Steam content update through the P4 chain.\" `T1_Build_Pipeline_Contracts` §1.11 rules SCHEMA version discipline (semver) and is cited by nine downstream sections — the discipline exists for canon, and the same doc's §1.8 L214 requires \"explicit migration handling specified per-bump in build pipeline configuration alongside the §1.11 MAJOR-version-mismatch halt protocol.\"",
"what_exists": "There is no BUILD version anywhere: `ProjectVersion` = 0 hits in `Config/DefaultGame.ini` and 0 hits in `docs/`. No patch/hotfix lane exists in either plan document (the P4 line is the only mention and it is an exit assertion, not an item). Crash/symbol posture: `CrashReport` / `crash report` / `GDPR` / `privacy policy` / `opt-in telemetry` / `data collection` all return 0 hits across `docs/` — POSITIVE-CONTROLLED, because `telemetry` returns 138 hits across 35 files in the same tree. What telemetry exists is dev-facing only: `UCombatTelemetrySubsystem` → `Saved/Telemetry/<s>.json` and `Saved/Crashes/**/CrashContext.runtime-xml` ingestion, and its plan item QT-14 (`PRE_5090_BUILD_PLAN_VOL2.md` L1416) is explicitly the internal auto-triage loop: \"Ingest Saved/Logs/*.log + Saved/Crashes/**/CrashContext.runtime-xml… auto-open a typed record.\" No symbol/PDB retention policy per shipped build exists — and `Binaries/` is gitignored per the game CLAUDE.md L92-96, so the 88 MB editor PDB currently on disk is not archived anywhere.",
"delta": "Post-EA, the loop cannot answer \"which build is this crash from\" or \"which save schema was that slot written by,\" because no build carries an identity and no shipped PDB is retained. `docs/MARKETING_WEB_PROGRAM.md`'s sibling lane already did the privacy read for the website (Cloudflare analytics, PIPE_WEBSITE_2026-07-29 L20) — the GAME-side player-data posture was never asked.",
"severity": "MAJOR",
"blocking": "P4 exit as literally written. Practically it blocks the first EA patch: without a build version stamped into the save header, §1.8's \"compares saved schema_version against current schema\" has no anchor to compare against.",
"proposed_home": "A `docs/SHIP_BUILD_CONTRACT.md` (sibling of `docs/ASSET_DROPIN_CONTRACT.md`, DOC_MAP-rowed) owning: build-version scheme + where it is stamped (ProjectVersion → save header → crash context), per-build PDB/symbol archive location, the patch/hotfix lane, and the shipped-build crash-report + player-opt-in posture. Ruled at director level per the care/decision protocol, not left to the build lane."
},
{
"index": 6,
"entry_id": "GAP-164",
"merged_into": null,
"name": "The editor/agent plugins have no Shipping fence — the shipped module set has never been declared or audited",
"vision_rules": "Game-repo `CLAUDE.md` L97-101 pins the plugin discipline (\"Plugins/NeoStackAI is installed AS SOURCE and compiled against this exact engine build\") and L110-131 documents both agent channels as live editor automation: NeoStack MCP on 127.0.0.1:9315 and Epic's ModelContextProtocol on 127.0.0.1:8000, the latter \"auto-started via the repo-tracked seed Config/DefaultEditorPerProjectUserSettings.ini (bAutoStartServer=True).\" `docs/ROADMAP_POST_5090_TO_SHIP.md` L465-467 requires launch-cert QA on the real Shipping build.",
"what_exists": "`Humanity.uproject` enables 10 plugins. Exactly ONE carries a target fence: `ModelingToolsEditorMode` has `\"TargetAllowList\": [\"Editor\"]`. `NeoStackAI` (an ACP agent bridge that spawns `claude.exe` per CLAUDE.md L152-161) declares only `SupportedTargetPlatforms: [Win64, Mac, Linux]` — a platform list, not a target fence. `ModelContextProtocol` declares nothing at all, and its settings section is `/Script/ModelContextProtocolEngine.*` — an Engine/Runtime module name, not an Editor one. POSITIVE CONTROL on the doc zero: `TargetAllowList` returns 0 hits across the whole canon `docs/` tree, while the same regex's NeoStack-ship/package alternates return 15 hits across 9 files — the concept has never been raised, not merely not-found. And no packaging config exists to strip them (see the ProjectPackagingSettings zero above).",
"delta": "The retail EA build's module manifest is undeclared and unaudited, and the two plugins most likely to be wrong in it are an AI-agent bridge and an auto-starting local HTTP server. This is not a code defect — the code is clean — it is a missing bill of materials: nobody has written down which plugins/modules are allowed to exist in a shipped build, and no gate or item checks it.",
"severity": "MAJOR",
"blocking": "P4 launch-cert / Steamworks review. It also compounds gap 4: the first Game-target cook is where this surfaces, and that cook has no owner.",
"proposed_home": "One clause in the `SHIP_BUILD_CONTRACT.md` above: the declared shipped plugin/module allow-list, with `TargetAllowList: [\"Editor\"]` applied to NeoStackAI + ModelContextProtocol, plus a cook-time validator row alongside W4.9's RowName validator that fails the cook on an unexpected staged module."
},
{
"index": 7,
"entry_id": null,
"merged_into": "GAP-136",
"name": "Every gate is canon-repo-internal — the two-repo trunk has zero cross-repo tooth",
"vision_rules": "CLAUDE.md ▸ Verification discipline: \"Trust content, not labels… Write your reasoning and evidence for every result you report.\" Memory `verify-with-fanout-not-commit-labels`: \"'class closed' + green gates still missed 7 stragglers.\" Memory `csv-width-defects-invisible-to-suite`: duplicate headers and short rows \"pass every gate and misread silently.\" The whole gate apparatus exists because a claim without a tooth rots; the canon→engine seam is the one claim with no tooth.",
"what_exists": "`harness/gates_config.json` = 34 gates, enumerated: stress, fidelity, scan, topography, layer_register, lint, anchors, graph, no_dead_end, boss_axes, spine_graph, lifecycle, reveal_discipline, registry_extensions, index_freshness, store_integrity, region_pages, ws_value_form, slice_coherence, seed_housing, build_readiness, entity_taxonomy, care_scope, grand_sage_silence, weave_lifecycle, build_space, rarity_firewall, counter_class_coverage, ally_build, factory_contract, realm_ruleset, arc_continuity, promise_ledger, emotional_curve. Every one reads canon-repo paths only — `build_readiness` (the closest candidate) reads region-PAGE machine-field presence per its own docstring (\"For each region page it emits one readiness row per downstream CONSUMER LANE\"), never the game repo. Not one gate reads `C:/dev/Humanity/Humanity/Source/**` or `Content/Data/Registries/**`. POSITIVE CONTROL: `gen_row_struct` is cited 53 times across 15 canon docs yet appears in ZERO gates_config entries — the tool the trunk depends on has never been armed.",
"delta": "The failure class this lane hunts is structurally guaranteed here: the canon repo can go fully green while the engine consumes a stale header, a missing tag, or a table that was never imported. Gaps 1, 2 and 8 in this audit are all the same missing mechanism seen from three angles. Rank 2 is the first attempt at a cross-repo tooth and it covers one of the four hops (struct drift) — not registry→struct coverage, not struct→DataTable import, not variable→GameplayTag.",
"severity": "MAJOR",
"blocking": "Every downstream engine claim. It is also the cheapest of these gaps: one script walking four coverage relations, zero model spend, and it converts gaps 1/2/8 from audits into permanent teeth.",
"proposed_home": "Widen rank 2 from \"wire gen_row_struct --check\" to a single `harness/check_canon_engine_trunk.py` gate asserting all four hops (registry↔struct, struct↔DataTable, registry↔manifest entry, ws.* row↔native tag) with the game repo read-only, and add it to `gates_config.json`. It must land BEFORE gap 1's reconciliation rank so the reconciliation has a scorecard to close against."
},
{
"index": 8,
"entry_id": null,
"merged_into": "GAP-136",
"name": "32 of 46 imported DataTables have no engine consumer, and no gate reconciles either direction",
"vision_rules": "Memory `anti-orphan-wire-everything-doc-map`: \"every artifact needs a consumer AND a DOC_MAP row.\" `docs/ASSET_DROPIN_CONTRACT.md` L120 makes the id-rail the load-bearing claim: \"It carries a canon id — the stable-id UPROPERTY equals its registry RowName (the W4.9 DataValidation pass).\" The trunk's premise is that importing a DataTable makes canon reachable.",
"what_exists": "46 real DataTables live in `Content/Data/Registries/`. Grepping all 201 files under `Source/` for `/Game/Data/Registries/DT_*` returns 17 distinct paths: AbilityTree, Beat, BossEncounter, BossPhase, Clue, CreatureRoster, ElementMatrix, Flora, Fork, ForkOption, GatherNode, HollowTrickPalette, Mineral, SceneAnchor, Sfx, Site, VrilSite. Three of those (Clue, ElementMatrix, HollowTrickPalette) point at assets that do NOT exist — all three are declared, null-safe and TODO_CANON-flagged with embedded fallbacks (`HumanityClueSubsystem.cpp:48-50`, `HumanityElementMatrix.cpp:54`), so they are honest debt, not defects. That leaves 14 imported tables with a C++ consumer and 32 with none — including DT_ChapterIndex (79 rows), DT_RegionIndex, DT_QuestDefinition, DT_Weapon, DT_CrossCulturalLinkGraph (145), DT_ThreadGrid, DT_Rune, DT_SceneSpec, DT_HardLines, DT_WorldstateVariables. HONEST LIMIT, stated because the rule demands it: I could NOT prove the Blueprint direction — a binary name-table scan of all 262 non-DT uassets for `DT_ChapterIndex` returned zero, but so did the control scan for `DT_BossPhase` (a table known to be C++-referenced), so that search CANNOT match and its zero proves nothing. The claim is \"no C++ consumer,\" not \"no consumer.\"",
"delta": "\"Imported\" is being read as \"wired\" for 32 tables, and nothing measures the difference in either direction. The reverse direction is the one with teeth today (W4.9's RowName validator, planned); the forward direction — does anything read this table — has no instrument at all, so a DataTable can be imported, pass fidelity, and be dead.",
"severity": "MAJOR",
"blocking": "Not a hard blocker on any single rank, which is exactly why it persists. It becomes load-bearing at the P1 EXIT / rank 11 persona pass and rank 15 Quest_Definition work, where the assumption \"the row is in the engine so the feature can read it\" starts driving scope estimates.",
"proposed_home": "A consumer-coverage column in the gap-7 trunk gate: per DataTable, does a C++ or Blueprint reference exist (resolve Blueprints via the asset registry / `AssetRegistry` dependency query, not a text scan — the text scan is proven unable to match). Report, don't fail, at v1: the honest register is the deliverable, the same shape as `check_build_readiness.py`'s BLOCKED-ON matrix."
},
{
"index": 9,
"entry_id": "GAP-165",
"merged_into": null,
"name": "The game repo has become the canon HOME for two derived CSVs, and one of them has no canon registry and no plan rank",
"vision_rules": "Game-repo `CLAUDE.md` L11-15 is unambiguous: \"The canon repo… READ-ONLY from this lane. Never edit anything there. If you find a canon defect or need a value that doesn't exist, record it in TODO_CANON.md… never invent the value yourself.\" `docs/REGISTRY_ROW_STRUCT_SPEC.md` §1 (quoted in §6): \"the canon repo owns the rows,\" and §6 rejects a generated shadow CSV precisely because \"the shadow copy becomes a second thing that can be edited, imported stale, or diverge.\"",
"what_exists": "Two data files live in the game repo as canon homes: `Tools/DT_ElementMatrix.csv` (373 B) and `Tools/DT_HollowTrickPalette.csv` (876 B). Both are honestly self-declared — `ElementMatrixRow.h` L2-8: \"Engine-Authored: Tools/DT_ElementMatrix.csv… whose CSV is a game-repo DERIVED file, not a canon registry\"; `HumanityHollowTrickPalette.h` L24: \"DATA HOME (flagged TODO_CANON, the ElementMatrix precedent): no canon-side registry for the trick palette exists yet — T0_Hollow_Codex carries no trick columns and the HOLLOW EXPANSION INTEGRATION record's own worklist still has the mint open.\" The structural admission is in the manifest: `registry_import_manifest.json` carries `engine_authored: 2`. Element matrix HAS an owner — window-plan rank 17 \"[schema-data·M] Complete + import the element matrix; lift the 10-element cap\" — and a partial canon home (`T0_Element_Effectiveness` 124 rows, though its shape does not match `ElementMatrixRow.h`'s attacker-row/10-column form). The hollow trick palette has NEITHER: no registry directory exists for it (POSITIVE CONTROL: `T0_Hollow_Codex [DRAFT v0.1]` does exist as a registry dir with a row struct and a DT, so the search space is real) and no rank in the 30-item queue or the R-31/R-32 additions names it.",
"delta": "One live exception to the one-writer rule is queued; the second is not, and it is the one whose canon home does not exist at all. Every number in it is illustrative under the tuning firewall, which means the balance audit will need a canon home to tune against and there is none.",
"severity": "MINOR",
"blocking": "The Hollow-class expansion build (ruled canon per memory `hollow-class-expansion-rulings` — six axes, two tiers) and the Phase-5M build-space sweeps, which sweep pool options against canon rows.",
"proposed_home": "One line folded into rank 14's data-home mint (it is already the \"mint the missing data homes\" rank): mint `T0_Hollow_Trick_Palette`, then retire `Tools/DT_HollowTrickPalette.csv` to a generated import and drop `engine_authored` from 2 to 1 — with rank 17 closing the last one."
},
{
"index": 10,
"entry_id": "GAP-166",
"merged_into": null,
"name": "No authority or replication scope is declared on any ws.* row — the Tier-C attach cost accrues silently in every system built now",
"vision_rules": "`docs/COMBAT_PROGRAM_ADDENDUM.md` §12 L256-263 carries Josh's verbatim intent: \"this also sets us up well for progression into MMO after the full game is released\" — \"the same role/stat/build architecture scales into Tier-C\" raid roles and the canonical 100-player World Boss (T1_Tier_C_MMO_Spec §8; CVD §13.1). `docs/ENGINE_OPTIMIZATION_DOCTRINE.md` L495-496 calls it \"the single most important CPU decision for our shape, because canon carries Tier-C raid roles and a 100-player World Boss.\"",
"what_exists": "The decision IS registered — `PRE_5090_BUILD_PLAN.md` §12 item 27: \"Tier-C MMO scope ruling — the base game's netcode posture (single-player-first? always-online? how the MMO layer attaches). GAS OnRep hooks imply a latent decision\" — and §13 deliberately parks the build: \"Not-model-gated but SEQUENCE-gated: Tier-C MMO netcode + guild-integrity aggregation + world bosses — last of the Tier A→B→C build; the math is specifiable now but building it is premature.\" So the engine SPEC is correctly not a gap. What is unstructured is the cost record: `T0_Worldstate_Variables` has 46 rows and 10 columns (variable_id, variable_name, type, domain, default, consumers, canonical_authority, schema_version_introduced, notes, extensions) — none declares server-authority or replication scope. Engine side, replication exists only where GAS supplies it (`HumanityAttributeSet.cpp` 20 DOREPLIFETIME lines, `HumanityWorldDemandAttributeSet.cpp` 4); no actor sets `bReplicates`, there is no server RPC, no `OnlineSubsystem` module (all 9 \"Steam\" hits in Source are the elemental Steam of the 10-element matrix, not Steamworks), and `UWorldStateSubsystem` is a `UGameInstanceSubsystem` — client-local by construction.",
"delta": "A default is being chosen 46 times over with no record of which of those variables would need to become server-authoritative. When Tier-C attaches, someone re-classifies 46 rows by hand against 79 nodes of spine writes with no column to write the answer into — a second pass over exactly the surface memory `golden-reenrich-run-step0-coverage-check` warns about.",
"severity": "MINOR",
"blocking": "Nothing pre-5090 (correctly parked). It becomes a re-typing pass at the Tier-C sequence, and the cheap version is one column added while rank 14 is already editing this registry.",
"proposed_home": "One column on `T0_Worldstate_Variables` — `authority_scope` (client_local | server_authoritative | undeclared) — added in the same edit as gap 3's semver/default fix, defaulting to `undeclared` so nothing is invented and item 27's ruling has a home to land in. Record it against §12 item 27 rather than minting a new decision."
}
],
"items-economy": [
{
"index": 1,
"entry_id": null,
"merged_into": "GAP-138",
"name": "The wearable/consumable BILL OF MATERIALS is one row — no item count is set anywhere",
"vision_rules": "T1_Combat_System_Spec [ACTIVE v1.0] §13 (L532) names the imprint target list verbatim — \"weapons, armour, off-hand items, grenades and bombs, potions and poisons\" — and §13 (L536) ratifies the RN_0018 slot scheme (1/2/3/4 slots at Common/Rare/Epic/Legendary + MYTHIC above). §5 (L63) makes Alchemy potions one of only THREE health-restoration channels (\"Health does not passively self-regenerate… restored only through vril-healing at the Heart-seat, Alchemy potions from Trade 5, and recharge and rest sites\"), so consumables are load-bearing on the ruled resource model. docs/original_predclaude/ELEMENTS_MATRIX_RECOVERED.md §3 authors the seven element-slot wearables (Feet/Leggings/Belt/Chest/Necklace/Diadem/Helmet) and INGEST_GDD L144 recovers \"16 equipment slots (7 enhanceable element slots + 9 stat slots)\".",
"what_exists": "registries/T0_Equipment_Registry [DRAFT v0.1]/Sheet1.csv = 1 row × 26 cols — EQ_0001 Mother's Amulet only (measured; the row's own notes call it \"never rolled or crafted… never an imprint base\", i.e. the one row is explicitly NOT an item-economy row). By contrast T0_Weapon_Registry = 72 rows. POSITIVE CONTROL on the zero: the same directory read returns 72 weapon rows, 150 creature rows, 281 boss rows, so the reader works; equipment is genuinely 1. No item count exists in canon: CVD §17.12 numerical canon carries 72 weapons / 185 abilities / 33 species / 22 familiars / 10 trades / 12 questlines and NO item number; PRE_5090_BUILD_PLAN §12 item 9 (\"row counts + columns are authorial… Josh sets content scope\") enumerates monster breeding, vehicle/mount trees, base building, minigame framework — equipment is not in that list.",
"delta": "The schema home landed (rank 14 mint, docs/pipeline_review/MINT_DESIGN_B_ITEM_ALLY_2026-07-27.md §1.4) but nothing sizes or schedules the CONTENT: no per-slot × per-rarity × per-region item schedule, no per-chapter item budget, and no Josh brief asking for the count the way 72 weapons was asked. FR-009's ruled imprint roll has nothing to roll onto.",
"severity": "CRITICAL",
"blocking": "The first real loot drop and the Ch 2-13 gear ladder — i.e. rank 26's RNG_Drop_Table rows have no payload_ref targets (payload_kind enum includes `equipment`, MINT_DESIGN_B §1.3 L409-410), and W-LW2's σ-drop wire lands on an empty catalog. Hits the moment any slice chapter needs a reward that is not a weapon.",
"proposed_home": "A Josh-facing sizing brief (the 72-weapons precedent) + a per-slot/per-rarity schedule authored into T0_Equipment_Registry, with the per-chapter budget expressed as a factory-contract rider."
},
{
"index": 2,
"entry_id": null,
"merged_into": "GAP-138",
"name": "The RULED per-region exchange economy has no column, no table, and no rank",
"vision_rules": "Ruled twice. (1) PRE_5090_BUILD_PLAN_VOL2.md §DECISIONS REGISTER, D-ECONOMY-MEDIUM (L1641-1660): Josh ruled Opt B verbatim, \"historically real mixed exchange per region,\" with the landing named — \"a `medium_of_exchange` token on `Region_Index`, vendor mechanics as a `P2.6` inventory consumer.\" (2) Re-ruled and sharpened at docs/spine/DECISIONS_PENDING_JOSH.md fourteenth sitting item 7 (L401-405): \"(b) — fully diegetic regional exchange media in-world + ONE presentation-only trade-value lens in the ledger UI (displayed, never stored, never spendable; the world only accepts goods).\" T1_Trades_Master §9.2 grounds it: \"Scarcity is real because materials are specific to geographic regions… Tier A Solo Base players engage trade interdependence through NPC trader networks.\"",
"what_exists": "`medium_of_exchange` occurs in exactly TWO files repo-wide — docs/PRE_5090_BUILD_PLAN_VOL2.md and docs/pipeline_review/MINT_DESIGN_B_ITEM_ALLY_2026-07-27.md — and in ZERO registries. POSITIVE CONTROL: that same grep returned those 2 hits, so the pattern matches real text; the registry zero is real. registries/T0_Region_Index [ACTIVE v1.2] header = 26 columns (region_id … generation_tier), none economic (read in full). `trade-value lens` occurs in exactly 3 lines across 2 files — the ruling record and docs/OPEN_BRIEFS_2026-07-28.md L140 — and nowhere in any schema, plan, or harness. T0_Worldstate_Variables [ACTIVE v0.1] = 46 rows read in full: no currency, no exchange, no vendor variable (WS_046 item_instance_ledger explicitly scopes itself to \"rolled/equippable objects\" and hands materials to UHumanityGatherLedger).",
"delta": "A ruled world rule with a named landing target has no data home five days after the ruling, and VOL2's own item row still reads the pre-ruling state — L1069: \"EC-medium — the `medium_of_exchange` region token + value abstraction (Opt-1). `BRIEF→CA on ruling`, gated on Josh.\" The 2026-07-28 refinement (never stored, never spendable, display-only) is a DIFFERENT shape from Opt-B's \"vendors price in the local medium\" and nothing has absorbed it. Disclosed honestly: EC-medium/EC-vendor sit in the VOL2 W7 wave, so a lane exists — what does not exist is the column, the value model, or a ranked owner.",
"severity": "CRITICAL",
"blocking": "Any vendor interaction or reward-value read in the slice; and the Region_Index column add should ride the same pass as rank 30's Region_Index environment rail rather than becoming a second schema touch on a 76-row ACTIVE registry.",
"proposed_home": "`medium_of_exchange` + an ordinal `trade_value_basis` on T0_Region_Index (added with rank 30's rail), the value lens specced as presentation-only in the rank-20 UI spec, and VOL2's H7/EC rows refreshed to the ruled state."
},
{
"index": 3,
"entry_id": null,
"merged_into": "GAP-138",
"name": "The material spine still covers only the four pre-rescope Ch 2-5 regions",
"vision_rules": "T1_Trades_Master §9.2: \"Scarcity is real because materials are specific to geographic regions and require physical presence to obtain. Regional specialization across the 77 regions creates genuine trade dependencies.\" The slice is RULED Prologue→Ch 13 (PRE_5090_BUILD_PLAN.md §SLICE RESCOPE L146-152: 14 nodes / 15 region-legs / 13 region rows), and T1_Region_Page_Template Section 9 (\"Minerals Resources and Trade Goods\") is a required page section for every one of them.",
"what_exists": "Measured by grouping the live CSVs: T0_Mineral_Registry = 19 rows, region_source ∈ {flores_island, bali, sumatra_java, angkor_khmer} only; T0_Flora_Registry = 25 rows, region_native the same four; T0_Gather_Node_Registry = 24 rows, region_id ∈ {flores_island 11, bali 4, sumatra_java 5, angkor_khmer 4}. Nine of the thirteen slice regions have ZERO material/gather rows. POSITIVE CONTROL: the grouping returned real region tokens for all three registries, so the reader resolves the column; the absence of sri_lanka/south_india/swahili_coast/ethiopia/rift_valley/central_africa_congo/west_africa/south_africa is a true zero — and those eight pages EXIST on disk (PRE_5090_BUILD_PLAN.md rank 10 rescope rider L82-87 measures 20/20 template sections + Zone Catalog each).",
"delta": "VOL2's FL-2 and MN-2 are scoped \"the 4 regions\" by their own text (L987, L993); rank 10's LIVE work is declared to be the §7.5 typing pass + Quest_Seed rows, not materials; no rank or wave extends the material spine to Ch 6-13. The gather→craft→trade loop therefore silently stops at Ch 5 while the build order runs Ch 2-13 first.",
"severity": "CRITICAL",
"blocking": "The Ch 6-13 region legs — the eight pages are authored and staging (DR-6 gather-node placement) reads flora/mineral stable ids that do not exist for them. First contact is the next Ch 6+ build leg.",
"proposed_home": "Extend T0_Mineral/Flora/Gather_Node to the nine remaining slice regions from each page's Section 2/9/14 prose, as an explicit rank riding rank 10's region queue."
},
{
"index": 4,
"entry_id": null,
"merged_into": "GAP-138",
"name": "No vendor/shop data home — 15 merchant NPCs exist with no stock, no accepted goods, no market",
"vision_rules": "T1_Trades_Master §9.2: solo-tier players \"engage trade interdependence through NPC trader networks.\" The fourteenth-sitting ruling (DECISIONS_PENDING_JOSH L401-405) makes vendors goods-only: \"the world only accepts goods.\" T1_Region_Page_Template Section 9 requires \"Trade goods, routes, currency, markets\" per region, and the built pages deliver it in prose — _source/02_Tier_2_Region_Pages/flores_island.md L837-842: \"the region's trade face is the ikat and songket cloth, the gongs… Merchant Siti and Trade-Envoy Tuan Yosef carry the economic-web edges.\"",
"what_exists": "T0_Character_Index [ACTIVE v1.1] carries 15 merchant/trader/market/broker rows (measured: CHAR_0015 Merchant Siti, CHAR_0019 Trade-Envoy Tuan Yosef, CHAR_0028 Market Merchant Ni Luh Dayu, CHAR_0035 Silk Road Information Broker Chelvan Kanakkan, CHAR_0046 Chetti Ponnan, CHAR_0055/0056/0057/0060/0061/0062 the Kilwa set, CHAR_0068 Hagos the Gold Merchant, CHAR_0127 Tunde, CHAR_0017 Ana, CHAR_0161 Rawiri) — so the vendor CAST is countable. Its 33 columns are role/faction/loyalty/mesh/decay only; nothing economic. POSITIVE CONTROL on the missing table: a `recipe|vendor|price|pricing|barter` grep over registries/ returned 14 files, every hit a prose note (e.g. \"black-powder recipe\" in T0_Mineral_Registry), so the search matches; there is no vendor, shop, market, or stock registry in the tree. T0_Dwelling_Registry = 2 anchor rows (DW_0001 trade-home, DW_0002 dwelling-home) and models the player's homes, not settlement commerce.",
"delta": "The named cast exists; the vendor SIDE of every transaction does not — no stock list, no accepted-goods set, no per-settlement vendor count or density, no restock model. EC-vendor's stated plan (VOL2 L1070) is \"folds onto N8.2 persona runtime,\" which supplies dialogue, not inventory.",
"severity": "CRITICAL",
"blocking": "The first buy/sell/barter beat in the slice, and the sink question the register already owns (LENS_animal-crossing AC-7, owner spec-doc / wave W10 economy) cannot be answered against zero vendor rows.",
"proposed_home": "A T0_Vendor_Registry (vendor_id → character_ref, region_ref, accepted_goods[], stock rows, restock class), FK-enrolled and keyed to the 15 existing merchant characters."
},
{
"index": 5,
"entry_id": "GAP-167",
"merged_into": null,
"name": "The density instrument is BLIND to the item economy — a chapter can pass QT-19 with zero items",
"vision_rules": "PRE_5090_BUILD_PLAN_VOL2.md §11.5.5 makes per-chapter density measurable and gate-watched: QT-19 \"gates SHAPES/RELATIONS/FLOORS\" over the QT-17 content-budget vector, implementing the CANON_AUDIT §7 density ruling (\"every chapter a dense woven experience… combat/exploration/discovery/puzzle/mystery/lore/trade/gathering/side-quest/folklore all woven\") plus Josh's 2026-07-24 rising curve. Note that the ruling's own woven list names TRADE and GATHERING.",
"what_exists": "VOL2 §11.5.5 L1424 enumerates the QT-17 vector in full: sites (DT_Site 376), beats-by-type (DT_Beat 891), encounters + sub-bosses, forks + options, minigames, weave-links (184), significance-lenses (33), personas (163), threads-woven (664/22), reputation surfaces, §16 citations. POSITIVE CONTROL: ten axes are named with live counts, so the spec is real and complete as written — and it contains NO item, loot, drop, gear, material, gather-node, or vendor axis. The QT-19 rescope blocker (L1427-1435) is about missing BANDS past Ch 5, not about missing axes, so nothing queued repairs the vector.",
"delta": "The one instrument that answers \"is this chapter dense enough?\" cannot see the item economy at all. Two of the density ruling's own woven categories — trade and gathering — have no measured axis, which is exactly why gap 4 (materials stopping at Ch 5) could go unnoticed while the gates stayed green.",
"severity": "MAJOR",
"blocking": "check_slice_scorecard.py, which does not exist yet and is the named precondition for arming QT-19 past Ch 5 — the vector should gain its item axes BEFORE that tool is written, or every Ch 6-13 node is scored blind to its economy.",
"proposed_home": "Extend the QT-17 vector in VOL2 §11.5.5 with item/reward/material/gather-node/vendor axes before check_slice_scorecard.py is authored."
},
{
"index": 6,
"entry_id": "GAP-168",
"merged_into": null,
"name": "Cultural dress is care-load-bearing prose with no data home and no producing pipeline",
"vision_rules": "CVD [ACTIVE v1.4] L270: \"Every region's texture — ritual, language, cosmology, foodways, dress, architecture, folklore, mythology — comes from primary source material.\" T1_Region_Page_Template Section 4 requires \"appearance for NPC design, dress\" per region (L164). Tailoring is Trade 6 with a full 12-tier gate roster (T1_Trades_Master §3.6, §5.6) and §9.1 names its cross-trade capability \"encoded garment patterns\" (T6+T9 at Adeptus Minor). ELEMENTS_MATRIX_RECOVERED §3 authors the worn pieces by name: Feet, Leggings, Belt, Chest, Necklace/Choker, Diadem, Helmet.",
"what_exists": "Prose only. _source/02_Tier_2_Region_Pages/flores_island.md L831 (\"cotton — the ikat/songket weaving fiber, the Trade-6 Tailoring substrate\") and L837, with L346-348 explicitly recording dress as UNATTESTED substrate. Structurally: zero garment rows anywhere; T0_Equipment_Registry's `item_class` enum is `wearable · offhand · grenade · bomb · potion · poison` with no garment/clothing member, and its `equip_slot` enum abstracts the authored piece names into `seat_1..seat_7` + six named stat slots + three `unassigned_stat_slot` placeholders (MINT_DESIGN_B §1.4 L480) — so the authored wearable identities are not addressable. Asset side: docs/translation/T99_Translation_AssetGen.md L82 routes NPCs MetaHuman-first with \"carried gear/props route through Weapons\" and names no clothing lane; T1_Region_Page_Template L122-123 records the asset_category/asset_routing enum as NOT YET RATIFIED. POSITIVE CONTROL: an `armor|armour|clothing|dress|apparel|garment|costume` grep over docs/ hit 315 files, so the vocabulary is searchable — the structured zero is real.",
"delta": "This is the exact analogue of the concept-art finding (\"not everyone has the same house\"): every NPC, companion and player wears something region-specific, the CVD makes dress a primary-source obligation, and there is no row, no enum member, no asset class, and no pipeline that produces it. Nothing distinguishes a Manggarai weaver's ikat from a Kilwa merchant's dress in any structured form.",
"severity": "MAJOR",
"blocking": "Rank 5 (asset_concept/morphology/asset_category/mesh_tags across the slice) — it decides the asset routing for slice entities and would freeze without a clothing class; and any MetaHuman NPC pass on the 13 slice regions.",
"proposed_home": "A per-region dress/textile lane on the region page's machine block feeding a garment item_class + named body slots on T0_Equipment_Registry, with a clothing asset_category declared in rank 5's enum ratification."
},
{
"index": 7,
"entry_id": null,
"merged_into": "GAP-134",
"name": "The factory contract has no per-chapter item, material, or vendor rider",
"vision_rules": "docs/FACTORY_CONTRACT.md is the rank-2.5 per-chapter obligation register — \"it answers 'for Ch NN, what must be true?'\" (PRE_5090_BUILD_PLAN.md L62-67) — and gate 30 (harness/check_factory_contract.py) keeps the doc and docs/factory_contract.json in sync while surfacing consumption gaps. Every chapter build from here on reads it.",
"what_exists": "70 FR rider rows (measured: `^\\| FR-` = 70). The item-adjacent ones are FR-009 (gear imprints → T0_Imprint_Affix#rarity_token_min, gate rarity_firewall, plan:rank14), FR-010 (loadout sanctums → T0_Loadout_Set_Definition), FR-005 (healing/cure loop → T0_Status_Table#cure_material_refs). A `vendor|currenc|gather|trade good|merchant|potion|consumable|clothing|garment|dress` grep over the file returns exactly ONE rider hit — FR-032, and there \"dress\" means terrain dressing (\"landscape import… dress, stage\"). POSITIVE CONTROL: that single match proves the pattern fires on real rider text; the other nine terms are true zeros.",
"delta": "A chapter can be declared factory-complete with no wearables, no consumables, no materials, no gather nodes, no vendor, and no declared exchange medium — gate 30 has nothing to check. The riders that do exist cover the ROLL mechanics (imprints, loadouts) and skip the items being rolled.",
"severity": "MAJOR",
"blocking": "The next chapter build to run the contract (the checklist emitter runs per chapter) — and the freeze constraint that rank 2.5 lands BEFORE ranks 13-17 means item riders added later are retrofits, which is precisely what the contract exists to avoid.",
"proposed_home": "Four new FR riders (chapter item bill · chapter material/gather bill · chapter vendor + accepted-goods · chapter exchange medium declared) in FACTORY_CONTRACT.md + factory_contract.json in one commit, per the gate-30 sync rule."
},
{
"index": 8,
"entry_id": "GAP-169",
"merged_into": null,
"name": "The ten trades have no product catalog — §9.1's six named cross-trade capabilities have no home",
"vision_rules": "T1_Trades_Master §9 (L266): \"Engineering requires materials from Mining. Alchemy requires Herbalism inputs. Blacksmithing requires Mining.\" §9.1 names six specific unlockable capabilities with thresholds (runic weapon alterations T3+T9; elemental infusion preparations T5+T4; vril-adjacent food preparation T7+T4; encoded garment patterns T6+T9; Vimana precursor T8+T2; ocean-creature coordination T1+T10) and rules the split: \"Consumable combat items are crafted by Engineering (Trade 8, bombs) and Alchemy (Trade 5, potions and poisons, fed by Herbalism Trade 4 botanical inputs via the Apothecary)… Spellcraft and consumables are two separate economies.\" ELEMENTS_MATRIX_RECOVERED §4 authors the real recipe chains (Default→Steel→…→Graphene-Nickel with iron/charcoal/chromium/rutile/graphene; Black Powder with saltpeter/sulphur/charcoal).",
"what_exists": "T0_Trade_Registry [DRAFT v0.1] = 10 rows × 12 cols — trade_id, name, homes, pillar_9 concept, the 120 gate placeholder strings, compound_membership, upgrade ceiling, grammar ref, ceremony refs. There is no inputs, outputs, product, or recipe column. T0_Equipment_Registry carries a `recipe_ref` column whose own spec says \"recipe key (recipe rows are a later lane)\" (MINT_DESIGN_B §1.4 L485). No recipe registry exists (positive control as in gap 4: the registries-wide `recipe` grep hits only prose notes). Disclosed: VOL2 FL-6 (L1025) owns \"mint recipe struct + craft subsystem + recipe rows\" for the herbalism loop at wave W-LW3, and MN-5 (L996) owns the ore→material→craft chain table — so the Herbalism/Mining legs have wave owners.",
"delta": "What has no owner is the cross-trade capability catalog itself: six named §9.1 unlocks and eight of the ten trades have no product rows, no output class, and no threshold data — so \"what does mastering Trade 6 let me make?\" is unanswerable in structured form, and the 120 trade gates (rank 23) will mint quests whose rewards point at nothing.",
"severity": "MAJOR",
"blocking": "Rank 23 (mint the 120 trade-gate quest rows + the Book-of-Trades data home) — gate quests need their unlocked product to exist as a row, or the roster lands with 120 dangling rewards.",
"proposed_home": "Product/output columns on T0_Trade_Registry plus a recipe table generalized from FL-6's struct so all ten trades and the six §9.1 cross-trade unlocks share one home."
},
{
"index": 9,
"entry_id": null,
"merged_into": "GAP-136",
"name": "Eight item/gear registries minted 2026-07-27 have no engine consumer — no struct, no DataTable, no import rank",
"vision_rules": "The wiring doctrine binds: \"an artifact with no consumer row is an orphan by definition\" (docs/DOC_MAP.md L9-10). The deterministic path is proven and named — VOL2 FL-12: \"Generate `FloraRegistryRow.h` + `DT_Flora` via `gen_row_struct.py`… the diff IS the review.\" MINT_DESIGN_B §1.4 L502 declares the Equipment consumers as \"the imprint foundry · loadout sets · the crafting lane · P2 AssetGen · the sweeps.\"",
"what_exists": "Game repo C:/dev/Humanity/Humanity: 48 row structs in Source/Humanity/Public/Data/ and 45 DataTables in Content/Data/Registries/ (both listed in full). NOT PRESENT for T0_Equipment_Registry, T0_Rarity_Grade, T0_Imprint_Affix, T0_Bonus_Option_Registry, T0_Bonus_Pool_Registry, T0_Loadout_Set_Definition, T0_Status_Table, T0_Element_Effectiveness. POSITIVE CONTROL twice over: (a) RngDropTableRow.h AND DT_RngDropTable.uasset both exist for a 0-row registry, so a table with no rows still gets a struct — the absence is not \"empty means skipped\"; (b) a `DT_Equipment|DT_Rarity|DT_Imprint|DT_LoadoutSet|DT_BonusOption|DT_Status` grep over the canon repo returns exactly ONE line — PRE_5090_BUILD_PLAN.md rank 25's DT_StatusTable — while DT_Flora/DT_Mineral/DT_Weapon do appear in plan text, proving DT_ names are plannable and these five simply are not planned.",
"delta": "The rank-14 §§7-12 mint is CSV-only. Rank 2 covers regenerating the 13 DRIFTED structs, not generating missing ones; rank 25 covers DT_StatusTable alone. Seven registries carrying the ruled gear/bonus/loadout canon are unreachable from the engine.",
"severity": "MAJOR",
"blocking": "P2.6 (inventory/equipment/loadout, BUILD-NOW per PRE_5090_BUILD_PLAN L2830) and FR-009/FR-010 — both read tables that do not exist in the engine; the first equip action in the slice hits this.",
"proposed_home": "Add the seven registries to the gen_row_struct + DataTable import list in the same pass as rank 2's struct regeneration (zero-token, deterministic)."
},
{
"index": 10,
"entry_id": "GAP-170",
"merged_into": null,
"name": "No T1 domain-authority doc owns items, equipment, or the economy",
"vision_rules": "CLAUDE.md authority hierarchy: T1 docs hold domain authority and \"T0 registries — structured row-level canon, subordinate to the T1 doc owning that domain.\" CVD L1005 delegates explicitly: \"Resource-bar count, HUD placement, recharge rates, and the rune and consumable lanes are owned by T1_Combat_System_Spec.\" PRE_5090_BUILD_PLAN §12 item 26 lists as missing specs: \"inventory/equipment/loadout rules, economy/currency/vendor loop, … crafting/gathering runtime… None exist as specs today.\"",
"what_exists": "20 T1 docs on disk (listed). `T1_(Item|Items|Economy|Equipment|Loot|Crafting)` returns ZERO occurrences anywhere in the repo. POSITIVE CONTROL: the identically-shaped `T1_(UI_UX_Spec|Trades_Master)` returns hits in the same plan file (L101, L945, L1695, L3025), so the pattern form matches real doc names — the items/economy zero is real and no plan even names such a doc. Rank 20 authors only T1_UI_UX_Spec + T1_Audio_Spec; rank 24 authors T1_Personal_Dimension_Spec. T1_Combat_System_Spec does carry the imprint lane (§13) and the resource model (§5) but no consumable catalog and no economy — its own §1 (L27) scope statement never claims items or economy beyond the imprint/loadout lanes.",
"delta": "Authority for this lane is scattered across T1_Combat §13, T1_Trades §9, WS_045/WS_046 worldstate rows and the MINT_DESIGN pipeline-review doc, with no owning T1 doc — so every item registry is subordinate to nothing, and item-26's economy/inventory/crafting half has no ranked owner while its UI/audio half does.",
"severity": "MAJOR",
"blocking": "Ranks 13-17 freeze schemas; a registry whose domain has no authority doc freezes its enums (item_class, equip_slot) with no doc to arbitrate later contradictions — the exact drift class CLAUDE.md's hierarchy exists to prevent.",
"proposed_home": "Mint T1_Items_and_Economy_Spec as a ranked sibling of rank 20, absorbing item-26's inventory/equipment/economy/crafting half and taking authority over the eight item registries."
},
{
"index": 11,
"entry_id": "GAP-171",
"merged_into": null,
"name": "The affix pool is five unnamed placeholders and the rarity ladder has no presentation",
"vision_rules": "Josh RULED the gear-imprint lane in the Borderlands/Diablo register (docs/COMBAT_PROGRAM_ADDENDUM.md §8, 2026-07-26; memory node combat addendum). T1_Combat_System_Spec §13 L536: \"An imprint carries a rolled bonus rather than a fixed one. Roll quality scales with the rarity of the source… Slot counts follow the ratified RN_0018 scheme — one, two, three, and four slots for the Common, Rare, Epic, and Legendary item grades respectively, with the questline-earned MYTHIC grade sitting above.\" A rolled-affix economy is definitionally a POOL — MINT_DESIGN_B §1.2 makes the sweep tooth \"a never-picked pool option = a balance defect.\"",
"what_exists": "registries/T0_Imprint_Affix [DRAFT v0.1] = 5 rows × 26 cols, and all five are IMP_0001-0005 with affix_name_text EMPTY, string_status `placeholder`, rune_anchor_ref all RN_0018 (read directly). fk_spec.json L672-677 confirms: \"BLANK on all five seed affixes — the design supplies no per-seed minimum grade.\" registries/T0_Rarity_Grade [DRAFT v0.1] = 13 rows (8 at axis=item_grade: none/common/uncommon/rare/epic/legendary/mythic/signature) with display_name_text, colour_ref, pickup_sfx_id_ref, beam_vfx_ref and card_layout_ref ALL blank on every row. POSITIVE CONTROL: the ordinal and axis columns ARE populated on the same rows, so the reader resolves the file; the presentation blanks are real.",
"delta": "The ruled roll economy has a five-slot placeholder pool — there is no affix roster to roll from and no build-space to sweep. Separately the loot-feel channels (rarity colour, pickup sound, drop beam, card layout) are unpopulated; card_layout_ref's declared consumer is \"rank-20 UI\" so presentation is partly routed, but the affix ROSTER itself has no rank.",
"severity": "MAJOR",
"blocking": "gate rarity_firewall + check_build_space are armed against these tables now, and FR-009 asserts per-chapter imprint rolls — the first slice drop that should roll an affix has a five-element placeholder pool.",
"proposed_home": "Author the affix roster onto T0_Imprint_Affix (slot_axis × applies_to_tags partitions harvested from GDD §12.1's authored good/evil-per-weapon-type axis, per MINT_DESIGN_B L354-357), and fill the rarity presentation columns with rank 20."
},
{
"index": 12,
"entry_id": "GAP-172",
"merged_into": null,
"name": "Culinary Arts has no product class — item_class freezes without food",
"vision_rules": "Trade 7 Culinary Arts is one of the ten canonical trades with a full 12-tier gate roster (T1_Trades_Master §3.7 \"Culinary Arts as nourishment consciousness\", §5.7), and §9.1 rules a specific cross-trade product: \"Trade 7 Culinary Arts plus Trade 4 Herbalism unlock vril-adjacent food preparation canonical at the Adeptus Minor threshold for both trades.\" CVD L270 names foodways among the region textures that must come from primary source material.",
"what_exists": "T0_Equipment_Registry's `item_class` enum is exactly `wearable · offhand · grenade · bomb · potion · poison` (MINT_DESIGN_B §1.4 L481) — no food, meal, dish, or provision member. Zero food rows exist. The nearest structure is T0_Flora_Registry's `gatherable_parts` (25 rows, four regions) which is an INPUT, not a prepared item. POSITIVE CONTROL: the enum is quoted from the mint spec that produced the live 26-column header, and the live header confirms the column exists — so the missing member is a real gap in a real enum, not an unread file.",
"delta": "A canonical trade's entire output class is inexpressible in the only item registry. Because item_class is an enum on a registry heading into the ranks 13-17 schema freeze, adding the member later is a schema change rather than a row add.",
"severity": "MINOR",
"blocking": "Not slice-critical (Trade 7's home is Ch 42), but the enum decision is — it must land before the rank 13-17 freeze or become a post-freeze schema edit; the factory-contract freeze rule (rank 2.5 before 13-17) applies equally here.",
"proposed_home": "Add a food/provision member to T0_Equipment_Registry.item_class before the schema freeze, with the vril-adjacent preparation threshold carried as a craft_trade_ref pair."
}
],
"voice-vo": [
{
"index": 1,
"entry_id": null,
"merged_into": "GAP-133",
"name": "PARTIAL VO has no mechanical form — no voiced-vs-subtitle selector anywhere, and the post-ruling chain docs silently re-expand it toward full VO",
"vision_rules": "D-VO-POLICY RULED PARTIAL VO (docs/ROADMAP_POST_5090_TO_SHIP.md §\"Decisions register\" L565-567, Josh 2026-07-24): \"Generated hero/canonical lines only (ElevenLabs behind the §4.4.1 clone gate); bulk/ambient stays subtitle; high-care cultural roles subtitle-or-synthetic. P2.8 executes to this shape.\" The ratified contract it must constrain says the opposite — T1_Build_Pipeline_Contracts [ACTIVE v1.0] §4.1: ElevenLabs \"produces canonical voice tracks for all speaking entities,\" seven categories incl. Ambient Crowd (§4.2).",
"what_exists": "NOTHING selects a line. Repo-wide scan of 728 CSVs: zero columns named vo_tier / voiced / voiced_flag / line_text / speaker / speaker_id / dialogue_line_id / bark_bucket (POSITIVE CONTROL: the same scan returns 95 files carrying player_text, and the sibling columns dialogue_dataset_array / actors / participant_refs hit 250+ files). Worse, the two post-ruling doctrine docs route the ruling's subtitle classes to SYNTHESIS with no ruling: docs/translation/T99_Translation_Audio.md §2.4 + Voice Step 3 send \"Per-Chapter Named NPC Voices and Ambient Crowd Voice\" to Kokoro-82M, and docs/pipeline_review/tech_research/PIPE_VOICE_2026-07-29.md §1 table routes \"Bulk / ambient / crowd / UI → Kokoro-82M\". The only sizing statement in the corpus is unquantified: \"a paid tier sized to full per-line VO\" (docs/BUILD_PLAN_END_TO_END.md:403).",
"delta": "The ruling exists as prose in a decisions register and as a vendor split in two chain docs; it exists as ZERO data. No per-entity or per-line tier field, no line budget, no credit/cost model, and an unflagged contradiction where the local-TTS lane quietly converts \"stays subtitle\" into \"generate it locally.\" Which lines get voice is, today, undecided and undecidable.",
"severity": "CRITICAL",
"blocking": "P2.8 (the VO pass) cannot start; the ElevenLabs paid-tier sizing brief (docs/PRE_5090_BUILD_PLAN.md:3009) has no denominator; VOL2 CN-4/U11.23 subtitle-box work cannot know which lines need a speaker-audio path. Hits the moment the first slice dialogue scene is authored — i.e. at rank 11's persona/dialogue lane, inside the pre-5090 window.",
"proposed_home": "A ruled VO_SELECTION section (T1_Audio_Spec, rank 20's doc) + a `vo_tier` enum on the line home (gap 9) + a Josh brief reconciling D-VO-POLICY against BPC §4.1/§4.2 and the Kokoro re-expansion, per the standing never-a-bare-question protocol."
},
{
"index": 2,
"entry_id": null,
"merged_into": "GAP-133",
"name": "The entity→voice FK does not exist on any of the five registries the ratified contract declares it on — while the sibling pipelines' column adds all landed",
"vision_rules": "T1_Build_Pipeline_Contracts [ACTIVE v1.0] §4.6 declares, at contract lock: T0_Character_Index gains voice_signature_ref (FK→T0_Voice_Registry.voice_id) + voice_substrate_override_object + dialogue_dataset_ref; T0_Antagonist_Network_Registry gains voice_signature_ref + family_voice_register + dialogue_dataset_ref; T0_Boss_Encounter gains voice_signature_ref + phase_voice_array; T0_Chapter_Index gains ambient_crowd_voice_signature_array; T0_Region_Index gains regional_accent_substrate + regional_language_secondary_array. §4.9 makes it load-bearing: \"UE5 build pipeline halts on missing voice_signature_ref for any entity flagged as required-voice.\"",
"what_exists": "ZERO of those eight columns exist on any of the five registries (header scan: Character_Index 164 rows, Antagonist_Network 64, Boss_Encounter 281, Chapter_Index 79, Region_Index 76). POSITIVE CONTROL, same files, same scan: the sibling pipelines' §2.6/§10.6 column adds DID land — mesh_id_ref + substrate_material_ref_path on Character/Antagonist/Boss, chapter_sfx_id_ref_array, region_footstep_sfx_id_ref_array, region_environmental_ambient_sfx_id_ref_array, region_ritual_context_sfx_id_ref_array, boss_sfx_id_ref_array, quest_dialogue_sfx_id_ref_array. Character_Index carries only voice_signature_NOTES (prose writing register, populated 164/164) — not the ref. The one live voice join in the tree is T0_Scene_Spec_Registry.voice_refs, populated on 6 of 16 rows (all Cassius/protagonist). The reverse direction is missing too: T0_Voice_Registry has no linked_entity_id/linked_entity_type, which is exactly how T0_SFX_Registry solves the same problem.",
"delta": "Voice is the only pipeline in the audio family whose entity-side wiring was never applied. There is no dispatch key in either direction, so no agent can ask \"which voice does CHAR_0071 use\" or \"which entities does this voice serve,\" and a ratified build-halt condition guards a column that does not exist.",
"severity": "CRITICAL",
"blocking": "Voice Step 1→2 dispatch (T99_Translation_Audio); PIPE_VOICE §4's autonomy contract; rank 11's persona.voice_register pointer would dangle onto rows and columns that do not exist. Blocks the first autonomous voice run outright.",
"proposed_home": "Apply BPC §4.6 as a one-shot column add across the five registries in one commit (the proven deterministic-transform vector), add linked_entity_id/type to T0_Voice_Registry, and enroll both directions in docs/fk_spec.json."
},
{
"index": 3,
"entry_id": null,
"merged_into": "GAP-133",
"name": "The ship slice's speaking cast is uncounted and unrowed — 86 distinct beat-actor tokens Prologue→Ch 13, exactly one covered by a voice row",
"vision_rules": "T99_Translation_Audio Voice Step 1: \"every entity appearing as a beat actor or a dialogue-bearing scene participant is a synth-required roster entry,\" resolved against Character_Index/Antagonist_Network/Boss_Encounter, output = \"a roster feeding T0_Voice_Registry population.\" BPC §4.2 enumerates seven categories; §4.6's own examples name the missing row shapes (FAMILY_OPERATIVE_EXTRACTIVE_SECTOR_ARCHETYPE, NPC_CH29_NOAIDI_NAMED, AMBIENT_CROWD_CH12_YORUBA_MARKET).",
"what_exists": "The INPUT exists at full corpus scale: 79/79 build/spine_rows/CH_*/beats.csv carry `actors` — 206 distinct actor tokens over 1482 mentions; the slice (CH_PROLOGUE + CH_01..CH_13) carries 86 distinct tokens over 315 mentions; 450 scenes corpus-wide, 66 dialogue-anchored (12 in the slice). The OUTPUT was never produced: T0_Voice_Registry = 23 rows, of which 10 are row_class=tts_casting and their recurrence_anchors read protagonist ×5 (base + 4 age stages), GRAND_SAGE_REVEAL_VOICE (generation_status=excluded_non_lexical_HL_0046), ARCHITECT_VOICE (\"Ch 18 to Ch 68\"), CASSIUS_PHASE_1/2/3 (SCENE_CH76_*). No roster artifact exists on disk (POSITIVE CONTROL: build/spine_rows/** yields beats/scenes/clues per node and no voice_roster of any name).",
"delta": "For the Early-Access slice the voice coverage is 1 speaking entity of 86 — the protagonist. Four of the seven ratified categories have ZERO rows (per-chapter named NPC, antagonist family operative, ambient crowd, cinematic voice), and the two non-protagonist casting sets that do exist (Architect, Cassius) both sit OUTSIDE the slice. Nobody has ever counted this lane's bill of materials.",
"severity": "CRITICAL",
"blocking": "Every slice dialogue beat — the healer, the healer's child, Ntala, the best-friend companion, the twelve regional casts. Hits at the first Pro→Ch13 dialogue authoring pass and at Gate 1 (Ch 2-13 P3-exit), inside the pre-5090 window.",
"proposed_home": "A zero-token harness emitter (harness/emit_voice_roster.py) deriving the per-node roster from beats.actors + scenes.participant_refs + Character/Antagonist/Boss rows, plus the minted T0_Voice_Registry rows per slice entity; wire it as a factory-contract rider so the roster regenerates per chapter."
},
{
"index": 4,
"entry_id": null,
"merged_into": "GAP-133",
"name": "The 13 cultural registers are TEXT-ONLY — there is no voice-casting register for any culture, and the ruled dispatch join has no column",
"vision_rules": "BPC §4.5 requires each voice's substrate to carry gender, age_range, accent_substrate, timbre_tags, intensity_range, cultural_anchor, language_primary, language_secondary_array, voice_clone_status; §4.8 binds \"documented accent register per documented linguistic and ethnographic record\" per culture (with the joik / songline / Vodou-parody prohibitions stated at VOICE level). PIPE_VOICE_2026-07-29 §4 defines the dispatch: select tts_casting rows, \"joins the row's voice_register_ref → its cultural_register row; composes the prompt strictly from voice_substrate + the register's speech_shape/translation_rule.\"",
"what_exists": "The 13 row_class=cultural_register rows carry an entirely different 11-key substrate — register_kind, peoples, care_tier, self_naming, speech_shape, translation_rule, naming_register, minted_names, forbidden, source_ref, voice_source — and ZERO of the eight §4.5 sub-fields (verified key-union across all 13 rows). POSITIVE CONTROL inside the same file: the 10 tts_casting rows carry all eight. voice_source is null on 12 of 13 rows. And the dispatch join does not exist: T0_Voice_Registry's 19 columns contain no voice_register_ref; that column exists only on T0_Ally_Behavior_Policy, T0_Bonus_Option_Registry, T0_Motif_Registry — blank in 27 of 27 rows — and docs/fk_spec.json enrolls it at min_tokens 0 with the note \"blank across all 12 seed rows today, so the floor is 0,\" which keeps the emptiness green forever.",
"delta": "The registers do real work for TEXT (they are consumed by 14 docs/spine/player_strings/*.csv sidecars, 330 rows: 176 beat / 88 site / 52 fork_option / 14 chapter — and zero rows of any spoken kind). For VOICE they carry nothing a synthesis prompt can read, and no row can point at them. The audit question \"is there a voice-casting register?\" answers NO, proven cell-for-cell.",
"severity": "CRITICAL",
"blocking": "Qwen3-TTS VoiceDesign is description-driven — it consumes exactly the accent/timbre/age fields that do not exist. So the whole cultural-register NPC lane (PIPE_VOICE's NEW PRIMARY) cannot generate a single line. Hits at the first non-protagonist slice voice.",
"proposed_home": "Either a third row_class (voice_casting) per register carrying the §4.5 block, or an accent/timbre/age sub-object added to the existing register rows — plus a voice_register_ref column on T0_Voice_Registry and an fk_spec floor that rises with the roster."
},
{
"index": 5,
"entry_id": "GAP-173",
"merged_into": null,
"name": "The protagonist's biography-state voice matrix has no key space — 5 age rows, zero integrity-band variants, and no ratified worldstate key for the router that is already queued to read one",
"vision_rules": "BPC §4.2/§4.3: the protagonist voice varies by biography state — \"integrity score affects warmth and tension, age stage affects range and resonance, appearance score affects timbre, relationship history affects emotional presence,\" per T1_Integrity_Paths_Worldstates_Master; CVD §17.4 band-keyed voice; T0_Character_Index CHAR_0001.voice_signature_notes states it as canon: \"five_band_voice_register_per_CVD_15_modulating_continuous_within_band_age_stage_three_canonical…\". The consumer is already a named BUILD-NOW unit: docs/PRE_5090_BUILD_PLAN.md:2943 N8.11 — \"VoiceRouter selecting a voice-variant id from BiographyState with §17.12 gender-lock + §17.5 no-pre-reveal-leak asserts.\"",
"what_exists": "Five rows: PROTAGONIST_VOICE_BASE + AGE_VARIANT_CHILDHOOD/ADOLESCENCE/YOUNG_ADULT/ADULT. The only modulation field is intensity_range (enum soft/mid/strong/climactic). No band, appearance, or relationship dimension exists on any row, and T99_Translation_Audio §2.5 states the binding side plainly: \"none is ratified for audio-adaptive binding today\" (no WS_NNN key). Game-side, the selector does not exist either — grep for VoiceRouter across C:\\dev\\Humanity\\Humanity\\Source returns zero, and no file in Source/ contains the substring \"Router\" at all (POSITIVE CONTROL: the same grep pattern returns HumanityAudioSubsystem.cpp for the SFX row struct).",
"delta": "A queued router with a five-row selectable space against a demanded ≥5-band × 3-4-age-stage matrix (15-20 variants) plus appearance and relationship axes, and no worldstate key to select on. N8.11 being queued does NOT cover this: the unit builds the selector, nothing owns the rows it selects or the variable it reads.",
"severity": "MAJOR",
"blocking": "N8.11 VoiceRouter (BUILD-NOW) and QT-9's §17.12 gender-lock tooth, whose failure mode is literally specified as \"a VoiceRouter §17.12 gender-lock breach\" (VOL2:1389). Also the first protagonist line in the slice.",
"proposed_home": "A protagonist voice-variant key-space spec (band × age × the appearance/relationship overlay decision) in T1_Audio_Spec, the corresponding T0_Voice_Registry rows, and a ratified WS_NNN audio-binding variable in T0_Worldstate_Variables."
},
{
"index": 6,
"entry_id": "GAP-174",
"merged_into": null,
"name": "Barks: no bucket taxonomy, no per-NPC-tier density, no bank data home — the authored floor canon says SHIPS at minimum spec has nowhere to live",
"vision_rules": "docs/RUNTIME_GENERATIVE_LAYER.md §2.3/§D names \"NPC ambient dialogue (barks, crowd chatter, vendor lines)\" a first-class generative class and §D.5/L204 specifies the floor: \"every generative slot has a deterministic authored fallback keyed by (entity_id, state_bucket) — for dialogue, a hand-written line bank (3-6 lines, RNG-picked).\" docs/ENGINE_OPTIMIZATION_DOCTRINE.md §2.7 min-spec row rules it as a SHIP configuration: \"Barks come from the authored 3-6-line-per-bucket bank… less prose variety, nothing else.\"",
"what_exists": "No data home and no taxonomy. `state_bucket` occurs 8× in RUNTIME_GENERATIVE_LAYER.md and 0× across registries/, harness/ and build/ (POSITIVE CONTROL: the same grep over docs returns the 8 hits, so the pattern matches where the token exists). No bark_bucket / barks column in the 728-CSV scan. docs/PRE_5090_BUILD_PLAN_VOL2.md contains zero occurrences of \"bark\" (POSITIVE CONTROL: the same file carries many voice/VO rows — :670, :749, :876, :945). No NPC tier axis exists for voice: T0_Character_Index.attackability_tier is populated on 8 of 164 rows (bonded 5, protected-collective 2, hostile 1). docs/DESIGN_GAP_REGISTER.md L432 lists bark-vocal-identity-channel as a newly minted aspect row with no lens having run it. NOT CLAIMED HERE: the ally combat call-out channel, which is LIVE plan rank 22 (register L337).",
"delta": "Doctrine, latency budgets (120 ms P99), and a min-spec ship ruling all exist for barks; the countable content — how many buckets per NPC tier, how many lines per bucket per tier, and which table holds them — exists nowhere, and no plan rank owns it.",
"severity": "MAJOR",
"blocking": "The 3-4B bark smoke (explicitly NOT 5090-gated — PIPELINE_READINESS_ROADMAP L86 says it \"already runs on the current GPU\") has no fallback bank to degrade to, so it cannot be evaluated honestly; the min-spec ship tier has no content. Hits as soon as the greybox slice populates NPCs.",
"proposed_home": "A T0_Bark_Bank registry (entity_or_tier × state_bucket × 3-6 lines) plus a ratified state_bucket enumeration in T0_Schema_Dictionary and a per-NPC-tier density table in T1_Audio_Spec; the tier axis rides rank 11's persona mint."
},
{
"index": 7,
"entry_id": "GAP-175",
"merged_into": null,
"name": "Ambient crowd voice: seven named contexts × 76 regions, zero rows, no data home — and its declared home landed on the SFX side instead",
"vision_rules": "BPC §4.2 Ambient Crowd Voice = \"battle cries during combat encounters, market chatter at settlement zones, ritual chanting at sacred sites and ceremonial scenes, prayer recitations, tavern crowd, congregation responses, mob and protest crowd,\" and the boundary is locked: \"ambient crowd voice falls under ElevenLabs scope, not AIVA or SFX.\" §4.6 declares the home column — T0_Chapter_Index.ambient_crowd_voice_signature_array — and §4.3 names the substrate reads (region page Sections 4/5/7).",
"what_exists": "Zero AMBIENT_CROWD_* rows in T0_Voice_Registry (23 rows, all accounted: 10 tts_casting + 13 cultural_register). T0_Chapter_Index (79 rows) has no ambient_crowd_voice_signature_array column, but DOES carry chapter_sfx_id_ref_array; T0_Region_Index (76 rows) carries region_ritual_context_sfx_id_ref_array — so the ritual-chanting/prayer audio the voice contract explicitly claims has an SFX home and no voice home. T0_Festival_Registry (16 rows) carries festival_id/tradition/region_id/site_anchor/player_participation/gameplay_hooks/care_note and no audio or voice column at all.",
"delta": "The most density-shaped category in the lane — how many crowd beds per market, per settlement, per festival, per congregation, per battle — has no count, no column, and no rows, and the one place the audio family did wire ritual context routed it to the wrong pipeline by omission. This is the exact failure class of the concept-art audit: a doctrine paragraph standing in for a bill of materials.",
"severity": "MAJOR",
"blocking": "Every populated settlement in the slice (Flores village, Bali street, Sumatra strait market, the Swahili coast port) reads as silent crowd; the region-page Section 10 machine cue table (rank 8) has no voice column to fill while it fills the music one. Hits at rank 8's per-page cue pass, in-window.",
"proposed_home": "Add ambient_crowd_voice_signature_array to T0_Chapter_Index (and a per-region crowd-context count to the Section 10/17 machine table), mint AMBIENT_CROWD_* rows per region×context, and add a voice column to T0_Festival_Registry so the 16 festivals bind their congregation beds."
},
{
"index": 8,
"entry_id": "GAP-176",
"merged_into": null,
"name": "Vendor/model routing is ruled in a dossier with no per-row home — the registry hardcodes one vendor, and the licence-provenance tooth the routing depends on does not exist",
"vision_rules": "PIPE_VOICE_2026-07-29 §1 sets the routing (ElevenLabs = hero/canonical; Qwen3-TTS-12Hz-1.7B-VoiceDesign = cultural-register NPC PRIMARY, because Kokoro's 54 voices/8 languages \"would voice all thirteen in the same two accents — the flattening defect, and the registry itself forbids it\"; Kokoro = bulk/ambient/UI; Piper = scratch; Chatterbox = gated, never default). §3 states the requirement: \"generating_model + model_licence on every generated voice row — LICENCE LAW… the Higgs V2-Apache → TTS-3-non-commercial flip is the proof this must be per-row, not per-doc,\" plus a NEW licence-provenance tooth failing any asset whose model_licence is off the shippable allowlist.",
"what_exists": "T0_Voice_Registry's 19 columns hardcode a single vendor — elevenlabs_voice_id_ref — and carry no generating_model, model_licence, engine, or voice-description column, so a Qwen3 VoiceDesign or Kokoro voice has no home for its id or its licence (POSITIVE CONTROL: the header scan finds elevenlabs_voice_id_ref, ue_sound_asset_path and row_class in the same file, so the scan resolves this registry's columns). ue_sound_asset_path is blank in 23 of 23 rows. harness/gates_config.json carries 34 gates and none reads a licence; the only voice tooth is #25 grand_sage_silence, a prohibition. The two schema asks are parked as riding \"the DR-2 column commit,\" and DR-2 (docs/ASSET_DROPIN_CONTRACT.md) enumerates open items 5, 6 and 7 — none of which is the model/licence pair.",
"delta": "A routing decision across five engines with per-lane licence traps (XTTS unpurchasable, Higgs 3 non-commercial, F5/Fish/Echo non-commercial, VibeVoice excluded-by-posture) and a per-row licence law — with no column, no tooth, and no owner. The standing licence memory (2026-07-29) exists precisely to keep this from being a doc-level claim.",
"severity": "MAJOR",
"blocking": "The first bulk voice batch on the 5090 box (PIPE_VOICE §2 install plan is Thursday-scale work) would write assets whose generating model and licence are unrecorded — the one defect that cannot be repaired after the fact at volume.",
"proposed_home": "Add generating_model + model_licence to T0_Voice_Registry in the DR-2 column commit (and name them in DR-2's open-item list so they cannot fall out), plus gate 35 licence_provenance enforcing the Apache-2.0/MIT/ElevenLabs-subscription allowlist."
},
{
"index": 9,
"entry_id": null,
"merged_into": "GAP-133",
"name": "The lane's unit of work has no id, no table and no producing script — dialogue lines exist nowhere, and the per-line join key is a flagged gap with no owner",
"vision_rules": "BPC §4.4 stores \"per-line track files… under voice-and-line organization\"; §4.7 isolates churn via \"per-line track regeneration\" against dialogue_dataset_ref; §4.9 halts generation \"on missing dialogue dataset for any entity flagged as speaking.\" T99_Translation_Audio Voice Step 5 flags it: \"the join key itself is not yet specified anywhere,\" owner recorded as \"Whoever finalizes the ElevenLabs/Kokoro build-asset-store path convention\" (§4 spike 9). PIPE_VOICE §3 proposes the interim V_<voice_id>__<dialogue_line_id> with a sha1(line_text) fallback.",
"what_exists": "No line home: zero dialogue_line_id / line_id / line_text / speaker columns across 728 CSVs (POSITIVE CONTROL: 95 files carry player_text). No DialogueLineRow.h among the 47 generated row structs in C:\\dev\\Humanity\\Humanity\\Source\\Humanity\\Public\\Data\\ (POSITIVE CONTROL: SfxRegistryRow.h, SceneSpecRegistryRow.h, VoiceRegistryRow.h are all present). T0_Scene_Spec_Registry.dialogue_dataset_ref is blank in 16 of 16 rows; T0_Quest_Definition_Registry carries dialogue_dataset_array against an unauthored BPC §6. No generator: Tools/generate_voice.py does not exist (POSITIVE CONTROL: Tools/generate_sfx.py, gen_placeholder_sfx.py and import_audio_assets.py all exist and generate_sfx.py has been RUN).",
"delta": "The lane has a ratified addressing contract for VOICES (DR-2's Voice row: voice_id → ue_sound_asset_path → /Game/Audio/Voice/<cat>/V_<voice_id>) and none for LINES. Nothing can be named, generated, regenerated, counted, or costed at line granularity — which is also why gap 1 has no denominator.",
"severity": "MAJOR",
"blocking": "Voice Steps 5-7, VOL2 Q3.2's six-option selection engine and CN-4's subtitle box (both BUILD-NOW), and the whole of P2.8. The flagged spike has no owner, so it will otherwise be discovered by the first VO batch.",
"proposed_home": "Mint T0_Dialogue_Line (line_id, speaker_ref→voice_id, scene/beat anchor, vo_tier, loc_namespace) + the generated DialogueLineRow.h + Tools/generate_voice.py (Kokoro/Qwen3 local legs + the ElevenLabs leg), and ratify the join key so the interim stops being interim."
},
{
"index": 10,
"entry_id": "GAP-177",
"merged_into": null,
"name": "No voice coverage or care tooth: the ratified §4.8 high-care voice audit has no artifact, the registry has no FK floor, and the imported voice DataTable has no consumer",
"vision_rules": "BPC §4.8 requires a batch-level cultural-authenticity audit pre-build for the named high-care set — \"Ch 29 Sámi, Ch 42 Haiti, Ch 57 Australia, Ch 11, Ch 12, Ch 13, Ch 47-48, and Ch 50\" — with joik-imitation, songline-imitation and Vodou-parody all prohibited AT VOICE LEVEL, and living-tradition roles routed to pure synthetic by default. PIPE_VOICE §4 makes it a model-promotion condition: \"zero findings from the accent-care lens across the 13-register sample set.\"",
"what_exists": "No audit artifact, no checklist, no owner (POSITIVE CONTROL: docs/ carries SPINE_CARE_AUDIT_2026-07-23.md and a care_scope gate for the text lanes, so a voice-side equivalent would be found by the same search). harness/gates_config.json = 34 gates; the only voice tooth is grand_sage_silence (a prohibition tooth, and per PIPE_VOICE §3 correctly binding). T0_Voice_Registry is NOT one of the 40 registries enrolled in docs/fk_spec.json — no PK pattern, no min_values floor (POSITIVE CONTROL: T0_Character_Index and T0_Vehicle_Registry are enrolled). Game-side the registry has no consumer: DT_Voice.uasset + VoiceRegistryRow.h are read by nothing (POSITIVE CONTROL: SfxRegistryRow is read by Source/Humanity/Private/Audio/HumanityAudioSubsystem.cpp and the scene automation tests).",
"delta": "The highest-care content class in the audio family — real living traditions' voices — has doctrine in three places and zero enforcement, zero coverage measurement, and zero runtime consumer. A voice row can be minted, mis-cast, and imported without any tooth noticing, and the registry's emptiness is structurally green.",
"severity": "MAJOR",
"blocking": "Slice chapters 11, 12 and 13 are IN the named elevated-care set and are IN the Early-Access base — so the audit is due inside the pre-5090 window, before Gate 1, not at localization time.",
"proposed_home": "A gate (voice_coverage: roster-vs-rows + every row's register/model/licence resolves) plus the §4.8 high-care voice audit checklist as a factory-contract rider per chapter, and T0_Voice_Registry enrolled in fk_spec.json with a floor that rises with the roster."
},
{
"index": 11,
"entry_id": "GAP-178",
"merged_into": null,
"name": "Cultural-register coverage stops at the slice: 13 registers against 76 region rows, and the three chapters whose voice disciplines are named in ratified canon have no register row",
"vision_rules": "BPC §4.8 names three per-culture VOICE disciplines by chapter — Sámi vocal generation (Ch 29, no joik), Aboriginal Australian (Ch 57, no songline, AIATSIS protocol), Haitian (Ch 42, Creole substrate, no Hollywood-zombie parody) — and §4.6 declares T0_Region_Index.regional_accent_substrate + regional_language_secondary_array as the per-region home.",
"what_exists": "13 cultural_register rows and they are exactly the slice: fairy realm, Manggarai/Flores, Balinese, Sumatra-Java-Khmer-Cham, Sinhalese-Vedda, Tamil-Malayali, Swahili-Mijikenda, Ethiopian-Orthodox-Ge'ez, San-Rift-Valley, Baka-Mbuti-Fang, Yoruba-Dahomey-Dogon-Akan, Southern-Africa-Shona, neutral UI. There is no REGISTER_SAMI, REGISTER_HAITI or REGISTER_ABORIGINAL_AUSTRALIA (POSITIVE CONTROL: the REGISTER_ prefix scan returns all 13 existing rows, so the pattern matches where rows exist). T0_Region_Index (76 rows) has neither regional_accent_substrate nor regional_language_secondary_array.",
"delta": "The register lane has a worked slice and no growth model: no per-region count, no minting rule, and no home column on the registry that owns regions — so three ratified voice-care rules currently point at rows that do not exist.",
"severity": "MINOR",
"blocking": "Not in-window (post-slice), but it becomes the P5 factory's per-chapter blocker on the first post-Ch-13 chapter, and it is cheapest to structure now while the 13-row exemplar is fresh.",
"proposed_home": "Add regional_accent_substrate + regional_language_secondary_array to T0_Region_Index and a per-region register minting rider to the factory contract, so each new chapter's register row is a checklist item rather than a rediscovery."
},
{
"index": 12,
"entry_id": "GAP-179",
"merged_into": null,
"name": "Spoken-VO localization tiering is a declared Josh-ruling item that never entered the brief queue",
"vision_rules": "T99_Translation_Audio §2.6: \"Spoken-VO localization tiering — which of the three voice lanes (Kokoro bulk, ElevenLabs hero, a future per-language ramp) carries multi-language generation, and on what cadence… is a JOSH-RULES item, flagged in §4, not resolved here,\" against the ship-everywhere localization mandate; BPC §4.11 defers the Multilingual v2 ramp with language_secondary_array as the captured substrate. The standing protocol (CLAUDE.md, Josh 2026-07-13) requires a full brief with alternatives + recommendation, never a bare flag.",
"what_exists": "No brief. docs/OPEN_BRIEFS_2026-07-28.md (211 lines, all fourteen items RULED) contains no VO or localization item (POSITIVE CONTROL: the file does contain the string \"natural voice\" at L109, so the grep resolves this file's voice tokens). language_secondary_array is populated only as prose placeholders (\"per region code-switch substrate\") on the protagonist rows. VOL2 U11.24 covers the loc/subtitle RUNTIME and explicitly marks non-English string/VO CONTENT as GATED-SCAN — i.e. the runtime is owned, the VO-language decision is not.",
"delta": "A named Josh decision with a live consequence for engine choice (Kokoro's 8 languages vs Qwen3's dialect coverage vs ElevenLabs Multilingual v2) sits in a spike table with no owner and no brief, so it will surface as a discovery at localization rather than as a ruling.",
"severity": "MINOR",
"blocking": "Not in-window, but it constrains gap 8's engine routing: committing an engine per lane before the language ramp is ruled risks a re-generation of every bulk line.",
"proposed_home": "A josh-brief item folded into the next bundled brief (rank 18's pattern): three steelmanned tiering options with per-engine language coverage, cost, and the re-generation risk, plus a recommendation."
}
],
"audio-sfx-ambience": [
{
"index": 1,
"entry_id": null,
"merged_into": "GAP-141",
"name": "T0_SFX_Registry implements 1 of its 21 REQUIRED columns — the whole production-state machine, category taxonomy and prompt substrate have no data home",
"vision_rules": "T0_Schema_Dictionary [ACTIVE v1.3] §3.16 declares 21 required columns for T0_SFX_Registry (sfx_category enum, sfx_subcategory, mood_tags, terrain_substrate, weapon_trait_substrate, magic_effect_substrate, cultural_substrate, era_substrate, recurrence_anchors, track_assignment, generation_method, generation_prompt_hash, last_generated_timestamp, generation_status 7-state, build_asset_path, sound_designer_in_loop_required, regeneration_trigger, primary_source_array, canonical_anchor, hard_line_relevance, sfx_id), mirroring T1_Build_Pipeline_Contracts §10.5. §10.7 runs a 7-state machine on generation_status; §10.4.1 step 1 (\"substrate read\") reads mood_tags/terrain_substrate/weapon_trait_substrate/magic_effect_substrate/recurrence_anchors to compose every prompt.",
"what_exists": "Live registries/T0_SFX_Registry [ACTIVE v1.0]/*.csv = 30 rows × 20 columns. Machine diff of §3.16-declared vs live header: 20 of 21 required columns ABSENT (only sfx_id survives); 19 live-only columns instead (sfx_class, layering_role, spatial_attenuation, linked_entity_type, vril_density_modifier, cultural_authenticity_source, hard_line_anchors...). sfx_class values (ambient 17 / gameplay_cue 8 / cultural_traditional 4 / cinematic_cue 1) share ZERO tokens with §10.2's six-value sfx_category enum. Placeholder-vs-final is encoded in a path-string suffix — 18/30 rows carry ue_sound_asset_path ending `_placeholder` — because no status column exists. T0_Theme_Registry (18/18 declared cols present) and T0_Voice_Registry (13/13) both conform, so this is an SFX-only omission, not a house style.",
"delta": "The divergence is already briefed as [DECISION NEEDED - JOSH] in docs/PIPELINE_ADAPTER.md L212-L220 + L296 (dated 2026-07-03, recommendation Option A = migrate to the §10.5 schema) and in the SUPERSEDED docs/ROADMAP.md L86 — and it appears on NO live board: zero audio hits in docs/OPEN_BRIEFS_2026-07-28.md, zero in docs/OPEN_DECISIONS_FOR_JOSH.md (91 lines, 3 sections — positive control: the grep matches its headers), no SFX-schema item across the 28 sittings of docs/spine/DECISIONS_PENDING_JOSH.md, no window-plan rank. Meanwhile the registry grew 12→30 rows and 19→20 columns inside the unreconciled shape, so the migration the brief priced at \"12 rows is cheap\" is now 2.5× larger and still unqueued.",
"severity": "CRITICAL",
"blocking": "Rank 8 (S10 machine cue table, UNBLOCKED by ledger 2026-07-29ay) and Vol2 AU-13 (Ch2-5 registry population) both write rows NEXT into a schema that cannot record a cue's track, category, generation method, prompt hash or sign-off state; DR-2 Batch 2 (ASSET_DROPIN_CONTRACT §6) then migrates paths with no state column to distinguish placeholder from final.",
"proposed_home": "Rule the 2026-07-03 PIPELINE_ADAPTER Option A as a window-plan schema-data rank (deterministic column add via registry_extensions.json + fidelity_baseline.json in one commit, sfx_class→sfx_category mapped, cultural columns carried), landing BEFORE rank 8 writes cue rows."
},
{
"index": 2,
"entry_id": null,
"merged_into": "GAP-141",
"name": "The SFX bill of materials is uncounted and un-homed: 30 rows for 79 nodes, and every one of the ten declared consumption arrays is empty",
"vision_rules": "T1_Build_Pipeline_Contracts §10.2 enumerates the countable BOM: 17 footstep terrain types × 5 protagonist-state modifiers (bare-foot/light-boot/heavy-armor/climbing-rig/stealth-pad) = 85 footstep cues; 17 biome ambients incl. day/night pairs; wind 4 / water 7 / fire 6 named members; weapon hits per Brute/Trickery trait plus per-region material modifiers; vril-cast identity progression across Neophyte→Magus. §10.6 declares the ten per-registry sfx_id_ref arrays as their consumption homes. T99_Translation_Audio SFX Step 1 requires \"a per-region SFX bank plan, each planned entry pre-assigned a category and a track\".",
"what_exists": "30 SFX rows total: 18 anchored to CH_02, 1-2 each on 11 other chapters — 67 of 79 nodes carry ZERO rows (chapter_anchor census over the live CSV). Consumption arrays, measured on the live CSVs: ability_sfx 0/185, vril_cast_sfx 0/185, weapon_sfx 0/72, boss_sfx 0/281, site_sfx 0/42, site_magic_effect_sfx 0/42, inscription_activation_sfx 0/98, familiar_bond_sfx 0/22, chapter_sfx 0/79, quest_dialogue_sfx 0/16, scene sfx_id_ref_array + sfx_category_array 0/16, equipment_sfx 0/1, status_sfx 0/10, rarity pickup_sfx 0/13; only T0_Region_Index env-ambient 8/76 + ritual 4/76 are populated (the entry-104 inversion, ledger 2026-07-28s). No artifact anywhere multiplies the §10.2 enumerations into a number — positive control: a search for audio quantity language returns only prose mentions (docs/DESIGN_GAP_REGISTER L1264 \"14 placeholder SFX\", L1311 \"0 of 30 SFX rows\") while the same pattern class returns real mesh/asset counts elsewhere.",
"delta": "AU-13 (PRE_5090_BUILD_PLAN_VOL2.md §7 L1284, UI wave) is the only queued item and it is scoped to \"Ch2-5 registry population + a coverage-map doc\" with no count and no arc-wide scope; T1_Region_Page_Template [ACTIVE v2.0]'s T0 Registry Contract lists the page as a CONSUME/loading surface for SFX (§10) but T0_SFX_Registry is absent from its FEED list — so no authoring surface owns producing SFX rows. Result: no seat-hour estimate, no licence-library budget, no 5090 batch sizing, no per-node coverage target exists for the single most-heard asset class in the game.",
"severity": "CRITICAL",
"blocking": "The 5090 handshake DR-AU3 (SFX generation lane) has no volume to plan against, and the Sonniss/BOOM licence-vs-generate split cannot be costed; the Prologue→Ch 13 Gate-1 P3-exit inherits an unsized audio scope.",
"proposed_home": "A counted SFX_BOM artifact (category × enumerated member × node/region/entity multiplicity, deriving straight from §10.2 + the live registry row counts) as rank 8's sibling, with T0_SFX_Registry added to the region-page template's FEED list so a page authoring pass produces rows."
},
{
"index": 3,
"entry_id": "GAP-180",
"merged_into": null,
"name": "Creature and combat vocalization have no category and no column — 150 creature rows carry a full mesh rail and zero audio field",
"vision_rules": "T1_Build_Pipeline_Contracts §10.3 (ADDED 2026-07-15) names T0_Creature_Roster as the Environmental-Ambient input \"for per-region fauna and creature vocalization substrate ... creature vocalization work runs the sound-designer-in-loop track per §10.4.1\". T99_Translation_Audio SFX Step 4 sizes the lane: \"132 creatures × multiple vocalization states (idle, alert, attack, hurt, death at minimum), each requiring actual sound-design craft\" via the Krotos lane; Vol2 DR-AU3 plans it as a drop-in contract.",
"what_exists": "registries/T0_Creature_Roster [DRAFT v0.1]/Sheet1.csv = 150 rows × 54 columns, including the full assetgen rail (mesh_id_ref, mesh_pipeline_type, mesh_tags, generation_status, generation_prompt_hash, last_generated_timestamp, regeneration_trigger, generation_tier) and ZERO audio/vocal column — positive control: the same column scan surfaced sfx/voice columns on 20 other registries. §10.2's six categories contain no creature class and §10.6's column-add list names ten registries, none of them the creature roster. The only creature-adjacent audio rows in existence are two bespoke Ebu Gogo ambient beds (SFX_00029/00030). Corpus-wide zero for non-lexical character effort: \"vocal effort\", \"exertion\", \"grunt\", \"death cry\" return no hits (positive control: \"bark\" returns 12+ hits, all runtime-LLM dialogue text, not vocal SFX); §4.2's Ambient Crowd Voice covers only crowd-level \"battle cries\".",
"delta": "T99_Translation_Audio flags this itself — SFX Step 1's verification block says \"Genuine coverage gap, flagged not patched\" and §4 carries it as spikes 13 and 14 — but the assigned owners are \"Josh / Phase 5M T0_Schema_Dictionary work\" (a retired phase label, absent from the window plan's 30 ranks and from ranks 13-17's data-home mints) and \"Production\" (no such lane). So the largest single labor block in the audio lane has a named flag, no data home, no count and no live owner.",
"severity": "MAJOR",
"blocking": "Every Ch 2-13 creature encounter in the slice (BE_0002's Ebu Gogo stalk already ships with bespoke ambient rows and no creature-voice rows), and any attempt to schedule the Krotos sound-designer lane against real capacity before Gate 1.",
"proposed_home": "A creature_vocalization_sfx_id_ref_array on T0_Creature_Roster plus a seventh §10.2 category (or an explicit routing of creature vocalization under MAGIC_EFFECT/ENVIRONMENTAL_AMBIENT), ruled with the gap-1 schema reconcile so it lands in one column-add pass."
},
{
"index": 4,
"entry_id": null,
"merged_into": "GAP-134",
"name": "The factory contract's chapter axis is audio-silent: 1 audio rider in 70, tooth NONE, and its declared data home is the wrong registry",
"vision_rules": "docs/PRE_5090_BUILD_PLAN.md rank 2.5 mints the FACTORY CONTRACT as \"the per-chapter obligation register ... it answers 'for Ch NN, what must be true?' and makes every rank after it self-wiring\", enforced by gate 30 factory_contract (R2 requires every rider's data_home to resolve to a real registry column, R1 requires every OWNER: line to be covered by a rider).",
"what_exists": "docs/factory_contract.json carries 70 riders. A regex scan for audio|sfx|sound|music|ambien|cue|foley returns 3, of which only FR-039 is audio-substantive: obligation \"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\", status PARTIAL, tooth \"NONE(no per-chapter festival or ambient coverage assertion exists; rank 8 authors the cue table)\", data_home \"registry:T0_Festival_Registry#chapter_range\". The other two are FR-017 (respawn class, incidental \"ambient\") and FR-024 (player strings). No rider exists for per-chapter theme/leitmotif coverage, footstep/foley, creature voices, UI or combat cues, or mix state.",
"delta": "The one rider's data_home points at a FESTIVAL column, so gate 30's R2 passes green while the SFX half of the obligation has no declared home and no tooth. The net effect is that all 14 slice nodes (15 region-legs) can reach freeze with zero audio obligations recorded and the chapter-axis gate still green — and per the story-depth freeze constraint, ranks 13-17 emit their riders at freeze time, so the omission propagates into every schema-freeze rank rather than being caught later.",
"severity": "MAJOR",
"blocking": "harness/emit_chapter_checklist.py output for every Ch 2-13 node right now, and the freeze-time rider emission of ranks 13-17.",
"proposed_home": "Split FR-039 into a festival rider and an audio rider whose data_home is registry:T0_Region_Index#region_environmental_ambient_sfx_id_ref_array (plus a chapter-level rider on T0_Chapter_Index#chapter_sfx_id_ref_array), with the tooth named once a coverage assertion exists."
},
{
"index": 5,
"entry_id": "GAP-181",
"merged_into": null,
"name": "The per-material foley matrix contradicts itself: 5 zone surface values against a 17×5 contract matrix, and zero footstep rows exist",
"vision_rules": "§10.2 Footstep SFX enumerates 17 terrain types (stone, dirt, grass, sand, snow, ice, water-shallow, water-deep, mud, gravel, wood-plank, marble, carpet, leaf-litter, jungle-undergrowth, desert-fine-sand, desert-coarse-sand) × 5 protagonist-state modifiers, and §10.6 gives them a home in T0_Region_Index.region_footstep_sfx_id_ref_array. Vol2 AU-3 (L1275) builds the runtime: \"Footstep-by-surface ... PhysMat→footfall_surface map, placeholder cues per surface\". Gate 20's Audio lane requires a per-zone footfall_surface field.",
"what_exists": "footfall_surface is populated 84/84 zone rows across all 12 slice region pages — with a 5-value vocabulary: stone 29, earth 27, water_edge 14, forest_litter 10, mixed 4. Exactly one token (stone) overlaps the contract's 17; earth/water_edge/forest_litter are near-misses of dirt/water-shallow/leaf-litter, and \"mixed\" is not a material at all — no cue can resolve from it. region_footstep_sfx_id_ref_array is 0/76 and the entry-104 apply record states why: \"footstep empty BY DATA (zero source rows)\" (DESIGN_GAP_REGISTER L1306-1308; ledger 2026-07-28s). The 5-state protagonist-footwear axis has no column anywhere (T0_Equipment_Registry = 1 row).",
"delta": "AU-3 is queued as ENGINE work (FEEL wave) and will ship a PhysMat map over 5 surfaces; nothing in the queue authors the footstep DATA or reconciles the two vocabularies, and no gate compares them — so the game's most frequent sound ships at 5-surface greybox fidelity with a 17×5 contract on the shelf and the divergence invisible. This is the music_mood_tags failure class (79/79 filled, 0/79 real) on a populated column that looks green.",
"severity": "MAJOR",
"blocking": "AU-3 in the FEEL wave, and every traversal capture the QA belt takes on Ch 2-13 zones.",
"proposed_home": "Reconcile the zone vocabulary against §10.2 in the Zone-Catalog column contract (either widen footfall_surface's enum or declare the mapping), retire \"mixed\", and mint the footstep row set as a rank-8 sibling since the source column is already 84/84 populated."
},
{
"index": 6,
"entry_id": "GAP-182",
"merged_into": null,
"name": "Ambience is keyed at region grain with no zone, time-of-day or weather axis — the join sits one granularity above the world that is built",
"vision_rules": "§10.2 Environmental Ambient names day/night pairs explicitly (jungle-day, jungle-night, desert-day, desert-night, steppe-day, steppe-night) plus rain-drizzle/rain-storm as distinct members; §10.6 homes ambience on T0_Region_Index arrays; Vol2 AU-4 (L1278) drives \"ambient-playback slot driven by region_environmental_ambient_sfx_id_ref_array\"; the L1.5 ambient lane and the arc-wide \"no valley may bore the L1 player\" ruling make ambience a felt-quality surface, not decoration.",
"what_exists": "The arrays live on T0_Region_Index (76 rows; 8 populated). The world is authored and built at ZONE grain: 84 Zone Catalog rows across the 12 slice pages, and the Zone Catalog's 18 columns (zone_id, terrain, ambient_threat, vril_density, worldcover_biome, footfall_surface, care_tier, asset_routing, environment_grammar_refs, zone_space_class...) contain no audio reference of any kind. No time-of-day column exists in any registry (positive control: a header scan for time_of_day|night|weather|season across all 62 registries returns exactly one column, T0_Region_Index.weather_cycle_profile, while the control term vril_density returns 3). weather_cycle_profile is 4/76 populated ('monsoon;rain;clear' etc.) with no join to any audio row — SFX_00020 is described in its notes prose as an \"additive intermittent rain layer stacking over any site bed (weather-state driven)\" and nothing keys it to that state. No per-zone bed-count or density target exists anywhere.",
"delta": "Entry 104 closed the empty side of the REGION join and its apply record is explicit that this was the region-level inversion only. Nothing in the queue moves the join to zone grain, adds the diurnal/weather axis the contract's own enum implies, or sets a beds-per-zone density target — so flores' 11 beds versus egypt's 2 is an artifact of which rows happened to be authored, not a measured density.",
"severity": "MAJOR",
"blocking": "Rank 8 as it scales from 4 to 12 slice pages (it authors per-page cue tables against a region-grained home), and AU-4's ambient playback slot the moment a second zone in the same region needs a different bed.",
"proposed_home": "A zone-level ambient reference column in the Zone-Catalog extension contract (the same mechanism that added footfall_surface/care_tier), plus a declared time_of_day/weather state axis on the SFX row so the layer stack is data, not prose."
},
{
"index": 7,
"entry_id": null,
"merged_into": "GAP-141",
"name": "Audio has no data-side tooth in the 34-gate suite, the ten sfx arrays are unenrolled in fk_spec, and 8 of 30 rows are already orphans",
"vision_rules": "The anti-orphan doctrine (every artifact needs a consumer) and the gate-34 E6 precedent — \"UNPOPULATED-IS-A-HARD-FAIL ... the rule that would have caught music_mood_tags reading 79/79 filled while being 0/79 real\" (harness/gates_config.json, gate 34 description). docs/fk_spec.json exists so that \"a mis-named FK fails loudly, never silently\".",
"what_exists": "harness/gates_config.json carries a 34-gate roster; a scan of the whole config returns sfx 0 / audio 0 / sound 0 / cue 0 / ambien 0 hits (positive control: music returns 1, inside gate 34's own description). The only audio touchpoints are gate 20 build_readiness's REPORT-tier Audio lane — which asserts two presence facts only (an S10 cue table with cue_id + track_type, and footfall_surface presence; harness/check_build_readiness.py lane_audio, L313-322) — and gate 25 grand_sage_silence, which polices one row. docs/fk_spec.json enrolls exactly two scalar sfx FKs (telegraph_sfx_id_ref L860, status_sfx_id_ref L889); none of the ten §10.6 arrays is enrolled, so the 22 sfx ids already referenced from T0_Region_Index are unvalidated and any future populate is unchecked. Both-directions check: 8 of 30 SFX rows are referenced by nothing anywhere in the registry layer — SFX_00004, 00021, 00022, 00024, 00025-00028 — and fk_spec's own note at L865 names four of them (\"the four authored chain SFX rows with zero consumers, which is the SFX consumer lane's item\"), while T0_Gather_Node_Registry and T0_Mineral_Registry, the natural homes for the gather-yield and mineral-strike cues, carry no audio column at all.",
"delta": "Vol2 QT-AU (queued, QA-ORG wave) asserts only cue-fired telemetry and a non-silent floor — a runtime check. There is no canon-side assertion that a declared array is populated, that an sfx id resolves, that a cultural_depiction_required row carries a source, or that a row has a consumer. The named \"SFX consumer lane\" has no rank and no owner.",
"severity": "MAJOR",
"blocking": "The next populate — rank 8 or AU-13 — lands unvalidated ids; and the orphan set is live today, so the gather, vril-recharge and ruled pip-meter cues are already authored content nothing can play.",
"proposed_home": "An sfx_coverage gate on the no_dead_end PASS-on-empty scaffold (array-population + id-resolution + consumer-presence + care-source teeth, must-fire/must-not-fire fixtures), plus fk_spec enrollment of the ten §10.6 arrays in the same commit."
},
{
"index": 8,
"entry_id": "GAP-183",
"merged_into": null,
"name": "No loudness or mix doctrine and no audio performance budget exist anywhere — the AAAAA bar has no measurable audio criterion",
"vision_rules": "The AAAAA/Quintuple-A output bar and the 30-year music bar (docs/proposals/MUSIC_COMPOSITION_DOCTRINE.md §0); T1_Build_Pipeline_Contracts §1.7 establishes per-spec-class performance budgeting as the governance model with steam_deck_minimum as the ship-viability floor; Vol2 AU-6 (L1281) builds a SoundClass/SoundMix hierarchy (Master/Music/SFX/Voice/Ambience) with sliders.",
"what_exists": "Corpus-wide zero for every loudness-doctrine term: LUFS, true peak, dialogue anchor, dynamic-range policy, ducking/sidechain — positive control: the word \"loudness\" itself returns 15+ hits across docs/ and _source/, all of them unrelated prose, so the pattern can match; \"SoundMix\" returns exactly two hits, both engine-plumbing items (AU-6, U11.5). §1.7's budget prices triangles, LOD chains, draw calls, material slots and VRAM streaming pools across four spec classes and says nothing about voice count, audio memory pool, compression settings or streaming; docs/ENGINE_OPTIMIZATION_DOCTRINE.md mentions audio only to place the foundry off the player's machine (L650-652). Game-side confirms the hole: HumanityAudioSubsystem.cpp:291-292 \"Music/SFX per-category routing awaits authored SoundClass/SoundMix assets (TODO_CANON)\" and every spawn passes ConcurrencySettings=nullptr (L231). T1_Audio_Spec [DRAFT v0.1] is 34 bytes.",
"delta": "Register entry 102 (DESIGN_GAP_REGISTER L1279-1285) scopes the T1_Audio_Spec authority stub to exactly three things — \"the score's dramatic law, the per-region identity law and the per-realm identity law\" — and window-plan rank 20 scopes the same doc to \"author T1_UI_UX_Spec + T1_Audio_Spec from the shipped W10 HUD + W2 audio spine\". Neither names loudness targets, dialogue-anchored mix, ducking rules, platform loudness compliance, or an audio memory/voice budget. So the mastering standard every imported and generated asset must conform to has no home, while the licensed-library import is already running.",
"severity": "MAJOR",
"blocking": "Benchmark day and any AAAAA feel claim (a QA capture can prove non-silence and nothing about mix), plus the Steam Deck ship-viability floor which is priced for meshes only.",
"proposed_home": "Add a mix/loudness section to the entry-102 T1_Audio_Spec work order (integrated LUFS target + true-peak ceiling + dialogue anchor + ducking policy) and an audio row to §1.7's per-spec-class budget table (voice count, audio memory pool, compression per class, concurrency groups)."
},
{
"index": 9,
"entry_id": "GAP-184",
"merged_into": null,
"name": "Music has no cue, stem or state-transition data home — music_cue_id_ref is an FK to no table, and Appendix S's fix collides on cardinality",
"vision_rules": "MUSIC_COMPOSITION_DOCTRINE §6.9 defines the per-cue deliverable: \"segment stems at 48 kHz with per_stem_role, adaptive_role and motif_carrier_stem; entry and exit cue offsets; post-exit tail rendered separately; transition segments for every modulating pair ... and a state-machine row per transition (source state, destination state, sync-to boundary, transition class)\", and its transition acceptance rubric makes \"every ORDERED STATE PAIR the MusicDirector permits ... a test row. Not a sample; the full permitted set\" fired at three offsets. §6.4 pins the grid contract per SUB-REGION (tempo family, tonal centre, tuning, phrase quantum, max de-escalation latency, entry/exit cues with pre-entry/post-exit).",
"what_exists": "registries/T0_Theme_Registry [DRAFT v0.1] = 14 rows × 28 columns, one row per THEME (12 cardinal_theme + 2 cue_variant after ledger 2026-07-29au). music_cue_id_ref is 0/14 there and 0/16 on T0_Scene_Spec_Registry, and no cue table exists to point at — a listing of all 62 registry directories contains no cue, stem, segment or state registry (the range_id no-target-table class from CLAUDE.md issue 3). There is no sub_region entity: T0_Region_Index is 76 region rows. Appendix S proposes state_id, adaptive_role, motif_carrier_stem, loop_bars, transition_class, entry_exit_offset_ms, stem_group_id and atomic_group as columns ON the theme row.",
"delta": "Ledger 2026-07-29ao records the Appendix-S columns as \"queued as a schema-data item, never auto-applied\" — but a one-row-per-theme table cannot hold many cues per theme, many states per cue, and a row per ordered state pair; the queued fix is a cardinality collision, not a home. Register entry 103's remedy is a doctrine stub (four dramatic rules inside entry 102), also not a home. So the composer-in-loop workflow's own deliverable — stems with roles, transitions, and the rubric's enumerable test rows — has nowhere to land and nothing to count.",
"severity": "MAJOR",
"blocking": "The first composer-in-loop cohort (§7.10) and rank 8's Theme/Scene music columns: the first hero theme's stems, state rows and transition tests have no table, and gate-20's Audio lane will read a cue table whose cue_id resolves to nothing.",
"proposed_home": "Mint a cue/segment table (cue_id PK, theme_id FK, state_id, adaptive_role, motif_carrier_stem, loop_bars, entry/exit offsets) plus a transition table (source_state, dest_state, sync boundary, transition_class) as the Appendix-S apply's real shape, and enroll music_cue_id_ref in fk_spec against it."
},
{
"index": 10,
"entry_id": "GAP-185",
"merged_into": null,
"name": "The ruled full-per-tier presentation program sizes the anim/VFX key space and leaves the audio half unsized and unkeyed",
"vision_rules": "Josh RULED 2026-07-28 fourteenth sitting, OPTION (A) FULL PER-TIER VARIANTS with the band-collapse recommendation OVERRULED: \"the mastery-tier-variant requirement stands at full strength; DR-2 sizes for the full key space (248 live / 372 clamp) and the 5090 asset program plans variant volume as a first-class workload\" (DESIGN_GAP_REGISTER entry 97). §10.2 Magic Effect SFX requires \"vril casting per twelve-tier substrate-perception threshold with audio identity progression across Neophyte through Magus tiers\", and §10.6 homes it in vril_cast_sfx_id_ref_array \"per twelve-tier substrate-perception threshold tier\". Josh's nod: every ability must be beautiful art at every tier.",
"what_exists": "Entry 97's sizing (31 elements × 8 live tier values = 248, 372 clamp) and entry 94's presentation_tier_ref rail are both stated for the animation/VFX variant key only — entry 94's fix is \"presentation_tier_ref on the ability/weapon extension rail\", and ASSET_DROPIN_CONTRACT's eleven-row class table gives audio one row (SFX id → ue_sound_asset_path, L76) with no tier, variant or multiplicity column. On the data side: ability_sfx_id_ref_array 0/185 and vril_cast_sfx_id_ref_array 0/185, and the §10.5 subcategory enum names only 2 of the 12 tiers (VRIL_CAST_NEOPHYTE, VRIL_CAST_ADEPTUS_MINOR) — in a column that does not exist on the live table at all (gap 1).",
"delta": "No artifact multiplies the audio side of the same ladder (abilities × tiers, or the mastery-band mapping ruled at Adeptus-Minor=6 / Magus=12) into a key space, and no resolver rule states how an audio cue falls back down the tier ladder the way entry 94 specifies for meshes/VFX. The ruled variant program therefore plans volume for one half of \"beautiful and fluid\" and silently omits the other.",
"severity": "MAJOR",
"blocking": "The DR-2 clause commit that entry 97 says to apply with, and the 5090 variant-volume workload plan — both are being sized now.",
"proposed_home": "Extend the entry-94 presentation_tier_ref rail and the DR-2 clause to the audio class (id-plus-tier resolver key with ladder fallback) and publish the audio key space alongside the 248/372 figure."
},
{
"index": 11,
"entry_id": "GAP-186",
"merged_into": null,
"name": "Trades, minigames and festivals have no audio surface at all — the craft-loop and festival soundscape the staging rider promises has no column and no category",
"vision_rules": "Factory rider FR-039 obliges every chapter to \"author this chapter's festival windows and the region's ambient and SFX rows as part of the staging pass\"; 10 trades with 120 mastery-gate questlines are core L1 content (COMBAT_PROGRAM_ADDENDUM + CLAUDE.md numerical canon); the L1.5 ambient lane makes festival and market life a felt surface.",
"what_exists": "registries/T0_Trade_Registry [DRAFT v0.1] = 10 rows, zero audio columns; T0_Minigame_Registry = 2 rows, zero; T0_Festival_Registry = 16 rows, zero (column scan; positive control: the same scan found audio columns on 20 registries). §10.2's Foley category enumerates item handling — pickup, wield, sheathe, drop, throw, harness, jewelry, satchel, scroll, page, lock, door, container — and contains no craft or work loop (forge/hammer, loom, kiln, kettle, chisel), and no festival/crowd-ambience class exists on the SFX side (§4.2 routes crowd VOICE to the voice pipeline, which leaves the instrument/procession/market ambience unowned).",
"delta": "This is the exact concept-art \"where are the trades\" shape on the audio axis: the doctrine has a foley category, the plan has a staging rider, and there is no countable trade/minigame/festival audio surface and no column to hold one. Nothing in the queue closes it — rank 23 mints the 120 trade-gate quest rows with no audio obligation attached.",
"severity": "MINOR",
"blocking": "Rank 23 (trade-gate quest rows + the Book-of-Trades data home) and the FR-039 staging pass on each of the 12 slice region pages.",
"proposed_home": "A trade/minigame/festival sfx_id_ref_array on those three registries plus a work-loop member set inside the Foley category, added with the gap-1 schema reconcile so it is one column-add pass."
},
{
"index": 12,
"entry_id": "GAP-187",
"merged_into": null,
"name": "The bank plan lives in code and prose: the library→cue mapping is a hardcoded Python constant and the placeholder provenance sits in a notes blob",
"vision_rules": "T99_Translation_Audio SFX Step 1 requires a per-region bank plan as \"planned T0_SFX_Registry rows\", §2.5 binds \"every generated cue/line/bank binds to an id, never freehand\", and ASSET_DROPIN_CONTRACT's core law is that assets are addressed by CANON ID and never by a content path, with one resolver layer.",
"what_exists": "C:/dev/Humanity/Humanity/Tools/import_audio_assets.py declares itself \"manifest-driven\" in its docstring and then carries the cue→source mapping as two in-file constants (MAPPING + BED_MAPPING, 24 dest_name entries) with the sfx_id written as a trailing code comment; it never reads T0_SFX_Registry. The licensed-source provenance for every placeholder lives in T0_SFX_Registry.notes as prose (\"Sonniss placeholder cat: InMotionAudio - Cave Design\", ×18 rows) rather than in a queryable column, because generation_method/build_asset_path do not exist on the live table. The 28GB/609-file Sonniss library at C:/dev/audio_library is recorded only in a ledger sentence (PRE_5090_BUILD_PLAN L2470). Content/Audio holds 14 uassets. docs/BUILD_PLAN_END_TO_END.md L247 names the missing compose hop — Tools/compose_audio_prompts.py, \"the missing Hop-3 script ... which today has no implementation in either repo\" — with status nothing_buildable_now.",
"delta": "AU-12 landed the importer, so the transport exists; what is absent is the data-driven bank plan the importer should consume, the queryable licence/provenance record the Sonniss no-AI-train fence needs to be auditable against, and the prompt-composer that all three chains' compose hop depends on. None of the three has a rank.",
"severity": "MINOR",
"blocking": "The first at-scale import after rank 8/AU-13 authors rows — the mapping must be re-hand-edited per cue — and any licence-compliance evidence trail for the shipped audio.",
"proposed_home": "Make the importer read the SFX registry (id → ue_sound_asset_path → source_ref) once gap 1's generation_method/build_asset_path columns land, and schedule compose_audio_prompts.py as the shared prompt-composer with the same registry read."
}
],
"world-terrain-interiors": [
{
"index": 1,
"entry_id": null,
"merged_into": "GAP-142",
"name": "Interior space has no class, no data home, and no producing pipeline — while 15 slice zones already specify measured interiors",
"vision_rules": "`T1_Region_Page_Template [ACTIVE v2.0]` §Section 17 (L252-253) declares the required fields as \"environment areas, **interiors**, vegetation palette, NPC population…\". `docs/ROADMAP_POST_5090_TO_SHIP.md` L489 (the factory machinery block) makes it a per-chapter obligation: \"the AMPLIFICATION doctrine applied (reality is the floor: under-sized settlements expanded and **interiors deepened**, guided by the culture's own architectural grammar)\" — ruled by Josh, `docs/PRE_5090_BUILD_PLAN.md` L2069-2086 ledger 2026-07-25k. CVD L25 makes architecture one of the documented materials \"surfaced through gameplay rather than narration\".",
"what_exists": "The demand is already authored: 15 of 84 Zone Catalog rows across the 12 slice region pages carry measured interior footprints inside the single free-text `area_bounds` cell — ethiopia `the_village_debtera` \"the mourning household interior 14×10\"; south_india `wootz_forge_and_herbalists_room` \"two workable interiors ~14×10 each\" and `kerala_kalari` \"treatment room and oil kitchen ~60×45\"; swahili_coast `kilwa_kisiwani` \"market and Sufi-quarter interiors 220×180\" and `dhow_open_sea` \"deck set 45×14 with the rigging traverse above it\"; west_africa `abomey_royal_court` \"the night-court interior 45×35\" and `ile_ife_bronze_city` \"foundry and diviner's-compound interiors 180×140\"; south_africa `witwatersrand_kimberley_workings` \"labor floor 180×120, superintendent's office deck 40×30\"; bali `besakih_mother_temple` \"lontar library interior\". Section 17 prose on the newer pages already names reusable KITS (ethiopia: \"One reusable interior kit on those three names covers the eleven Lalibela churches, the Aksum precinct, and the village church\"; south_india: \"The kalari is the region's one hero interior and it is fully specified\"; west_africa: \"Needs the workshop interior kit, the diviner's compound… the barracoon and ledger-house interiors\"). Nothing structures any of it: a header scan of all 62 registries returns ZERO columns matching interior/indoor/room/building/architect — POSITIVE CONTROL: the same scan did match `impossible_architecture_budget` (T0_Realm_Ruleset_Registry), `architecture` (T0_Research_Corpus_Registry) and `weather_cycle_profile`/`terrain_feature_class_ids` (T0_Region_Index), so substring matching worked. `docs/ASSET_DROPIN_CONTRACT.md` §2 enumerates exactly eleven asset classes and the only environment row is \"Vril-site / prop / environment mesh → T0_Vril_Site_Registry.mesh_id_ref\" — one static mesh per site, no architecture or interior class. `Content/Maps/` holds 9 .umap files, all region or arena (AngkorKhmer, Bali, BorobudurMerapi, FloresIsland, GreyboxArena, LiangBua_TerrainSmoke, PalembangMusi, SamosirToba) — no interior level or sublevel exists. `docs/FACTORY_CONTRACT.md` FR-033 is the only rider that mentions the doctrine and its source column is `doctrine_only:docs/ROADMAP_POST_5090_TO_SHIP.md` with verified-by `NONE(the slope assertion and navmesh continuity teeth are game-repo side)`.",
"delta": "An enterable interior is a real content class with 15 authored instances in the slice and it has no id space, no row, no count, no asset class, no level/streaming home, and no tooth. The countable BOM (how many interior kits and rooms Prologue→Ch 13 needs) cannot be produced from any artifact — the numbers live in one prose cell per zone. Checked the queue: none of the ranked 30 (`docs/PRE_5090_BUILD_PLAN.md` L50-111) owns interiors; a full grep for `interior` across PRE_5090_BUILD_PLAN_VOL2, ROADMAP_POST_5090_TO_SHIP, 5090_SETUP_RUNBOOK, FACTORY_CONTRACT and MILESTONE_BUILD_PIPELINE returns exactly ONE hit, the doctrine sentence above. The register's GTA row lists \"Enterable interior density\" as DIVERGENT-BY-DESIGN (`docs/DESIGN_GAP_REGISTER.md` L214) — but that is a bare one-line verdict about GTA-style AMBIENT urban density, and it is being read as cover for the authored interiors the pages already require.",
"severity": "CRITICAL",
"blocking": "Hits NOW, twice: ranked item 5 (`asset_concept`/`morphology`/`asset_category`/`mesh_tags` across the 15-node slice) must classify assets in a taxonomy that has no interior class; and the Ch 6-13 per-chapter STAGING waves (`PRE_5090_BUILD_PLAN_VOL2` §WS-4+) reach the first interior-bearing region at Ch 7 (wootz forge, kalari) and Ch 8 (Kilwa) with nothing to build against. Also blocks the P2 generative asset waves, which dispatch off registry rows that do not exist for this class.",
"proposed_home": "Mint `T0_Interior_Space_Registry` (interior_id · parent zone_id FK · culture/build-grammar ref · footprint + storey count · enterable|referenced · room/segment count · care_tier · kit_id · the standard assetgen block) + add `interior_authored` to the `zone_space_class` enum + a twelfth asset-class row in ASSET_DROPIN_CONTRACT §2 + one FR rider with a real verified-by; the engine contract belongs in a new `docs/translation/T99_Translation_Interiors.md` or a §Interiors block in T99_Translation_UE5_Build."
},
{
"index": 2,
"entry_id": null,
"merged_into": "GAP-142",
"name": "Below-ground volume is ruled canon, ruled OUT of the terrain pipeline, and certified green by a tooth that cannot see it",
"vision_rules": "Josh RULED, verbatim in `docs/PRE_5090_BUILD_PLAN.md` L2082-2083 (the AMPLIFICATION doctrine): \"caverns/ruins accurate at the mouth then **vaster and more complex below**.\" CVD §3 Component 6 (L92) makes interior volume constitutional: \"**Internal structures** harness vril through resonant geometric-substrate mechanisms\", with the canonical anchors including \"Ch 58 Antarctica (**underground facility**)\". `docs/translation/T99_Translation_Terrain.md` §5 item 1 (D-MPV, Josh 2026-07-21) reserves the 1 m/vertex hero tier explicitly for \"**caves**, boss pockets, ritual grounds\".",
"what_exists": "The terrain chain deliberately rules out the geometry class: T99_Translation_Terrain §2 Step 7 (L180-182) — \"Import target: classic heightfield Landscape, not UE 5.8's experimental Mesh Terrain — real (true XYZ-mesh, **overhangs**, non-destructive modifiers…) but experimental this release\"; §5 item 7 keeps Mesh Terrain as WATCH, owner \"track only\". `docs/pipeline_review/tech_research/GEODATA_TERRAIN_CHAIN.md` L215 states the same: mesh terrain \"can represent overhangs/caves/arches\", and L508 defers it. `docs/ENGINE_OPTIMIZATION_DOCTRINE.md` mentions \"cave systems\" exactly ONCE (L1020) and it is a lighting aside. `T0_Vril_Site_Registry` (42 rows) carries 15 rows whose `site_class` is inherently an interior — pyramid 6, megalith 5, tomb 3, underground_facility 1 — and has ZERO spatial columns (28 columns: site_id…notes plus the assetgen block; its only geometry field is a single `mesh_id_ref`). POSITIVE CONTROL on the zero: the same registry read did return populated `site_class`, `vril_function` and `mesh_id_ref` values, so the columns were readable. `terrain=cave_system` appears on 1 of 84 zone rows (flores `liang_bua_cave`). And the tooth that certifies space is DEM-only: `Humanity/QA/SPACE_AUDIT_FLORES_POSTSCULPT.md` L22 grades `liang_bua_cave | Ch2 | 220x180x60 karst interior | 0.0 | 0.0 | 100% | OK` after the sculpt pass, while L13 discloses \"COP30 is a ~31 m ground sample… a sub-31 m cliff or a graded pad is invisible here\" — the pass measures the slope of the ground ABOVE the cave, and `docs/PRE_5090_BUILD_PLAN.md` L2020 records the fix as \"Liang Bua 21.3°→0.0° with a level cave-mouth terrace replacing the 27° opening\".",
"delta": "There is no vertical/below-grade representation anywhere: no field, no fork ruled, no producer, and no verification. The slice's OPENING playable space is an interior cave and what exists is a flattened outdoor terrace that the space tooth reports as OK — a silent-success failure, the same class as register entry 70. W4.8's `terrain_type`→PCG-template routing (plan L2871, BUILD-NOW) will need a `cave_system` template, and a PCG scatter over a heightfield cannot produce an enclosed volume. Checked the queue: no ranked item, no Vol2 item, and no FR rider owns below-grade space; the only cave hits in either plan volume are the Ch-2 CAVE_BEAR tutorial (Vol2 U11.27) and the terrace sculpt note above.",
"severity": "CRITICAL",
"blocking": "Blocks the Ch-2 AAAAA polish that the JOSH GATE terminates on (Prologue→Ch 13, `CLAUDE.md` model-seats block) — Liang Bua cannot be finished as a terrace. Immediately upstream of that, the geometry fork (Mesh Terrain re-target vs authored mesh-kit/level-instance interiors) must be ruled BEFORE the 5090 asset waves start dispatching architecture, because the two answers imply different asset pipelines. Also blocks Ch 12/13 `blombos_cave` and the Ch-58 underground facility.",
"proposed_home": "A director brief (never bare — alternatives + recommendation per the standing protocol) on the interior-geometry vector, then `below_grade_depth`/`vertical_extent`/`storey_count` on the new interior registry + spatial columns on T0_Vril_Site_Registry, plus a W-SPACE tooth extension: any zone with `terrain=cave_system` or an interior row must assert an interior volume exists, and DEM slope must not be accepted as its evidence."
},
{
"index": 3,
"entry_id": null,
"merged_into": "GAP-142",
"name": "Water is a system nothing owns: two in-slice boss arenas and a live ranked boss mechanic sit on a placeholder plane",
"vision_rules": "Canon stages water as playable space, not backdrop: swahili_coast Zone Catalog `dhow_open_sea` = \"open-water arena ~3 km run, deck set 45×14 with the rigging traverse above it | P1 (the boss set-…)\" and `coral_reef_hazard_zones` = \"reef-crest run ~2.6 km… warded-threshold pocket 120×9…\", gameplay functions \"combat, puzzle, vril_management\", ambient_threat HIGH; angkor_khmer `west_baray` = \"West Baray reservoir ~7.8×2.1 km (earthen dikes ~12 m) + West Mebon island-temple pocket ~100×100 + reversing-flo…\". Ranked item 27 (`docs/PRE_5090_BUILD_PLAN.md` L108) is a LIVE rank whose deliverable is \"CH_05 sub-boss real mechanics (ledger decode, chain meter, **baray-flow strip**)\". 11 of 84 zone rows carry `terrain=water_body`.",
"what_exists": "The build has a placeholder plane and a box: `Humanity/TODO_CANON.md` L395-398 — \"FloresIsland.umap now carries the `FloresOcean` placeholder plane… the **real water pass (actual water system/material, shore interaction) remains open**\"; L638-642 — \"MV-5 — drowning NOT modelled… there is **no air/breath/drowning clock**… A drowning model + the real water system/material/shore-interaction (the 'real water pass') **ride a later item**.\" That later item does not exist: a grep for \"real water pass\" and \"water system\" across all of `docs/` returns only Vol2's MV-5 absence line (L554) and one unrelated SIGNIFICANCE_LENSES mention of Harappan municipal water systems. No Water plugin is enabled (`Plugins/` holds only NeoStackAI). No registry anywhere carries a water column — POSITIVE CONTROL: the 62-registry header scan that returned zero for water/ocean/river/lake/tide/depth in the same pass matched `weather_cycle_profile` and `terrain_permanence_default`, so the scan was live. `SEAM_TYPING_SPEC` covers water only as T2 conveyance (\"the player cannot steer\", §0.2), which is inter-chapter travel and explicitly not within-chapter play.",
"delta": "Water exists as a WorldCover material layer (`*_wc_water.png`) and a swim volume, and as nothing else: no water-body rows, no depth/current/navigability/shore/seasonal-flood data, no breath model, no underwater traversal or camera, no reef/flood-pulse state. A named LIVE rank (27) is scheduled to build a baray-flow mechanic on a reservoir that has no water representation, and the Ch-8 boss set-piece is an arena on open water.",
"severity": "CRITICAL",
"blocking": "Rank 27 hits it as soon as it starts (CH_05 baray-flow strip). Ch 8's P1 boss staging (`dhow_open_sea`) and the reef's high-threat combat/puzzle zone hit it in the Ch 6-13 staging wave. The absent breath/drowning clock also leaves MV-5 shipped in a state where the player swims indefinitely.",
"proposed_home": "Mint the water block as columns on the interior/zone spatial layer or a `T0_Water_Body_Registry` (water_class · depth_band · current · navigability · seasonal_state · shore_type · FK zone_id), open a NAMED plan item for the real water pass in the W4/W-MOVE lane (it is currently owned by a TODO sentence), and route the breath/drowning rule into the ruled death-choice spec (`docs/proposals/systems/DEATH_CHOICE_RUNTIME_SPEC.md`)."
},
{
"index": 4,
"entry_id": "GAP-188",
"merged_into": null,
"name": "The twenty bounded rift dungeons have a full economy spec, zero instance rows, and no spatial vocabulary at all",
"vision_rules": "Ruled roster: `T0_Dungeon_Class_Reference` CLASS A `roster_cardinality` = \"exactly 20 (10 vril pieces + 10 health pieces)\", `per_instance_registry_row` = TRUE (Josh, twelfth sitting — `docs/PRE_5090_BUILD_PLAN.md` L1386-1391). `docs/proposals/systems/RIFT_DUNGEON_SCAFFOLDING_SPEC.md` §3.2 declares \"The rift interior is the invented eleventh register\" and §9 arms T-RIFT-8 \"the interior answerability tooth\".",
"what_exists": "The instance rows do not exist anywhere. POSITIVE CONTROL: an id-shaped scan of `registries/` for `DG_nnn|DUN_nnn|RD_nnn|RIFT_nnn` returns 0, while the identical scan shape for `VS_CHnn_nnn|BE_nnnn` returns 982 hits — the pattern form works, the dungeon id space is unminted. The registry that should hold them is an unresolved fork by its own admission: CLASS A `instance_home` = \"the rift instance run-economy row (**F-1's home**)\", and §6.2/§8 carry F-1 as an open DIRECTOR fork (\"STEP 2, director: rule F-1, F-2 and F-7\"). And the spec contains no spatial grammar: a grep of the full spec for room/layout/floor/chamber/corridor/footprint/geometry/size returns only unrelated uses (the rarity FLOOR, the answerability FLOOR, the chapter FLOOR per locus token) — there is no dungeon footprint, no room or segment count, no depth, no entrance geometry, no art kit.",
"delta": "Twenty authored dungeons and a fifty-piece capacity economy are fully specified as an ECONOMY and completely unspecified as SPACE — nobody can count rooms, size a build, or dispatch an asset. This is distinct from the register's existing dungeon entries, which I checked: entry 46 asks for a GATE vocabulary at sub-site grain, entry 47 for escalation discipline, entry 48 for factory rider rows (`docs/DESIGN_GAP_REGISTER.md` L499-518). None of the three asks for an instance row or a spatial spec, and none is a ranked plan item with an owner.",
"severity": "MAJOR",
"blocking": "Ranked item 21 (between-site traversal, `[canon-author·L]`) hits it first and soon: Fork C ruled the important crossings become real staged or open DUNGEONS (`SEAM_TYPING_SPEC` §0.2 L50), and the slice-scope reconcile scales rank 21 to \"eleven seams instead of two, including the Indian Ocean crossing\" (`docs/pipeline_review/SLICE_SCOPE_RECONCILE_2026-07-27.md` L408-409) — each typed against a dungeon class whose instances have no rows and no size.",
"proposed_home": "Rule F-1 in the same landing that mints the instance registry (20 CLASS-A rows with ids), and put the spatial block in that mint: footprint · segment/room count · vertical extent · entrance zone FK · kit_id, so T-RIFT-8 has an input and the 5090 asset queue has dispatchable rows."
},
{
"index": 5,
"entry_id": "GAP-189",
"merged_into": null,
"name": "\"Not everyone has the same house\" — the built environment has no typology, and the one build-grammar pointer is circular",
"vision_rules": "Josh RULED (`docs/PRE_5090_BUILD_PLAN.md` L2081-2083): \"under-sized settlements EXPANDED into fuller living places **guided by their own cultures' architectural grammar**\", carried into the per-chapter factory at `ROADMAP_POST_5090_TO_SHIP.md` L489. `docs/proposals/systems/base-building.md` §3 (L77) sets the module BOM: \"Trade-crafted modules are the building blocks — walls, roofs, floors, stations, defenses, decor — crafted from the §3.2 material economy.\"",
"what_exists": "`T0_Dwelling_Registry` is a FALSE FRIEND at 2 rows, and both are PLAYER home classes: DW_0001 \"Trade-Home (per trade hub)\" and DW_0002 \"Dwelling-Home (world-home)\", `source_anchor` = base-building.md §trade-homes / §dwelling-homes, `notes` = \"DRAFT anchor\". Its `build_grammar_ref` is EMPTY on both rows. The grammar pointer is circular: `T0_Trade_Registry.shared_build_grammar_ref` = `shared_trade_module_grammar` on 2 of 10 trades (TRADE_01, TRADE_03), and `docs/proposals/systems/WS7_WIRING_BUILD_PLAN.md` L207/L234 declares that token resolves to `T0_Dwelling_Registry.build_grammar_ref` — the empty column. No module, structure, or settlement registry exists (POSITIVE CONTROL: the 62-registry header scan that found `impossible_architecture_budget` and `architecture` found no structure/module/building/settlement column). And the village FK is a phantom: `T0_Chapter_Index.seed_village_ids` reads `[POPULATE→T0_Seed_Registry]` on 59 of 79 chapter rows and `NONE_DEFERRED` on the other 20 — there is no T0_Seed_Registry among the 62 (only `T0_Quest_Seed_Registry`, 0 rows), the same defect class already documented for `T0_Folklore_Entity_Registry` in `docs/proposals/PHANTOM_REGISTRY_ROUTING_FINDING.md`.",
"delta": "Nothing states how many dwellings a settlement has, what types differ by rank/trade/wealth, or which culture's grammar governs them — so the amplification ruling has no countable target and the concept-art finding (\"not everyone has the same house\") has no structured surface to land on even once the art exists. The player-side module BOM (walls/roofs/floors/stations/decor) is prose with no row, and its grammar reference resolves to an empty cell.",
"severity": "MAJOR",
"blocking": "Hits the Ch 6-13 staging waves (7 `urban` + 8 `agricultural` zones need populated settlements) and ranked item 11 (`T0_Persona_Index` + personas on every slice entity, P1 EXIT) which will author villagers whose homes have no type; LW-8 ambient-NPC presence/schedule (Vol2 W-LW3) needs the same houses to schedule people into.",
"proposed_home": "Scope T0_Dwelling_Registry explicitly to PLAYER homes in its own notes, mint `T0_Structure_Registry` (structure_id · culture/region FK · structure_class dwelling|workshop|temple|monument|civic · rank/wealth variant · count-per-settlement · interior FK · assetgen block), give `shared_trade_module_grammar` a real artifact target, and repair `seed_village_ids` to point at a registry that exists in the same commit as its `--emit-baseline`."
},
{
"index": 6,
"entry_id": "GAP-190",
"merged_into": null,
"name": "Weather, sky and time-of-day have drivers queued, a nine-token vocabulary, no effect model, and no per-beat authority",
"vision_rules": "`docs/proposals/systems/environment-combat.md` §4 promotes weather to a first-class combat input — Model B is \"the elemental-affinity matrix (ENHANCE / WEAKEN by element × terrain × **weather**)\" (L24, L81), §4.3 \"Weather as an arena/region cycle\", and §290 asks to \"Author the 69 Region Affinity Profiles… weather tables from climate rows\". CVD L728 carries weather in the Tier-C world state. Ruled valleys-never-boring and the L1.5 ambient lane make time-of-day part of the felt world (`docs/PRE_5090_BUILD_PLAN.md` final-ascent rulings).",
"what_exists": "The token exists and means nothing yet: `T0_Region_Index.weather_cycle_profile` is populated on 4 of 76 rows (`dry;ash;clear` · `monsoon;rain;clear` · `monsoon;ash;clear` · `monsoon;flood_pulse;clear`), all four with `env_profile_status=stub`; the 9-value vocabulary is declared only in `WS7_WIRING_BUILD_PLAN.md` L116 (rain|storm|fog|sandstorm|ash|monsoon|dry|celestial_window|clear). There is NO effect table: `T0_Element_Effectiveness` is 124 rows over exactly 5 columns — `attacker_element, defender_element, effectiveness, attacker_axis, source` — with no environment or weather axis, and ranked item 17 (\"Complete + import the element matrix; lift the 10-element cap; per-enemy weaknesses\") does not add one. And there is no per-beat or per-scene authority: the beat row grammar carries no time or weather field (`docs/spine/CH_08.md` L103 — \"CH08_B01 · seq 1 · role hook · mode traversal · site dhow_open_sea · boss none · fork none\"), and `T0_Scene_Spec_Registry`'s 31 columns contain no time_of_day, lighting or weather field (POSITIVE CONTROL: the same read returned its real `audio_priority_layer`, `mesh_refs` and `cinematic_status` columns). `T0_Chapter_Index.environmental_params` is real prose on 20 of 79 rows and `[POPULATE→T8_Region_Pages Section 17…]` on 59.",
"delta": "Vol2 queues LW-1 (day/night driver), LW-2 (\"Tropical weather driver **consuming the existing Region_Index.weather_cycle_profile token**\") and LW-12 (ws.time_of_day / weather_state keys) at wave W-LW2 — so the CONSUMERS are planned while the authored target does not exist. Ranked item 30 will populate the rail with tokens that carry no gameplay semantics, which lands a decorative weather system. Nothing anywhere can state that CH_02's night descent or CH_08's pre-dawn slip requires a specific time of day, so the QA capture loop cannot fail a scene lit at noon.",
"severity": "MAJOR",
"blocking": "W-LW2 (LW-1/LW-2/LW-12) hits it the moment the drivers are wired — they will read blank or semantics-free data. Rank 30's populate hits it immediately after. The Ch-2 night vril-tell beats and the QA shot-state expectations hit it during the Prologue→Ch 13 polish pass.",
"proposed_home": "An environment-state effect table (weather_state × element modifier / visibility / traversal / stealth / vril-density interaction) as a T0 registry alongside T0_Element_Effectiveness, plus `time_of_day` and `weather_required` fields added to the SPINE_SCHEMA v3 beat grammar (§3b/§3d) and to T0_Scene_Spec_Registry, so the drivers and the capture critics both have an authored target."
},
{
"index": 7,
"entry_id": "GAP-191",
"merged_into": null,
"name": "The Zone Catalog machine columns the terrain and biome pipeline is planned to consume are empty on every zone",
"vision_rules": "The coordinated column pack is the declared cross-lane trunk: `docs/BUILD_PLAN_END_TO_END.md` §Top-3 (L46, L75) — one table add \"flips FIVE lanes from BLOCKED to READY\"; `docs/PRE_5090_BUILD_PLAN.md` T0.2 (L2773) records it DONE for \"7 columns × 27 zones, cited-or-empty\"; W4.8/RM.1 (Vol2 L1183) is the consumer — \"`worldcover_biome` from the Zone Catalog routes the template; explicit fallback so an unseen biome never silently no-ops\".",
"what_exists": "Measured across all 12 slice region pages (84 zone rows): `worldcover_biome` 0/84 filled, `asset_routing` 0/84, `environment_grammar_refs` 0/84, `zone_space_class` present on only 27/84 rows (the 8 Ch 6-13 pages carry a 17-column header without it) and every one of those 27 reads `earth_geo`; `zone_bounds_wgs84` blank on 7 rows (central_africa_congo 5 of 8, rift_valley 2 of 8). POSITIVE CONTROL: the same parse returned populated `meters_per_vertex`, `footfall_surface` and `care_tier` on those rows, so the reader was working. `harness/check_build_readiness.py` L277-278 fails the UE5 lane on exactly this column — \"Zone-Catalog worldcover_biome column (PCG Biome Core / auto-material key)\". The WorldCover rasters themselves exist for the 4 built regions (`Saved/Terrain/*_wc_forest.png`, `_wc_water.png`, …), and `docs/DOC_MAP.md` L320 records the mechanism (`zone_pack --populate-empty` fills worldcover_biome from the W4.5 fetch) — it was never run.",
"delta": "The fetch ran, the writer exists, the consumer is queued, and the column is empty everywhere — so RM.1's \"explicit fallback\" will fire on 100% of zones and every region gets the default biome material. Separately, `DESIGN_GAP_REGISTER` entry 70 records the `zone_space_class` discriminator as \"landed on all 27 live zones\" (L679) while 84 zone rows are live, so the realm/space discriminator and its T-RLM-ZONE tooth are blind to two-thirds of the slice.",
"severity": "MAJOR",
"blocking": "W4.8/F′ (RM.1 biome material, generalized per region) hits it on its first run, and the Ch 6-13 terrain chain hits it at Step 8 (WorldCover → weightmaps → PCG). The 7 missing bboxes block `derive_region_bbox`→terrain fetch for those congo and rift_valley zones.",
"proposed_home": "One all-or-nothing `harness/apply_zone_catalog_columns.py --populate-empty` pass over all 12 pages (worldcover_biome from the existing rasters; zone_space_class extended to the 8 newer pages; the 7 bboxes cited) with `--emit-baseline` in the same commit, and correct entry 70's 27-of-84 arithmetic in place."
},
{
"index": 8,
"entry_id": null,
"merged_into": "GAP-134",
"name": "The chapter axis has no space obligation: interiors, water, weather and dungeon space are invisible to the factory and to gate 30",
"vision_rules": "`docs/FACTORY_CONTRACT.md` §1 states the design: \"The checklist is DERIVED. A rider added here reaches every future chapter automatically… A landing that makes a per-chapter promise declares an `OWNER:` line and a rider row in the same commit. Gate 30 fires the day a promise lands uncited.\" The per-chapter machinery in `ROADMAP_POST_5090_TO_SHIP.md` L477-495 promises interiors deepened, settlements expanded and the amplification doctrine applied on every chapter.",
"what_exists": "70 rider rows. The whole of my lane is three of them: FR-032 (region build through the parameterized terrain and staging drivers, BUILT), FR-033 (the W-SPACE pass — slope audit, arena pads, amplification doctrine, golden paths; source `doctrine_only:docs/ROADMAP_POST_5090_TO_SHIP.md`, verified-by `NONE(...)`), FR-039 (festival windows + ambient/SFX rows). POSITIVE CONTROL that the row set was fully read: the same listing returned FR-001…FR-070 including the class-scoped rows (`class:boss`, `class:hard_line`, `class:rr_node`). No rider keys interiors, dwellings, water, weather/time-of-day, or dungeon space; the only artifact reference for the amplification half is a doctrine URL, and the only executable teeth named are the game-side slope and navmesh assertions — both of which are DEM-surface measurements.",
"delta": "Every gap above recurs on all 79 nodes by construction, because the mechanism built specifically to stop that (\"a promise without a row is an orphan\") has no row for any of them. FR-033 is the shape the audit hunts: it looks covered because a doctrine sentence is cited, while the obligation has no artifact, no count and no verifier. Register entry 48 asks for four rider rows for the rift dungeon economy only (`DESIGN_GAP_REGISTER` L511-518); the space classes above are not in it.",
"severity": "MAJOR",
"blocking": "Hits the next chapter build — `harness/emit_chapter_checklist.py` derives that node's checklist from the contract, so the first Ch 6-13 build silently inherits no interior, water or weather obligation. Every subsequent node repeats it.",
"proposed_home": "Four FR rows in the FACTORY_CONTRACT + `factory_contract.json` mirror (interiors authored per chapter; the region's water bodies typed; weather/time-of-day authored per beat; dungeon space rows for any bounded interior the node opens), each with a real `path:`/`registry:` source and a named tooth rather than `doctrine_only`, landed with gate 30's R1/R2/R3 scan re-run."
},
{
"index": 9,
"entry_id": "GAP-192",
"merged_into": null,
"name": "No lighting or streaming rule exists for enclosed space, and the art bible the doctrine makes a precondition was never written",
"vision_rules": "`docs/ENGINE_OPTIMIZATION_DOCTRINE.md` §3.2 decision 1 (L1014-1020) rules the consequence and names the deadline: MegaLights changes the authoring rule from \"few lights, each cheap\" to \"as many lights as you like, but keep per-pixel light overlap low\", and \"**it must be written into the art bible before the first region is lit**… This is a design unlock for a canon dense with lantern-lit settlements, ritual grounds, vril sites and **cave systems**.\" L1918 repeats the clause.",
"what_exists": "There is no art bible: a grep for \"art bible\" across `docs/` returns only forward-looking references (this doctrine's two clauses, the realm-wave head-of-art-bible notes in DESIGN_GAP_REGISTER L1334/L1746, and the continuo handoff), and a filename search for `*ART*BIBLE*`/`art_bible` returns nothing. Meanwhile four regions are already lit (FloresIsland, Bali, AngkorKhmer, SumatraJava maps with sun/sky/skylight per the W4 ledger, `docs/PRE_5090_BUILD_PLAN.md` L2521-2600). The doctrine's streaming and soak architecture is open-world only: §6.4's soak route is \"one full traversal of the largest authored region… plus one combat set-piece with the densest authored light and VFX load, plus one dwell in the densest settlement\" — no enclosed-space leg — and the World Partition / FastGeo rules (L984, RULE WP-5/WP-7) address actor streaming across terrain, never level instances or interior cells.",
"delta": "The one place \"cave systems\" appears in the engine doctrine is the sentence that makes an unwritten document a precondition of lighting a region — and regions have been lit. Interiors will be the project's highest light-density, lowest-margin spaces (lantern-lit, enclosed, MegaLights-relevant) and there is no authoring rule, no streaming strategy, no perf budget and no soak route that touches them. Checked the queue: rank 20 authors `T1_UI_UX_Spec` + `T1_Audio_Spec` from the shipped surfaces; there is no equivalent ranked item for the lighting/art rule set.",
"severity": "MINOR",
"blocking": "Hits at the first interior build (Ch 7-8 staging) and again at the 5090 beauty pass, where the interior lighting rule set has to exist before generative surfaces are lit; the perf consequence surfaces at the P3 QA loop, whose soak route cannot currently sample an enclosed space at all.",
"proposed_home": "Write the interior/enclosed-space half of the lighting rule set as a section of ENGINE_OPTIMIZATION_DOCTRINE (MegaLights overlap rule indoors, interior probe/GI posture, level-instance vs World-Partition cell decision) and stub the art bible it names so the clause has a target; add an enclosed-space leg with its own `route_id` to the §6.4 soak route. Boundary note: the visual/reference half of an art bible belongs to the concept-art lane — this row claims only the enclosed-space lighting and streaming rule."
}
],
"quest-dialogue-runtime": [
{
"index": 1,
"entry_id": null,
"merged_into": "GAP-133",
"name": "The dialogue TREE has no serializable shape — the pinned DD schema physically cannot carry a node, a six-option slot, or a branch edge",
"vision_rules": "T0_Hard_Lines HL_0039/HL_0040/HL_0041 (authority CVD §17.8, applies_to_chapter_range=universal, status=canonical, pipeline_consumer includes Quest+UE5): \"Every dialogue moment surfaces six options\"; \"All six... fully written and fully voiced. No procedural generation. No template-fill. No placeholder text.\" CVD §10.7 makes this \"the Quest Writing contract for the 30-million-word base game.\" T1_Build_Pipeline_Contracts [ACTIVE v1.0] §6.5 declares the logical model: dialogue_node_array carrying node_id, trigger_anchor_id, dialogue_type (6 members), six_option_array, branch_target_array. Josh RULED D-SIX-OPT 2026-07-17 (docs/spine/DECISIONS_PENDING_JOSH.md L2272): per-slot slot→outcome routing \"RIDES to the dialogue build\" — the dialogue build is the ruled home.",
"what_exists": "Contracts §6.5 'Physical file' clause pins the DD CSV at SIX columns — line_id, speaker_ref, trigger_beat, line_text, condition_expression, loc_namespace_key — then asserts \"The dialogue_node_array and line_variant_array model below is the logical structure this CSV serializes.\" None of node_id, dialogue_type, six_option_array (which of the six slots a line is) or branch_target_array (the tree edges) is a column. On disk: docs/quest_dialogue/ DOES NOT EXIST (Test-Path False, while sibling docs/spine, docs/translation, docs/proposals all list); zero DD_*.csv anywhere (git ls-files quest|dialogue = 42 hits, none a DD file). Engine: no DialogueRow.h among 47 Source/Humanity/Public/Data/*Row.h headers (ClueRow.h, VoiceRegistryRow.h present — positive control), no DT_Dialogue* among 46 Content/Data/Registries/DT_*.uasset (DT_Voice, DT_SideQuestBeat present). Contracts' own deferral list still names \"Dialogue dataset structure including six-option dialogue node format, biography-state-conditional line variants\" as an open item (L1045).",
"delta": "The ruled home for the six-option tree is a flat 6-column line list. A branch_decision node's edges and a six_option node's slot identity are UNREPRESENTABLE in the ratified physical schema, so Josh's D-SIX-OPT deferral lands nowhere. Plan item Q3.1 queues \"create docs/quest_dialogue/ + pinned 6-col DD header\" — which BAKES the defect as data. Needs: a node/edge-bearing schema (node_id, dialogue_type, six_option_slot, branch_target) before any DD file is authored, plus its engine row struct + DataTable.",
"severity": "CRITICAL",
"blocking": "Q3.2 (the six-option SELECTION engine) has no data shape to read; Q3.1 lands the wrong header the moment it runs; every slice-chapter conversation and the Ch 75 maximum-weight deployment (HL_0069) author against it. Hits first at Q3.1, which is BUILD-NOW today.",
"proposed_home": "Amend T1_Build_Pipeline_Contracts §6.5 'Physical file' to a two-file DD shape (DD_<quest_id>_nodes.csv + DD_<quest_id>_lines.csv) or add node_id/dialogue_type/six_option_slot/branch_target columns; mint the matching DialogueNodeRow.h + DT_DialogueNode; run BEFORE Q3.1 creates the directory."
},
{
"index": 2,
"entry_id": null,
"merged_into": "GAP-135",
"name": "Zero quest rows exist for the slice, and Ch 6-13 has no quest-authoring owner anywhere in the queue",
"vision_rules": "The slice is PROLOGUE→CH 13 — 14 nodes / 15 region-legs / 13 region rows, and \"THE EA BOUNDARY — the full slice ships as the Early Access base; no early cut\" (docs/PRE_5090_BUILD_PLAN.md L146-163). CVD §11.1: 22 buckets, Main Story + 10 trades + 12 SQ, each trade/SQ bucket 1M+ words. Contracts §6.2 'Main Story Per-Chapter Quests' requires per-chapter opening/pivot/closing/character-introduction/regional-integration quests.",
"what_exists": "registries/T0_Quest_Definition_Registry [ACTIVE v1.0]/T0_Quest_Definition_Registry.csv = exactly 16 rows (Import-Csv count), every one canonical_hard_line/prologue_baseline/epilogue_resolution at Ch 55, 58, 76, 77, PROLOGUE, EPILOGUE. ZERO rows for Prologue→Ch 13 and zero for Ch 2-54/56-57/59-75. registries/T0_Quest_Seed_Registry [DRAFT v0.1]/Sheet1.csv = 1 line, header only, ZERO rows (positive control: sibling T0_Source_Material_Registry reads 1915 lines by the same method). The Ch 2-5 spike's 25 main quests + 17 SQ stages exist only as proposal prose in docs/proposals/quest_spike/CH_02..CH_05_quests.md (SPIKE_REPORT §3 table). Queue coverage: Q3.1 lands the Ch 2-5 spike; rank 10 types \"264 seeds on the 4 built regions\" (flores/bali/sumatra_java/angkor_khmer).",
"delta": "Ch 6-13 is 8 of the 14 slice nodes and 9 of the 15 region legs, and no ranked item, no WS-3 item and no R-3x item authors a single quest row for them. The whole EA base ships with a quest registry that names no quest inside it. Needs: a Ch 6-13 quest-decomposition rank (the spike method, 8 nodes) plus the Ch 2-5 spike landing.",
"severity": "CRITICAL",
"blocking": "Gate 1 (Ch 2-13 P3-exit, where Josh's verdict directs the fairy realm) and Gate 2 (full-slice exit, opens P4). Blocks the moment the Ch 6-13 region legs start building — the rank-10 rescope rider already records those eight region pages as ON DISK.",
"proposed_home": "A new window-plan rank beside rank 10/15: 'Ch 6-13 main-story quest decomposition + SQ stage rows', reading build/spine_rows/CH_06..CH_13 beats.csv (the beat graph already exists) into T0_Quest_Definition_Registry."
},
{
"index": 3,
"entry_id": null,
"merged_into": "GAP-135",
"name": "87 region-page Section-13 quest seeds on the Ch 6-13 pages are structurally invisible to the housing ledger and its gate",
"vision_rules": "docs/proposals/QUEST_SEED_HOUSING_LEDGER.md header states the governing instruction (Josh 2026-07-22b): \"the seeds and weaves are headed for quest writing and must not be lost. Every proposal-tier seed... appears here exactly once. UNROUTED is the default, so a seed nobody has placed shows up as an open row rather than as silence.\" Gated by harness/check_seed_housing.py in the run_gates.py roster. Contracts §6.5 CG-22 routes region-page seeds to the DEEP_BOOK §7.5 typing step.",
"what_exists": "harness/rag/seed_housing_index.py sources ONLY QUEUE = docs/proposals/quest_seed_queue (L28, L61) and EXR_DIR = docs/book_extractions/EXR_SRC_*.json (L29, L86). The ledger's own count block: \"rows: 400 — 264 queue seeds + 136 weave_links\". The 12 slice region pages carry 187 top-level Section-13 seed bullets (measured per page: bali 31, sumatra_java 39, flores_island 22, west_africa 16, central_africa_congo 17, swahili_coast 12, sri_lanka 10, rift_valley 10, south_india 8, angkor_khmer 8, ethiopia 7, south_africa 7). The eight Ch 6-13 pages carry 87 of those, and quest_seed_queue/ has no shelf for any of the eight slugs (11 shelf files: angkor-khmer, bali, cross-cutting, esoteric, fairy-literary, flores-indonesia, malay-world, rome-italy, sumatra-batak, sumatra_java, vietnam). Positive control: grep -iE 'sri_lanka|south_india|swahili|ethiopia|rift_valley|congo|west_africa|south_africa' over the ledger returns exactly ONE line — a weave_link whose region_ref is 'esoteric' — while 'bali' returns 56.",
"delta": "The one gate that guarantees no seed is lost cannot see the eight Ch 6-13 pages at all, so 87 authored seeds sit outside the ledger's exactly-once contract and outside rank 10's 264-seed scope. The gate will stay green while they rot. Needs: extend seed_housing_index.py's source set to _source/02_Tier_2_Region_Pages/*.md Section 13, re-emit the ledger, and re-scope rank 10.",
"severity": "CRITICAL",
"blocking": "Rank 10's typing pass (the pass that mints Quest_Seed rows) and every Ch 6-13 side-content build; a silent-loss class the repo has already been burned by (memory: silent-data-loss-chunk-id-collapse).",
"proposed_home": "harness/rag/seed_housing_index.py source-set extension + a check_seed_housing coverage assertion that every region page with a Section 13 contributes ≥1 ledger row."
},
{
"index": 4,
"entry_id": null,
"merged_into": "GAP-135",
"name": "The journal (Pillar 6) has a complete state machine and zero content structure — the journal_entry_id space is minted by nothing and the CVD-named template registry has never existed",
"vision_rules": "CVD §5 Pillar 6 — Journal Player-Facing (Gate 6): \"Journal is both plot object (canonical beats: Ch 13 activation, Ch 38 handoff, Ch 57 public release) AND player-readable living artifact\"; executable test — \"Journal voice not the healer's child = pillar violation. Path-variable texture absent = pillar violation. Canonical beats Ch 13/38/57 missing = pillar violation\"; cross-ref: \"T0_Journal_Entry_Template_Registry; T1_Integrity_Paths §8.4 Journal Status Anchors.\" T1_Integrity_Paths §8.4/§8.5 own the anchors and the path-variable texture.",
"what_exists": "The STATE half is fully structured: T0_Worldstate_Variables WS_009 journal_status (9-member enum, consumers journal_renderer/region_page_section_19/Ch59_65 dispatcher), WS_010 journal_entries_unlocked (\"array of journal_entry_id strings\", consumers journal_renderer + save_state_system), WS_011 journal_voice_texture (RICH_WARM/MIDDLE_REGISTER/SPARSE_COLD/DIMINISHING). build/spine_rows/CH_13/beats.csv writes journal_status=ACTIVE_HEALERS_CHILD;local.journal_open=true. The CONTENT half is empty: T0_Journal_Entry_Template_Registry does not exist (0 of the 30 files in _source/00_Tier_0_Master_Indices, 0 of the 62 dirs in registries/ — positive control, the same greps return the three T0_Quest* files/dirs); 'journal_entry_id' occurs exactly ONCE in registries/, inside WS_010's own description cell; docs/factory_contract.json — 70 riders — contains the word 'journal' ZERO times (positive control: 'objective' hits FR-036, 'fail' hits FR-050/FR-063). Adjacent registered work: DESIGN_GAP_REGISTER entry 126 registers the deduction workspace (entry-state enum, evidence back-link, more-here flag) and explicitly prices the assembly-and-voice half as already-registered Q3.6 work.",
"delta": "Entry 126 covers the deduction workspace; nothing covers the entry inventory. There is no table of journal entries, no per-band template rows for Q3.6's \"path-band template selection\" to select, no count model (entries per chapter × 3 path bands × voice texture), and no per-chapter obligation. Ch 13 — the slice's closing beat — activates a Pillar with an empty entry set. Needs: T0_Journal_Entry_Template_Registry (or an equivalent home) + a per-chapter entry bill of materials + a factory rider.",
"severity": "CRITICAL",
"blocking": "Q3.6 Journal system (BUILD-NOW) has nothing to assemble from; VOL2 U11.16's book screens; the Gate-1/Gate-2 slice exit, where Pillar 6's three-clause executable test is applied to a Ch-13-closing slice.",
"proposed_home": "Mint T0_Journal_Entry_Template_Registry per the CVD Pillar-6 cross-ref, with a factory-contract rider (data_home + tooth + consumption) and Ch 13/38/57 as its hard anchors."
},
{
"index": 5,
"entry_id": null,
"merged_into": "GAP-134",
"name": "FR-029, the factory contract's only NPC-dialogue obligation, has no data home and no consumption point — and is mis-pointed at a rank that delivers personas, not dialogue",
"vision_rules": "docs/FACTORY_CONTRACT.md is the ratified per-chapter obligation register (window-plan rank 2.5, landed with gate 30 in the same commit) — it answers \"for Ch NN, what must be true?\" and every rank after it is meant to be self-wiring against it. Rider FR-029, lane canon-author, scope=all (all 79 nodes): \"Author the quest-giver conversations this chapter's quest log then remembers — the NPC dialogue lane is per chapter, not a one-time pass.\"",
"what_exists": "docs/factory_contract.json FR-029: status SEED, data_home = \"NONE_YET(rank 11)\", consumption_point = \"NONE_YET(rank 11)\", tooth = \"critic:does a person say this\" (a critic only, no gate). Window-plan rank 11 is \"Mint T0_Persona_Index + complete personas on every slice entity\" — a persona registry, not a dialogue home. The ratified dialogue home (docs/quest_dialogue/DD_<quest_id>.csv, Contracts §6.5) is not cited by FR-029 at all. Of 70 riders, 11 carry NONE_YET homes (FR-014/016/021/023/029/035/042/061/063/064/067); FR-024 and FR-036 point at the real path:docs/spine/player_strings/*.csv, so the register CAN carry a working home — positive control.",
"delta": "The per-chapter dialogue obligation is unfalsifiable by construction: rank 11 will complete and FR-029's data_home will still not exist, while gate 30's vacuity guard reads the rider as legitimately-pending rather than mis-routed. Needs: re-point FR-029 at the dialogue home once it is schema-fixed (gap 1), and add the missing per-chapter riders — quest rows in T0_Quest_Definition_Registry, journal entries, a fail/no-dead-end path (0 of 70 riders mention 'questline', 'side quest', 'abandon' or 'reward').",
"severity": "MAJOR",
"blocking": "Every chapter the factory builds from rank 2.5 onward runs with no checkable dialogue obligation; the mis-pointer surfaces as a false-closed rider the moment rank 11 lands.",
"proposed_home": "docs/FACTORY_CONTRACT.md + docs/factory_contract.json — re-point FR-029, mint FR-quest-rows / FR-journal-entries / FR-quest-fail-path riders in the same pass."
},
{
"index": 6,
"entry_id": "GAP-193",
"merged_into": null,
"name": "No runtime quest state model, no abandon path, and the no-dead-end tooth cannot see a quest",
"vision_rules": "Contracts §6.5 CG-14 CLOSED added typed fail_state + progression_guarantee \"so the no-dead-end rule and the reward-on-win-and-death rule\" become \"machine-checkable at quest grain.\" CLAUDE.md content bar: killing \"never hard-gates progression (multi-path / no-dead-end)\". ENTITY_PERSONA_SYSTEM §3.4/§3.5: the non-gating invariant is only trustworthy if CHECKED, not asserted.",
"what_exists": "Contracts §6.7's quest_status is an AUTHORING-pipeline state machine (pending → substrate_check → blocked_on_substrate → canonical_question_review → authoring → authored → reviewed → accepted → rejected → regeneration_required) — there is no runtime enum anywhere (offered/active/complete/failed/abandoned). Engine: grep -rniE 'QuestDefinition|fail_state|Abandon|QuestState|JournalEntry|Dialogue' over both Source trees returns no runtime state type — only FQuestDefinitionRegistryRow's FString columns, a QA-watchdog comment and the scene AnchorType string 'dialogue_initiation'. UQuestSubsystem.h's full public API is a BEAT DAG (IsBeatEligible/AdvanceBeat/ChooseFork/CompletedBeats) with no quest object. fail_state and progression_guarantee are 0/16 populated. harness/no_dead_end_scorecard.md: \"Gate: SCAFFOLD-PASS\", \"spine nodes (forward backbone): 79\", \"opportunity/persona layer populated: False\" — it walks T0_Chapter_Index, never a quest row. gates_config.json: 34 gates, none subject to T0_Quest_Definition_Registry.",
"delta": "Rank 15 populates the fail_state/progression_guarantee COLUMNS on the 16 endgame rows; nothing mints the runtime state machine, the abandon/re-acquire affordance, or a quest-grain no-dead-end tooth. A quest that soft-locks is undetectable by any gate today, and check_no_dead_end will keep returning SCAFFOLD-PASS after quests populate because quests are outside its walk. Needs: a runtime quest-state enum + abandon path (engine) and a quest-grain arm on check_no_dead_end.",
"severity": "MAJOR",
"blocking": "Q3.5 (the 22-bucket QuestRuntime + multi-path/no-dead-end validator, BUILD-NOW) and QT-7 fork completability; bites as soon as gap 2's Ch 6-13 quest rows land with reachability nobody can check.",
"proposed_home": "Source/Humanity/Public/Quest/ (a runtime FQuestState + abandon API) + a quest-grain arm inside harness/check_no_dead_end.py, both cited to Contracts §6.5 CG-14."
},
{
"index": 7,
"entry_id": "GAP-194",
"merged_into": null,
"name": "The density model is blind to quests and dialogue — the content-budget vector has no quest axis and no dialogue axis",
"vision_rules": "VOL2 §C: \"The density model is a curve (directive 6)... This scorecard makes the progression/quest budget measurable per chapter.\" QT-19 gates \"content ≥ the chapter-band floor... the SHAPE is monotone-rising early→mid, so a mid-game chapter under the early-game floor fails\" and names \"the thinnest chapter each run.\" VOL2 §C states the target: \"full game ≈100-200 h main / 1-2 k h side+weave.\"",
"what_exists": "VOL2 L1424 QT-17's declared budget vector, read literally: sites (DT_Site 376), beats-by-type (DT_Beat 891), encounters + sub-bosses, forks + options (DT_Fork 90 / DT_ForkOption 305), minigames, weave-links (184), significance-lenses (33), personas (163), threads-woven (664), reputation surfaces, §16 citations (1356). No quest count, no dialogue-node count, no side-quest count. VOL2 §C's per-chapter table columns: quest beats | forks (opts) | scored-interaction beats | ability grants | scene-anchors needed | durable ws.* writes | QT-7 fork paths — main-path beats only. QT-17/18/19 are unimplemented (no content_budget/QT-17 hit anywhere in harness/, Tools/ or QA/; check_slice_scorecard.py also absent per the plan's own positive control).",
"delta": "The instrument that decides whether a chapter is thin cannot measure the two things the quest lane produces. Arming QT-19 as specified would certify a chapter as density-compliant with zero quests and zero dialogue nodes, and the \"1-2 k h side+weave\" target has no countable bill of materials at any grain. Needs: quest-rows-per-chapter, side-quest-rows-per-chapter and dialogue-nodes-per-chapter added to the QT-17 vector BEFORE QT-19 is armed.",
"severity": "MAJOR",
"blocking": "WS-10's QT-17/18/19 build (BUILD-NOW) would ship a scorecard that reports nothing about this lane; the band-sentinel dependency for Ch 6-13 is already a named precondition in the plan.",
"proposed_home": "VOL2 §11.5.5 QT-17 spec amendment + the QT-17 implementation's budget vector."
},
{
"index": 8,
"entry_id": "GAP-195",
"merged_into": null,
"name": "Not one of the 34 gates reads the quest or dialogue lane, and four universal six-option hard lines have no tooth at all",
"vision_rules": "CLAUDE.md verification discipline: \"Trust content, not labels\" and every claim independently audited; the repo's own standing lesson is that a rule not armed is not a rule (memory: noisy-gate-conceals-and-anchor-scoping-defects). T0_Hard_Lines HL_0039/HL_0040/HL_0041/HL_0068 are all status=canonical, applies_to_chapter_range=universal, with pipeline_consumer including Quest. Plan Q3.1 names check_quest_rows.py as a deliverable.",
"what_exists": "harness/gates_config.json carries 34 gates; none takes T0_Quest_Definition_Registry or any dialogue surface as its subject (Quest_Definition is read only incidentally, by check_build_space.py for twelve_tier_gate — recorded in DESIGN_GAP_REGISTER L1143 as 'ARMED-all-blank'). No check_quest_rows.py exists in harness/ (positive control: the harness readily mints per-domain teeth — check_boss_axes, check_counter_class_coverage, check_rarity_firewall, check_ally_build, check_realm_ruleset, check_promise_ledger, check_emotional_curve, check_seed_housing all present). grep HL_0039/HL_0040/HL_0041 across harness/*.py, harness/rag/*.py and docs/factory_contract.json returns zero. T0_Quest_Definition_Registry is not enrolled as a registry in docs/fk_spec.json (it appears only as an FK target).",
"delta": "fk_spec enrollment is queued at rank 15; a CONTENT tooth is not. The strongest hard lines in the lane (six options always, all six authored, no placeholder text) are unenforced, and Q3.1's named check_quest_rows.py sits outside the ranked 30. Needs: check_quest_rows.py in the gates roster, arming the six-option and objectives/fail-state invariants, with must-fire/must-not-fire fixtures per the QA-8 discipline.",
"severity": "MAJOR",
"blocking": "Every quest row and dialogue file authored between now and the gate's arrival is unverified; the cost rises with volume, so this precedes gap 2's Ch 6-13 authoring.",
"proposed_home": "harness/check_quest_rows.py + a gates_config.json entry, cited to Contracts §6.5/§6.7 and HL_0039-HL_0041."
},
{
"index": 9,
"entry_id": "GAP-196",
"merged_into": null,
"name": "The 22-bucket architecture's trade and familiar-bond arcs are wholly unanchored, and only the side-questline half got a ruling and a rank",
"vision_rules": "CVD §11.1: 22 buckets — Main Story + 10 Trade Questlines + 12 Side Questlines — and \"Each Trade and SQ bucket carries 1M+ words at full canonical depth\" summing to the 30M base. CVD §11.3: each trade has exactly one ancient and one modern home-base chapter and \"the Trade Questline opens at the ancient home base, develops cross-chapter, and revisits/transforms at the modern home base.\" Josh RULED FORK J-1 as TWELVE COMPLETE ARCS for side questlines (window plan R-32).",
"what_exists": "registries/T0_Arc_Index [DRAFT v0.1] = 128 rows over 7 classes (22 thread, 60 chain, 21 familiar_bond, 12 side_questline, 10 trade_questline, 2 object_spine, 1 antagonist). Measured: the 10 trade_questline rows carry first_anchor_node, last_anchor_node, resolution_node, promised_beats and depth_grade ALL EMPTY — 0/10 on every one; the 21 familiar_bond rows are 0/21 resolution_node and 0/21 promised_beats. Positive control: side_questline carries 7/12 resolution_node, so the columns do hold values. docs/fk_spec.json records the same finding in its own note: \"5 of 12 side questlines and every trade questline reach no resolution anywhere.\" Queue coverage: R-32 builds the floor for the five never-COMPLETE SIDE questlines only; rank 23 mints the 120 trade tier-gate ROWS; rank 18 bundles the 5 trade chapter pins as a Josh brief.",
"delta": "The identical machine-derived finding — no resolution anywhere — produced a ruling and a rank for side questlines and nothing for the 10 trade questlines or the 21 familiar-bond arcs. Rank 23's 120 gate rows are the tier ladder (quest_type trade_questline_tier_progression); the questline ARC spine and the trade_questline_home_base half have no owner. Needs: a J-1-equivalent disposition for trade + familiar-bond arcs and an arc-spine build rank beside R-32.",
"severity": "MAJOR",
"blocking": "Rank 23 (120 trade-gate rows) would author gates hanging off arcs with no anchors; gate 32 / check_arc_continuity and check_promise_ledger read these rows today and cannot assert anything about 31 of 128 arcs.",
"proposed_home": "Extend R-32 to 'the questline floor build' across all three bucket families, or mint R-33 for trade + familiar-bond arcs; write through T0_Arc_Index/T0_Arc_Grid as R-32 does."
},
{
"index": 10,
"entry_id": "GAP-197",
"merged_into": null,
"name": "Five side-bucket quest_types are declared with no reference point on the entity side — 72 weapons, 13 schools and 184 link edges have nowhere to name their quest",
"vision_rules": "Contracts §6.5 quest_type is a ratified 21-member enum including weapon_bond, familiar_bond, familiar_father_reunion, school_curriculum, folklore_combat, grimoire_link and seed_defense. §6.2 'Regional Quest Set' requires \"School curriculum quests per T0_School_Registry... Grimoire link quests cross-referencing vril sites... Seed defense quests per T0_Quest_Seed_Registry.\" Locked numerical canon: 72 weapons, 22 familiar slots, 33 legendary species, 12-tier mastery / 120 quest gates (CLAUDE.md).",
"what_exists": "T0_Weapon_Registry [DRAFT v0.1] = 72 rows, 22 columns, and NO bond/quest/gate column of any kind (columns are weapon_id…presentation_tier_ref; positive control — the same read shows T0_Familiar_Registry DOES carry bonding_quest_id and bond_formation_beat_ref). T0_School_Registry = 13 rows, 15 columns, no curriculum-quest column (gate_administration is an administration field). T0_Cross_Cultural_Link_Graph = 184 rows, zero columns containing 'quest'. T0_Familiar_Registry bonding_quest_id populated 0/22. T0_Questline_Index = 23 rows (12 SQ + 10 trade + 1 legendary) and the single legendary row is LEG_WPN_036 with name 'UNRESOLVED'. T0_Quest_Seed_Registry = 0 rows, so seed_defense has no target either.",
"delta": "The enum supplies vocabulary the entity registries cannot point back at, so a weapon-bond or school-curriculum quest can never be joined to its weapon or school even after the quest row exists. Rank 26 fills 'weapon damage_type/vril_couple 0/72, familiar↔creature bonds' — creature_ref, not bonding_quest_id — and rank 14 mints the §§7-12 data homes, none of them a quest hook. Needs: bond/curriculum/link quest-ref columns on Weapon, School and Link_Graph, and bonding_quest_id population on the 22 familiars.",
"severity": "MAJOR",
"blocking": "Rank 23 and any weapon/familiar/school questline authoring; and the FK edges cannot be registered in fk_spec at rank 15 because the columns do not exist to register.",
"proposed_home": "Contracts §6.6 'Per-Registry Quest Column Adds' — add the columns via harness/apply_t03_extensions.py, then enroll them in docs/fk_spec.json in the same commit as rank 15."
},
{
"index": 11,
"entry_id": null,
"merged_into": "GAP-133",
"name": "The 164-character and 64-operative speaking cast carries no dialogue_dataset_ref and no voice_signature_ref FK — the two columns two ratified pipelines declare as their halt conditions",
"vision_rules": "Contracts L152: \"T0_Character_Index Session 5K target. UE5 minimum-viable adds at populate — ue5_npc_actor_class_ref, behavior_tree_class_ref, dialogue_dataset_ref, mesh_id_ref, voice_signature_ref\" (L150 says the same for T0_Antagonist_Network_Registry). §4: \"ElevenLabs voice generation halts on missing dialogue dataset for any entity flagged as speaking in the build manifest\"; \"UE5 build pipeline halts on missing voice_signature_ref for any entity flagged as required-voice.\" §4 L922 pins voice_signature_ref as an FK to T0_Voice_Registry.voice_id.",
"what_exists": "T0_Character_Index [ACTIVE v1.1] = 164 rows, 33 columns: character_id…decay_stage. It carries voice_signature_notes (free text, populated 164/164) but NO voice_signature_ref, NO dialogue_dataset_ref, NO behavior_tree_class_ref, NO ue5_npc_actor_class_ref. Positive control: mesh_id_ref, mesh_pipeline_type, generation_status and presentation-lane columns DID land on the same registry, so the column-add mechanism works — the AssetGen half of that same declared set landed and the dialogue/voice half did not. T0_Antagonist_Network_Registry = 64 rows, 19 columns, no voice or dialogue column at all. T0_Voice_Registry = 23 rows (10 row_class=tts_casting + 13 row_class=cultural_register), so the FK target exists and is populated. Demand measured from the spine: 86 distinct actor tokens across the 14 slice nodes, 206 across all 79; 66 of 450 scene rows carry a dialogue anchor_type.",
"delta": "228 speaking-candidate entities, a populated voice registry, and no edge between them — so the declared halt conditions can never fire and 66 dialogue-anchored scene rows have no bindable speaker asset. Rank 15 covers Quest_Definition's execution columns only; no rank covers the Character_Index/Antagonist_Network dialogue-and-voice column adds that Contracts declares 'at populate'. Needs: the four declared columns, plus voice_signature_ref FK enrollment.",
"severity": "MAJOR",
"blocking": "CN5.4 participant resolution and the ElevenLabs per-line lane (DR-AU2); Q3.9's persona-voice dataset collector has no per-entity voice key to accrete against.",
"proposed_home": "Contracts §6.6 / §4.6 column adds applied through harness/apply_t03_extensions.py, with the voice_signature_ref edge landed in docs/fk_spec.json."
},
{
"index": 12,
"entry_id": "GAP-198",
"merged_into": null,
"name": "Both DOC-authority homes for the quest lane are empty: the ten T5 questline docs are 2-line title stubs, and the quest pipeline is the only one of seven with no Translation Doc",
"vision_rules": "CVD §11.5: \"Per-bucket detail (specific SQ canonical structures, Trade-by-Trade canonical structures, Main Story chapter-by-chapter beats) → T5 detailed questline docs\" — CVD names T5 as the authority for all 22 buckets' actual structure, each sized at 1M+ words by §11.1. The Translation Docs are \"the §0 runtime layer the contracts always deferred — the concrete schema→engine realization chains\" (DOC_MAP L103); plan Q3.1 names T99_Translation_Quest as a deliverable.",
"what_exists": "All ten files in _source/05_Tier_5_Questlines/ are 2 lines each (title + blank): Main_Story_Spine_Detailed, Side_Questlines_Detailed, Trade_Questlines_Detailed, School_Curriculum, Folklore_Combat, Grimoire_Link, Legendary_Weapons, Familiar_Bond, Seed_Defense, Questlines_Master_Summary — 20 lines for the entire tier. docs/CORPUS_SWEEP.md row 5 records it: \"All ten are 48-53-byte title-only stubs. The entire T5 questline tier is unauthored.\" No live window-plan rank names T5. Separately, docs/translation/ holds exactly six docs — T99_Translation_AssetGen, _Audio, _Cinematic, _Combat, _Terrain, _UE5_Build — and NO T99_Translation_Quest (positive control: the six siblings all list); DOC_MAP L103 calls that roster \"COMPLETE.\"",
"delta": "The lane's design authority (T5) and its schema→engine runbook (T99_Translation_Quest) are both absent, while every other pipeline has its Translation Doc and the 2026-07-19 readiness audit treated a missing Translation Doc as a WALL when it was Combat's. Rank 23 and R-32 fill fragments of T5's job; nothing owns the tier or the runbook. Needs: T99_Translation_Quest authored (the seventh doc, the same shape as _Combat), and a T5 population owner or an explicit supersession note routing T5's job to the arc registries.",
"severity": "MINOR",
"blocking": "Q3.1-Q3.9 have no runbook to build against, so each engine item re-derives the schema→runtime chain; hits at the first WS-3 engine increment after gap 1's schema fix.",
"proposed_home": "docs/translation/T99_Translation_Quest.md (mirroring _Combat's shape) + either a T5 population rank or a DOC_MAP-rowed supersession declaring T0_Arc_Index/T0_Quest_Definition_Registry the live authority in T5's place."
}
],
"animation-cinematics": [
{
"index": 1,
"entry_id": null,
"merged_into": "GAP-140",
"name": "No cinematic bill of materials: 450 scenes exist, nothing counts, sizes, tiers, or budgets them",
"vision_rules": "ROADMAP_POST_5090_TO_SHIP.md §P2.7 \"Movie cinematics\" exit = \"the slice's cinematic events render as real rendered cinematics over the scene-anchor runtime; MRQ dailies read by critics and sent to Josh\". T99_Translation_Cinematic §3 routes 7 scene categories (Canonical Set Pieces, Boss Encounter Cinematics, Special Asset Class bookends…) through a director-in-loop vs autonomous two-track workflow. The AAAAA/box-office bar makes cinematic volume a first-class production workload.",
"what_exists": "build/spine_rows/*/scenes.csv = 450 data rows across 79 nodes (5-8/node; census: per_chapter_cutscene 210 · boss_encounter_resolution 91 · canonical_set_piece 38 · branch_decision_point 32 · boss_encounter_intro 29 · ambient_cinematic 21 · phase_transition 15 · epilogue 5 · prologue 4 · architect_appearance 3 · convergence_node 2), 8 columns, NONE of them duration, shot count, complexity, or production tier. T0_Scene_Spec_Registry = 16 rows only (chapters 55/58/76/77/PROLOGUE/EPILOGUE — zero slice rows except the Prologue), cinematic_status='pending' 16/16, scene_spec_ref 0/16, mesh_refs '[]' 16/16. QT-17's content-budget vector (PRE_5090_BUILD_PLAN_VOL2.md §11.5.5) counts sites/beats/bosses/forks/minigames/weaves/lenses/personas/threads/citations and NOT scenes. ZERO-POSITIVE-CONTROL: grep -riE \"cinematics per chapter|scenes per chapter|cinematic (count|budget|minutes|runtime)|minutes of cinematic|cutscene (count|budget)\" over docs/ = 0 hits while \"per chapter\" returns 123 files; grep -i \"duration|minutes|shot count|seconds\" over T99_Translation_Cinematic.md = 0 hits while the same file returns 9 \"facial\" hits.",
"delta": "The lane has a pipeline procedure (T99_Translation_Cinematic §5's 11-step per-region checklist) and zero arithmetic. Nobody can say how many cinematics Ch 7 needs, how many shots or seconds each is, which get the director-in-loop track vs autonomous lock, or what the 79-node total costs. Rank 6 populates the region-page scene index (scene_type/participant_refs/beat_ref) — it does not add a count, a duration, a shot estimate, or a production-tier column, and T0_Scene_Spec_Registry's 434 missing rows are outside its stated scope.",
"severity": "CRITICAL",
"blocking": "P2.7 cannot declare an exit it cannot measure, and P5 — the 60-plus-chapter factory (ROADMAP_POST_5090_TO_SHIP.md lines 471-562) — has ZERO cinematic/cutscene/animation mentions against 27 \"chapter\" mentions (positive-controlled), so the factory that builds the remaining 65 chapters carries no cinematic lane at all. Hits first at the Ch 2-13 slice build, now.",
"proposed_home": "A cinematic BOM pass minting scene_shot_count / scene_duration_class / production_track (director_in_loop|autonomous) / cinematic_tier on T0_Scene_Spec_Registry, plus the 434-row scatter from build/spine_rows; a new QT-17 census dimension for scenes; a P5-factory per-chapter cinematic lane row beside the existing player-strings / clue / non-kill / ambient-SFX lanes."
},
{
"index": 2,
"entry_id": null,
"merged_into": "GAP-140",
"name": "Animation has no data home anywhere: 0 of 1,415 registry columns, and the RULED twelfth DR-2 class was never landed",
"vision_rules": "STACK_CONFLICT_ADJUDICATIONS_2026-07-29.md C-13 RULES it: \"ANIMATION's `Animation / montage` row (keyed ability_id + presentation_tier_ref) takes DR-2 ordinal 12\", with PC-5 ruled canon-row-authoritative. PIPE_ANIMATION_2026-07-29.md §3 states the requirement as \"A twelfth §2 row… drop path /Game/Animations/<class>/AM_<ability_id> | path takeover | tooth = the PC-5 notify-vs-row check\".",
"what_exists": "docs/ASSET_DROPIN_CONTRACT.md §2 carries ELEVEN asset-class rows (Named-NPC skeletal, boss/creature mesh, weapon mesh, vril-site mesh, material, SFX, VO, music, VFX, Cinematic scene, HUD art skin). ZERO-POSITIVE-CONTROL: grep -ci \"animation\\|montage\" on that file = 0, while grep -n \"^| \" on the same file returns the 11 class rows and 7 rung rows. Registry-wide: a scan of all 62 registry CSVs / 1,415 columns for anim|montage|mocap|keyframe|lip|viseme|facial|shot|camera|perform returns 2 hits, both `duration_class` (ability + status-effect duration, unrelated); the same scan for mesh|generation returns 65 columns. Game side: 309 uassets in Content/, exactly ONE animation asset (Characters/Mannequins/Anims/Unarmed/ABP_Unarmed.uasset), no Cinematics dir, zero AnimMontages; HumanityAttackLibrary.h:66-72 carries WindupSeconds/ActiveSeconds/RecoverySeconds as bare floats with no montage or notify field.",
"delta": "A ruling exists with no landing vehicle. C-13's own consumers list names the routing table, the install manifest, the night list, the firewall table, the scheduler spec and THE LICENCE SCHEMA COMMIT — the DR-2 twelfth row is not among them, so nothing is queued to write it. Consequence: every animation asset request, every dispatch query, and every write-back has no id, no path convention, no status column, and no resolver key on disk.",
"severity": "CRITICAL",
"blocking": "The 5090 animation lane's autonomy contract (PIPE_ANIMATION §4) dispatches by \"a script emits rows where generation_status='pending' on animation-bearing ids\" — there are no animation-bearing ids. Blocks the first overnight anim batch and the first montage import; must land before the DR-2 clause commit / Batch 0 or it retrofits across twelve registries.",
"proposed_home": "ASSET_DROPIN_CONTRACT.md §2 twelfth row + the generation_* / asset_licence_ref column family on the ability, weapon, character, creature, boss and scene registries via Batch 0 (one fidelity re-emit), with C-13 cited as its ratifying ruling."
},
{
"index": 3,
"entry_id": "GAP-199",
"merged_into": null,
"name": "The ruled 248/372 sizing is the VFX element×tier space; the ANIMATION variant BOM is uncounted and undersized by up to ~6×",
"vision_rules": "Josh RULED OPTION (A) FULL PER-TIER VARIANTS, band-collapse OVERRULED (DECISIONS_PENDING_JOSH.md fourteenth sitting; \"every spell and ability and movement needs to be beautiful and fluid art\" at full strength). COMBAT_PROGRAM_ADDENDUM.md §5 defines the variant unit as \"each ability family… per-mastery-TIER presentation variants (animation refinement, VFX density/control, audio confidence, follow-through polish)\" PLUS \"weapon moveset fluidity scales the same way via the per-weapon mastery track\". C-13 sets the animation resolver key = (ability_id, presentation_tier_ref).",
"what_exists": "The sized number is element-keyed: DESIGN_GAP_REGISTER.md:1236 \"the live key space is 31 elements by 8 live tier values = 248, with 372 the clamp ceiling\" — verified against the live registry (T0_Ability_Tree_Registry `element` = exactly 31 distinct values incl. hybrids and Ether-Crown). ASSET_DROPIN_CONTRACT.md:296 sizes the contract on that number. The animation axis is a different, larger space and is uncounted: 185 ability rows, `ability_class` 53 distinct, T0_Weapon_Registry 72 rows with `weapon_subclass` 11 distinct → 185×8 = 1,480 / 424 / 576 / 88 depending on the grain, and no doc picks the grain. presentation_tier_ref is declared and EMPTY on both rails: 0/185 abilities, 0/72 weapons (positive control: tier_numerical 185/185, cast_pattern 185/185 in the same file). PIPE_ANIMATION_2026-07-29.md's honest-supply statement calls 248/372 \"the presentation ladder keys\" that stay hand-tuned UE craft — folding the animation axis into the VFX count.",
"delta": "The DR-2 contract, the 5090 workload plan, and the animation dossier all cite one number that only covers per-element effect systems. The per-ability and per-weapon-moveset animation variant sets the ruling actually demands have never been enumerated, so the largest hand-craft workload in the project is sized by the wrong denominator.",
"severity": "MAJOR",
"blocking": "Rank 13's ability data pass writes ONE presentation_tier_ref per row — a single column cannot express a per-tier variant SET, so rank 13 will close green having populated the rail without creating the BOM. Blocks the DR-2 clause commit's sizing claim and the 5090 variant-volume schedule.",
"proposed_home": "A variant-key manifest (one row per authored (canon_id, tier) key, per the ruling's \"the live variant key must be AUTHORED, never synthesized\") with separate ANIM and VFX axes and a declared family grain; register entry 97 amended with the second arithmetic; ASSET_DROPIN_CONTRACT.md:296 corrected to name which axis 248/372 sizes."
},
{
"index": 4,
"entry_id": "GAP-200",
"merged_into": null,
"name": "Mocap-vs-keyframe routing has no owner, no ruling, and no column — the Animation Pipeline Contract is a named deferral to nobody",
"vision_rules": "T99_Translation_Cinematic §4 item 9 records the deferral and its owner verbatim: \"Animation Pipeline Contract deferral | Before any cinematic participant needs body-performance content beyond retargeted stock motion | Whoever scopes the deferred Animation Pipeline Contract | Contract §1.2 and §5.11 both defer animation-content generation (mocap/keyframe/generative) out of scope here\". Item 2 defers \"Bespoke hero-beat performance capture (facial/body)\" to owner \"Production/animation\". PIPE_ANIMATION's own supply statement: generation CANNOT supply hero beats or ladder keys — those \"stay hand-tuned UE craft\".",
"what_exists": "Two unowned seats and one research dossier. PIPE_ANIMATION_2026-07-29.md is explicitly pre-canon (\"Nothing here is repo canon until the director lands it\") and routes by LANE CLASS (unattended bulk traversal/idle/ambient · attended for care-gated ids, hero beats, ladder keys), never per item. No registry column routes an id to generated / studio-mocap / hand-key / Cascadeur-assisted (the 0-of-1,415 scan above). The ranked queue's 30 items + R-31/R-32 contain no animation item; the animation lane appears in the plan only as C-3/C-4 install staging (\"ARDY + Kimodo BOTH staged with primacy benchmark-decided\", ledger 2026-07-29al).",
"delta": "The lane that decides HOW every motion asset is made — and therefore what it costs and who touches it — is a deferral pointing at a role that does not exist, plus a dossier with no landing rank. The routing decision also has no per-item expression, so even once ruled it cannot be recorded against an id.",
"severity": "MAJOR",
"blocking": "Blocks CN5.4 participant body-animation and every Canonical Set Piece scene (\"before any cinematic participant needs body-performance content beyond retargeted stock motion\"), and blocks the benchmark-day A/B question 3 (\"does Bones-Rigplay-trained output produce anything usable for stylized combat motion\") from having a decision surface to write into. Hits at the first slice cinematic and at benchmark day.",
"proposed_home": "Land PIPE_ANIMATION as a T1/T99 Animation Pipeline Contract with an explicit per-item routing enum (`animation_source`: stock_retarget | generated | studio_mocap | hand_key | cascadeur_assisted) on the twelfth DR-2 class's column family; assign the owner seat in the ranked queue."
},
{
"index": 5,
"entry_id": "GAP-201",
"merged_into": null,
"name": "Facial and lipsync: the mechanism is named, the cast count and the data home are absent",
"vision_rules": "T99_Translation_Cinematic Step 2 makes it a solved lever and says so: \"Facial performance for dialogue beats drives from MetaHuman Animator's audio-driven mode — feed a SoundWave, get facial animation\", with \"dialogue-beat participants additionally wired to the audio-driven facial pipeline\". ROADMAP_POST_5090 §P2.7 exit: \"the audio-driven facial mode drives dialogue beats against real voice tracks\". §4 item 2 carves out bespoke non-audio-driven hero capture as still-open.",
"what_exists": "No facial data home and no count. T0_Voice_Registry = 23 rows / 19 cols (voice_id, voice_substrate, voice_clone_status, recurrence_anchors, cinematic_anchor_array, elevenlabs_voice_id_ref, ue_sound_asset_path…) with no facial, viseme, lipsync, line-count or duration column — ZERO-POSITIVE-CONTROL: the same regex (lip|facial|anim|emot|perform|line|duration|length) matched `hard_line_relevance` in that file, so the scan was live. T0_Character_Index = 164 rows / 33 cols with mesh_id_ref 0/164, ue_asset_path 0/164, and no facial/rig/metahuman column (only `mesh_pipeline_type`, itself 0/164). Per-line dialogue substrate absent: Vol2 CN-4's absence-proof \"no DialogueLineRow.h in game Source, per-line text substrate unbuilt\", and build/spine_rows/CH_NN/ carries beats·boss·clues·fork_options·forks·scenes·sites·sq — no dialogue file. CN5.8/CN5.9 build ONE MetaHuman plus a coefficient-sampling batch harness against that 164-row cast.",
"delta": "Nothing states how many characters need a facial-capable rig, how many dialogue lines need lipsync, or which scenes are facial-bearing at all — and 66 of the 450 scene rows carry anchor_type `dialogue_initiation`, so the requirement is already countable and uncounted. The bespoke-hero-capture case has an owner string with no seat behind it.",
"severity": "MAJOR",
"blocking": "Blocks CN-4 dialogue scene presentation and P2.7's stated exit; also blocks the MetaHuman batch throughput spike (§4 item 1) from having a roster size to test against. Epic sunsets the browser MetaHuman Creator 2026-11-05 (§7 CN5.8), which puts a hard date on the rig-count decision.",
"proposed_home": "A facial-bearing flag + rig class on T0_Character_Index and a facial_performance_mode + line-count rail on T0_Voice_Registry, sized off the 66 dialogue_initiation scene rows; the bespoke hero-beat capture seat named in the ranked queue."
},
{
"index": 6,
"entry_id": "GAP-202",
"merged_into": null,
"name": "CN5.2 — the camera-language deliverable — is the one CN item the live plan never mentions; the shot grammar has no doc, no script, no rank",
"vision_rules": "PRESENTATION_DOCTRINE.md §1 draws its own boundary: \"TD_CINE §3 Step 4 states plainly that camera blocking, timing, and cut rhythm are not in the scene schema and come from the scene_type template — this doc is the input to those templates, not a competing schema\". §6 Consumers: \"`T99_Cinematic_Shot_Grammar` (unauthored) — inherits §3 as its cut-rhythm section\". PRE_5090_BUILD_PLAN.md §7 CN5.2 = \"T99_Cinematic_Shot_Grammar (11 scene_types) + 11 LS_TPL_* templates via build_shot_templates.py\" with \"Camera blocking/cut rhythm live in the template, NOT the schema\".",
"what_exists": "The doctrine ruled the CUT POLICY and continuity (CC-1..CC-10, four treatments, CP-0 precedence) and stopped exactly where shot language begins. The successor exists nowhere. ZERO-POSITIVE-CONTROL (three ways): (1) `find _source -iname \"T99*\"` returns 10 T99 docs, none named Cinematic_Shot_Grammar, and the name appears only in 4 planning docs as a consumer; (2) PRE_5090_BUILD_PLAN_VOL2.md — the live spec home for the AV layer per Vol1's own pointer \"§7 WS-5 + §8 WS-6 → Vol2 §7\" — references CN5.1 ×2, CN5.3 ×4, CN5.4 ×1, CN5.5 ×4, CN5.6 ×14, CN5.7 ×2, CN5.8 ×3, CN5.9 ×3, and CN5.2 ZERO times; (3) build_shot_templates.py is absent from the game repo's Tools/ (positive control: 40+ scripts present there, including import_audio_assets.py and the whole terrain/staging chain). Meanwhile 32 branch_decision_point scene rows already carry an off-enum scene_type with no template (PRESENTATION_DOCTRINE §3.5/§5).",
"delta": "Rank 19 delivered the brief it promised (\"precedes CN5.2 template bake\") and CN5.2 then fell out of the live plan when Vol2 took over the AV layer. So shot size, lens language, coverage, blocking, eyelines, and camera movement grammar — the actual vocabulary a box-office bar is judged on — have no home, no owner, and no rank, while the templates they feed are the only place cut rhythm is allowed to live.",
"severity": "MAJOR",
"blocking": "Blocks the 11 LS_TPL_* template bake, and therefore CN5.3 assembly and every per-region cinematic batch (T99_Translation_Cinematic §5 step 4: \"confirm every referenced scene_type already has an authored template\"). Hits the moment the first slice scene is assembled rather than played as a greybox card.",
"proposed_home": "Author T99_Cinematic_Shot_Grammar as the camera-language sibling of the ruled cut policy (inheriting PRESENTATION_DOCTRINE §3 verbatim), and restore CN5.2 + build_shot_templates.py as a numbered rank with the 32 off-enum rows resolved in the same pass."
},
{
"index": 7,
"entry_id": "GAP-203",
"merged_into": null,
"name": "The QA belt has zero animation or cinematic teeth, and the montage tooth's id collides with an existing harness",
"vision_rules": "The standing visual-verification directive: no play-quality claim ships without its critic-read capture. PIPE_ANIMATION §3 makes it explicit for this lane — \"QA gate: QT-5 (notify tolerance) + QT-6 (readability at 5 presets) + an image/video-critic capture read… no animation quality claim ships without a capture behind it\". C-13 requires \"the QT-5 divergence check ships as a must-not-fire fixture before the first montage imports\".",
"what_exists": "ZERO-POSITIVE-CONTROL on the harness roster: PRE_5090_BUILD_PLAN_VOL2.md §11.5.8's QT-1..22 table (lines 1452-1478) contains \"anim|cinemat|scene\" 0 times against \"harness\" 8 times. The id is already taken: Vol2 line 1460 defines QT-5 as \"Combat-invariant harness (→ QA-3)\" over DT_BossEncounter/DT_BossPhase — so PIPE_ANIMATION §3, C-13, and DESIGN_GAP_REGISTER #98 all assign the montage notify-divergence check to an occupied id. QA_WATCHING_PROGRAM.md RB-9 states \"Presentation — HUD BUILD-NOW · cinematic PARKED · audio SKELETON-NOW\" and §4.4 that \"the cinematic rubric is PARKED-UNARMED behind P2.7\"; there is no animation rubric at all (grep -ci \"animation\" on that file = 2, both the bug-family enum token at lines 178/184, against \"audio\" = 5 with a real RB row).",
"delta": "Nothing in the 22-harness belt or the 14-rubric board can catch a T-pose, a foot-slide, a notify/row disagreement, a camera pop across a scene boundary, or a facial track that never fires — the exact defects an award-bar claim rests on. And the one tooth that was ruled has no id of its own, so it will either overwrite the combat-invariant harness or be built twice.",
"severity": "MAJOR",
"blocking": "C-13's precondition (\"before the first montage imports\") is already reachable — the game has PlayAnimation calls on boss and enemy today (HumanityBossCharacter.cpp:302, HumanityEnemyCharacter.cpp:883) with zero notify binding. Blocks any honest animation-quality report and the SLICE-PRESENTATION wave's verified-by clause.",
"proposed_home": "Mint a distinct QT id for the montage notify-divergence tooth (must-not-fire fixture now, zero montages bound) plus an animation/cinematic playback harness; add an animation rubric row to QA_WATCHING_PROGRAM's RB family beside RB-9's parked cinematic rubric; correct the QT-5 references in PIPE_ANIMATION §3, C-13 and register entry 98."
},
{
"index": 8,
"entry_id": "GAP-204",
"merged_into": null,
"name": "The animation/VFX CRAFT law is a HIGH register finding that no rank owns — the lane has no craft doctrine while audio got one",
"vision_rules": "DESIGN_GAP_REGISTER.md:1253-1262 (entry 99, spec-doc; HIGH): \"Land commit-versus-cancel policy, root-motion policy, a hit-reaction taxonomy, follow-through and settle, and the per-tier fluidity vocabulary the DR-2 prompt composer must quote — under the existing T1_Ability_Tree anchor\". Josh's nod recorded in COMBAT_PROGRAM_ADDENDUM.md §5 (mastery-tier animation fluidity as a hard 5090 requirement).",
"what_exists": "Findings about the absence, and no law. Verified today: `_source/01_Tier_1_Foundation/T1_Combat_System_Spec [ACTIVE v1.0].md` (666 lines, 80 KB — the T1 authority owning Block/Parry/Dodge and the weapon frameworks) contains `animation` ×0 and `VFX` ×0 against a `parry` ×14 POSITIVE CONTROL. Corpus-wide the craft terms (root motion | cancel window | hit reaction | follow-through | commit window | AnimNotify) return 9 doc files — the lens draft, its critic, the register, PIPE_ANIMATION, DECISIONS, COMBAT_PROGRAM_ADDENDUM and two spine files' incidental prose — i.e. the finding and the dossier, never a rule; POSITIVE CONTROL: \"presentation ladder\" returns 24 files. What exists instead is budget doctrine wearing a craft title (ENGINE_OPTIMIZATION_DOCTRINE §5.3/§5.4). Rank 20 authors T1_UI_UX_Spec + T1_Audio_Spec and NOT an animation craft home.",
"delta": "The audio lane's equivalent mandate produced docs/proposals/MUSIC_COMPOSITION_DOCTRINE.md (155 KB, authored 2026-07-29, ledger 28al: \"authored BEFORE any hero-theme work\"). The animation lane has no counterpart, so the DR-2 prompt composer and every hand-authoring pass have no craft vocabulary to quote, and the per-tier \"fluidity\" the ladder sells is undefined.",
"severity": "MAJOR",
"blocking": "Blocks the DR-2 prompt composer's input (a craft doctrine written after 200 montages exist is a retrofit — the lens's own surviving self-refutation) and the CF-4/CF-5 W-PRES wave, whose verified-by asks an image critic to confirm \"≥3 visually-distinct cast primitives\" against no declared standard.",
"proposed_home": "A craft-law section under the T1_Ability_Tree presentation-ladder anchor (entry 99's ruled home), paired one-to-one with ENGINE_OPTIMIZATION_DOCTRINE §5.4 so each craft rule names its budget rule; added to the ranked queue beside rank 20."
},
{
"index": 9,
"entry_id": "GAP-205",
"merged_into": null,
"name": "The lane's quality bar is unrecorded and no comparator lens has ever audited cinematic direction",
"vision_rules": "Josh's box-office-award bar for cinematics (the lane mandate). Its sibling in the audio lane was recorded the same week and is fully citable: PRE_5090_BUILD_PLAN.md ledger 2026-07-29al records \"the SCORE DIRECTION… (the 30-year bar — SM64/Zelda/Skyrim/Halo/Pokemon/Animal-Crossing/DK lineage; melody-first + the hummability test)\" and it became MUSIC_COMPOSITION_DOCTRINE §0. COMPARATOR_LENS_PROGRAM.md:13 makes the roster itself a gap surface: \"An aspect of the game no lens has ever audited is an\" uncovered cell.",
"what_exists": "ZERO-POSITIVE-CONTROL on the bar: grep -riE \"box.?office|blockbuster|academy.?award|oscar|pixar|dreamworks|film.quality|movie.quality|cinema.quality|feature.film\" over docs/ (excluding archive) returns ONE hit and it is the PixArt-Σ model name in PIPE_ART; the same search style returns \"30-year bar\" in 2 live docs. ZERO on the lens coverage: DESIGN_GAP_REGISTER.md §v1.2's live claim board carries 24 cells + ~30 new aspect rows + R-A1..R-A20, of which the nearest are cell 11 \"Presentation ladder (anim/VFX craft)\" (CLAIMED-RUN — combat ability presentation) and the aspect row \"camera-doctrine (sm64)\" (gameplay camera) — there is NO cell or aspect row for cutscene direction, staging, blocking, or performance capture. The god-of-war lens ran (4 survivors, register v1.1 entries 20-45) but no LENS_GOW file exists in docs/pipeline_review/ (LENS_BG3 does) and no register entry carries a cinematic-staging finding; PRESENTATION_DOCTRINE Fork A cites \"the GoW lens\" as a name, not a run audit.",
"delta": "The one lane explicitly held to a film bar has neither the bar written down nor a single title×aspect audit of the craft it is judged against — while the audio lane got both in the same 48 hours. Every future cinematic decision is therefore made against an unrecorded standard.",
"severity": "MAJOR",
"blocking": "Blocks the MARKETING_WEB_PROGRAM go-live, which Josh ruled fires at \"real cinematic captures\" (DECISIONS fourteenth sitting item 5) — the captures have no quality standard to clear. Also leaves the P3 surpass-claim contract (RB-11) with no cinematic band to claim against.",
"proposed_home": "Record the bar in the ledger and open a CINEMATIC_DIRECTION_DOCTRINE as the sibling of MUSIC_COMPOSITION_DOCTRINE; add a cutscene-direction/staging/performance-capture cell to the ASPECT×LENS claim board with its claiming lens (GoW one-shot camera · TLOU2 performance · RDR2 staging) named."
},
{
"index": 10,
"entry_id": null,
"merged_into": "GAP-140",
"name": "chapter_bridging_cinematic: the ruled transition doctrine's designated story home has zero rows across 79 nodes and no rank",
"vision_rules": "Fork C RULED TIERED TRAVERSAL (PRESENTATION_DOCTRINE §0.C / §4): \"transitions are playable navigable segments under the COMPRESSION RULE… all 78 seams type T0-T3 on one SeamlessTravel mechanism\", and DT-3 sends the story load to the authored bridging scene: quoted in FORKC_ANALYSIS_CANON_TRAVEL_2026-07-27.md:181 — \"Story load belongs to the authored bridging scene (chapter_bridging_cinematic)\".",
"what_exists": "Zero rows, and the zero is already positive-controlled at source: FORKC_ANALYSIS_CANON_TRAVEL_2026-07-27.md:179 \"grep -rn \\\"chapter_bridging_cinematic\\\" build/spine_rows/ → zero across all 79 nodes' scenes.csv\" and :548 records the control (\"the grep itself was verified against boss_encounter_resolution / per_chapter_cutscene, which match\"); FORKC_TRANSITIONS_BRIEF:45 repeats it (\"positive control PASSED: 11 real scene_type values arc-wide… chapter_bridging_cinematic is not among them\"). Independently re-verified in this audit: the 450-row scene_type census contains 11 values and chapter_bridging_cinematic is not one of them. The 78-seam typing pass appears in PRE_5090_BUILD_PLAN only inside the ruling record (lines 666, 1671-1672), never as a numbered rank; PRESENTATION_DOCTRINE §5 routes it away as \"a schema and corpus call for the spine/contract owner\". It is not a DESIGN_GAP_REGISTER entry (the register does not appear in a corpus-wide grep for the token).",
"delta": "A ruled doctrine names a data class as the home for the story load at 78 chapter crossings; the class has 0 rows, no per-seam BOM, no rank, and no owner. Rank 21 covers between-site (intra-chapter) traversal, not the 78 chapter-to-chapter seams.",
"severity": "MAJOR",
"blocking": "Blocks the seam-typing pass and the transition-map plumbing that Fork C's ruling depends on, and blocks the CH_04→CH_05 prototype seam from being authored as anything but a mechanism test. Hits inside the slice — Ch 2→3→4→5 are four of the 78.",
"proposed_home": "A seam-typing + bridging-scene pass writing chapter_bridging_cinematic rows (78 seams typed T0-T3, each with its bridging scene or a declared none-by-design) into build/spine_rows + T0_Scene_Spec_Registry; entered as a numbered rank with the FORKC brief as its authority."
},
{
"index": 11,
"entry_id": "GAP-206",
"merged_into": null,
"name": "The cinematic assembly toolchain is entirely absent while its sibling lanes shipped, and the scene-row count has drifted 439→450 ungated",
"vision_rules": "PRE_5090_BUILD_PLAN.md §7 marks the whole chain BUILD-NOW and ungated — CN5.1 extract_spine_scene_rows.py, CN5.2 build_shot_templates.py, CN5.3 assemble_scene_sequence.py, CN5.7 check_scene_spec.py + render_mrq_dailies.py — with \"the entire Sequencer chain ungated; only rendered assets gated\", and §13 names retarget_participants.py for the mocap/body-animation library.",
"what_exists": "ZERO-POSITIVE-CONTROL: the game repo's Tools/ holds 40+ scripts (import_audio_assets.py — the audio lane's A6.4 equivalent — plus gen_row_struct.py, the terrain fetch/import/dress chain, five stage_*.py, the QA runners) and ZERO of build_shot_templates.py, assemble_scene_sequence.py, retarget_participants.py, render_mrq_dailies.py, check_scene_spec.py, npz_to_bvh.py, extract_spine_scene_rows.py. Content/ has no Cinematics directory and one animation asset among 309 uassets. Count drift: build/spine_rows carries 450 scene rows today, while \"439\" is the figure quoted throughout both plan volumes and in Vol2 CN-1 as the imported DT_SceneAnchor row count (\"439 imported rows, ledger 2026-07-23c\"); no gate checks canon↔engine scene-row parity (the gate roster has no scene check — see the QT-table zero above).",
"delta": "Every named script in the ungated cinematic chain is absent while the audio and terrain lanes' equivalents shipped, so \"the Sequencer chain is ungated\" has never been exercised once. And the canon layer has silently moved 11 rows ahead of the engine layer with no tooth to notice — the same silent-divergence class as the chunk_id collapse.",
"severity": "MINOR",
"blocking": "Blocks CN-1's greybox scene runtime from being fed by anything but hand work, and blocks the first MRQ daily (the QA directive's canonical cinematic case). The 439/450 drift misreports the workload in every plan that quotes it.",
"proposed_home": "The Tools/ cinematic chain as a numbered rank (extractor → template bake → assembler → check_scene_spec → MRQ dailies), plus a scene-row parity assertion in check_spine_graph.py or a new scene gate, and a corpus-wide correction of the 439 figure to the measured count."
},
{
"index": 12,
"entry_id": "GAP-207",
"merged_into": null,
"name": "DOC_MAP advertises the lane's only ruled doctrine as PENDING JOSH, and Fork A has no ledger row",
"vision_rules": "The anti-orphan doctrine: every artifact needs a consumer AND an accurate DOC_MAP row; a doc is not done until it is listed there. PRESENTATION_DOCTRINE closes DESIGN_GAP_REGISTER #29 with ALL THREE FORKS RULED (§0 \"THE THREE RULINGS — ALL THREE RULED\"; Fork A 2026-07-27, Forks B and C the second sitting) and ships its own replacement DOC_MAP row at line 945 for the director to land.",
"what_exists": "DOC_MAP.md:329 still carries the superseded row: status \"PROPOSAL — 3 FORKS PENDING JOSH (2026-07-27)\", the stale summary \"Carries three briefed forks for Josh — the one-shot camera (the GoW lens), the defeat cut…, the loading screen's standing\", and \"three rows on non-schema concepts (player HP 0, the cross-map seam, the travel card)\" where the doc's own authored row reads \"four on non-schema concepts (the three ruled defeat rows and the typed cross-map seam)\" and describes the ruled tiered traversal. The doc also self-reports the second half: §5 \"FORK A'S LEDGER ROW… Forks B and C each have clause-level ledger rows and Fork A does not… named here so the asymmetry is recorded rather than discovered later as an unsupported claim.\"",
"delta": "The lane's single ruled artifact is advertised to its own consumers as unruled, and its head ruling (the one-shot camera policy that governs every hard cut) rests on an in-conversation line with no ledger row. Both were flagged inside the doc and neither was landed.",
"severity": "MINOR",
"blocking": "The CN5.2 template bake and CN-8 cine-rig read DOC_MAP for status; a builder checking it concludes camera policy is still pending Josh and either stalls or re-briefs a settled ruling. Also leaves Fork A's authority unciteable in any later audit.",
"proposed_home": "Replace DOC_MAP.md:329 with the doc's own line-945 row (status RULED, all 3 forks) and write Fork A's clause-level ruling row into docs/spine/DECISIONS_PENDING_JOSH.md alongside Forks B and C."
}
]
}
}