Gap audit 2026-07-29 - lane voice-vo (12 findings)
Verbatim from workflow wf_d0ca605f-891. Each finding carries either its own register entry id or
the cross-lane merge that absorbed it. This file is the evidence of record the compact register
entries cite.
voice-vo#1 [CRITICAL] merged into GAP-133 - 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 (verified). 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.
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.
voice-vo#2 [CRITICAL] merged into GAP-133 - 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 [...]
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 (verified). 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.
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.
voice-vo#3 [CRITICAL] merged into GAP-133 - 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 (verified). 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.
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.
voice-vo#4 [CRITICAL] merged into GAP-133 - 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 (verified). 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.
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.
voice-vo#5 [MAJOR] GAP-173 - 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 [...]
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 (verified). 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.
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.
voice-vo#6 [MAJOR] GAP-174 - 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 (verified). 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.
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.
voice-vo#7 [MAJOR] GAP-175 - 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 (verified). 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.
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.
voice-vo#8 [MAJOR] GAP-176 - 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 [...]
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 (verified). 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.
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.
voice-vo#9 [MAJOR] merged into GAP-133 - 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 [...]
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 (verified). 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.
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.
voice-vo#10 [MAJOR] GAP-177 - 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 [...]
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 (verified). 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.
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.
voice-vo#11 [MINOR] GAP-178 - Cultural-register coverage stops at the slice: 13 registers against 76 region rows, and the three chapters whose voice disciplines are named in [...]
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 (verified). 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.
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.
voice-vo#12 [MINOR] GAP-179 - 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 (verified). 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.
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.
Generated by harness/site/structure_site.py — the URL path is the repo path. review root