build_sufficiency_review.json

pipelines/build_sufficiency_review.json

{
 "lanes": [
  {
   "lane": "environment-level",
   "derivation": {
    "derived_from": [
     "docs/ASSET_DROPIN_CONTRACT.md §1-§3, §6, §7 items 1/3/4/6/6-D (id-not-path invariant, five-state lifecycle, path takeover default, generation_tier/decay_stage axes, the §17.1 reference-built care gate)",
     "docs/pipeline_review/tech_research/PIPE_ART_2026-07-29.md §1 (Z-Image-Turbo SHIPPABLE, HiDream-O1 ruled primary/not installed), §3 (the two artifact classes; the 'an art-bible field that cannot become a T0_Environment_Grammar_Registry row is a field describing scenery' rule; 16-bit PNG, no JPEG), §4 (dispatch is a row set), §6 Q4 (per-realm style LoRA vs multi-reference unresolved)",
     "docs/pipeline_review/tech_research/PIPE_3D_2026-07-29.md §1 (TRELLIS.2/Direct3D-S2/Hunyuan3D-2.1 image->3D backends; AutoRemesher+xatlas+Blender finishing; terrain chain carried) — and its total absence of any input-image specification",
     "docs/pipeline_review/tech_research/GEODATA_TERRAIN_CHAIN.md §3 (heightmap encoding, 8129 vertex ceiling, headless landscape_import_heightmap/weightmap_from_render_target), §4 (Leg A raster carve from the zone catalog's polygons vs Leg B edit layers), §5 (WorldCover 11 classes -> material layer -> PCG Biome Core landscape-layer-weight generator), §6 (Gaea as the middle erosion synthesis step)",
     "docs/CONCEPT_ART_PRODUCTION_PROGRAM.md §1 (43 classes / 17,876 plates), §2 (THE LEAF, 12-row cap, three leaf kinds), §3.2 path form line 185, §3.4 GATE 43 eight teeth, §4 measured throughput, §5.3 the art bible is the only artifact the factory reads, §6 Rank 0/Rank 1 row 6 'Kit before dwelling, always', §7.1 the proposed palette-deltaE tooth, §8 what did NOT land",
     "docs/proposals/CONCEPT_ART_PROGRAM.md §1.1 (the PLAN and KIT art units; KIT = 'roof, wall, opening, threshold, ornament, ground treatment' as one sheet), §1.2 classes 3/4/5/14 and their counts",
     "docs/proposals/REALM_DESIGN_PROGRAM.md §3.1 (a realm gets ONE establishing board; zone boards only run after it is picked), §3.2 (Panel A = 3 plates per option, charter-fixed), §3.6 (the bible is the law)",
     "docs/proposals/systems/WS7_WIRING_BUILD_PLAN.md L97-L144 — the T0_Environment_Grammar_Registry column contract and the eleven T0_Region_Index environment columns",
     "registries/T0_Environment_Grammar_Registry [DRAFT v0.1]/Sheet1.csv — 112 rows x 18 columns, read live (structural 59, hydro 15, mineral 14, sacred_marker 11, vegetation 9, geothermal 2, gaseous 2; TRAVERSAL_SURFACE 38, NONE 34, CONSTRICTION 18, CONCEALMENT 10, COVER 6, HAZARD_VOLUME 4, ELEVATION 2)",
     "registries/T0_Interior_Space_Registry [DRAFT v0.1]/Sheet1.csv — 44 rows, kit_id_ref blank on every row; registries/T0_Dwelling_Registry — 2 rows, build_grammar_ref empty; docs/fk_spec.json ('kit_id_ref is a declared placeholder for the mesh-kit lane and is blank on every row at mint')",
     "_source/02_Tier_2_Region_Pages/flores_island.md § Zone Catalog (20 columns incl. zone_bounds_wgs84, meters_per_vertex, worldcover_biome, footfall_surface, care_tier, asset_routing, environment_grammar_refs, zone_space_class) + Section 7 Architecture + Section 17 UE 5.8 Build Specifications",
     "docs/spine/CH_02.md § Key sites and spatial layout (typed v3.1 site rows) and § Asset anchors (the architecture_set_dressing line)",
     "docs/translation/T99_Translation_AssetGen.md §2 (Architectural Features = reference-built / photogrammetry / licensed-kit by default; generation only for blockout/massing, never the shipped asset), §4.1 mesh_tags five sub-fields, §4.3-4.4 finishing and budgets",
     "docs/PRE_5090_BUILD_PLAN.md §13 GATED list and rows W4.5-W4.8 (landcover fetch, World Partition convert + HLOD + SafeZone data layer, terrain->level chain, PCG binding with terrain_type routing)",
     "docs/COMBAT_ENCOUNTER_SYSTEM.md §4.5 (the arena is a clock: env_cycle_period_s / env_phase / env_trap_nodes), §6.1 (arena as modifier space: recharge wells, trap nodes, stealth cover, high ground), and the L279 statement that the schema has NO arena-to-env-feature join today",
     "docs/pipeline_review/gap_audit_2026-07-29/gap_findings.json entries at :115 (interiors: zero interior level in Content/Maps, footprints in free-text area_bounds, the DEM-only tooth grading liang_bua_cave by the slope of the ground above the cave) and :1028 (positive-controlled 62-registry scan returns ZERO time_of_day columns; weather_cycle_profile 4/76 all env_profile_status=stub)",
     "The BUILD side, read directly: C:/dev/Humanity/Humanity/Tools/{terrain_fetch_preprocess,import_flores_landscape,sculpt_encounter_pads,audit_encounter_spaces,apply_biome_materials,dress_flores_map,stage_flores_ch02,derive_region_bbox}.py and Tools/sculpt/pads_flores.json",
     "harness/read_boards.py:182/617/619 (PANEL_A_PLATES_PER_OPTION = 3, hard FAIL) and :195 PLATES_REQUIRED; harness/check_art_pointers.py:94 (the path form) and its P0-P7 teeth; docs/art_boards/PLATES.csv (91 rows, one board) and MANIFEST.csv; docs/canon_derivation.json id_families (exactly ten families)",
     "Live measurements I ran this pass: plate_role value counts over PLATES.csv (board_candidate 76, silhouette 3, palette 3, detail 3, hero 3, law_in_action 3); a positive-controlled prefix grep over all 80 docs/spine/CH_*.md returning EG_ 0, INT_ 0, GN_ 0, DW_ 0, FL_ 0, MN_ 0, ZN_ 0 (control: CR_/CHAR_/BE_ ids are plainly present in the same files); worldcover_biome populated 0 of 46 rows across the 7 extracted build/zones/*.csv projections"
    ],
    "not_derived": [
     "Any claim about what the Z-Image-Turbo or HiDream-O1 models can actually render for a plan view, a kit sheet or a vista — no environment plate has ever been generated (CONCEPT_ART_PRODUCTION_PROGRAM.md §8: 'No plate has been generated for canon'), so every quality statement here is about pipeline SHAPE, never observed output",
     "Plate-role names beyond the six live values in PLATES.csv. The brief's role list (establishing/angle/traversal/mood/layout_plan/staging/study/scale/detail/silhouette/variant/strip/grid + serial) does not exist as a closed vocabulary anywhere in the repo — grep for PLATE_ROLES / ROLE_VOCAB / allowed_roles over harness/ and docs/ returns nothing, and plate_role is free text with no gate reading its membership. I treated it as the parent's synthesis and judged against the LIVE six plus density_model.csv's art_unit column",
     "The 84-zone figure. I could only verify 46 zone rows via build/zones/*.csv (7 of 12 pages projected); the 84 count is CONCEPT_ART_PRODUCTION_PROGRAM.md §1's re-count of the 12 pages and I carried it as that document's number, not my own measurement",
     "Whether Gaea's Indie tier permits CLI automation (GEODATA_TERRAIN_CHAIN.md §6 flags this unconfirmed) — I make no scheduling claim that depends on it",
     "Any per-plate GPU cost for the roles I propose. art_throughput.py's model is per-plate at a resolution tier; the aspect-correct plan/vista tiers I propose are outside its measured points and I do not extrapolate them",
     "Industry-practice statements about kit-sheet contents (module grid, joint conditions, span limits, storey height) are AUTHORED JUDGEMENT labelled as such — the repo's own KIT definition stops at 'roof, wall, opening, threshold, ornament, ground treatment' (CONCEPT_ART_PROGRAM.md §1.1) and names none of the rest"
    ]
   },
   "what_build_needs": [
    "BLOCKOUT / SPATIAL LOGIC. The pad manifest Tools/sculpt/pads_flores.json is the live blockout artifact: per pad {pad_id, site_id, bbox_wgs84, offset_cm, width_m, depth_m, skirt_m, target_slope_deg, note}. sculpt_encounter_pads.py cuts a flat core (<=6 deg) with a 30-60 m blended skirt against the COP30 raster; audit_encounter_spaces.py then re-measures slope over the 30.89 m post lattice. So blockout needs METRES and a bbox in the SAME frame the stage tools use (zone_bounds_wgs84 -> UTM -> world cm), plus a target slope and a skirt width. It does NOT need Phase-5M numbers — it needs a polygon, a floor plane, an entry/exit set, and a declared internal slope ceiling.",
    "ZONE BOUNDS ARE ALREADY THE SPATIAL KEY. The Zone Catalog carries zone_bounds_wgs84, area_bounds (free-text metres), meters_per_vertex (1/2/5 m rungs), footfall_surface, zone_space_class, environment_grammar_refs, care_tier, build_priority. Every build tool reads them. A layout that does not resolve to a zone_id and a bbox cannot enter the chain at all.",
    "MODULAR ARCHITECTURE KITS. T99_Translation_AssetGen §2 rules Architectural Features 'reference-built / photogrammetry-grounded / licensed-kit by default', with generation permitted ONLY for blockout/massing on real structures and never the shipped asset. So a kit sheet is a BUILD BRIEF for a human/kitbash/scan workflow, not an image->3D input: it must carry the repeatable piece set, the module grid the pieces snap on, storey height, joint/corner conditions, span limits, per-piece material callouts that resolve onto mesh_tags.material, and a human-scale figure. Its consumers are T0_Interior_Space_Registry.kit_id_ref (44 rows, blank), T0_Dwelling_Registry.build_grammar_ref (2 rows, empty), T0_Trade_Registry.shared_build_grammar_ref, and D1-06 dwelling variation which CONCEPT_ART_PRODUCTION §6 orders strictly downstream ('Kit before dwelling, always').",
    "PER-EG-CLASS DRESSING TARGETS. PCG Biome Core spawns off landscape layer weights (GEODATA §5); W4.8 routes terrain_type -> PCG template with ambient_threat -> density and vril_density -> creature-tier filter. The 112 EG rows carry the mechanical half (physical_properties_array, tactical_affordance_class, attack_verbs, exposure_hazard, alteration_permanence_default) and the zone rows join to them via environment_grammar_refs. A PCG rule needs a visual target for the AFFORDANCE, not for each row: 6 usable tactical_affordance_class values x the region's biome set, with the affordance legible without colour (COMBAT_ENCOUNTER_SYSTEM L249 makes multi-channel readability a non-negotiable L1-playability requirement).",
    "BIOME / MATERIAL PALETTE AS DATA. apply_biome_materials.py authors M_Landscape_Biome from a hardcoded LAYER_COLORS table (Tools/apply_biome_materials.py:60) of linear per-WorldCover-class base colours, identical across all six region maps. The region's palette must arrive as a machine-readable object keyed on the same WorldCover class names the importer painted (forest/grass/crop/urban/bare_rock/water/wetland), or every region renders the same.",
    "SKYBOX / VISTA / LANDMARK READ. W4.6 runs WorldPartitionConvertCommandlet with CellSize/RuntimeGrid and headless HLOD builders; the Flores landscape is 173x47 km. HLOD and imposter authoring need a declared answer to 'which silhouettes are the navigational anchors and what do they read like at 2/10/30 km' — a distance read, not a camera-height establishing frame.",
    "INTERIOR SETS. T0_Interior_Space_Registry gives 44 rows with footprint_w/l/h_m, storeys, below_grade_depth_m, room_count, and access_class in {in_place_kit, portal_sublevel}. Content/Maps holds nine region/arena umaps and no interior level; the spatial tooth is DEM-only and grades a 220x180x60 karst interior by the slope of the ground above it. Interiors need their own plate, their own footprint-conformance measurement, and a portal condition drawn for the portal_sublevel rows.",
    "LIGHTING LAW PER ZONE AND TIME. dress_flores_map.py sets one raking sun per region. COMBAT_ENCOUNTER_SYSTEM §4.5 makes the arena a periodic state machine (env_cycle_period_s / env_phase) that gameplay times against, and §6.1 makes stealth cover and high ground arena furniture. Lighting therefore has a gameplay contract: a legibility floor for the cave/night states, a key direction the cover-reading depends on, and a per-state sky. The pipeline must supply a per-zone key/fill/fog/darkness-floor spec keyed to a weather x time-of-day state.",
    "MESH-BOUND ENVIRONMENT PROPS. D1-08 civic monuments, D1-20 minerals/gather nodes and the vril-site meshes route to TRELLIS.2 / Direct3D-S2 / Hunyuan3D-2.1 image->3D and then AutoRemesher + xatlas + Blender finishing. That lane consumes a single-subject, full-object, neutral-ground image with a declared scale — not an atmospheric hero frame.",
    "ONE STYLE ACROSS HUNDREDS OF PLATES. A single region is ~180 key-art plates + 134 kit plates + dressing/dwelling/interior sets that must read as ONE place, and the kit->dwelling chain is a derivation. The build needs the style key that held the kit to be the same key that renders its 40 dwelling variants."
   ],
   "what_pipeline_gives": [
    "ONE board shape. MANIFEST.csv's only live board_shape value is place_3panel, subject_canon_id = a REGION row (flores_island). read_boards.py:182 fixes Panel A at exactly 3 plates per option and :617-619 hard-FAILs any other count, with the message naming them 'silhouette / palette / detail'. Panel B is 2 (WARN only), Panel C is text cards.",
    "SIX live plate roles, free text, ungated: board_candidate 76, silhouette 3, palette 3, detail 3, hero 3, law_in_action 3 across the 91 rows of the one board. No PLATE_ROLES constant exists in harness/; GATE 43 P2 checks path depth/segments and P3 checks the __<hash12>.<ext> suffix — neither reads role membership.",
    "A content-addressed path and a real integrity gate. $HUMANITY_ART_ROOT/<class_id>/<canon_id>/<plate_role>__<hash12>.<ext>, with GATE 43 harness/check_art_pointers.py's eight teeth (P0 vacuity, P1 complete-claim, P2 path form, P3 content-addressed, P4 collision, P5 duplicate content, P6 byte integrity, P7 blind mode), 20 must-fire fixtures and live mutation proof. This machinery is genuinely good and everything below rides it.",
    "A prose art bible as the single artifact the factory reads: docs/art_bibles/flores_island.md — eleven fields (palette, light doctrine, material vocabulary, silhouette/architectural grammar, scale rule read off meters_per_vertex, vril-physics signature, motion grammar, forbidden list, citations, intensity slot, downstream consumers) plus a canon_derivation coverage sidecar. Every field is English sentences.",
    "A licence-aware, self-enforcing regeneration chain: generation_prompt_hash over a closed payload including the model's licence class -> a changed hash changes the filename -> regeneration_required fires and cannot overwrite its predecessor. The three request axes (generation_tier, decay_stage, presentation_tier_ref) are parameters and columns, never path segments.",
    "Measured throughput on this box: 1024^2/8 steps 2.78 s, 1344^2 REVIEW 5.35 s, 2048^2 HERO 20 steps 34.38 s, all square, Z-Image-Turbo bf16 (the ruled primary HiDream-O1 is not installed). Whole-slice art = ~6 unattended nights; the review surface, not the GPU, is the constraint.",
    "A declared but unimplemented unit vocabulary. density_model.csv's art_unit column already carries KIT (D1-05), PLAN (D1-41), PLAN_1 (D1-04), PLAN_3 (D1-03, D1-40), SHEET (D1-19 foliage/biome dressing), BOARD, SHEET_n, VARIANT, LANGUAGE_BOARD — and CONCEPT_ART_PROGRAM §1.1 defines PLAN as 'a top-down or isometric layout drawing for a zone, site, or dungeon' and KIT as 'roof, wall, opening, threshold, ornament, ground treatment drawn as one sheet'. Nothing in read_boards.py, PLATES.csv or the leaf renderer can represent either; the leaf renderer is named NOT BUILT.",
    "Zero environment plates. Every one of the 91 rows is pending; the one board is a region establishing board awaiting pick; no plan, no kit, no dressing, no vista, no interior, no lighting plate exists.",
    "An empty style key. style_lora_hash is a required PLATES.csv column and is empty on all 91 rows; PIPE_ART §6 Q4 leaves per-realm style LoRA vs multi-reference personalization open to benchmark day."
   ],
   "gaps": [
    {
     "severity": "BLOCKER",
     "gap": "The architecture-kit id space does not exist. D1-05 'Architecture kits per culture' is P0, ranked #6 in Rank 1 with 134 slice plates and art_unit KIT, and CONCEPT_ART_PRODUCTION §6 states 'Kit before dwelling, always' — but there is no T0_Architecture_Kit_Registry anywhere in registries/. T0_Interior_Space_Registry.kit_id_ref is blank on all 44 rows and docs/fk_spec.json records it verbatim as 'a declared placeholder for the mesh-kit lane'; T0_Dwelling_Registry.build_grammar_ref is empty on both rows; T0_Trade_Registry.shared_build_grammar_ref resolves into that same empty column.",
     "consequence": "A kit plate has no <canon_id> to be written under, so the ruled path form <class_id>/<canon_id>/<plate_role>__<hash12>.<ext> cannot address it and GATE 43 P2/P3 cannot verify it. The P0 class that gates every settlement, dwelling, interior and civic monument in the slice cannot be started, and the three registry columns that are supposed to consume it point at nothing. This is Rank-0 registry work that the Rank-0 list does not name."
    },
    {
     "severity": "BLOCKER",
     "gap": "The review surface cannot carry a KIT or a PLAN. read_boards.py:182 hard-codes PANEL_A_PLATES_PER_OPTION = 3 and :617-619 FAILs any Panel A option with another count; MANIFEST.csv has one board_shape value, place_3panel. A kit sheet needs at least six pieces (CONCEPT_ART_PROGRAM §1.1's own list) and a PLAN_3 climactic-site layout needs three; the 12-row LEAF renderer that was supposed to generalise this is named NOT BUILT (CONCEPT_ART_PRODUCTION §8).",
     "consequence": "Every environment art unit the density model declares — KIT (134 slice plates), PLAN_3 (126), PLAN_1 (46), PLAN (D1-41), SHEET foliage/biome (54-108) — is structurally unrepresentable on the only board the gate accepts. The lane's plates would either fail the gate or be forced into a 3-plate place board that cannot show a piece breakdown, which is precisely the 'unpickable' failure Josh's review must not hit."
    },
    {
     "severity": "BLOCKER",
     "gap": "Environment canon is invisible to the derivation gate, so the anti-slop spine of the whole art program is unarmed for this domain. docs/canon_derivation.json declares exactly ten id_families, all entity-scale (CR_ CHAR_ A_x_ VS_ LINK_ WPN_ BE_ NW_ INSC_ MASTERY_). A positive-controlled prefix grep over all 80 docs/spine/CH_*.md returns EG_ 0, INT_ 0, GN_ 0, DW_ 0, FL_ 0, MN_ 0, ZN_ 0 while CR_/CHAR_/BE_ ids are plainly present in the same files. CH_02.md's architecture_set_dressing anchor line is pure prose ('the Manggarai mbaru niang cone-houses and the lingko spider-web fields...') with zero ids, and the §3b site rows key on slugs (liang_bua_cave), which match no family.",
     "consequence": "The ANCHOR LEAF — the mechanism CONCEPT_ART_PRODUCTION §2.3 builds the entire anti-slop program on, 'a leaf cannot be authored without opening the anchor section it is bound to, because the anchor section is what enumerates its rows' — enumerates NOTHING for environment. GATE 39's D2 residue is structurally zero for this lane, and a zero residue reads exactly like full coverage. This is the 2026-08-01 BRD_0001 failure class with the gate switched off by construction, on the largest plate class in the game."
    },
    {
     "severity": "MAJOR",
     "gap": "No layout plate is spatially binding. The live blockout artifact, Tools/sculpt/pads_flores.json, is hand-authored JSON with prose notes ('SEVERE (43/51 deg -- the steepest arena)'), and nothing in the art pipeline emits, constrains or is checked against it. A layout_plan role that produces only a picture is approvable without changing a single pad.",
     "consequence": "Josh can pick a top-down layout and the terrain the player actually walks is unchanged — the sculpt, the audit and the staging all still read the hand-written manifest. The pick becomes decorative, which is the exact failure mode the drop-in contract's id-not-path invariant exists to prevent, transposed onto spatial data."
    },
    {
     "severity": "MAJOR",
     "gap": "The 112 EG rows have no art field of any kind. T0_Environment_Grammar_Registry's 18 columns are entirely mechanical; there is no palette, no reference-plate pointer, no mesh_tags, no art_plate_ref. The zone rows already join to them (flores liang_bua_cave -> EG_0005;EG_0006;EG_0007), and PIPE_ART §3 already enforces the converse rule — 'an art-bible field that cannot become a T0_Environment_Grammar_Registry row is a field describing scenery'.",
     "consequence": "Every PCG dressing rule fires against a row with a physics vector and no look. 59 of the 112 rows are feature_category=structural and 38 carry TRAVERSAL_SURFACE — the surfaces the player literally walks and fights on — and the generator has no visual target for any of them. The affordance also has a legibility contract (COMBAT_ENCOUNTER_SYSTEM L249: hazard/polarity reads must work without colour) that no plate role is responsible for."
    },
    {
     "severity": "MAJOR",
     "gap": "Palette is prose on one side and hardcoded RGB on the other, and the two never meet. The art bible's §1 is sentences ('limestone karst grey-cream', 'wet cloud-forest green thinning to ash-grey'); Tools/apply_biome_materials.py:60 defines LAYER_COLORS as fixed linear per-WorldCover-class colours reused unchanged across all six region maps. Meanwhile CONCEPT_ART_PRODUCTION §7.1 proposes 'palette deltaE against the region's locked key-art palette' as THE mechanical anti-slop tooth.",
     "consequence": "Six regions render from one colour table, so the pipeline's own de-slop claim fails at the terrain layer before a single plate is judged; and the proposed deltaE tooth has no locked palette object to measure against, so the one deterministic anti-slop measure that would scale to 17,876 plates cannot be built."
    },
    {
     "severity": "MAJOR",
     "gap": "Lighting and time-of-day have no data home at any grain. A positive-controlled 62-registry header scan returns ZERO time_of_day columns (control term vril_density returns 3); weather_cycle_profile is populated on 4 of 76 region rows and all four are env_profile_status=stub; T0_Scene_Spec_Registry's 31 columns carry no time/lighting/weather field; the Zone Catalog's 20 columns carry none either. density_model.csv D1-02 records its own missing_inputs as 'weather_cycle_profile 4/76; worldcover_biome 0/84 zone rows' while budgeting 316 mood/lighting/weather plates.",
     "consequence": "316 lighting plates would be generated against a nine-token sky vocabulary with no state axis, no per-zone authority and no consumer — art with nowhere to land. And the gameplay side already depends on it: COMBAT_ENCOUNTER_SYSTEM §4.5 makes the arena a periodic state machine players time offence against, so 'lighting law' is a mechanics contract, not a mood note."
    },
    {
     "severity": "MAJOR",
     "gap": "worldcover_biome is 0 populated. I measured 0 of 46 zone rows across the 7 extracted build/zones/*.csv projections; the program's own count is 0/84. It is the key that joins WorldCover weightmaps to the landscape material layers and to PCG Biome Core's landscape-layer-weight generator.",
     "consequence": "The biome/dressing plate class (D1-19, 54-108 slice plates) has no enumerable subject set, the auto-material has nothing per-zone to blend, and PCG scatter falls back to terrain_type routing alone — one template per terrain class across 12 cultures. Rank 0 names Equipment/Quest_Seed/RNG_Drop_Table as the unpopulated predecessors and does not name this one."
    },
    {
     "severity": "MAJOR",
     "gap": "Interiors have no plate, no level, and no measurement. 44 T0_Interior_Space_Registry rows exist (35 of 44 declared design sizings rather than sourced), kit_id_ref blank; Content/Maps holds nine region/arena umaps and no interior level; the spatial tooth is DEM-only and grades 'liang_bua_cave | 220x180x60 karst interior | 0.0 | 0.0 | 100% | OK' by measuring the ground ABOVE the cave; T99_Translation_Terrain rules classic heightfield Landscape, so overhangs and caves have no geometry representation at all. D1-41 is sized 0 for the slice.",
     "consequence": "The Ch-2 opening site is an interior, and the pipeline has no way to specify it, no way to build it, and a green tooth that reports it OK. A pass that says the slice's spatial audit is clean is measuring the wrong surface."
    },
    {
     "severity": "MAJOR",
     "gap": "No vista/landmark/HLOD authority. W4.6 runs headless HLOD builders over a 173x47 km Flores landscape and tags protected zones into a SafeZone data layer; nothing in the plate roles or the art bible declares which silhouettes are navigational anchors or how the region reads at 2/10/30 km. D1-01 spends 180 slice plates on establishing art specified only as a camera-height read.",
     "consequence": "The distance layer — the first thing the player sees of every region and the layer HLOD/imposter budgets are spent on — is authored by nobody, so it will be whatever the auto-LOD produces. Sightlines are also the navigation system in an open region; leaving them unauthored is a wayfinding decision made by default."
    },
    {
     "severity": "MAJOR",
     "gap": "style_lora_hash is empty on all 91 plate rows and the consistency mechanism is unchosen (PIPE_ART §6 Q4). For entities this is a look question; for environment it is structural, because D1-06 dwelling variation is defined as a derivation off D1-05's kit and CONCEPT_ART_PRODUCTION §6 orders it that way.",
     "consequence": "40 dwelling variants generated off an approved kit with no locked style key drift off the kit, and the drift is invisible to every landed tooth (GATE 43 is byte-integrity, not style identity). The kit pick stops meaning anything by the second batch."
    },
    {
     "severity": "MINOR",
     "gap": "plate_role is an open free-text column with six live values and no membership check anywhere in harness/. density_model.csv's art_unit vocabulary (KIT/PLAN/PLAN_1/PLAN_3/BOARD/SHEET_n/VARIANT/LANGUAGE_BOARD/KEY_FRAME_4) has no declared mapping onto roles.",
     "consequence": "At 17,876 plates the role column is unqueryable and the schedule cannot be reconciled against what was actually produced — 'how much of D1-05 exists' answers by directory listing but 'how many kits have a threshold plate' has no answer."
    },
    {
     "severity": "MINOR",
     "gap": "Every measured render tier is square (1024/1344/2048). A plan view of a 1.2 km three-crater rim and a vista of a 173 km island are both aspect-wrong in a square frame, and CONCEPT_ART_PRODUCTION §7.1's proposed 'resolution / aspect conformance' tooth has no per-role aspect target to check.",
     "consequence": "Layout and vista plates either crop the subject or waste most of the frame, and the deterministic conformance tooth degenerates into a single global resolution check."
    },
    {
     "severity": "MINOR",
     "gap": "PIPE_3D specifies backends, VRAM, licences, retopo, UV, LOD and collision — and contains no input-image specification whatsoever. Nothing states what a plate destined for TRELLIS.2 / Direct3D-S2 must look like.",
     "consequence": "Environment props (civic monuments, gather nodes, vril-site meshes) will be fed atmospheric hero frames and produce fused, ground-welded, unscaled geometry, and the failure will be blamed on the 3D model rather than on the plate that was never specified."
    }
   ],
   "required_additions": [
    {
     "kind": "schema_column",
     "addition": "MINT T0_Architecture_Kit_Registry — the id space kit_id_ref and build_grammar_ref already point at",
     "shape": "kit_id (KIT_dddd), kit_name, culture_ref, era_ref, region_scope (;-joined region_id), module_grid_m (float; the snap dimension), storey_height_m, piece_class_set (;-joined from a closed set: roof|wall|opening|threshold|ornament|ground|column|stair|roof_edge|corner), joint_rule (free text: how two pieces meet), span_limit_m, material_callout_array (piece:material pairs resolving onto mesh_tags.material), provenance_class (reference_built|generation_sanctioned — reference_built is the DEFAULT per T99_Translation_AssetGen §2), care_tier, source_ref, art_plate_ref (plate_id), mesh_id_ref, plus the standard assetgen block (generation_status, generation_prompt_hash, generation_tier, generation_licence_ref, last_generated_timestamp, regeneration_trigger). Then backfill T0_Interior_Space_Registry.kit_id_ref (44 rows) and T0_Dwelling_Registry.build_grammar_ref, and enrol the FK in docs/fk_spec.json. Lands the Batch-0 way: registry_extensions.json + fidelity_baseline.json in the same commit, generation_status populated not empty (the ASSET_DROPIN_CONTRACT §6 Batch-0 correction)."
    },
    {
     "kind": "plate_role",
     "addition": "kit_sheet — the KIT art_unit made real",
     "shape": "One sheet per KIT_dddd showing the repeatable piece set as an elevation strip (roof / wall / opening / threshold / ornament / ground treatment at minimum), overlaid with the module grid in metres, storey height, one drawn corner/joint condition, a per-piece material callout, and a human figure for scale. AUTHORED JUDGEMENT: the grid/joint/span/storey requirements are standard modular-kit practice and are NOT in the repo's own KIT definition, which stops at the six piece names. Consumers: the reference-built architecture workflow (never image->3D for real cultural forms), kit_id_ref, build_grammar_ref, D1-06 dwelling variation."
    },
    {
     "kind": "plate_role",
     "addition": "kit_assembly — the proof the kit closes",
     "shape": "One plate per kit: three dwellings assembled from ONLY that kit's pieces at the settlement's real density, plus the negative case (a piece combination the grammar forbids). Sits on the same board as kit_sheet. This is the anti-thinness tooth for architecture: a kit that cannot show three distinguishable buildings is a texture, not a kit."
    },
    {
     "kind": "plate_role",
     "addition": "layout_plan + traversal_diagram — the blockout pair, per zone",
     "shape": "layout_plan: top-down orthographic, north-up, at a declared metres-per-pixel matching the zone's meters_per_vertex rung, bounded by zone_bounds_wgs84, with the arena core, the skirt, the entry/exit thresholds, cover/high-ground/hazard/recharge positions (the COMBAT_ENCOUNTER_SYSTEM §6.1 modifier space), and a scale bar. traversal_diagram: the same plan annotated with the critical path, the alternates (the no-dead-end rule), verticality, and sightline anchors. Both are review-tier and both MUST ship a sidecar (below)."
    },
    {
     "kind": "tooling",
     "addition": "The layout sidecar and its writeback — the thing that makes a layout pick binding",
     "shape": "Every layout_plan plate carries <plate_role>__<hash12>.layout.json beside the image: {zone_id, bbox_wgs84, local_enu_origin, pads:[{pad_id, polygon_m, target_slope_deg, skirt_m}], thresholds:[{kind, point_m}], affordance_points:[{eg_ref, tactical_affordance_class, point_m}]}. A new harness/emit_pad_manifest.py transforms approved sidecars into Tools/sculpt/pads_<region>.json in the SAME commit as the pick, and GATE 43 gains a sidecar-integrity tooth (sha256 over the sidecar, same byte-exactness as P6). Consequence: approving a layout changes the terrain the player walks, or the gate goes red."
    },
    {
     "kind": "plate_role",
     "addition": "eg_dressing — the visual target PCG is missing, sized as a LAW not a per-row leaf",
     "shape": "One plate per (tactical_affordance_class x biome), not per EG row — 6 usable affordance values (ELEVATION, COVER, CONSTRICTION, CONCEALMENT, HAZARD_VOLUME, TRAVERSAL_SURFACE) x the region's biome set, showing the feature at gameplay camera distance with the affordance legible in silhouette and value alone (no colour dependency, per the L1-playability accessibility rule). Deliberately NOT 112 plates: at per-row grain this becomes an unpickable pile, which is the anti-thinness failure in the opposite direction."
    },
    {
     "kind": "schema_column",
     "addition": "Art fields on T0_Environment_Grammar_Registry (112 rows) and the Zone-Catalog extension pack",
     "shape": "EG registry gains art_plate_ref (plate_id), palette_ref, and mesh_tags (the five sub-fields from T99_Translation_AssetGen §4.1). Zone Catalog gains, through the same extension mechanism that already added footfall_surface/care_tier/asset_routing: layout_plate_ref, kit_id_refs (;-joined KIT_dddd), lighting_law_ref, sky_state_ref, vista_anchor_ids, and worldcover_biome POPULATED (0 of 46 measured today). Region rows gain palette_ref."
    },
    {
     "kind": "schema_column",
     "addition": "A machine-readable palette object, replacing hardcoded LAYER_COLORS and arming the deltaE tooth",
     "shape": "docs/art_bibles/<region>.palette.json — {region_id, locked_at_plate_id, sha256, layers:{forest|grass|crop|urban|bare_rock|water|wetland: linear_rgb}, zones:{<zone_id>: {key_hex, shadow_hex, fog_hex}}}. Two consumers, one artifact: Tools/apply_biome_materials.py reads it instead of its :60 constant, and CONCEPT_ART_PRODUCTION §7.1's palette-deltaE measure grades every later plate in the region against it. The 'the pick actually changes the build' property that ASSET_DROPIN_CONTRACT gives meshes, applied to colour."
    },
    {
     "kind": "schema_column",
     "addition": "MINT the environment-state table that lighting/sky plates key onto (this is GAP-190's own proposed home, unbuilt)",
     "shape": "T0_Environment_State_Table: state_id, weather_state (from the ruled nine-token vocabulary rain|storm|fog|sandstorm|ash|monsoon|dry|celestial_window|clear), time_of_day (a NEW closed enum — the positive-controlled 62-registry scan returns zero such columns today), visibility_m, traversal_modifier, stealth_modifier, vril_density_delta, element_modifier, lighting_key_deg, colour_temp_k, fog_density, darkness_floor_lux. Then add time_of_day + weather_required to the SPINE_SCHEMA v3 beat grammar and to T0_Scene_Spec_Registry so a beat can demand a state."
    },
    {
     "kind": "plate_role",
     "addition": "sky_state + lighting_law + interior_set + vista",
     "shape": "sky_state: one plate per (weather_state x time_of_day) the region declares, sky and atmosphere only. lighting_law: per zone, key direction and colour temperature range, bounce/ambient, fog density, and the DARKNESS FLOOR (the cave/night legibility floor a hazard read must survive). interior_set: one plate per T0_Interior_Space_Registry row at the row's authored footprint, with the portal condition drawn for access_class=portal_sublevel rows. vista: the region at 2/10/30 km with the landmark silhouettes named, feeding HLOD/imposter authoring and the SafeZone data-layer read."
    },
    {
     "kind": "plate_role",
     "addition": "mesh_ortho — the image->3D input plate, and the rule that only it may feed a mesh",
     "shape": "Single subject, full object in frame, neutral ground, no atmospheric perspective, three-quarter plus one orthographic front, human-scale reference, HERO tier. AUTHORED JUDGEMENT (PIPE_3D specifies no input requirements at all). Paired authoring rule: only a mesh_ortho plate may be dispatched to TRELLIS.2 / Direct3D-S2 / Hunyuan3D-2.1; a hero/establishing plate is refused by the composer, the same mechanical refusal PIPE_ART §4 already applies to living-tradition rows and Lane G."
    },
    {
     "kind": "schema_column",
     "addition": "Close the plate_role vocabulary and give a plate a spatial key",
     "shape": "PLATES.csv gains: plate_role becomes a CLOSED enum (the six live values plus kit_sheet, kit_assembly, layout_plan, traversal_diagram, eg_dressing, biome_palette, sky_state, lighting_law, interior_set, vista, mesh_ortho, scale_bar); zone_id_ref (nullable, the spatial scope a plate binds to); aspect_target (per-role, so the §7.1 aspect-conformance tooth has something to check); sidecar_path + sidecar_sha256. GATE 43 gains tooth P8 (role membership + role-appropriate aspect) and P9 (sidecar exists and matches its sha). MANIFEST.csv's board_shape opens to place_3panel|kit_sheet|layout_plan|language_board with a plate_count_rule per shape."
    },
    {
     "kind": "tooling",
     "addition": "Un-hardcode the board gate",
     "shape": "Replace harness/read_boards.py:182's PANEL_A_PLATES_PER_OPTION = 3 with a per-board_shape plate-count table (place_3panel keeps 3 and stays charter-fixed and FAIL-level; kit_sheet is >=6; layout_plan is 1 image + 1 sidecar; language_board keeps its own count), with must-fire/must-not-fire fixtures per shape so the widened rule is armed rather than loosened. Without this the whole environment lane fails the gate by construction."
    },
    {
     "kind": "authoring_rule",
     "addition": "Environment ids enter the spine and the derivation gate — the fix that re-arms the anti-slop spine",
     "shape": "(a) Add id_families to docs/canon_derivation.json: env_feature EG_\\d{4}, interior INT_\\d{4}, kit KIT_\\d{4}, gather_node GN_\\d{4}, dwelling DW_\\d{4}, plus a ZONE family expressed as a membership SET enumerated from build/zones/*.csv rather than a regex (zone ids are slugs). (b) SPINE_SCHEMA v3 amendment: the architecture_set_dressing anchor line and the §3b site rows must carry those ids the way creatures_and_fauna already carries CR_ ids — today CH_02.md's architecture line is prose and the prefix grep over all 80 spine files returns zero for every environment family. (c) Positive control before trusting the change: assert the new families match a known-present id and that the residue for an environment leaf is non-zero before it is authored. Until (b) lands, the honest state is that GATE 39 does not cover this lane and must SAY so rather than report zero residue."
    },
    {
     "kind": "process_step",
     "addition": "Three additions to Rank 0, the hard non-art predecessor",
     "shape": "Rank 0 names Equipment (1 row), Environment_Grammar (stale — it now holds 112), Quest_Seed and RNG_Drop_Table. Add: (1) mint T0_Architecture_Kit_Registry and backfill kit_id_ref / build_grammar_ref; (2) populate worldcover_biome on all 84 zone rows (0 populated, measured); (3) take weather_cycle_profile past env_profile_status=stub on the 12 slice region rows. All three are zero-GPU registry work and all three gate plate classes that are budgeted at P0/P1."
    },
    {
     "kind": "process_step",
     "addition": "Order of operations within a region, and the pick that binds",
     "shape": "kit_sheet + biome_palette + lighting_law BEFORE the region establishing board's Panel A silhouette pick where architecture dominates the silhouette (the existing rule is only 'kit before dwelling'; the finding is that the kit also precedes the LAYOUT, because a settlement's area_bounds is module_grid x count, and precedes the establishing pick, because the silhouette grammar Panel A is arguing about IS the kit). Then layout_plan + traversal_diagram per zone, whose approval writes pads_<region>.json in the same commit. Then eg_dressing per affordance x biome. Then interiors and vista. The style key (style_lora_hash) is locked at the kit pick and is carried, non-empty, on every subsequent plate in that region — a plate whose style_lora_hash differs from its region's locked key is a gate failure, not a stylistic choice."
    }
   ]
  },
  {
   "lane": "character-creature",
   "derivation": {
    "derived_from": [
     "docs/pipeline_review/tech_research/PIPE_ART_2026-07-29.md (full) — §1 model tier + licence law, §3 integration contract, §4 autonomy, §6 benchmark Q4 (LoRA vs multi-reference)",
     "docs/pipeline_review/tech_research/PIPE_3D_2026-07-29.md (full) — §1 stack table incl. UniRig row (line 39), §3 integration contract, §6 Q5 (non-humanoid rig quality)",
     "docs/pipeline_review/tech_research/PIPE_ANIMATION_2026-07-29.md (full) — §1 licence fork, §3 the missing twelfth DR-2 row (lines 102-106), the HONEST SUPPLY STATEMENT",
     "docs/pipeline_review/tech_research/LOCAL_3D_ASSET_GEN.md lines 100-135 and 395-470 — TRELLIS.2 single-image input (113-117), §3.2 creatures/rigging, §3.3 NPCs-vs-MetaHuman",
     "docs/ASSET_DROPIN_CONTRACT.md (full) — §1 invariant, §2 rows 1-4 (MetaHuman manifest re-point vs mesh path takeover, lines 80-83), §3 five-state lifecycle, §7 items 6/6-D/7",
     "docs/CONCEPT_ART_PRODUCTION_PROGRAM.md (full) — §2 leaf, §3.2 path form, §3.4 GATE 43 teeth, §4 measured throughput, §4.3 'neither is installed', §5.3 bible lock, §7 anti-slop split, §8 what did not land",
     "docs/proposals/CONCEPT_ART_PROGRAM.md §1.1-1.3 (lines 85-224) — the SHEET arity definitions at 99-102 — and §4.1-4.2a (lines 600-659) incl. the per-region style-LoRA sentence at 628-634",
     "docs/art_boards/README.md (full) + docs/art_bibles/README.md (full, the eleven place-shaped bible fields at 24-51)",
     "docs/proposals/REALM_DESIGN_PROGRAM.md §3.6 (lines 1043-1071) — the bible is the only artifact the factory reads; mesh_tags.style is the handoff",
     "docs/translation/T99_Translation_AssetGen.md lines 60-253 — §2 category routing (NPC=MetaHuman-first line 82, creature rig via Tripo line 80), §3 PBR hole, §4.1 mesh_tags five sub-fields (159-169), §4.3-4.4 finishing + per-category budgets",
     "docs/task_router.json work_kinds assetgen-3d / art-bible / concept-art-class (read_sets, realizing, gate, enforcement)",
     "harness/read_boards.py — BOARD_SHAPES 158-165, PANEL_A_PLATES_PER_OPTION 180-181, PLATES_REQUIRED 194-199, plate_role passthrough at 195 and 577, teeth block 320-440",
     "harness/check_art_pointers.py lines 94, 194 — the ruled path form <class_id>/<canon_id>/<plate_role>__<hash12>.<ext>",
     "harness/art_throughput.py lines 235-258 — the ONLY generation graph on this box: UNETLoader/CLIPLoader/EmptySD3LatentImage(245)/KSampler denoise 1.0(251)/VAEDecode/SaveImage",
     "docs/concept_art/density_model.csv — all 43 rows read; D1-09..D1-17, D1-29..D1-31 arities, formulas and missing_inputs (D1-31's one-mesh_id_ref finding is the model's own)",
     "registries/ — I counted rows and column population directly: T0_Character_Index 164, T0_Creature_Roster 182, T0_Familiar_Registry 22, T0_Boss_Encounter_Registry 281, T0_Antagonist_Network_Registry 64",
     "docs/PRE_5090_BUILD_PLAN.md lines 425-440 — P2.9 integrity bands, P2.11 character creation, P2.12 SelectAppearanceVariant(score,ageStage,pathLock); line 636 external-service note",
     "docs/PRE_5090_BUILD_PLAN_VOL2.md line 463 (CF-7 shape-channel accessibility FLOOR), line 1386 (QT-6 × 5 difficulty presets)",
     "docs/COMBAT_ENCOUNTER_SYSTEM.md section headings — the phase model 'evolve, not swap' (§3), composure (§5), anti-staleness (§11)",
     "docs/proposals/systems/WS7_WIRING_BUILD_PLAN.md — companion-loyalty and attackability column extensions on T0_Character_Index",
     "docs/CAPABILITY_LEDGER.md lines 160-175 — what is actually standing on the box (Z-Image only; MetaHuman plugins present, uproject not enabled)",
     "C:/dev/Humanity/Humanity/Source/Humanity — verified live: 2 montage/ABP references total; HumanityBossCharacter.cpp:139-151 binds every boss to SKM_Manny_Simple at 1.5x scale"
    ],
    "not_derived": [
     "CVD §9.7 (three canonical age stages) and §17.12 (gender lock) were NOT read directly — I took them from the CHAR_0001 registry row's voice_signature_notes and from PRE_5090_BUILD_PLAN P2.9/P2.11/P2.12. Treat the age-stage count as second-hand.",
     "T1_Combat_System_Spec, T1_Companion_System and T3_Familiars_Named were not opened; boss/creature combat requirements are taken from COMBAT_ENCOUNTER_SYSTEM.md headings and from the live T0_Boss_Encounter_Registry columns.",
     "_source/02_Tier_2_Region_Pages/*.md Section 12 (the region-page named figures) was not opened, so the D1-09 'region-page-to-registry overlap unmeasured' flag stays unmeasured here too.",
     "No licence document was re-fetched. UniRig MIT, TRELLIS.2 MIT, Hunyuan3D territory exclusion, Tripo's shipped-output terms and Articulation-XL2.0's dataset terms are all carried from the repo's 2026-07-29 research pass, not re-verified today. PIPE_3D itself flags the Tripo and Articulation-XL2.0 reads as OPEN.",
     "The specific turnaround VIEW COUNT recommendation (front / side / back / three-quarter, plus a rig-notes overlay) is stated industry practice and my authored judgement. No repo document rules a view count; 'turnaround' returns zero hits across docs/.",
     "Whether HiDream-O1 multi-reference or a per-subject LoRA actually holds a character across plates is PIPE_ART §6 benchmark question 4 and is unmeasured. I specify that the row must RECORD which mechanism was used; I do not rule which one wins.",
     "No image was generated or inspected. Every claim about what single-frame T2I can or cannot deliver for view consistency is derived from the installed graph's shape (no LoadImage / no conditioning node) plus the research docs, not from an experiment.",
     "docs/DESIGN_GAP_REGISTER.md, docs/QA_WATCHING_PROGRAM.md and docs/RUNTIME_GENERATIVE_LAYER.md were only grepped, not read; persona/dialogue-driven expression requirements are inferred from those greps."
    ]
   },
   "what_build_needs": [
    "HUMANS ARE NOT GENERATED. T99_Translation_AssetGen.md:82 and LOCAL_3D_ASSET_GEN §3.3 rule named + background NPCs MetaHuman-first through the in-engine creator (browser Creator sunsets 2026-11-05). A MetaHuman is SCULPTED against reference, not prompted — so what concept art owes the human roster is a face reference at consistent lighting from at least front and profile, a proportion/height call, skin/hair/eye values, and a costume construction breakdown. None of that is a 'portrait'.",
    "CREATURES/FAMILIARS/BOSSES ARE image->3D FROM EXACTLY ONE IMAGE. LOCAL_3D_ASSET_GEN.md:113-117 is explicit: TRELLIS.2 takes a single image officially, multi-image conditioning tests WORSE, and 'Do not plan a multi-view-first pipeline around TRELLIS.2.' So the build needs one designated geometry-driver plate per row at a specified view, pose, lighting and background — and the other views exist to VERIFY the mesh, not to drive it.",
    "THE DRIVER PLATE MUST BE RIG-LEGAL. Rigging is unsolved by every generator in scope (PIPE_3D:39 UniRig; T99:80 routes creature rigging to Tripo's universal rig as the one sanctioned paid gap-filler). Auto-rig wants limbs separated from the torso in a neutral pose. The current creature SHEET_3 spends its third plate on a 'behaviour pose' — the exact opposite input.",
    "SCALE AS A NUMBER. Creatures/familiars are skinned non-Nanite: they decimate to the steam_deck_minimum LOD0 budget and take capsule/convex collision matched to the skeleton (T99 §4.3-4.4). Placement, collision and encounter framing all need a height in metres. The PLACE bible gets a SCALE RULE field bound to meters_per_vertex; the BEING classes get nothing.",
    "PER-PHASE, SILHOUETTE-LEGIBLE TELEGRAPHS. PRE_5090_BUILD_PLAN_VOL2.md:463 makes multi-channel readability a non-negotiable L1 FLOOR — 'the Cue carries an audio + shape channel, not color alone' — and specifies a windup pose plus a colour-independent shape indicator. QT-6 (VOL2:1386) grades it at five difficulty presets. A telegraph pose is therefore a gameplay-correctness artifact, not a taste artifact, and the boss model is 'evolve, not swap' (COMBAT_ENCOUNTER_SYSTEM §3), so the count is per phase.",
    "BREAKABLE-PART READS. T0_Boss_Encounter_Registry carries hitzone_parts with per-part break_threshold and break_effect. A breakable part has to be visibly separable in the concept before it can be a mesh section, a hit volume and a VFX anchor.",
    "AN APPEARANCE-VARIANT MATRIX FOR THE PROTAGONIST. PRE_5090_BUILD_PLAN.md:433 (P2.12, BUILD-NOW) ships SelectAppearanceVariant(score, ageStage, pathLock) returning 'a variant id the render layer consumes'; :430 (P2.9) has five integrity bands collapsing to three at Ch 65; :432 (P2.11) adds an appearance base and a best-friend gender choice at character creation; CHAR_0001's own row names three canonical age stages. The render layer is already coded to ask for a variant that concept art has no plan to produce.",
    "COSTUME ACCRETION AS DATA. Ntala's clothing evolution is ruled canon and density_model.csv D1-31 states the hole itself: 'T0_Character_Index carries exactly ONE mesh_id_ref — the schema structurally cannot express a second outfit.'",
    "IDENTITY THAT SURVIVES ACROSS PLATES, CHAPTERS AND CINEMATICS. Cast members recur across four to seventy-seven chapters, across sheet/expression/costume/variant plates, and into Level Sequences. The build needs the SAME character each time, provably.",
    "THE ROUTING SWITCH POPULATED. ASSET_DROPIN_CONTRACT.md:80-83 splits the swap mechanism by class: MetaHuman lands OFF-convention via manifest re-point on ue_asset_path; boss/creature/familiar take over /Game/Meshes/<class>/SM_<mesh_id_ref>. mesh_pipeline_type is the column that decides which — and dispatch reads it before anything is generated.",
    "PROMPT-COMPOSER INPUT. T99 §4.1 (lines 159-169) names mesh_tags the composer's primary input, with five sub-fields: morphology, region, style, material, era. 'style' is precisely where the bible attaches ('concept decides; geometry executes', REALM_DESIGN_PROGRAM §3.6).",
    "A RATIFIED BIBLE PER SUBJECT. task_router.json assetgen-3d is categorical: 'THE RATIFIED BIBLE IS THE ONLY ARTIFACT THE ASSET FACTORY READS. If the subject has no RATIFIED bible... this work is not ready.'",
    "MOTION-LANE INPUTS. PIPE_ANIMATION §3 (102-106) shows animation is not yet a DR-2 class and proposes the twelfth row; the honest supply statement says generation covers ambient/traversal/idle/persona motion but the 248-live/372-clamp presentation ladder stays hand-authored. Hand-authoring needs an authored key pose to start from, and retargeting needs a declared skeleton/proportion profile.",
    "A NON-PLACEHOLDER STARTING POINT. Verified live in the build repo: every boss is SKM_Manny_Simple scaled 1.5x (HumanityBossCharacter.cpp:139-151) and the whole Source tree holds two montage/AnimBP references. The character domain is at absolute zero in-engine, so nothing downstream is currently constraining what concept art must supply — which is exactly why the contract has to be written now rather than discovered later."
   ],
   "what_pipeline_gives": [
    "A being-class decision surface exists and is gate-enforced for geometry: read_boards.py:158-165 declares board_shape 'being_2panel' at (2 panels x 3 options), and T-SHAPE / T-ONE-REC / T-BADGES / T-CITE-PANELA / T-CRITIC-NOGO all fire on it.",
    "Per-class sheet arities are ruled and are executable as counts: CONCEPT_ART_PROGRAM.md:99-102 defines boss SHEET_4 = silhouette + three-quarter orthographic + phase-transform + signature-attack-pose-with-human-scale; creature SHEET_3 = silhouette + detail + behaviour pose; NPC SHEET_2 = portrait + costume full-length. density_model.csv carries each as a row with a formula and a cheap/expensive verdict.",
    "The character/creature/familiar domain is already sized: D1-09/10/11/12/13/14/15/16/17/29/30/31 total 1,517 of 3,471 slice target plates (43.7%) and 7,267 of 17,876 full-game target plates (40.7%) — about 2,713 full-game review units. My domain is the single largest block of the art program.",
    "Measured throughput on this box: REVIEW 1344^2 at 5.35 s/plate, HERO 2048^2/20-step at 34.38 s/plate, peak ~20.6 GiB VRAM, batching proven NOT a lever (CONCEPT_ART_PRODUCTION_PROGRAM §4). The whole slice is ~6 unattended nights of GPU.",
    "Content-addressed storage that makes a regeneration physically unable to overwrite its predecessor: <class_id>/<canon_id>/<plate_role>__<hash12>.<ext> (check_art_pointers.py:94), with GATE 43's eight teeth including P3 content-addressing, P6 byte-exact integrity and P7 blind-mode (a gate that cannot see the drive reports MANIFEST_ONLY, never green).",
    "A plate row rich enough to carry a character contract: PLATES.csv already has plate_role, style_lora_hash, model_id, weights_revision, sha256, generation_prompt_hash, rights_value, image_use_class, generation_licence_ref, lane, generation_status.",
    "The five-state generation lifecycle plus hash-fired regeneration, already landed on every registry in my domain: T0_Character_Index (164 rows), T0_Creature_Roster (182), T0_Familiar_Registry (22), T0_Boss_Encounter_Registry (281), T0_Antagonist_Network_Registry (64) — 713 rows, all carrying the assetgen block (mesh_id_ref, mesh_pipeline_type, substrate_material_ref_path, mesh_tags, generation_status, generation_prompt_hash, last_generated_timestamp, regeneration_trigger, generation_tier, decay_bearing, decay_stage, generation_licence_ref) and all at generation_status=pending.",
    "A licence rail that reaches my domain automatically: previz_only barred from every panel of every board, marketing_eligible COMPUTED not asserted, and the licence-class token folded into generation_prompt_hash so a model demotion fires regeneration_required without a human re-reading anything.",
    "Real care routing already in the DATA for beings, not just in prose: T0_Creature_Roster.combat_permission is populated PROTECTED 19 / FOLKLORE_FACED 16 / PERMITTED 10 / NONE 3, cultural_depiction_required TRUE on 37 rows, cultural_care_register on 79; T0_Boss_Encounter_Registry.care_tier is 281/281; T0_Familiar_Registry.cultural_care_register is 22/22 with two rows carrying explicit depiction_constraint prose.",
    "An anti-slop bar that survives volume: four adversarial critics per board, the 14-plate-per-class-x-leg sampling law (95% confidence on any systematic defect at 20% or worse), and EXHAUSTIVE per-plate critique on every care-gated subject.",
    "A review surface sized for a human: the 12-row LEAF, measured against the spine's own anchor-line grain (no anchor line anywhere names more than 12 ids), with a pick block in the ruled JOSH_REVIEW_INBOX grammar that queue.py intake already parses at BOARD level.",
    "The Rank-0 discipline is already stated: 'you cannot generate a plate for a row that has not been authored' — registry population is named a hard predecessor, not a parallel track."
   ],
   "gaps": [
    {
     "severity": "BLOCKER",
     "gap": "THERE IS NO TURNAROUND. The token 'turnaround' returns zero hits across docs/. The entire corpus contains exactly one orthographic reference: the single 'three-quarter orthographic' plate inside the boss SHEET_4 (CONCEPT_ART_PROGRAM.md:100). A creature SHEET_3 has no ortho at all; an NPC SHEET_2 has no ortho at all; a familiar has none; a companion has none. No document anywhere specifies view count, neutral pose, camera height, lighting neutrality or background for a being plate.",
     "consequence": "No character design is ever view-locked. The back and the profile of every creature in the game are undefined, so they get invented at mesh time by a generator and again at rig time and again at texture time — three different animals wearing one name. The MetaHuman sculpt for a named NPC has no profile to sculpt against. The de-slop critic's unlabeled-relabel test cannot even be run on a being, because there is no second view to be inconsistent with."
    },
    {
     "severity": "BLOCKER",
     "gap": "THE INSTALLED GENERATOR CANNOT PRODUCE VIEW CONSISTENCY, AND NOTHING SAYS SO. The only generation graph on this box is pure text-to-image: harness/art_throughput.py:245 EmptySD3LatentImage into :251 KSampler with denoise 1.0. No LoadImage, no reference node, no ControlNet, no depth. The consistency mechanisms the research actually rules — HiDream-O1 multi-reference personalization, Qwen-Image-Edit-2511 multi-image identity, ControlNet-Union pose — all require models that CONCEPT_ART_PRODUCTION_PROGRAM §4.3 confirms are not installed ('models/diffusion_models/ holds z_image_turbo_bf16 only'). PIPE_ART §6 Q4 (per-subject LoRA vs multi-reference: which holds a nine-plate series together) is an OPEN benchmark question scheduled AFTER the art program starts.",
     "consequence": "Every plate of a given creature is an independent sample from a text prompt. Four plates of 'the Kelimutu Guardian' are four different guardians. At 7,267 domain plates this is not a quality wobble, it is the pipeline's dominant failure mode — and it is invisible to every landed tooth, because GATE 43 proves a plate's bytes are its approved bytes and says nothing about whether two plates depict one animal."
    },
    {
     "severity": "BLOCKER",
     "gap": "THERE IS NO ART BIBLE SHAPE FOR A BEING. The eleven ratified bible fields (art_bibles/README.md:24-51, from REALM_DESIGN_PROGRAM §3.6) are entirely place-shaped: palette, light doctrine, material vocabulary, silhouette-and-ARCHITECTURAL grammar, scale rule tied to meters_per_vertex, vril-physics signature that must become an EG_ row, motion grammar, forbidden list, citations, intensity slot, downstream consumers. Not one field describes anatomy, proportion, costume construction, expression range, rig intent or identity lock. Meanwhile task_router.json assetgen-3d rules the RATIFIED bible 'the ONLY artifact the asset factory reads.'",
     "consequence": "A creature or character mesh has literally nothing legal to read. Either the whole being half of the pipeline is blocked by its own contract, or the factory improvises — which is the 2026-08-01 failure class (build from the program doc, never open the canon) reproduced at 7,267-plate scale."
    },
    {
     "severity": "BLOCKER",
     "gap": "NO PLATE IS DESIGNATED AS THE GEOMETRY DRIVER. The image->3D lane consumes exactly one image (LOCAL_3D_ASSET_GEN.md:113-117), and nothing on PLATES.csv, on MANIFEST.csv, or in the bible's eleven fields says WHICH plate that is. plate_role is free text with no vocabulary; the bible's declared handoff to the factory is mesh_tags.style, a TEXT field, with no image slot at all.",
     "consequence": "The hash-verified chain that CONCEPT_ART_PRODUCTION_PROGRAM §5.3 is proud of proves which bytes were approved but not which bytes drive the mesh. The factory picks — differently per run, per operator, per model — so the geometry is not reproducible from the approval, and a re-generation after a comment may silently switch which view the creature was built from."
    },
    {
     "severity": "MAJOR",
     "gap": "mesh_pipeline_type IS EMPTY ON ALL 713 DOMAIN ROWS. Measured: 0/164 Character, 0/182 Creature, 0/22 Familiar, 0/281 Boss, 0/64 Antagonist. This is the MetaHuman-vs-image->3D routing switch (T99 §2) AND the DR-2 swap-mechanism selector (manifest re-point for off-convention MetaHuman vs path takeover for meshes, ASSET_DROPIN_CONTRACT.md:80-83).",
     "consequence": "Dispatch cannot route a single row. Worse, the DR-2 default is path takeover, so an unrouted named-NPC row would be taken over into /Game/Meshes/<class>/SM_<id> and break the MetaHuman off-convention contract silently — a broken bind that still reports complete. This is exactly the defect class Batch 0 named when it refused to land a status column empty."
    },
    {
     "severity": "MAJOR",
     "gap": "mesh_tags IS EMPTY ON ALL 713 DOMAIN ROWS, and it is the prompt composer's declared PRIMARY input with five required sub-fields (morphology / region / style / material / era, T99 §4.1 lines 159-169).",
     "consequence": "The composer has nothing to compose from, so a being prompt is authored as free text — un-derived, uncheckable, and unable to fire regeneration_required when the canon behind it changes, because nothing structured is in the hash. Region, era and style are exactly the fields that make a Sri Lankan sloth bear read as Sri Lankan rather than as generic."
    },
    {
     "severity": "MAJOR",
     "gap": "NO SCALE, PROPORTION OR ANATOMY COLUMN EXISTS ON ANY BEING REGISTRY. I enumerated every column on all four and matched against size|scale|height|mass|anatom|morph|body|silhouette|costume|expression|face|age: the only hits are regeneration_trigger, decay_stage, phase_trigger and loyalty_join_trigger — i.e. zero real hits. The place bible gets a SCALE RULE field bound to the Zone Catalog's meters_per_vertex so the art call and the geometry budget agree; beings get no equivalent.",
     "consequence": "Capsule collision, LOD decimation targets, arena framing, camera distance and encounter readability all key off a size the pipeline never records. A creature drawn heroically and modelled at 2 m instead of 0.6 m is not caught by any tooth, and the error surfaces first as a broken encounter."
    },
    {
     "severity": "MAJOR",
     "gap": "NO EXPRESSION OR EMOTION SHEET CLASS EXISTS. D1-09 named-persona is SHEET_2 = portrait + costume full-length, full stop. There is no facial-range artifact for any of the 164 named characters, the companions, or the antagonist operatives — while the build carries a per-entity persona system, a generative ambient-dialogue layer that shifts NPC mood on integrity band, and 16 cinematic scene specs with participant bindings.",
     "consequence": "MetaHuman ships the blend shapes; nothing says which face a character actually wears. Every cinematic and every dialogue beat then improvises the performance, and the 'natural voice doctrine' has no visual counterpart — the one place where a cast reads as generic no matter how good the base sculpt is."
    },
    {
     "severity": "MAJOR",
     "gap": "THE TELEGRAPH/PHASE PLATE DISCIPLINE IS ABSENT AND ITS SIZING INPUTS ARE UNPOPULATED. The accessibility FLOOR demands a windup pose plus a colour-independent shape indicator readable at five difficulty presets (VOL2:463, QT-6 at VOL2:1386), and the boss model is 'evolve, not swap' with per-phase escalation. SHEET_4 provides ONE 'phase-transform' and ONE 'signature-attack pose' regardless of how many phases a boss has — and the columns that would size it are empty: phase_trigger 0/281, escalation_vector 0/281, signature_counters 0/281, hitzone_parts 1/281, pip_count 13/281, defender_element 5/281.",
     "consequence": "Boss art is authored against an encounter nobody has specified, so the shape channel — a non-negotiable accessibility floor — is drawn by accident if at all, and QT-6 has no authored reference to grade a capture against. This is the one gap in my domain where the failure is not ugliness but an unplayable, and legally-adjacent, accessibility miss."
    },
    {
     "severity": "MAJOR",
     "gap": "IDENTITY LOCK IS REGION-SCOPED, NOT SUBJECT-SCOPED. style_lora_hash exists on PLATES.csv and is empty; the only ruled LoRA is 'the charter's per-realm LoRA, generalized here to per-region' (CONCEPT_ART_PROGRAM.md:628-634). Nothing rules per-character or per-creature identity.",
     "consequence": "A per-region LoRA makes every Flores plate look like Flores. It does nothing to make Ntala look like Ntala across her base look, three outfit accretion states, an expression sheet, four chapters and a cinematic. The cast — the thing players actually remember — is the one axis with no consistency mechanism at all."
    },
    {
     "severity": "MAJOR",
     "gap": "THE PROTAGONIST'S APPEARANCE-VARIANT MATRIX IS UNBUDGETED AND UNROUTED. P2.12 (PRE_5090_BUILD_PLAN.md:433) is BUILD-NOW and returns a variant id keyed on (integrity score x age stage x path lock); P2.9 has five bands collapsing to three at Ch 65; P2.11 adds an appearance base and a best-friend gender choice; CHAR_0001 names three canonical age stages. CHAR_0001 is simply one of D1-09's rows and draws a SHEET_2.",
     "consequence": "Two plates for the only character on screen for the entire game, and a shipped selector function with no art behind any of its return values. The variant space is real and multiplicative; it is currently budgeted at zero."
    },
    {
     "severity": "MAJOR",
     "gap": "THE COSTUME SCHEMA CANNOT HOLD A SECOND OUTFIT — the density model says so itself. density_model.csv row D1-31 missing_inputs: 'PER-REGION COMPANION OUTFITTING IS NOT RULED. T0_Character_Index carries exactly ONE mesh_id_ref - the schema structurally cannot express a second outfit.'",
     "consequence": "Ntala's ruled clothing accretion has nowhere to land, and every companion/protagonist outfit state either overwrites the base mesh id or lives outside the contract entirely — the DR-2 invariant broken at the first character who changes clothes."
    },
    {
     "severity": "MINOR",
     "gap": "plate_role IS UNVALIDATED FREE TEXT. read_boards.py reads it at :195 into PLATES_REQUIRED and passes it through at :577 into the critics' worklist; no tooth checks it against any vocabulary, and no tooth checks that a density class's declared roles are all present. The ruled per-option plate counts (PANEL_A_PLATES_PER_OPTION = 3 at :180) are charter-fixed for PLACES — silhouette-and-architecture, palette-and-light, signature detail — and are simply wrong roles for a being.",
     "consequence": "'A creature sheet is three plates' is a sentence in a document, not a property of the artifact. A being board can ship two plates, or three plates all named 'hero', and pass every landed tooth."
    },
    {
     "severity": "MINOR",
     "gap": "ROSTER DRIFT ACROSS THE THREE DOCS THAT SIZE MY DOMAIN. The live T0_Creature_Roster is 182 rows; density_model.csv D1-15 sizes against '150 minted'; PIPE_3D budgets rigging and animation for '132 creatures / 22 familiars'; T3_Creatures_Tameable rules 420+ as the ceiling. Four numbers.",
     "consequence": "The rigging budget, the plate budget and the GPU-night schedule are each computed against a different roster, so none of the three can be trusted to size the character wave."
    },
    {
     "severity": "MINOR",
     "gap": "PANEL SEMANTICS DO NOT TRANSFER CLEANLY TO BEINGS. being_2panel inherits Panel A = 'the accurate depiction — what the source tradition itself says the place looks like' with a hard T-CITE-PANELA citation requirement. 42 of 182 creature rows are species_class=folklore, and the materialized-argument boss class is invented-by-canon.",
     "consequence": "For a real animal the panel reads correctly; for a folklore being 'accurate' means faithful to the TRADITION's account, and for a construct there is no accurate depiction at all. The rule is under-ruled rather than broken, but it will produce either false citations or timid boards on the 42 folklore rows — and care-tier inflation is itself a declared defect."
    }
   ],
   "required_additions": [
    {
     "kind": "plate_role",
     "addition": "THE TURNAROUND SET — ortho_front, ortho_side, ortho_back, ortho_three_quarter",
     "shape": "Four plates, one subject, one declared neutral pose, one camera height, flat even light, plain neutral background, identical framing and subject occupancy. Required on every model-bearing being row (creature, familiar, boss, folklore being, and any named NPC whose mesh_pipeline_type is not metahuman). This is the design lock: it is what the modeller, the rigger, the texture pass and the de-slop critic all compare against. Authored judgement on the count of four — no repo doc rules a view count, and four is the smallest set that closes the back and the profile."
    },
    {
     "kind": "plate_role",
     "addition": "geometry_driver — exactly one per (canon_id, variant_key)",
     "shape": "A flag on the plate row, not a new id space. The one image the image->3D generator consumes, per LOCAL_3D_ASSET_GEN:113-117's single-image rule: three-quarter front, rig-legal neutral pose, limbs clear of the torso, no motion blur, no ambiguous ground contact, uniform background. Normally the same render as ortho_three_quarter. A gate tooth asserts exactly one per key; zero blocks dispatch, two is a defect."
    },
    {
     "kind": "plate_role",
     "addition": "scale_figure",
     "shape": "The subject beside a 1.75 m human silhouette at the same camera and lens, with the metre value carried on the REGISTRY ROW (see height_m) and never only inside the image. One per being row. Gives collision, decimation target, arena framing and encounter camera a single source."
    },
    {
     "kind": "plate_role",
     "addition": "expression_sheet",
     "shape": "Six cells for named cast and companions: neutral, the character's signature affect, and the four states the dialogue/persona system actually drives. Feeds the MetaHuman sculpt, the cinematic participant performance, and the ambient-crowd mood shift the runtime layer already keys on integrity band."
    },
    {
     "kind": "plate_role",
     "addition": "costume_callout and material_closeup",
     "shape": "costume_callout: the outfit exploded into garment pieces, fastenings and wear points, with material names that resolve into the bible's MATERIAL VOCABULARY so the authenticity and physics critics have something checkable. material_closeup: hide/feather/scale/fabric/skin at macro, as the target for the manual PBR derivation lane (the commercially-clean AI PBR gap is confirmed still open)."
    },
    {
     "kind": "plate_role",
     "addition": "telegraph_pose (per phase) with a mandatory silhouette derivative, plus phase_state and hitzone_breakable",
     "shape": "telegraph_pose: the windup at its most readable moment, rendered ALSO as pure black-on-white — the shape channel made an artifact rather than an aspiration (VOL2:463). phase_state: one per phase beyond the first, sized from the boss row's phase_trigger/escalation_vector, never a fixed 4. hitzone_breakable: one per hitzone_parts entry, showing the part intact and broken with its break_effect visible."
    },
    {
     "kind": "plate_role",
     "addition": "variant_key plate and rig_notes overlay",
     "shape": "variant_key: one plate per declared variant value, with variant_axis (age_stage | integrity_band | path_lock | outfit_state | rare_morph | hollow_surface) and variant_value on the row, so the parametric/authored split is a query. rig_notes: a cheap annotated overlay on ortho_side marking joint intent — spine path on a serpentine, limb segment count, whether the wings are arms — which is what stops UniRig producing a rig nobody can retarget on the 182-row non-humanoid roster (PIPE_3D §6 Q5 is exactly this risk)."
    },
    {
     "kind": "authoring_rule",
     "addition": "THE NEUTRAL-POSE RULE",
     "shape": "Every ortho and every geometry_driver is authored in a declared neutral pose per morphology class: biped A-pose, quadruped standing square, serpentine relaxed S, avian perched with wings half open, chimeric declares its own and records it. Behaviour, attack and phase poses are ADDITIONAL plates and are never the driver. This directly retires the current SHEET_3, which spends its third plate on a behaviour pose and therefore hands the 3D lane its worst possible input."
    },
    {
     "kind": "authoring_rule",
     "addition": "THE VIEW-CONSISTENCY RULE",
     "shape": "No ortho set is produced by independent T2I sampling. View 1 is generated; views 2..n are CONDITIONED on view 1 (edit/reference mode, or ControlNet pose/depth over a posed proxy), and the plate row records the conditioning mechanism and the source plate_id. Independent sampling of a turnaround is a defect by construction, not a quality judgement."
    },
    {
     "kind": "authoring_rule",
     "addition": "THE IDENTITY-LOCK RULE",
     "shape": "Any subject appearing in more than one plate role or more than one chapter carries a per-SUBJECT identity lock: either a per-subject LoRA whose hash lands in the existing style_lora_hash column, or a declared multi-reference chain in identity_ref_plate_id pointing at the ratified geometry_driver. PIPE_ART §6 Q4 decides WHICH mechanism wins; this rule requires only that the row RECORD which was used, so a look drift becomes a query instead of an archaeology dig."
    },
    {
     "kind": "authoring_rule",
     "addition": "THE BEING CARE ROUTE — extend the Panel-A reference rule from generation_class to being selectors",
     "shape": "The landed rule keys Panel-A reference-class on the board's generation_class. For beings the selectors already exist in the data and are populated: T0_Creature_Roster.combat_permission = PROTECTED (19 rows) or cultural_depiction_required = TRUE (37 rows), plus cultural_care_register and the Familiar registry's depiction_constraint prose. Same mechanism, new selector — and calibrated BOTH ways per the standing ruling, since a folklore being that is a canon BOSS must not be routed to reverent-empty by a care flag."
    },
    {
     "kind": "authoring_rule",
     "addition": "SCALE IS A NUMBER FIRST",
     "shape": "height_m is written on the registry row BEFORE the scale_figure plate is rendered; the plate is rendered against it; disagreement is a regeneration, not a note. Mirrors the place bible's meters_per_vertex discipline, which exists precisely so the art call and the geometry budget cannot diverge."
    },
    {
     "kind": "schema_column",
     "addition": "POPULATE mesh_pipeline_type across all 713 domain rows (existing column, 0% filled)",
     "shape": "Closed enum { metahuman, metahuman_crowd, image_to_3d, reference_built, hand_authored }. Derived per row from T99 §2's routing table (humans -> metahuman; creature/familiar/folklore/boss -> image_to_3d; the materialized-argument construct class case-by-case). One scripted pass through the sanctioned writer with docs/fidelity_baseline.json refreshed in the same commit. Batch 0's own correction applies verbatim: a routing column that lands empty re-creates the defect it exists to close."
    },
    {
     "kind": "schema_column",
     "addition": "POPULATE mesh_tags across all 713 domain rows (existing column, 0% filled)",
     "shape": "The five declared sub-fields, derived from the row's own canon rather than typed: morphology from species_class/tier_classification, region from primary_region_ids/region_native, style from ontology_class + cultural_care_register, material from the spine node's material_palette anchor, era from T0_Chapter_Index. Folded into generation_prompt_hash so a canon edit fires regeneration_required through the existing trigger."
    },
    {
     "kind": "schema_column",
     "addition": "NEW height_m on T0_Character_Index / T0_Creature_Roster / T0_Familiar_Registry / T0_Boss_Encounter_Registry",
     "shape": "One numeric column plus an optional length_axis token for serpentine and quadruped forms. Consumed by the scale_figure plate, the Decimate/steam_deck_minimum LOD target, the capsule/convex collision hull and the encounter camera. Lands through the proven added_columns + registry_extensions.json vector."
    },
    {
     "kind": "schema_column",
     "addition": "NEW costume_set_ref (multi-value) and appearance_variant_axes on T0_Character_Index",
     "shape": "costume_set_ref closes the hole density_model.csv D1-31 already names verbatim — N outfit states against one mesh_id_ref, resolver-keyed exactly as decay_stage is (canon id, variant key) with fallback to the base look, reusing the DR-2 item-7 shape rather than inventing machinery. appearance_variant_axes declares which of { age_stage, integrity_band, path_lock, gender_presentation, appearance_base } a row varies on, giving P2.12's SelectAppearanceVariant a data home and making the protagonist's plate budget a query instead of an omission."
    },
    {
     "kind": "schema_column",
     "addition": "NEW columns on PLATES.csv: geometry_driver (bool), identity_ref_plate_id, identity_lock_kind, view_conditioned_from, variant_axis, variant_value, subject_pose_class",
     "shape": "Seven columns, all cheap, all queryable. They make the four blocker findings mechanically checkable: which plate drives geometry, how identity is held, whether a view was conditioned or independently sampled, and what variant a plate depicts. style_lora_hash already exists and stays as the hash home."
    },
    {
     "kind": "schema_column",
     "addition": "CLOSE the plate_role vocabulary and bind a REQUIRED-ROLE SET per density class",
     "shape": "A JSON sidecar beside density_model.csv: role vocabulary as a closed list, plus per-class required roles (e.g. D1-15 creature = {ortho_front, ortho_side, ortho_back, ortho_three_quarter, geometry_driver, scale_figure, material_closeup, behaviour_pose}; D1-09 named NPC adds expression_sheet and costume_callout; D1-13/D1-14 boss adds telegraph_pose x phases, phase_state x phases, hitzone_breakable x parts). This converts every sheet-arity sentence in CONCEPT_ART_PROGRAM.md:99-102 into a checkable property and re-sizes the density model honestly — the boss and protagonist counts will go UP."
    },
    {
     "kind": "tooling",
     "addition": "INSTALL THE MULTI-REFERENCE PATH BEFORE ANY BEING VOLUME RUNS",
     "shape": "HiDream-O1-Image-Dev (MIT, the ruled T2I primary, still uninstalled) with HiDreamO1ReferenceImages, or Qwen-Image-Edit-2511 (Apache) for multi-image identity, plus Qwen-Image-ControlNet-Union and Depth-Anything-3 with the Apache variants pinned by filename (Giant and Nested are CC BY-NC). And PIPE_ART §6 benchmark question 4 — per-subject LoRA versus multi-reference — must be ANSWERED BEFORE the character wave, not after: it is the single question that decides whether 7,267 domain plates depict one creature each or many."
    },
    {
     "kind": "tooling",
     "addition": "NEW GATE art_roles — the deterministic sibling to GATE 43",
     "shape": "Built on read_boards.py/check_art_pointers.py's proven interface, PRESENCE and SHAPE only, never content. Teeth: required-role coverage per density class; exactly-one geometry_driver per (canon_id, variant_key); ortho-set completeness; subject_pose_class declared on every ortho and driver; height_m present on every row carrying a scale_figure; identity lock declared for any subject with more than one plate; view_conditioned_from non-empty on views 2..n; telegraph_pose count equals the boss row's declared phase count. Must-fire and must-not-fire fixtures plus exit 3 if a ruler rotted, per the landed pattern — a tooth without a failing fixture is not armed."
    },
    {
     "kind": "tooling",
     "addition": "BEING-SPECIFIC DETERMINISTIC IMAGE MEASURES (extends the PROPOSED art_quality set, numpy/PIL, no model)",
     "shape": "Background uniformity on geometry_driver plates — a busy background poisons the image->3D segmentation and is the cheapest possible catch; subject bounding-box occupancy band, so a creature is not rendered at 8% of frame; silhouette-contrast measure on every telegraph_pose derivative, which turns the accessibility FLOOR into arithmetic; and cross-view dhash collision inside an ortho set, which catches the sampler having ignored the view instruction and returned the same image twice."
    },
    {
     "kind": "process_step",
     "addition": "AUTHOR THE BEING BIBLE TEMPLATE — docs/art_bibles/_TEMPLATE_BEING.md",
     "shape": "Twelve fields, parallel in spirit to the eleven place fields and equally consumer-bound: SILHOUETTE LAW; PROPORTION CANON (with height_m); SURFACE AND MATERIAL VOCABULARY; PALETTE with its placement rule; COSTUME CONSTRUCTION; EXPRESSION RANGE; MOTION GRAMMAR (weight, gait, idle tell); TELEGRAPH GRAMMAR per phase, shape-channel explicit; VARIANT AXES and what each one changes; THE FORBIDDEN LIST; CITATION APPENDIX with rights values; DOWNSTREAM CONSUMERS named so nothing orphans (mesh_tags, mesh_pipeline_type, the UniRig/MetaHuman route, the animation lane's retarget profile, the image-critic expectation manifest). Same two states and the same director-only ratification write — a subagent may create AWAITING PICK and may never flip it."
    },
    {
     "kind": "process_step",
     "addition": "RANK 0 FOR THIS DOMAIN — populate the encounter and routing columns before any being art runs",
     "shape": "Zero-GPU registry work that gates everything: phase_trigger, escalation_vector, signature_counters, hitzone_parts and pip_count on T0_Boss_Encounter_Registry (today 0/281, 0/281, 0/281, 1/281, 13/281) SIZE the telegraph/phase/hitzone plates; mesh_pipeline_type and mesh_tags ROUTE them; height_m SCALES them. Generating boss art before these are written means regenerating it — the exact argument the program already uses to put the law boards first."
    },
    {
     "kind": "process_step",
     "addition": "LAND THE PLT_ TARGET CASE IN queue.py's INTAKE RESOLVER",
     "shape": "Already named NOT LANDED in CONCEPT_ART_PRODUCTION_PROGRAM §8. My domain is where it bites hardest: a leaf row is one entity but a comment lands on one VIEW ('the horns are wrong', 'the profile is wrong', 'phase 2 reads the same as phase 1'). Until plate-level targets resolve, every character comment either lands as a BLOCKED unresolved_target or regenerates the whole sheet — and regenerating a whole ortho set to fix one view breaks the identity lock the set was built to hold."
    }
   ]
  },
  {
   "lane": "props-3dgen",
   "derivation": {
    "derived_from": [
     "docs/pipeline_review/tech_research/LOCAL_3D_ASSET_GEN.md — §1.1 L113-117 (TRELLIS.2 single-image official; multi-image conditioning reported WORSE, verbatim 'Do not plan a multi-view-first pipeline around TRELLIS.2'), L52/L62 (TRELLIS.2 GLB+PBR out; InstantMesh multi-view sparse-input), L224-226 (SF3D single 512x512 input, explicit 'delighting' post-process to strip baked-in lighting), §2.1 L337-351 (PolyGen/SeamGPT unreleased; 'LODs and collision generation are not addressed even in this research-only pipeline'), §3.1 L414-420 (weapons = best fit: 'object-scale, single-item, well-lit-reference inputs these models were trained on'), §3.4 L462-465 (models trained object-scale/Objaverse-class; buildings rendered 'in an empty scene which does not occur in the real world'), §3.6 L484-502 (texture options), §5.2 L565-587 (benchmark protocol + metrics)",
     "docs/pipeline_review/tech_research/PIPE_3D_2026-07-29.md — §1 L32 (TRELLIS.2-4B primary / Direct3D-S2 fallback), L35 (TRELLIS.2 textured path BANNED from shipped path, nvdiffrast/nvdiffrec), L36-37 (AutoRemesher 'Does NOT generate UVs' — pair with xatlas), §3 L126-144 (DR-2 addressing, state machine, three request axes, formats GLB/OBJ→Blender→FBX + separate basecolor/normal/ORM), L145-156 (Nanite prep; no authored LOD chains for world/static; opaque/masked only; collision hull; WPO metadata), L157-165 (the deterministic QA teeth: manifold/watertight, tri + material-slot budget, UV coverage/overlap from xatlas, collision hull exists; 'Only assets that pass the deterministic teeth are shown to an image critic, which reads captures against the concept-art reference'), §4 L169-172 (script-emitted dispatch; prompt composer reads the row and never invents subject matter)",
     "docs/pipeline_review/tech_research/PIPE_ART_2026-07-29.md — §1 L22-33 (HiDream-O1 MIT primary w/ instruction-edit + multi-reference personalization; Qwen-Image-Edit-2511 multi-image identity; Depth-Anything-3 Apache variants only; PBR channel derivation = Material Maker primary / Materialize fallback), L53-55 (CHORD Research-Only; 'the commercially-clean AI PBR-estimation gap is STILL OPEN … that is why §1's PBR row is deterministic tools, not a model'), §3 L148-155 (this lane writes DR-2 substrate_material_ref_path rows), §4 L190-196 (care_tier rows mechanically refuse Lane-G dispatch)",
     "docs/ASSET_DROPIN_CONTRACT.md — §2 L82 (Weapon mesh: T0_Weapon_Registry.mesh_id_ref → /Game/Meshes/Weapon/SM_<mesh_id_ref>, placeholder home 'none built (weapons unrendered)'), L83-84 (prop/env mesh + material rows), §3 L98-122 (five-state lifecycle), §7 item 6.1-6.4 L231-252 (generation_tier closed enum background·region_standard·region_hero·realm·apex; tier is a REQUEST parameter never a path segment; prompt hash includes tier), item 7 L315-328 (presentation_tier_ref rail; resolver key (canon id, presentation_tier_ref); sizing RULED at the full 248/372 key space)",
     "docs/translation/T99_Translation_AssetGen.md — §1 constraints 1-4 (MIT-class default in shipped path; territory/revenue-capped tools previz-only — this is what bars SF3D and its delighting step; real cultural architecture never raw-generated), §2 routing table (Weapons → TRELLIS.2 / Hi3DGen fallback; Vril Sites best-case; Special Asset Class inherits weapons/props), §4.1 (mesh_tags five sub-fields morphology/region/style/material/era), §4.3 (Blender-headless finishing; steam_deck_minimum decimate target; static Nanite classes carry no triangle cap; collision stays simple convex/capsule/box; FBX→UE import via unreal.AssetImportTask), §4.4 (Weapons = small hand-held props, simple convex collision, short LOD chain, hand-finished regardless)",
     "docs/CONCEPT_ART_PRODUCTION_PROGRAM.md — §3.2 L185 (path form <class_id>/<canon_id>/<plate_role>__<hash12>.<ext>), §3.4 L223-257 (GATE 43 teeth P0-P7; 'a tooth without a failing fixture is not armed'), §4 L267-283 (measured tiers: REVIEW 1344² 5.35 s/plate; HERO 2048²/20 steps 34.38 s/plate, 105/hr; batching is not a lever), §4.3 L324-334 (Z-Image-Turbo is NOT the ruled primary; HiDream not installed), §5.3 L395-410 (approved plate → art bible; assetgen-3d reads the bible; GATE 43 P6 hash-verifies the chain), §6 Rank 0 L420-427 (registry population gates everything), Rank 1 rows 4-5 L439-440 (D1-23 165 slice plates; D1-26 15 plates incl. the Ch-2 realm object 'on screen for the entire slice'), §7.1 L478-491 (proposed image-space measures), §8 L551-561 (PLT_ intake resolver NOT landed)",
     "docs/art_bibles/README.md — 'the eleven named fields' (PALETTE / LIGHT DOCTRINE / MATERIAL VOCABULARY / SILHOUETTE AND ARCHITECTURAL GRAMMAR / SCALE RULE tied to the Zone Catalog meters_per_vertex rung / VRIL-PHYSICS SIGNATURE / MOTION GRAMMAR / FORBIDDEN LIST / CITATIONS / INTENSITY SLOT / DOWNSTREAM CONSUMERS incl. mesh_tags.style) — every field is PLACE-shaped",
     "docs/task_router.json › assetgen-3d + docs/TASK_ROUTER.md L461-478 — 'THE RATIFIED BIBLE IS THE ONLY ARTIFACT THE ASSET FACTORY READS'; gate = generation_lifecycle; no binary enters the canon repo",
     "docs/art_boards/README.md — six-value rights vocabulary, the |-separator convention, the four critics, the board=decision-surface rule",
     "docs/concept_art/density_model.csv L24 (D1-23 grade_variants = weapon_types × 6 art-bearing grades; 11 subclass grade boards; missing_inputs verbatim 'T0_Weapon_Registry carries NO rarity column - the grade join is unbuilt'; cheap; P0), L25-26 (D1-24 unruled multiplier / D1-25 72 ruled legendaries), L27 (D1-26 equipment 1 row; expensive; P0), L35 (D1-34 missing_inputs '4 rarity art hooks … 0/13')",
     "docs/COMBAT_PROGRAM_ADDENDUM.md §5 (the proficiency presentation ladder — animation/VFX/audio refinement, 'presentation only'), §8 (gear-imprint rune lane, RNG rolls by rarity), §10 (LEGENDARY and MYTHIC are RARITY GRADES never tier names)",
     "docs/PRE_5090_BUILD_PLAN.md §13 L632 (GATED-5090: 3D geometry gen, PBR texture gen at 72-weapon volume) and 'Numbers only (tuning firewall)' L644 (per-category poly/LOD budgets wait for measurement — shapes and bindings build now)",
     "LIVE REGISTRY READS (this pass, csv.DictReader): registries/T0_Weapon_Registry [DRAFT v0.1]/Sheet1.csv = 72 rows × 27 cols — mesh_id_ref 0/72, mesh_pipeline_type 0/72, mesh_tags 0/72, substrate_material_ref_path 0/72, generation_tier 0/72, presentation_tier_ref 0/72, regional_bonus_class 0/72, generation_status 72/72 'pending', cultural_region_ref 58/72; ZERO columns matching /len|size|dim|scale|mass|weight|bbox|met(er|re)/, /rarity|grade/, /socket|part|attach/ (positive control: mesh_id_ref, mesh_pipeline_type, mesh_tags all matched). registries/T0_Equipment_Registry [DRAFT v0.1] = 1 row (EQ_0001, mesh_id_ref empty). registries/T0_Rarity_Grade [DRAFT v0.1] = 13 rows, item_grade axis carries 8 tokens (none/common/uncommon/rare/epic/legendary/mythic/signature); shape_token, colour_ref, beam_vfx_ref, card_layout_ref, display_name_text all 0/13.",
     "docs/art_boards/PLATES.csv (live read) = 91 rows; plate_role values in use = board_candidate 76, silhouette 3, palette 3, detail 3, hero 3, law_in_action 3; lanes G 76 / R 9 / P 6. harness/read_boards.py:195 lists plate_role as a REQUIRED column; harness/check_art_pointers.py:94,194 checks only the filename FORM — no closed vocabulary and no value check anywhere.",
     "ZERO-CHECK WITH POSITIVE CONTROL: a corpus-wide grep of docs/ and _source/ for the input-image-conditioning vocabulary (input image · conditioning image · background removal · matte · alpha cutout · rembg · isolated on · studio light · neutral/white/clean background · orthographic · turnaround · three-quarter · multi-view · scale reference · delight) returned NOTHING on the subject of what an image→3D conditioning plate must look like; the only near-hits are LOCAL_3D_ASSET_GEN's own model-catalog lines and one parenthetical at docs/proposals/CONCEPT_ART_PROGRAM.md:100 describing a BOSS sheet ('silhouette, three-quarter orthographic, phase-transform, signature-attack pose with human scale'). Positive control on the same corpus: 'TRELLIS' matches 191 times in docs/. The absence is real, not a failed search."
    ],
    "not_derived": [
     "The specific numeric thresholds proposed for GATE 44's image-space teeth (alpha coverage 55-92 % of frame, mid-grey ~sRGB 128 background, specular-clip ceiling at >0.97 luminance, the background luminance-std-dev ceiling) — these are AUTHORED JUDGEMENT in the register of docs/CONCEPT_ART_PRODUCTION_PROGRAM.md §7.1's proposed measures, and every one must be replaced by a measurement from the LOCAL_3D_ASSET_GEN §5.2 benchmark's input-condition arm before it is treated as a fact. They are stated so they can be argued with, exactly as §2.2's 12 s/45 s review model is.",
     "The framing prescriptions themselves (three-quarter ~30-40° off the flat for a blade, subject filling 80-90 % of frame, soft key+fill with no rim or cast shadow, three ortho views) — STATED INDUSTRY PRACTICE for image→3D conditioning, labelled as authored judgement. The repo's research supports the PRINCIPLE (object-scale · single-subject · empty scene · no baked light, per LOCAL_3D_ASSET_GEN §3.1/§3.4 and SF3D's delighting step at L224-226) but names no angle, no framing fraction and no lighting rig anywhere.",
     "The recommendation that item_grade rungs common→epic are MATERIAL-ONLY and legendary/mythic are GEOMETRY-BEARING at SUBCLASS scope — an authored proposal, creative-within-vision, offered because the density model calls D1-23 'cheap' and 'parametric' while saying nothing about whether a grade changes geometry. It is not ruled anywhere and it changes the 3D volume by an order of magnitude, so it is named for the director rather than assumed.",
     "The recommendation that presentation_tier_ref on a WEAPON is a moveset/VFX axis and NOT a mesh axis. COMBAT_PROGRAM_ADDENDUM §5 says the ladder is 'presentation only' and lists animation/VFX/audio/follow-through, never mesh — but ASSET_DROPIN_CONTRACT item 7 sizes the rail at the full 248/372 key space without ever saying whether a weapon MESH is one of the variant-bearing surfaces. The ruling is needed; the direction I recommend is inference from §5's own enumeration.",
     "GATE 44 as a gate ID. The live roster is 43 gates (GATE 43 = art_pointers); 44 is the next free number by convention, not a reservation I verified against a registry of gate ids.",
     "Everything about creatures, familiars, NPCs, architecture, terrain and realms. This return is scoped to props / artifacts / weapons / equipment. The creature lane shares the neutral-plate law but adds rigging and a T-pose/A-pose conditioning question that is a different lane's ruling."
    ]
   },
   "what_build_needs": [
    "A SINGLE NAMED CONDITIONING IMAGE per canon id. TRELLIS.2 and Direct3D-S2 are single-image models by the repo's own read, and LOCAL_3D_ASSET_GEN:113-117 forbids a multi-view-first plan around the ruled primary. The pipeline must therefore designate exactly one plate as the geometry input — the factory must never have to pick the best-looking one.",
    "THAT IMAGE CONDITIONED FOR OBJECT-SCALE RECONSTRUCTION: one subject, nothing else in frame, full object visibility with no self-occlusion of a major form, an empty neutral background with a hard alpha, and lighting flat enough that no highlight or cast shadow bakes into albedo. The repo's own reasoning for why weapons are the best-fit class is verbatim that they are 'object-scale, single-item, well-lit-reference inputs these models were trained on' (LOCAL_3D_ASSET_GEN §3.1), and its reasoning for why architecture fails is that buildings get rendered 'in an empty scene which does not occur in the real world' (§3.4). Both halves of that finding are input-condition statements.",
    "A DELIGHTING SUBSTITUTE. SF3D is the only tool in the corpus with an explicit delighting step (LOCAL_3D_ASSET_GEN:225) and it is barred from the shipped path by the ruled licence constraints (T99_Translation_AssetGen §1, Stability Community Licence $1M cap). TRELLIS.2 / Direct3D-S2 / Hi3DGen have none. The input plate's lighting is therefore the ONLY delighting control the shipped path owns.",
    "A BACK-FACE TRUTH REFERENCE. Single-image gen hallucinates the unseen half. Not one of PIPE_3D §3's deterministic teeth (manifold, tri budget, material slots, UV coverage, collision hull) can see a wrong back, and the image critic can only catch it if it holds a back plate to compare against.",
    "A MULTI-VIEW INPUT SET that exists but is never fed to the ruled primary — needed so the LOCAL_3D_ASSET_GEN §5.2 benchmark can actually run its multi-view backends (InstantMesh sparse-input at L62/L300, Hunyuan, HY-World) instead of scoring them on an input they were not built for.",
    "A REAL-WORLD SCALE ANCHOR. Generators emit unit-normalized meshes; Blender-headless has to apply a scale factor before FBX export or every weapon lands wrong in UE and every wield socket is off. The art bible's SCALE RULE field ties to the Zone Catalog's meters_per_vertex rung — a PLACE quantity a sword has no row in.",
    "FLAT, EVENLY-LIT, FRONTO-PARALLEL MATERIAL SOURCE IMAGERY — one per distinct material on the object. PIPE_ART §1 routes PBR channel derivation to Material Maker / Materialize (deterministic tools, not a model) precisely because 'the commercially-clean AI PBR-estimation gap is STILL OPEN' (PIPE_ART:53-55). Materialize consumes a flat surface crop. Nothing else in the pipeline produces one, and substrate_material_ref_path is a live DR-2 asset class (ASSET_DROPIN_CONTRACT:84) sitting at 0/72 on the weapon registry.",
    "A FUNCTIONAL PART MAP. PartCrafter is already in the ruled stack for part decomposition (PIPE_3D:40) with nothing telling it which parts matter, and the grade ladder needs to know which part takes the treatment.",
    "NAMED ATTACH GEOMETRY — grip root and axis, tip, sheath root, second grip — so the Blender-headless finisher places empties deterministically instead of a human doing it 72 times plus once per variant. T99 §4.4 says weapons are 'hand-finished regardless'; that is a statement about topology, not a licence to hand-place every socket at variant volume.",
    "A GRADE-LADDER LAW with a declared geometry consequence. Six art-bearing item_grade tokens × 72 weapons is 432 units. Whether that is 432 material swaps or 432 meshes is the single largest unresolved number in this domain and no document states it.",
    "POSE-MATCHED CAPTURES for the QA gate. PIPE_3D:161-165 has the image critic reading captures 'against the concept-art reference'. For a place that is a mood comparison; for a prop it must be the same camera and framing or the critic is grading vibe.",
    "A CARE REFUSAL THAT COVERS OBJECTS. The never-raw-generate rule is written for ARCHITECTURE (T99 §1 constraint 3). Ritual regalia and ceremonial objects of a living tradition are the same class of error as a real temple and are currently unfenced on the object lane.",
    "REVEAL DISCIPLINE ON THE GEOMETRY PLATE. EQ_0001's ward is unreadable and uninscribed before the Ch-8 reveal (HL_0095, carried verbatim in the registry row's notes). A geometry plate that inscribes it bakes the leak into the mesh permanently, and no critic currently reads geometry plates for reveal.",
    "POPULATED ROWS TO GENERATE AGAINST. Live: T0_Weapon_Registry mesh_id_ref 0/72, mesh_pipeline_type 0/72, mesh_tags 0/72, substrate_material_ref_path 0/72, generation_tier 0/72; T0_Equipment_Registry 1 row. Rank 0 of the production program already names this; the 3D-specific consequence is that mesh_tags — the composer's primary prompt input per T99 §4.1 — is empty on every weapon in the game."
   ],
   "what_pipeline_gives": [
    "Canon-derived prompt packs and a composer that reads registry rows rather than inventing subject matter (PIPE_3D §4) — the addressing discipline is right and the id rail is the correct spine for the 3D lane.",
    "Single square frames at 1344² REVIEW tier from Z-Image-Turbo, with a measured HERO tier at 2048²/20 steps costing 34.38 s/plate, 105/hr (CONCEPT_ART_PRODUCTION_PROGRAM §4). Resolution and step count are the only throughput levers; batching is measured as a non-lever.",
    "Content-addressed plates at <class_id>/<canon_id>/<plate_role>__<hash12>.<ext> under E:/art/boards, where the hash covers prompt + seed + sampler + tier + licence class — so a regeneration physically cannot overwrite its predecessor (§3.2, GATE 43 P3).",
    "PLATES.csv with sha256, generation_prompt_hash, model_id, weights_revision, rights_value, image_use_class, generation_licence_ref and a style_lora_hash column — a real provenance manifest, hash-verified to the byte by GATE 43 P6, with a blind-mode tooth (P7) so an unmounted drive cannot read as a pass.",
    "A pick loop that ends in a RATIFIED art bible, which task_router.json makes the only artifact the asset factory reads — the chain from a 3D asset back to the image Josh approved is hash-verified end to end (§5.3).",
    "Thirteen plate roles plus serial: establishing · angle · traversal · mood · layout_plan · staging · study · scale · detail · silhouette · variant · strip · grid. Every one of them is a PLACE role or a look role. `scale` is a place-scale role, not an object-dimension one; `detail` and `silhouette` are look plates.",
    "In-scene, atmospherically-lit renders of objects — the realm object on cave stone in torchlight — which are exactly correct as DECISION surfaces and exactly wrong as geometry input.",
    "The ratified DR-2 landing rail: /Game/Meshes/Weapon/SM_<mesh_id_ref> by path takeover, the five-state lifecycle, generation_tier as a request axis never a path segment, and the (canon id, presentation_tier_ref) resolver key.",
    "A finishing spec: GLB/OBJ → Blender-headless → FBX with separate basecolor/normal/ORM channels, AutoRemesher + xatlas for retopo and UV, simple convex collision, Nanite-first with no authored LOD chains for static classes (PIPE_3D §3, T99 §4.3-4.4).",
    "Deterministic mesh-side teeth that judge OUTPUT: manifold/watertight, triangle and material-slot budget, UV coverage and overlap, opaque/masked-only materials, collision hull exists (PIPE_3D §3). Nothing anywhere judges INPUT.",
    "A benchmark protocol with a fixed test set of two hero weapons (one organic-curve, one hard-surface) and per-model metrics including 'minutes of manual retopology to game-ready' — the right metric, scheduled, with no specified input image."
   ],
   "gaps": [
    {
     "severity": "BLOCKER",
     "gap": "NO 3D-GEN-READY PLATE ROLE EXISTS, AND THE ROLES THAT DO EXIST ARE ACTIVELY HOSTILE TO IMAGE→3D. All fourteen current roles are place/look roles; the live PLATES.csv carries only board_candidate, silhouette, palette, detail, hero, law_in_action. A moody in-scene render of the realm object on cave stone in torchlight violates every condition the repo's own research names: the cave stone is a SECOND SUBJECT that becomes geometry; the scene background gives a model trained on object-scale empty-scene data (LOCAL_3D_ASSET_GEN §3.4) structure to reconstruct; and directional torchlight bakes a highlight and a cast shadow into albedo that the shipped path has no delighting step to remove — SF3D owns the only one in the corpus (L225) and is licence-barred (T99 §1).",
     "consequence": "Every weapon and prop generated from a picked look plate arrives with a permanent light streak in basecolor, phantom geometry where the scene was, and a hallucinated back. None of PIPE_3D §3's teeth fire — manifold, tri budget, UV coverage and collision hull all pass on a mesh that is simply wrong. The defect surfaces at the image critic, one asset at a time, after the GPU hours are spent, at 72-weapon plus 432-variant volume."
    },
    {
     "severity": "BLOCKER",
     "gap": "THE REPO SPECIFIES NOTHING, ANYWHERE, ABOUT WHAT AN IMAGE→3D CONDITIONING IMAGE MUST LOOK LIKE. Verified by corpus-wide grep over docs/ and _source/ with a positive control ('TRELLIS' = 191 hits): zero hits for background removal, matte, alpha, isolated, neutral/clean background, studio light, turnaround, orthographic-as-a-plate-convention, or delight-as-a-pipeline-step. The only adjacent line in the corpus is a parenthetical describing a BOSS sheet (CONCEPT_ART_PROGRAM.md:100). LOCAL_3D_ASSET_GEN §5.2 and T99 §5 score models on topology quality, UV quality and PBR accuracy 'vs the reference photo/concept art' while never specifying the input.",
     "consequence": "The 5090 benchmark cannot distinguish 'TRELLIS.2 is bad at blades' from 'our plate was bad input', so it will mis-rank the geometry backends and may retire the ruled primary on a defect that belongs to the art lane. It also means the two decisions the benchmark exists to make — the per-category default and the 'minutes to game-ready' number that schedules the whole 72-weapon volume — are both measured against an uncontrolled variable."
    },
    {
     "severity": "BLOCKER",
     "gap": "VIEW COUNT IS UNRULED AND THE OBVIOUS ANSWER IS FORBIDDEN. LOCAL_3D_ASSET_GEN:113-117 states verbatim that TRELLIS.2's multi-image conditioning is tuning-free, is reported WORSE than single-image in issues #10/#77/#103, and 'Do not plan a multi-view-first pipeline around TRELLIS.2.' But InstantMesh (L62, L300) and HY-World are multi-view-native and are on the benchmark roster. So neither 'one canonical view' (locks out multi-view backends, gives no back-face reference) nor 'a four-view turnaround fed as multi-view' (degrades the ruled primary) is correct, and nothing rules the split.",
     "consequence": "Without an explicit rule the plate set will be authored for whichever backend the author had in mind, and the ortho views will be either missing (no back-face truth, no depth-conditioning source, no multi-view arm to the benchmark) or wrongly fed as conditioning (degrading the primary's output while looking like diligence)."
    },
    {
     "severity": "BLOCKER",
     "gap": "THE PBR LANE IS DETERMINISTIC AND HAS NO INPUT PLATE. PIPE_ART routes PBR channel derivation to Material Maker / Materialize as tools rather than a model, for the stated reason that 'the commercially-clean AI PBR-estimation gap is STILL OPEN' (L53-55), and T99 §3 calls this 'the single most important operational fact in this document'. Materialize consumes a flat, evenly-lit, fronto-parallel surface crop. No plate role produces one. substrate_material_ref_path is a first-class DR-2 asset class with its own path convention (ASSET_DROPIN_CONTRACT:84) and reads 0/72 on the weapon registry.",
     "consequence": "Geometry ships and materials do not. Every weapon lands as untextured or placeholder-material geometry, and the one open path to clean PBR — deterministic derivation from a flat source image — has no source image. This is the difference between a mesh in the level and an asset in the game."
    },
    {
     "severity": "MAJOR",
     "gap": "NO SCALE ANCHOR ANYWHERE ON THE OBJECT PATH. The art bible's SCALE RULE field binds to the Zone Catalog's meters_per_vertex rung, which a weapon has no row in; T0_Weapon_Registry is 27 columns with ZERO matching /len|size|dim|scale|mass|weight|bbox|met(er|re)/ (positive control: mesh_id_ref, mesh_pipeline_type, mesh_tags all matched the mesh regex). Generators emit unit-normalized meshes.",
     "consequence": "Blender-headless has no scale factor to apply, so every FBX imports at an arbitrary size. A dagger and a greatsword arrive the same length, wield sockets are wrong, and the fix is a manual per-asset correction 72 times plus once per grade variant — the exact hand-labour the volume thesis is built to avoid."
    },
    {
     "severity": "MAJOR",
     "gap": "NO ATTACH-POINT OR FUNCTIONAL-PART AUTHORING EXISTS. Corpus grep finds no socket/attach-point/scabbard authoring rule on the asset side, and the weapon registry has no socket, part or attach column. PartCrafter sits in the ruled stack (PIPE_3D:40) with nothing declaring which parts of a weapon are functional.",
     "consequence": "Every generated weapon needs a human to place grip root, grip axis, tip and sheath root before it can be wielded, sheathed, or carry a trail VFX. At 72 base meshes plus the grade ladder that is the single largest manual-minutes line item in the domain, and it is invisible to the benchmark's 'minutes to game-ready' metric because nobody has named the step."
    },
    {
     "severity": "MAJOR",
     "gap": "D1-23'S GRADE SYSTEM HAS NO DATA AT EITHER END AND NO GEOMETRY RULING. density_model.csv:24 states the hole verbatim — 'T0_Weapon_Registry carries NO rarity column - the grade join is unbuilt' — confirmed live (no rarity or grade column in 27). The upstream is equally empty: D1-34's four rarity art hooks (shape_token, colour_ref, beam_vfx_ref, card_layout_ref) are 0/13 on T0_Rarity_Grade, verified live, and display_name_text is 0/13 too. Separately, the model classes D1-23 'cheap'/parametric — a 2D recolour-and-beam pass — while saying nothing about whether a grade changes GEOMETRY.",
     "consequence": "The 'parametric off D1-34's pick' chain cannot run: there is no pick to inherit and no column to join on. And if legendary/mythic add form (guard, filigree, spikes), D1-23 is not 165 cheap slice plates but 432 hero MESHES — a full order of magnitude on the most GPU-expensive lane in the project, discovered at generation time rather than at planning time."
    },
    {
     "severity": "MAJOR",
     "gap": "PRESENTATION_TIER_REF'S SCOPE ON A WEAPON MESH IS UNDECLARED. ASSET_DROPIN_CONTRACT item 7 rules sizing at the FULL key space (248 live variant keys, 372 at the 12-tier clamp) and makes the resolver key (canon id, presentation_tier_ref) — but COMBAT_PROGRAM_ADDENDUM §5 describes the ladder as 'presentation only', enumerating animation refinement, VFX density, audio confidence and follow-through polish, never mesh. The weapon registry's presentation_tier_ref is 0/72.",
     "consequence": "If a mesh is variant-bearing on this axis, the 72-weapon roster is a 864-mesh roster at the 12-tier clamp and the plate set multiplies with it. If it is not, the column stays empty on weapons by design and someone should say so, because item 7's sizing language reads as though every rail-bearing surface pays."
    },
    {
     "severity": "MAJOR",
     "gap": "plate_role IS A FREE-TEXT COLUMN WITH NO CLOSED VOCABULARY AND NO VALUE CHECK. harness/read_boards.py:195 requires the column's PRESENCE; harness/check_art_pointers.py:94/194 checks the FILENAME form. Nothing validates the token, and nothing can therefore validate that a row claiming to feed geometry actually carries geometry conditions.",
     "consequence": "A 3d_gen_ready role can be typed onto an in-scene torchlit plate and the entire 43-gate roster stays green — precisely the failure class GATE 36, GATE 39 and GATE 43 P7 each exist because of. The program's own rule applies: a tooth without a failing fixture is not armed, and here there is not even a tooth."
    },
    {
     "severity": "MAJOR",
     "gap": "THE NEVER-RAW-GENERATE CARE RULE COVERS ARCHITECTURE BUT NOT OBJECTS. T99 §1 constraint 3 and LOCAL_3D_ASSET_GEN §3.4 fence real cultural BUILDINGS. PIPE_ART §4 makes the composer mechanically refuse Lane-G dispatch on living-tradition care_tier rows for the image lane. Nothing extends either fence to a ritual or ceremonial OBJECT of a living tradition on the geometry lane, and T0_Equipment_Registry carries a care_tier column that the 3D dispatcher does not read.",
     "consequence": "A sacred regalia item is the same class of §17.1 error as a hallucinated temple — a diffusion model's guess at a living tradition's object, shipped as geometry. The care doctrine's answer is weight and authenticity via reference-built sourcing, not omission; today the object lane has neither the refusal nor the reference route."
    },
    {
     "severity": "MINOR",
     "gap": "NO POSE-MATCHED CAPTURE CONVENTION FOR THE OUTPUT CRITIC. PIPE_3D:161-165 hands the image critic 'captures against the concept-art reference'. Nothing specifies that the capture uses the conditioning plate's camera, FOV, framing and background.",
     "consequence": "The critic compares a three-quarter hero render against an arbitrary UE orbit frame and grades atmosphere instead of fidelity — an unfalsifiable pass on the one gate that stands between generated geometry and the build."
    },
    {
     "severity": "MINOR",
     "gap": "REVEAL DISCIPLINE DOES NOT REACH GEOMETRY PLATES. T0_Equipment_Registry's EQ_0001 row carries the ruling in its own notes — unreadable and unidentified before the Ch-8 script reveal, 'the safest form is UNINSCRIBED' (HL_0095) — and the object is on screen for the entire Prologue→Ch 13 slice (CONCEPT_ART_PRODUCTION_PROGRAM:440). The reveal-discipline critic runs on boards; no critic reads gen plates, which do not exist yet.",
     "consequence": "An inscription that reaches the conditioning plate reaches the mesh, and a mesh leak is permanent and un-regenerable-away once the asset is in a build. This is the single most-seen prop in the slice."
    },
    {
     "severity": "MINOR",
     "gap": "THE PLT_ TARGET CASE IN harness/queue.py's INTAKE RESOLVER IS NAMED AS NOT LANDED (CONCEPT_ART_PRODUCTION_PROGRAM §8). Board-level comments route; plate-level ones become BLOCKED unresolved_target items.",
     "consequence": "The comments this domain generates are inherently per-plate — 'the back is hallucinated', 'the grip highlight is baked in', 'this material callout is the saya not the tsuka'. Every one of them lands as a blocked item until that resolver case exists."
    }
   ],
   "required_additions": [
    {
     "kind": "plate_role",
     "addition": "THE TWO-FAMILY SPLIT — declare LOOK plates and GEN plates as separate families with different physics. LOOK plates (hero, silhouette, detail, in-scene mood) are the DECISION surface and stay moody, atmospheric and unconstrained; they are what Josh picks and must never be sanitized. GEN plates are the MACHINE surface, boring on purpose, and are DERIVED from the picked look plate through the edit lane (HiDream-O1 edit mode / Qwen-Image-Edit-2511 multi-image identity preservation, PIPE_ART §1) rather than re-designed.",
     "shape": "One ruling in docs/art_boards/README.md's conventions block plus a `gen_role` column (below). This split is the answer to anti-slop AND anti-thinness at once: the pick stays beautiful because the neutral plate is not the pick, and the geometry input stays clean because the pretty plate never reaches the model. Neutralization is identity-preserving by construction, so the object on the gen plate is the object Josh approved."
    },
    {
     "kind": "plate_role",
     "addition": "`gen_primary` — REQUIRED, exactly one per canon id. The single conditioning image for TRELLIS.2 / Direct3D-S2 / Hi3DGen.",
     "shape": "Three-quarter view rotated so no major form self-occludes (for a blade ~30-40° off the flat so edge and face both read; for a hafted weapon full length with the head camera-high). Subject fills 80-90 % of frame, centred, nothing cropped. Background flat neutral mid-grey with the object matted to a hard alpha, delivered PNG-RGBA — mid-grey rather than white or black because white blows a bronze rim and black eats an obsidian edge. Soft three-quarter key plus fill; NO rim, NO backlight, NO cast shadow on the background, NO bloom, NO volumetrics, NO lens effects; specular minimised, because the shipped path has no delighting step. Single subject — no stand, pedestal, hand, cloth, scabbard, cave stone or companion object. No VFX, glow, rune-light or elemental effect (those are D1-27's surface and become baked geometry here). Square, 2048² HERO tier at 34.38 s/plate, NOT the 1344² review tier — geometry input is the one place resolution converts to mesh detail. Framing/angle figures are authored judgement pending the benchmark's input arm."
    },
    {
     "kind": "plate_role",
     "addition": "`gen_ortho_front` / `gen_ortho_side` / `gen_ortho_back` — a REQUIRED set of three at region_hero tier and above, same background and lighting law as gen_primary, orthographic-flat framing, mutually consistent scale and rotation. These are NEVER fed to the ruled primary as multi-view conditioning.",
     "shape": "Three declared consumers, each of which the repo already needs and cannot serve today: (a) the BACK-FACE TRUTH reference the image critic compares a hallucinated rear against — no deterministic tooth can see a wrong back; (b) the multi-view arm of the LOCAL_3D_ASSET_GEN §5.2 benchmark, so InstantMesh/Hunyuan/HY-World are scored on the input they were built for; (c) the depth-conditioning source via Depth-Anything-3 (Apache variants only, pinned by filename per PIPE_ART:29) for proportion and retopo checking. VIEW COUNT IS TIER-BOUND, not per-object judgement — `background` and `region_standard` get gen_primary alone; `region_hero`, `realm` and `apex` get the full set. That rides the ratified generation_tier enum instead of minting a new axis."
    },
    {
     "kind": "plate_role",
     "addition": "`gen_scale_ref` — REQUIRED, one per canon id. The object beside a neutral graduated rod in metres, or beside a neutral 1.75 m mannequin silhouette, on the same neutral background.",
     "shape": "Its consumer is the human, the critic and the `bbox_m` schema column — NOT the 3D model. A scale rod fed as conditioning would become geometry, which is exactly why it must be a separate plate and why `gen_role` must mechanically bar it from being the conditioning image. This is what closes the unit-normalization gap between a generator's normalized output and a correctly-sized FBX."
    },
    {
     "kind": "plate_role",
     "addition": "`gen_material_callout` — REQUIRED, one per distinct material on the object (a katana = blade steel + ray-skin grip + lacquer saya = three).",
     "shape": "A flat, fronto-parallel, evenly-lit, tileable-intent crop of that material's surface at the object's real scale — no silhouette, no curvature, no highlight ramp. This is the input Material Maker and Materialize are built to consume, and it is the ONLY answer available to the still-open commercially-clean PBR gap, because PIPE_ART's routing is deterministic tools that need a photo-like flat source. The row carries the material's token from the mesh_tags.material vocabulary (bronze / iron / obsidian / ceremonial-gold / stone / hardwood / linen / ochre). This is the plate class that makes substrate_material_ref_path fillable, and it is the difference between geometry in the level and an asset in the game."
    },
    {
     "kind": "plate_role",
     "addition": "`gen_part_map` — REQUIRED for any object with a functional split (grip vs blade, head vs haft, body vs strap). A flat colour-coded overlay on the gen_primary framing, one flat colour per functional part, with the legend carried as a row field.",
     "shape": "Consumers: PartCrafter's part decomposition (already in the ruled stack with nothing telling it what to split); the socket plan below; and the grade ladder, which needs to know WHICH part takes the grade treatment. It is an annotation, never a conditioning image."
    },
    {
     "kind": "plate_role",
     "addition": "`gen_socket_plan` — REQUIRED for weapons and any wielded or worn equipment. The gen_ortho_side framing overlaid with named attach markers.",
     "shape": "Named markers: `grip_root` (where the hand closes — the origin the UE socket binds), `grip_axis` (forward vector), `tip` (thrust point and trail end), `sheath_root` (body-hang point), plus per-class extras — `haft_second_grip` for two-handers, `draw_origin` for bows, `mouth` for horn/instrument classes. It is a DRAWING, but it is the artifact that lets Blender-headless place empties deterministically instead of a human doing 72 placements plus one per variant. It converts the largest un-named manual-minutes line in the domain into a scripted step."
    },
    {
     "kind": "plate_role",
     "addition": "`gen_grade_ladder` — ONE plate per weapon SUBCLASS (11, matching the density model's 'ONE grade language board per subclass (11) sets the whole ladder'), showing one silhouette across the six art-bearing item_grade tokens on the neutral background, with the delta named per rung in the row text.",
     "shape": "This plate is what forces the missing ruling: each rung declares MATERIAL_ONLY (albedo/roughness/metallic swap + emissive mask + VFX) or GEOMETRY_BEARING (added form). RECOMMENDED, and named as beyond-floor authored judgement so the director can veto: common→epic MATERIAL_ONLY, legendary and mythic GEOMETRY_BEARING at SUBCLASS scope — one added-form treatment per subclass applied across its weapons, never per-weapon. That keeps D1-23 genuinely cheap and parametric on the 2D side while bounding the 3D side to 11 × 2 = 22 extra meshes instead of 432. Depends on D1-34's four rarity art hooks being populated first (0/13 today) — the grade ladder has no upstream until they are."
    },
    {
     "kind": "plate_role",
     "addition": "`gen_negative` — OPTIONAL, hero objects only. The same object rendered AS the failure it must not have (the generic glowing-runed fantasy sword reading).",
     "shape": "Consumer is the de-slop critic's unlabeled-relabel test applied to an object rather than a place: if the approved plate can be swapped for the negative and nobody notices, the object has no identity. Cheap (one iteration-tier plate) and it is the only anti-slop instrument in this domain that survives 432 variants."
    },
    {
     "kind": "authoring_rule",
     "addition": "R1 NO SECOND SUBJECT ON A GEN PLATE — anything in frame that is not the object becomes geometry. R2 NO BAKED LIGHT — no rim, no cast shadow, no bloom; the shipped path has no delighting step and the input plate is the only control. R3 THE CONDITIONING IMAGE IS NAMED, NEVER INFERRED — exactly one plate per (canon id, generation_tier) carries gen_role=conditioning and the factory never picks the best-looking one. R4 GEN PLATES RUN AT HERO TIER. R5 VIEW COUNT IS TIER-BOUND to the ratified generation_tier enum. R6 REVEAL DISCIPLINE APPLIES TO GEOMETRY — a gen plate inherits its canon row's reveal constraints (EQ_0001 stays UNINSCRIBED before Ch 8; a mesh leak is permanent). R7 CARE-GATED OBJECTS NEVER RAW-GENERATE — extend the architecture rule to ritual and ceremonial objects of living traditions, mechanically, by care_tier refusal in the composer, the same refusal PIPE_ART §4 already makes on the image lane.",
     "shape": "Seven rules into docs/art_boards/README.md's conventions block and the assetgen-3d router read-set. R7 is the care extension: it is a fence on RAW GENERATION and a route to reference-built sourcing, not an omission — the doctrine's own instrument is weight and authenticity, and care-tier inflation is itself a defect, so the fence is keyed on the existing care_tier column rather than on a reviewer's instinct."
    },
    {
     "kind": "schema_column",
     "addition": "PLATES.csv: close the `plate_role` vocabulary (free text today), and add `gen_role` (conditioning | reference | material_source | annotation | look_only), `view_axis` (three_quarter | front | side | back | top | n_a), `background_class` (neutral_matte | in_scene | n_a), `alpha_present` (bool), `material_token` (the mesh_tags.material token a material_source plate serves), `part_legend` (|-separated colour:part_name), `socket_tokens` (|-separated marker names).",
     "shape": "`gen_role` is the load-bearing one: it is what makes an in-scene torchlit hero plate MECHANICALLY unable to feed geometry, rather than merely inadvisable. Multi-value cells split on `|` per the landed convention. All columns land through the proven extension mechanism with docs/fidelity_baseline.json refreshed in the same commit, and — per the Batch-0 correction — no status-shaped column lands empty."
    },
    {
     "kind": "schema_column",
     "addition": "T0_Weapon_Registry / T0_Equipment_Registry (and every prop-bearing registry): `bbox_m` (real-world L×W×H in metres), `mass_kg_ordinal` (ORDINAL BAND ONLY — the numbers firewall bans magnitudes; the ordinal is what hit-reaction and physics need), `socket_set_ref`, `material_token_array` (|-separated), `item_grade_art_mode` (material_only | geometry_bearing, per subclass), and `rarity_class` — the grade join the density model names as unbuilt in its own missing_inputs cell. Populate `mesh_pipeline_type` (0/72) with a declared vocabulary, and populate T0_Rarity_Grade's four art hooks (0/13) since D1-23 inherits from them.",
     "shape": "`bbox_m` is the smallest change with the largest effect in this domain — it converts a unit-normalized generator output into a correctly-sized FBX with no human in the loop, on all 72 rows. `item_grade_art_mode` is the column that makes the grade ruling data rather than a paragraph, and it is what decides whether the grade ladder costs 22 meshes or 432."
    },
    {
     "kind": "tooling",
     "addition": "`harness/check_gen_plates.py` — a new deterministic gate (art_gen_plates), built on GATE 43's interface, gating the INPUT side the way PIPE_3D §3 gates the output side. Teeth: G1 exactly one conditioning plate per (class_id, canon_id, generation_tier); G2 conditioning/reference rows carry background_class=neutral_matte and alpha_present=true; G3 alpha coverage within band (catches both a crop and a speck) and background luminance std-dev BELOW a ceiling (catches a background that is not flat — the inverse of §7.1's std-dev floor, which is the right measure for a subject); G4 matte-region saturation below a floor (catches a scene background typed as neutral); G5 specular-clip fraction inside the alpha below a ceiling (catches blown highlights that bake into albedo); G6 region_hero+ rows carry the complete set (3 ortho + scale + ≥1 material + part map + socket plan where the class demands); G7 material_source rows carry a token in the mesh_tags.material vocabulary; G8 BLIND MODE copied verbatim from P7 — with HUMANITY_ART_ROOT absent, report MANIFEST_ONLY and FAIL any row claiming gen-ready.",
     "shape": "Every tooth ships a must-fire fixture plus must-not-fire baselines and is mutation-proven live against PLATES.csv with byte-exact restore — the landed GATE 43 method, because a tooth without a failing fixture is not armed. Numpy/PIL only, milliseconds per plate, zero model cost. The thresholds are AUTHORED and must be replaced by measurements from the benchmark's input arm before they are quoted as facts."
    },
    {
     "kind": "process_step",
     "addition": "A `neutralize` step in the board pipeline: picked LOOK plate → HiDream-O1 edit mode (or Qwen-Image-Edit-2511 multi-image identity) with a fixed neutralization prompt and a fixed seed ladder → the GEN set. Runs unattended overnight, which PIPE_ART §4 already permits for variant sweeps.",
     "shape": "Identity-preserving by construction, so neutralization never re-decides a design Josh approved. Cost at HERO tier: ten gen plates per weapon × 72 = 720 plates ≈ 6.9 GPU-hours, under one night — on top of D1-22's existing 216. The GEN family is cheap in GPU and expensive in RULES, which is the inverse of what the current plan assumes and the reason this domain's gap is a doctrine gap rather than a schedule one."
    },
    {
     "kind": "process_step",
     "addition": "Add an INPUT-CONDITION ARM to the LOCAL_3D_ASSET_GEN §5.2 / T99 §5 benchmark: run the SAME weapon through each backend as (a) the in-scene look plate, (b) the neutralized gen_primary, (c) the four-view ortho set against multi-view backends only.",
     "shape": "One extra afternoon on benchmark day. Without it the benchmark cannot separate model quality from input quality and will mis-rank the geometry backends — and both outputs the benchmark exists to produce (the per-category default and the minutes-to-game-ready number that schedules the 72-weapon volume) rest on an uncontrolled variable. It also produces the measured replacements for GATE 44's authored thresholds."
    },
    {
     "kind": "process_step",
     "addition": "POSE-MATCHED CAPTURE for the output critic: the Blender/UE finishing pass renders the finished mesh from the gen_primary camera — same FOV, same framing, same neutral background — and that capture is what the image critic diffs against the plate. Plus the PLT_ target case in harness/queue.py's intake resolver, so a per-plate comment on a gen plate routes instead of blocking.",
     "shape": "The capture rule turns PIPE_3D §3's 'reads captures against the concept-art reference' from a vibe comparison into a like-for-like diff, which is the only form in which it is falsifiable on an object. The resolver case is already named as NOT LANDED in the production program §8; this domain's comments are inherently per-plate ('the back is hallucinated', 'the highlight is baked in', 'that callout is the saya not the tsuka'), so without it every finding in this lane becomes a BLOCKED unresolved_target item."
    }
   ]
  },
  {
   "lane": "vfx-ui-cinematic",
   "derivation": {
    "derived_from": [
     "docs/ASSET_DROPIN_CONTRACT.md:88 — the VFX asset-class row: canon id source is a GameplayCue tag + the closed cue-parameter set; final asset is a Niagara system bound to the same cue tag, branching per-tier on the parameter set, one system per family, never one per variant; teeth = every cue fires its effect (QT-6), shape channel independent, per-tier variant identifiable (doctrine 5.4 D10)",
     "docs/ASSET_DROPIN_CONTRACT.md:90 — the HUD art skin row: canon id source is a UMG widget binding (authored, not generated), drop = skinned art in the same widget, tooth = legibility audit (QA-12) plus before/after captures",
     "docs/ASSET_DROPIN_CONTRACT.md:218-230 (item 5, RATIFIED) — VFX and HUD are HAND-AUTHORED (Niagara, UMG), ride only the id + placeholder + swap discipline, generation_status = the not_applicable sentinel. There is no generative recovery step for these two classes: whatever the concept plate fails to specify is invented at authoring time.",
     "docs/ASSET_DROPIN_CONTRACT.md:329-332 (item 7, register v1.4 entry 100) — THE CLOSED CUE-PARAMETER SET: exactly (element, presentation_tier_ref, status class, counter class, phase). This is the literal input signature of my domain's downstream tool, and phase is one of the five.",
     "docs/ASSET_DROPIN_CONTRACT.md:315-328 (item 7, Josh RULED fourteenth sitting, OPTION A) — resolver key is (canon id, presentation_tier_ref), fallback walks DOWN to the nearest AUTHORED tier; sizing is 248 live variant keys / 372 at the 12-tier clamp; parametric interpolation permitted only INSIDE an authored tier's polish pass, never instead of one; the live variant key must be AUTHORED, never synthesized",
     "docs/ENGINE_OPTIMIZATION_DOCTRINE.md:1417 (D10) — a tier-12 ability must remain visually distinguishable from its tier-1 form at minimum spec; what degrades under sg.EffectsQuality is layer count, particle count, resolution and secondary detail, never the identity of the variant; serving the tier-1 effect for a tier-12 ability is a canon defect. Pass/fail = a per-tier paired capture at minimum AND recommended spec judged by the image critic on one question.",
     "docs/DESIGN_GAP_REGISTER.md:3318-3324 (entry 4 amendment, adjudication 20) — the 31 elements will be generated against no VISUAL law; the fix is a per-BASE-element presentation row carrying dominant hue band, silhouette primitive, motion signature and sound register, plus a declared hybrid-inheritance rule, which becomes the prompt composer's per-element constraint block and the de-slop critic's per-element checklist",
     "docs/COMBAT_ENCOUNTER_SYSTEM.md:168 — tell_windup_ms per attack; shown windup scales with vril density (same animation, less lead); tell_channel (visual / audio / vril-polarity shimmer) must be readable without color alone, an accessibility hard requirement",
     "docs/COMBAT_ENCOUNTER_SYSTEM.md:182 — the density dial sets telegraph slack, punish-window width, recharge latency and answer-pruning depth, plus the arena's baseline VFX weather so the tension is visible",
     "docs/COMBAT_ENCOUNTER_SYSTEM.md:255-314 (section 9b, RULED Josh 2026-07-30) — the seven response classes (any, dodge_only, parry_only, neutralize, cover, weak_point, trigger_interrupt) and 9b.4's chain meter standing whole: visible pips, five to seven or more correct reads, wipe on any mistake",
     "docs/COMBAT_PROGRAM_ADDENDUM.md:84-96 and :120 — the proficiency presentation ladder: per-mastery-tier presentation variants (animation refinement, VFX density/control, audio confidence, follow-through polish); Josh NODDED verbatim that every spell and ability and movement needs to be beautiful and fluid art, and the 5090 asset passes generate TIERED variants as a hard requirement",
     "docs/PRE_5090_BUILD_PLAN_VOL2.md:309 and :421 — the W2 FEEL wave and its tag law: hit-stop, floating damage numbers, target flash, camera shake/punch, hit-react states, the color-independent SHAPE telegraph channel and UMG are deterministic BUILD-NOW; only final Niagara VFX and generated meshes/textures are GATED-5090",
     "docs/PRE_5090_BUILD_PLAN_VOL2.md:444-449 — CF-1 hit-confirm, CF-6 the Composure-BREAK moment, CF-8 camera shake/punch, CF-12 the withdrawal-clock pressure read, CF-10 the defeat shell, AU-10 the audio half firing on the same frame as hit-stop",
     "docs/PRE_5090_BUILD_PLAN_VOL2.md:463 and :467 — CF-7: a windup pose plus a color-independent ground/boss SHAPE decal danger indicator, verified by an image critic PASSing the telegraph shape in greyscale (the L1 accessibility floor, legible with color stripped)",
     "docs/PRE_5090_BUILD_PLAN_VOL2.md:684-782 — the 32 counted U11.x UI surfaces across 11a-11k: the WBP_HumanityHUD framework, lock-on reticle and threat indicator, the damage-number/hit-marker/floating-combat-text pool, Composure node-break pips and the withdrawal pressure read, menus/settings/rebinding, book screens, map and travel, subtitles and fonts, the teaching layer",
     "docs/proposals/systems/combat-and-spellcraft.md:346-350 — the canon resource-bar grammar: vril as a BUBBLE to the LEFT of the health bar growing in concentric deeper-blue overlapping layers, and max-growth pickups as fifths that stack into full additional units",
     "docs/proposals/systems/WS7_WIRING_BUILD_PLAN.md:350 — the resource-bar model is NEW systemic canon owned by a HUD/resource subsystem plus Josh, deliberately unclaimed by the combat lane",
     "docs/CONCEPT_ART_PRODUCTION_PROGRAM.md:429-441 (RANK 1 laws), :101-169 (the 12-row LEAF and its measured cap), :261-334 (measured throughput), :184-206 (the content-addressed path), :373-410 (comment-to-regeneration, and the art bible as the only artifact the asset factory reads), :471-535 (the three-way anti-slop split), :551-561 (what did NOT land)",
     "docs/proposals/CONCEPT_ART_PROGRAM.md:1204-1224 — D1-27 as the largest single full-game line by ruling, and the LANGUAGE BOARD unit definition at 1.1; :481-500 — the four P0 language boards, including the verbatim statement that T0_Rarity_Grade's four art hooks are 0/13",
     "docs/concept_art/density_model.csv — all 43 classes read directly. D1-27 formula = element_x_tier_keys x 3, missing_inputs = the per-BASE-element visual law does not exist plus presentation_tier_ref 0/185. D1-34 formula = board + rarity_rows x 4_icons, missing_inputs = the 4 art hooks 0/13. D1-36 missing_inputs = 0 scene rows for CH_01 through CH_13.",
     "harness/read_boards.py:157-166 (BOARD_SHAPES enum), :181-182 (PANEL_A_PLATES_PER_OPTION = 3, charter-fixed as silhouette/palette/detail), :195 (plate_role in PLATES_REQUIRED), :577 (plate_role copied into the critic worklist), :617-619 (Panel A exactly-3 enforced for every shape) — establishing that plate_role is required, carried, and validated by nothing",
     "harness/check_art_pointers.py:94 and :194 — the ruled path form class_id/canon_id/plate_role__hash12.ext, parsed for FORM only, never for role membership",
     "docs/art_bibles/_TEMPLATE.md — the 11 bible fields, including 6 the vril-physics signature, 7 motion grammar, 11 downstream consumers; docs/art_bibles/README.md:50 — the bible seeds the image-critic expectation manifest so built frames are judged against the ratified bible rather than a reviewer's memory",
     "docs/art_bibles/flores_island.md:66-70 — the one authored instance of the vril signature law: the waterfall recharge, and nothing else",
     "docs/pipeline_review/tech_research/PIPE_ART_2026-07-29.md sections 1-2 — the full verified model stack and licence tiering; read end to end and found to contain no VFX, flipbook, sprite-sheet, icon, HUD or UI generation coverage of any kind (a per-realm style LoRA is named as the 2026 consistency mechanism, replacing IP-Adapter)",
     "docs/proposals/PRESENTATION_DOCTRINE.md sections 0.A, 3.4 — Fork A RULED Option 2, continuity by default and cut earned; CN5.2 is about to bake camera blocking, timing and cut rhythm into eleven permanent templates",
     "MEASURED DIRECTLY FROM THE LIVE REGISTRIES AND MANIFESTS (csv.DictReader, not grep): T0_Ability_Tree_Registry 185 rows — element 185/185 across 31 distinct values (10 base + 21 X+Y hybrids), tier_numerical 1.0-8.0, shape_primitive 2/185, physical_properties_array 18/185, status_effects 9/185, duration_class 0/185, ability_sfx_id_ref_array 0/185, vril_cast_sfx_id_ref_array 0/185, presentation_tier_ref 0/185. T0_Rarity_Grade 13 rows — shape_token, colour_ref, pickup_sfx_id_ref, beam_vfx_ref, card_layout_ref, display_name_text all 0/13. T0_SFX_Registry 30 rows — magic_effect_substrate 0/30, only 2 rows categorised MAGIC_EFFECT. T0_Scene_Spec_Registry 16 rows — scene_beat_structure 16/16, scene_spec_ref 0/16, music_cue_id_ref 0/16. T0_Hollow_Codex 1 row. docs/art_boards/PLATES.csv 91 plates — live plate_role values are board_candidate 76, silhouette 3, palette 3, detail 3, hero 3, law_in_action 3; style_lora_hash filled 0/91."
    ],
    "not_derived": [
     "THE PLATE-ROLE ROSTER NAMED IN MY OWN BRIEF IS NOT IN THE REPO. The brief lists establishing/angle/traversal/mood/layout_plan/staging/study/scale/detail/silhouette/variant/strip/grid + serial as the current roles. I searched harness/, docs/concept_art/, docs/art_boards/ and the two program docs and found no such enum declared anywhere, and the live PLATES.csv uses a different, smaller, ad hoc set. I have treated the roster as an undeclared intent rather than as canon, and gap G6 reports the absence rather than assuming the list exists somewhere I did not look. If it lives outside this repo, G6 is wrong about the vocabulary and still right that no gate reads it.",
     "THE FIVE PHASE NAMES ARE MY AUTHORED VOCABULARY, NOT CANON. anticipation / cast / travel / impact / residue is standard VFX practice and it is chosen to match the ratified cue parameter named phase (ASSET_DROPIN_CONTRACT.md:329-332). Canon rules that phase EXISTS and is closed; it does not enumerate its values. The count of five is my judgement and is the one number in this return most open to being wrong — three (cast/impact/residue) would halve the cost and is defensible.",
     "THE 12 s / 45 s / 20 percent REVIEW-TIME PARAMETERS I lean on when arguing that added plates do not add review cost are the program's own MODELED values, labelled as such at CONCEPT_ART_PRODUCTION_PROGRAM.md:129-148 and flagged there for replacement by measurement after the first ten leaves. My affordability argument inherits that uncertainty. The plate-count and GPU-hour arithmetic is not modeled: it is division against the program's own emitted figures.",
     "NO TIER-DOC AUTHORITY WAS READ FOR THE ELEMENT ROSTER ITSELF. I counted 31 element values off the live T0_Ability_Tree_Registry and cross-checked the count against CONCEPT_ART_PROGRAM.md's 31 (10 base + 21 hybrid). I did not open T1_Vril or the recovered elements matrix to confirm the base/hybrid split is canon rather than registry convention. If the split differs, T0_Element_Presentation's row count changes; its columns do not.",
     "I DID NOT READ THE BUILD REPO. Every engine-side claim (no CameraShake/HitStop/DamageNumber/UUserWidget in Source, the ten ConstructorHelpers binds, the six hardcoded audio literals, the no-op cue notifies) is quoted from the canon repo's own absence-proofs in ASSET_DROPIN_CONTRACT.md and PRE_5090_BUILD_PLAN_VOL2.md, which carry file:line into C:/dev/Humanity/Humanity. They are recorded evidence, not my verification, and one of them (the audio-side hardcoded count) is already annotated in-place as critic-refreshed to a different live number.",
     "NO MAGNITUDE IS PROPOSED ANYWHERE IN THIS RETURN. Contrast floors, greyscale separation thresholds, ladder monotonicity epsilons, min-read-at-Sundered, and the fifths-per-unit count are all left as ORDINAL or as named-but-unvalued columns, per the Phase-5M tuning firewall and combat-and-spellcraft.md:354's own open flag on the fifths.",
     "PANEL A's COUNT OF THREE IS NOT MINE TO MOVE. It is charter-fixed by REALM_DESIGN_PROGRAM 3.2 and enforced at read_boards.py:181-182. I propose substituting the three ROLES on language boards and explicitly do not propose changing the number.",
     "THE RARITY LADDER STAYS GLOBAL. CONCEPT_ART_PROGRAM.md's D3-13 already decided against per-region rarity variance with its strongest objection stated. Nothing here reopens it; the ladder role I propose makes the global ladder pickable, not regional.",
     "SIZING FOR THE PROPOSED UI CLASS (D1-45) IS COUNTED OFF THE 32 U11.x ROWS AND THEN JUDGED. The 32 is a count. The roughly 10 state grids and 8 screens are my estimate of how those 32 surfaces group, labelled as such rather than passed off as derived — the density model's own convention for separating COUNTED from PROJECTED."
    ]
   },
   "what_build_needs": [
    "ABILITY VFX AS A PHASE SEQUENCE, NOT A LOOK. The Niagara consumer's input signature is the closed cue-parameter set (element, presentation_tier_ref, status class, counter class, phase) at ASSET_DROPIN_CONTRACT.md:329-332, and one system per FAMILY branches on it. phase is a first-class parameter, so the art must specify anticipation, cast, travel, impact and residue as distinct authored states of one effect, each addressable by name. A still that does not declare which phase it is cannot be bound to a cue branch.",
    "A PER-BASE-ELEMENT VISUAL LAW WITH A DECLARED HYBRID-INHERITANCE RULE, as a data row, not prose. 31 live element values (measured: 10 base + 21 X+Y hybrids), four fields named by canon — dominant hue band, silhouette primitive, motion signature, sound register — feeding the prompt composer's per-element constraint block AND the de-slop critic's per-element checklist (DESIGN_GAP_REGISTER.md:3318-3324).",
    "A PER-TIER IDENTITY DELTA THAT SURVIVES PARTICLE CULLING. D10 (ENGINE_OPTIMIZATION_DOCTRINE.md:1417) makes serving a tier-1 effect for a tier-12 ability a CANON DEFECT, and its pass/fail is an image critic looking at paired minimum-spec and recommended-spec captures. What sg.EffectsQuality culls is layer count, particle count, resolution and secondary detail — so the ladder's identity must ride on a property in the other set: silhouette geometry, count of discrete forms, or motion law. The art has to name which one, per element family.",
    "EVERY LIVE VARIANT KEY AUTHORED, NEVER SYNTHESIZED. 248 live keys / 372 at the 12-tier clamp, ruled OPTION A, no band collapse; interpolation only INSIDE an authored tier's polish pass (ASSET_DROPIN_CONTRACT.md:315-328). Downstream the resolver falls DOWN the ladder to the nearest authored tier, so an unauthored tier silently serves a weaker one — which is exactly the D10 defect, arriving through the fallback rather than through the culler.",
    "A RARITY LADDER THAT LANDS AS FIVE DATA CELLS PER GRADE, not as a mood. T0_Rarity_Grade's art hooks are shape_token, colour_ref, beam_vfx_ref, card_layout_ref plus display_name_text — measured at 0/13 on every one. The deliverable of D1-34 is 65 populated cells; the plates are the evidence for them, not the product.",
    "A COLOR-INDEPENDENT TELEGRAPH SHAPE VOCABULARY. tell_channel must be readable without color alone as an accessibility HARD REQUIREMENT (COMBAT_ENCOUNTER_SYSTEM.md:168), CF-7 builds a ground/boss SHAPE decal, and its acceptance test is literally an image critic passing the telegraph in GREYSCALE (PRE_5090_BUILD_PLAN_VOL2.md:463, :467). Seven ruled response classes each need a distinguishable decal plus a windup-pose class: any, dodge_only, parry_only, neutralize, cover, weak_point, trigger_interrupt.",
    "A TELEGRAPH THAT STAYS READABLE UNDER TIME COMPRESSION. The density dial cuts telegraph slack off the SAME animation (COMBAT_ENCOUNTER_SYSTEM.md:168, :182), so the shape must resolve at the Sundered lead time and not merely at Wellspring. That is a design property of the shape itself, decided at the board and unrecoverable afterward.",
    "THE ARENA'S BASELINE VFX WEATHER AS A READABLE SCALE. The dial's tension is required to be VISIBLE (COMBAT_ENCOUNTER_SYSTEM.md:182) and CF-12's read is tells visibly tighten, wells visibly slow. That is a per-band ambient-vril visual ladder, not a per-region mood note.",
    "A UI COMPONENT SET WITH ITS STATES. 32 counted U11.x surfaces (PRE_5090_BUILD_PLAN_VOL2.md:684-782), of which the FEEL-critical four are the HUD framework, the reticle and threat indicator, the damage-number and hit-marker pool, and the Composure node-break pips plus the withdrawal pressure read. DR-2 gives them a swap mechanism (skinned art in the same widget) and a tooth (legibility audit QA-12) but names no art source.",
    "THE CANON RESOURCE-BAR GRAMMAR, DRAWN. Vril is a bubble LEFT of the health bar growing in concentric deeper-blue layers that overlap; non-vril maxima grow by fifths into stacked full units (combat-and-spellcraft.md:346-350). That is a specific, bespoke, deliberately non-generic HUD read with no plate behind it and no class that could hold one.",
    "THE CHAIN METER AS PIPS. Five to seven or more visible pips, correct reads accumulate, any mistake wipes (COMBAT_ENCOUNTER_SYSTEM.md:314). The wipe is the single most punishing feedback moment in the puzzle-boss system and it needs an authored accumulate-and-wipe visual, not a generic bar.",
    "AUDIO PAIRED TO THE VISUAL AT THE FRAME. AU-10 fires the hit/block/miss/crit taxonomy on the same frame as hit-stop (PRE_5090_BUILD_PLAN_VOL2.md:449); the element law's fourth ruled field is a SOUND REGISTER; T0_SFX_Registry.magic_effect_substrate is 0/30 and the ability registry's two sfx ref arrays are 0/185 each. Someone has to author the visual and its sound register as one decision, in one place.",
    "CINEMATIC KEY FRAMES UNDER A CUT POLICY. Camera doctrine is continuity by default, cut earned, with eleven templates about to bake camera blocking permanently (PRESENTATION_DOCTRINE.md 0.A, 3.4). Scene rows carry scene_beat_structure 16/16 but scene_spec_ref 0/16 — the beats exist, the staging does not.",
    "EVERYTHING ABOVE MUST REACH THE ART BIBLE. REALM_DESIGN_PROGRAM 3.6 makes the bible the only artifact the asset factory reads (CONCEPT_ART_PRODUCTION_PROGRAM.md:396-410), and the bible also seeds the image-critic expectation manifest (art_bibles/README.md:50). Anything the 11-field template cannot carry is invisible to both the factory and the QA loop.",
    "A HARDER FLOOR THAN EVERY OTHER CLASS, BECAUSE THERE IS NO GENERATIVE RECOVERY. VFX and HUD are ratified HAND-AUTHORED with generation_status = not_applicable (ASSET_DROPIN_CONTRACT.md:218-230). For a creature, an under-specified plate still yields a mesh from an image-to-3D model. For a Niagara system or a UMG skin, whatever the plate leaves unsaid is invented by a person at a keyboard — the plate IS the spec, and that is the argument for finer plate granularity here and nowhere else."
   ],
   "what_pipeline_gives": [
    "Single square still frames at 1344 (REVIEW tier) or 2048 (HERO), Z-Image-Turbo today with HiDream-O1 the ruled but uninstalled primary — CONCEPT_ART_PRODUCTION_PROGRAM.md:261-334. Throughput is measured on this box, not quoted, and batching is proven NOT to be a lever.",
    "Content-addressed storage at class_id/canon_id/plate_role__hash12.ext, where the hash covers prompt, seed, sampler, tier and licence class, so a regeneration physically cannot overwrite its predecessor (CONCEPT_ART_PRODUCTION_PROGRAM.md:184-206).",
    "A landed pointer gate — GATE 43 harness/check_art_pointers.py, 8 teeth, 20 must-fire fixtures, mutation-proven live against PLATES.csv, including P7-BLIND-MODE so an unmounted art root cannot read as a pass.",
    "A landed board gate — harness/read_boards.py, 18 teeth over presence and shape: the board_shape enum, panel and option counts, exactly one recommendation per panel, the six-value rights vocabulary, the previz_only bar, computed marketing_eligible, and the four required critic verdicts.",
    "Six board shapes, two of which are already the right containers for my domain: language (3,3) for a rule-not-a-place, and frame_1panel (1,3) for a cinematic composition board (read_boards.py:157-166).",
    "The LANGUAGE BOARD concept itself — a board whose subject is a rule, where one pick sets a law applied hundreds of times — and D1-27, D1-28 and D1-34 already correctly classified as P0 laws that must precede the art inheriting them (CONCEPT_ART_PROGRAM.md 1.1; CONCEPT_ART_PRODUCTION_PROGRAM.md:429-441).",
    "A ratified review economy: the 12-row LEAF, its cap measured against the spine's own anchor grain rather than chosen, roughly 3.7 minutes per leaf and about 142 leaves for the whole slice. This is the mechanism that decides whether any addition is affordable.",
    "A comment-to-regeneration loop needing no new state: the comment joins the prompt payload, the hash necessarily changes, the row moves to regeneration_required, and the new plate writes to a new path (CONCEPT_ART_PRODUCTION_PROGRAM.md:373-391).",
    "An art bible per subject as the single downstream read, carrying plate_id plus sha256 plus prompt hash, with a vril-physics-signature field (6) and a motion-grammar field (7) already in the template — the two fields nearest my domain, and the only footholds it currently has.",
    "A tiered anti-slop bar: deterministic checks on 100 percent of plates, a 14-plate sample per class-by-leg as a systematic-defect tripwire at 95 percent confidence, and EXHAUSTIVE four-critic review on every care-gated subject (CONCEPT_ART_PRODUCTION_PROGRAM.md section 7).",
    "A schema that already reserves the axes my domain needs and keeps them distinct: presentation_tier_ref as the mastery-variant key, generation_tier as the fidelity class, decay_stage as the condition axis — separated deliberately because five senses of tier already collide (ASSET_DROPIN_CONTRACT.md:41-49).",
    "Honestly declared holes rather than silent ones: section 7.1's image-space measures are PROPOSED and not running, the PLT_ intake resolver case does not exist, the leaf renderer does not exist, and no plate has yet been generated for canon (CONCEPT_ART_PRODUCTION_PROGRAM.md:551-561). Several of my additions attach to work that has not started, which is the cheapest moment to attach them."
   ],
   "gaps": [
    {
     "severity": "BLOCKER",
     "gap": "THE PIPELINE HAS NO SEQUENCE UNIT. Every art_unit in density_model.csv is a set of independent stills — BOARD, SHEET_2/3/4, PLATE, PLATE_2, PLAN, KIT, VARIANT, VARIANT_SET, KEY_FRAME_4. D1-27's formula reads literally vfx_plates = element_x_tier_keys x 3: three unlabelled stills for the entire visual life of an ability. But the consumer's cue-parameter set carries phase as a closed ratified parameter (ASSET_DROPIN_CONTRACT.md:329-332), and a Niagara family must author anticipation, cast, travel, impact and residue. Worse, the role of those three stills is unconstrained, so nothing says which phase any of them depicts. And read_boards.py:617-619 fixes Panel A at exactly 3 plates described as silhouette/palette/detail for EVERY shape including language — a sequence cannot be represented on the ruled board even if someone rendered it.",
     "consequence": "The pipeline produces the one failure mode this domain cannot absorb: a beautiful frame that specifies nothing about motion. Because VFX is ratified HAND-AUTHORED with generation_status = not_applicable, no downstream generative step can recover the missing phases — the Niagara author invents the timing, the travel behaviour and the residue for all 372 variant keys. Josh picks a look and receives an effect he never approved. This is the highest-leverage defect in the art program for my domain, and it sits on the class the program itself ranks P0 number 3."
    },
    {
     "severity": "BLOCKER",
     "gap": "D1-27 IS P0 AND ITS OWN PREDECESSOR DOES NOT EXIST. The density model's D1-27 row states its own missing_inputs verbatim: the per-BASE-element visual law does not exist (DESIGN_GAP_REGISTER entry 4 amendment), presentation_tier_ref 0/185. The fix is fully specified at DESIGN_GAP_REGISTER.md:3318-3324 — a per-BASE-element presentation row with four named fields and a declared hybrid-inheritance rule — but it has no registry, no column, no board field and no plate role. Measured: 31 distinct element values live in T0_Ability_Tree_Registry (10 base, 21 X+Y hybrids), presentation_tier_ref 0/185, shape_primitive 2/185.",
     "consequence": "1,116 full-game VFX plates would be generated against no law, which is the definition of per-element slop: 31 elements differing by prompt adjective rather than by a ruled hue band, silhouette primitive and motion signature. The 21 hybrids are worse — with no inheritance rule, Fire+Lightning is whatever the sampler felt like, twice. And the two consumers entry 4 names, the composer's constraint block and the de-slop critic's checklist, both stay unarmed, so the gates report green over unruled art."
    },
    {
     "severity": "BLOCKER",
     "gap": "THE MASTERY LADDER HAS A COUNT BUT NO IDENTITY AXIS. The ruling sizes 248/372 variant keys and forbids collapsing them; COMBAT_PROGRAM_ADDENDUM.md:84-96 describes the per-tier delta only as animation refinement, VFX density and control, audio confidence, follow-through polish. Three of those four are precisely what sg.EffectsQuality culls at minimum spec. D10 (ENGINE_OPTIMIZATION_DOCTRINE.md:1417) makes that a canon defect and hangs its pass/fail on an image critic answering whether the tier-12 variant is identifiable as tier-12 over paired captures. Nothing in the art program names a per-tier property in the non-culled set.",
     "consequence": "A ladder authored as more particles fails D10 by construction, and it fails INVISIBLY — the doctrine states verbatim that the perf gates would score it as a pass (critique F-6). Josh's ruled reward for twelve tiers of mastery is silently deleted for the recommended-spec majority. This is the most expensive class in the program, 1,116 plates ruled uncheapenable, being spent on a distinction that does not survive shipping."
    },
    {
     "severity": "BLOCKER",
     "gap": "UI/HUD HAS A CONSUMER, A SWAP MECHANISM AND A VERIFICATION TOOTH — AND NO PRODUCER. DR-2 enumerates HUD art skin as an eleventh asset class (ASSET_DROPIN_CONTRACT.md:90-96) with drop path skinned art in the same widget and tooth legibility audit QA-12 plus before/after captures. The build side counts 32 U11.x surfaces (PRE_5090_BUILD_PLAN_VOL2.md:684-782). The art side offers exactly one class, D1-34, whose formula is board + rarity_rows x 4_icons and whose own formula_inputs name only the 13 rarity rows. There is no component sheet, no state grid, no screen composition, no menu frame, no map, journal or dialogue surface — and no plate anywhere depicting the canon vril-bubble-with-concentric-layers resource grammar (combat-and-spellcraft.md:346-350).",
     "consequence": "The HUD ships greybox and stays greybox, or it gets art-directed at the keyboard by whoever builds U11.1, with no board, no pick line, no bible entry and nothing for the legibility audit to judge against. HUD is also ratified hand-authored, so no later generative pass repairs it. The surface Josh looks at for 100 percent of playtime is the one surface with zero concept supply — exactly the named-a-consumer-built-no-producer orphan the anti-orphan rule exists to catch."
    },
    {
     "severity": "MAJOR",
     "gap": "THE TELEGRAPH SHAPE LANGUAGE — AN ACCESSIBILITY FLOOR, NOT A TASTE CALL — HAS NO BOARD. CF-7 is BUILD-NOW and its acceptance test is an image critic passing the telegraph in GREYSCALE (PRE_5090_BUILD_PLAN_VOL2.md:463, :467), grounded in a canon non-negotiable L1 requirement for multi-channel readability. Seven ruled response classes each demand a distinguishable read (COMBAT_ENCOUNTER_SYSTEM.md 9b.1), and the shape must still resolve when the density dial cuts telegraph slack off the same animation (:168). No density class, no board shape, no plate role and no registry carries the shape vocabulary.",
     "consequence": "Every boss's tells get authored ad hoc, one boss at a time, across 281 encounters — so the same danger means a different shape in Ch 4 and Ch 40, and the counter-class system the player is being trained to read becomes untrainable. Because the readability requirement is a canon floor, this is not polish debt; it is a floor failure that a critic finds only after the art exists. Built after the boss sheets, it is a re-authoring pass over every boss in the game."
    },
    {
     "severity": "MAJOR",
     "gap": "plate_role IS FREE TEXT WITH NO VOCABULARY AND NO TOOTH. read_boards.py lists it in PLATES_REQUIRED (:195) and copies it into the critic worklist (:577); it validates it nowhere. check_art_pointers.py parses the filename's role segment for FORM only (:94, :194), never for membership. Measured across all 91 live plates: board_candidate 76, silhouette 3, palette 3, detail 3, hero 3, law_in_action 3 — an ad hoc set matching no declared roster, including the one named in this review's own brief, which I could not find declared anywhere in the repo.",
     "consequence": "For most classes a loose role is untidy. For mine it is fatal: cast versus impact versus residue, component versus screen, tell_shape versus its greyscale twin are exactly the semantics a Niagara or UMG consumer must query to find the frame it needs. Without a closed enum a state sequence is unaddressable even once rendered, and the content-addressed path — whose entire design is that the filename carries the meaning — carries a meaning nothing agrees on."
    },
    {
     "severity": "MAJOR",
     "gap": "NO AUDIO FIELD CROSSES THE BOARD-TO-BIBLE-TO-REGISTRY CHAIN. The element law's fourth ruled field is SOUND REGISTER (DESIGN_GAP_REGISTER.md:3322). The art bible template has no audio field at all. Measured: T0_SFX_Registry.magic_effect_substrate 0/30 with only 2 of 30 rows categorised MAGIC_EFFECT; T0_Ability_Tree_Registry.ability_sfx_id_ref_array 0/185 and vril_cast_sfx_id_ref_array 0/185; T0_Rarity_Grade.pickup_sfx_id_ref 0/13. Meanwhile AU-10 requires the hit taxonomy to fire on the same frame as hit-stop.",
     "consequence": "The one place the corpus explicitly asks a VISUAL law to also rule the AUDIO register has nowhere to write it, so the two halves of every impact are authored months apart, by different lanes, against different references. The audio-visual language — the thing that actually makes an impact feel like it landed — becomes an emergent accident, and a ruled field is ruled into existence and then dropped on the floor."
    },
    {
     "severity": "MAJOR",
     "gap": "style_lora_hash IS A LANDED COLUMN, EMPTY ON 100 PERCENT OF PLATES, AND READ BY NO GATE. Measured 0/91. PIPE_ART_2026-07-29.md section 1 names a per-family style LoRA as the 2026 consistency mechanism and explicitly retires IP-Adapter as a 2024 answer. The two classes most dependent on cross-plate consistency are precisely the parametric ones: D1-23's 432 weapon grade variants inherit D1-34's ladder, and D1-27's 372 keys must read as one magic system.",
     "consequence": "A rarity ladder or an element law generated across many sessions has no mechanism binding its plates to one visual identity and no way to prove they share one. The parametric tier is 20.9 percent of all plates and is auto-approved off a single law pick (CONCEPT_ART_PRODUCTION_PROGRAM.md 1.1, 7.4) — so the one class never individually reviewed is also the one class whose consistency is unfalsifiable. That combination is how a ladder gets approved and then rendered wrong at volume."
    },
    {
     "severity": "MAJOR",
     "gap": "THE LEAF PAGE CANNOT RENDER A LADDER. Section 2.4 fixes the leaf row as one entity, one recommended plate at full width, two alternates as a collapsed strip. A rarity ladder is 13 grades judgeable only AS A LADDER — monotone, instantly separable, no two grades confusable at a glance. Presented one grade per row, the only property that matters is the only property invisible. The same holds for the twelve-tier mastery ladder and the seven-class telegraph set.",
     "consequence": "Josh approves 13 individually plausible colours that collectively do not read as a progression, and the defect surfaces at playtest as I cannot tell rare from epic. This is the anti-thinness half of the bind: the review surface is well designed for entities and structurally wrong for laws, which are exactly the P0 classes scheduled to go first."
    },
    {
     "severity": "MINOR",
     "gap": "THE language BOARD IS FORCED INTO A PLACE BOARD'S PLATE ROLES. BOARD_SHAPES maps language to (3,3) like place_3panel, and read_boards.py:617-619 enforces Panel A at exactly 3 plates described in its own failure text as silhouette / palette / detail regardless of shape. Panel A is defined as the accurate depiction, what the source tradition itself says the place looks like — meaningful for Flores, meaningless for a rarity ladder or an element law.",
     "consequence": "Three of the P0 law boards — D1-27, D1-28, D1-34 — must fill a panel whose semantic does not apply, so the accuracy panel becomes decorative and the tooth fencing it becomes ceremony. Since Panel A is also where the reference-rights fence lives, the fence ends up enforced on a panel carrying no reference claim, which is how a real tooth quietly becomes a ritual."
    },
    {
     "severity": "MINOR",
     "gap": "POSITIVE VRIL HAS NO VISUAL STATE LADDER. The dial's tension is required to be VISIBLE as the arena's baseline VFX weather (COMBAT_ENCOUNTER_SYSTEM.md:182) and CF-12 needs a the-world-is-withdrawing read. The only authored instance is per-region prose: the waterfall recharge, and nothing else (art_bibles/flores_island.md:66). D1-28 covers NEGATIVE vril (Hollow and rift surfaces) at 15 cheap plates; there is no class for the ambient-density band ladder, the recharge state, or the withdrawal transition.",
     "consequence": "The dial that is simultaneously the game's difficulty system and its cosmology has no authored visual scale, so the realm reaches you less reads as nothing, or reads differently in every region. The anti-inflation thesis depends on the player FEELING the world withdraw; unauthored, it degrades into exactly the number inflation the design refuses."
    },
    {
     "severity": "MINOR",
     "gap": "CINEMATIC KEY FRAMES ARE FOUR INDEPENDENT STILLS UNDER A DOCTRINE ABOUT TRANSITIONS. D1-36 is KEY_FRAME_4 with frame_plates = scene_specs x 4 and missing_inputs of 0 scene rows for CH_01 through CH_13; scene_beat_structure is 16/16 populated but scene_spec_ref is 0/16. The doctrine it serves is continuity by default, cut earned — its entire content is which transitions are legal and what covers them — and CN5.2 is about to bake camera blocking into eleven permanent templates.",
     "consequence": "Four unrelated stills cannot review a cut policy, because the reviewable object is the JOIN and not either frame. Deferred to P2 this is survivable; but the template bake is not deferred, so the eleven templates take their camera language from prose rather than from a picked frame pair, and every later cinematic in the game inherits it."
    }
   ],
   "required_additions": [
    {
     "kind": "plate_role",
     "addition": "THE PHASE ROLES — a closed five-value sequence family: anticipation, cast, travel, impact, residue. These are not new taxonomy; they are the art-side names of the phase value already inside the ratified closed cue-parameter set (ASSET_DROPIN_CONTRACT.md:329-332), so the plate role and the Niagara branch key are the same word.",
     "shape": "D1-27's art_unit changes from VARIANT_SET at 3 plates to SEQUENCE_6 = 5 phase plates plus 1 strip. Cost on the model's own counted rows: slice 69 to 138, full game 1,116 to 2,232. At the program's measured 260.7 GPU-hours over 17,876 plates that is roughly plus 16 GPU-hours, about two nights — against a GPU the program itself proves is not the bottleneck. Enforced by the T-ROLE tooth below; a phase role on a non-sequence class FAILs."
    },
    {
     "kind": "plate_role",
     "addition": "strip — the contact-sheet role: all phases of ONE variant, in order, on one plate. It is the REVIEW unit for a sequence, while the five phase plates are the ADDRESSABLE units for the consumer.",
     "shape": "This is the addition that keeps the whole proposal affordable and is the direct answer to the anti-thinness bind. Review units cost Josh time (about 3.7 minutes per leaf, about 142 leaves for the slice); plates cost GPU nights. A sequence reviewed as one strip is still ONE row and ONE decision on the leaf, so D1-27's plate count roughly doubles while REVIEW COST DOES NOT MOVE. Rule: the leaf renders the strip full-width; the phase plates are the pick's payload, never its surface."
    },
    {
     "kind": "plate_role",
     "addition": "ladder — the parametric grammar sheet: every grade or tier of one axis, on ONE plate, in ordinal order, at identical framing and identical scale.",
     "shape": "Mandatory Panel-A-equivalent role on every LANGUAGE_BOARD: 13 rarity grades for D1-34, 12 mastery tiers for D1-27's tier axis, the 7 response classes for the telegraph board, the density bands for the vril board. Fixes the leaf-cannot-render-a-ladder gap: the pick becomes this ladder rather than 13 unrelated approvals, and monotonicity becomes visible and therefore measurable by the tooling entry below."
    },
    {
     "kind": "plate_role",
     "addition": "tell_shape and tell_shape_greyscale — an obligatory PAIR. The second is the first with colour stripped, rendered as a deliverable rather than produced later by a critic.",
     "shape": "Every telegraph plate ships both. This converts the ruled accessibility floor from a downstream verdict (PRE_5090_BUILD_PLAN_VOL2.md:467, an image critic passing the shape in greyscale) into an artifact Josh picks — the only moment at which the shape can still be changed cheaply. A tell_shape row whose greyscale twin is absent FAILs the role tooth."
    },
    {
     "kind": "plate_role",
     "addition": "component, state_grid, screen — the UI triad. component is one element drawn to spec with its 9-slice or margin behaviour stated; state_grid is that component across its states (empty, partial, full, overflow, damaged, disabled, focused); screen is the assembled surface at the target aspect so components are judged in composition.",
     "shape": "A bar without its states is not a bar — the fifths-stacking and the overlapping bubble layers (combat-and-spellcraft.md:346-350) live entirely in the state axis, and a single still of a full bar depicts none of the canon. state_grid is one plate covering many states, so this is cheap per unit of information delivered."
    },
    {
     "kind": "plate_role",
     "addition": "shot_pair — the frame before a cut and the frame after, on one plate, for D1-36 under the cut-policy doctrine.",
     "shape": "Deferred with D1-36 to P2 per the ruled build order — but the ROLE lands now, because CN5.2's eleven-template bake is not deferred and will otherwise take its camera language from prose. Adding the role costs nothing today and makes the later class buildable rather than re-derivable."
    },
    {
     "kind": "schema_column",
     "addition": "CLOSE plate_role as an enum, per density class. Add a role_allowed_for_class map keyed on class_id in the density model, and a T-ROLE tooth in harness/read_boards.py.",
     "shape": "The enum is the union of the current live values (silhouette, palette, detail, hero, law_in_action, board_candidate) plus the roles above. The tooth fails an unknown token AND a role illegal for its class — a component plate on a creature board, a cast plate on an architecture kit. One dict and one tooth, against a column already required, already copied into the critic worklist, and today validated by nothing."
    },
    {
     "kind": "schema_column",
     "addition": "sequence_id and phase_index on docs/art_boards/PLATES.csv.",
     "shape": "Five plates become provably ONE sequence in the ruled order, which content-addressing alone cannot express because the hash deliberately scatters filenames. Enables the P8 completeness tooth below and gives the Niagara consumer a queryable join from a cue branch to its authored frame."
    },
    {
     "kind": "schema_column",
     "addition": "A new registry T0_Element_Presentation — 31 rows, one per live element value. Columns: base_element, dominant_hue_band, silhouette_primitive, motion_signature, sound_register, hybrid_inheritance_rule, tier_identity_axis, source_ref.",
     "shape": "This is DESIGN_GAP_REGISTER entry 4's own named fix given a home; the first five columns are its four fields plus the rule, verbatim. tier_identity_axis is the D10 answer and its vocabulary is CLOSED to properties sg.EffectsQuality does not cull — silhouette_geometry, discrete_form_count, motion_law — so authoring a ladder as more particles becomes unrepresentable rather than merely discouraged. Rows split 10 base plus 21 hybrid; a hybrid resolves through the declared rule and a gate fails any hybrid whose two parents are not both present. Zero GPU."
    },
    {
     "kind": "schema_column",
     "addition": "A new registry T0_Telegraph_Grammar — 7 rows, one per ruled response class. Columns: counter_class, decal_shape_token, windup_pose_class, colour_channel, greyscale_contrast_floor, min_read_at_sundered (ORDINAL; magnitudes are Phase-5M's), plate_ref.",
     "shape": "Seven rows against seven classes already ruled and already resolvable off existing columns (COMBAT_ENCOUNTER_SYSTEM.md 9b.1). It gives CF-7 a source, gives the greyscale image critic a manifest to judge against instead of a memory, and makes this shape must still resolve when slack is cut a recorded design property rather than an assumption nobody wrote down."
    },
    {
     "kind": "schema_column",
     "addition": "Make style_lora_hash REQUIRED (non-empty) for every plate in a class the density model marks cheap or parametric, and add a family-consistency tooth: all plates sharing a sequence_id, a ladder, or a D1-23 / D1-34 variant family must carry ONE identical style_lora_hash.",
     "shape": "Turns an empty landed column (measured 0/91) into the mechanism that makes 432 weapon grade variants and 372 VFX keys provably one look. The precedent is exact: the pointer gate already proves a plate's bytes are the approved bytes; this proves a family's plates are the approved family."
    },
    {
     "kind": "schema_column",
     "addition": "Declare the four T0_Rarity_Grade art hooks plus display_name_text the DELIVERABLE of D1-34, and gate it: a board in picked state whose density_class_id is D1-34 must have written all 13 by 5 cells, or the pick has not landed.",
     "shape": "65 cells, measured 0/65 today. Same pattern for D1-27 into T0_Element_Presentation (31 rows) and the telegraph board into T0_Telegraph_Grammar (7 rows). Closes the general defect that a LANGUAGE board's output is a RULE and a pick that does not write the rule into a registry is a pick that changed nothing — the art-side twin of the Batch-0 lesson that a status column landing empty re-creates the defect it exists to close (ASSET_DROPIN_CONTRACT.md:168-173)."
    },
    {
     "kind": "schema_column",
     "addition": "Two audio bridges: route the element law's sound_register into T0_SFX_Registry.magic_effect_substrate (measured 0/30), and add paired_vfx_phase to T0_SFX_Registry so a cue is authored against the phase plate it fires on.",
     "shape": "Makes AU-10's the-cue-fires-on-the-same-frame-as-hit-stop an authored pairing rather than a hoped-for coincidence, and gives the ability registry's two empty ref arrays (0/185 each) a populated source. Also gives the art bible's new section 12 something to carry, so the audio decision reaches the only artifact the factory reads."
    },
    {
     "kind": "authoring_rule",
     "addition": "THE MOTION CAPTION RULE: every plate carrying a phase, telegraph or UI-state role must carry, in its prompt payload and on the leaf beneath the image, one sentence stating what happens in the moment before and the moment after this frame.",
     "shape": "A still that cannot say that is not a specification, and for a hand-authored class it is the only thing standing between the plate and an invented animation. It costs one line of text, rides the existing prompt payload (so it is inside generation_prompt_hash and a change fires the existing regeneration trigger), and it is precisely the field the de-slop critic needs to judge a still against motion."
    },
    {
     "kind": "authoring_rule",
     "addition": "THE NON-CULLED IDENTITY RULE: a mastery-tier ladder's authored delta must ride on tier_identity_axis, and a ladder plate whose only visible difference from the tier below is density, count or resolution is rejected at the board — not at the paired-capture critic months later.",
     "shape": "D10 as an authoring rule rather than only a downstream verdict. The ladder role makes it checkable by eye in one glance, and the closed enum on tier_identity_axis makes the non-compliant answer unrepresentable in data. This is the difference between catching the defect across 12 plates and catching it across 1,116."
    },
    {
     "kind": "authoring_rule",
     "addition": "RELAX Panel A on language boards: substitute the roles ladder / law_in_action / strip for silhouette / palette / detail, keeping the count at three so read_boards.py's charter arithmetic is untouched.",
     "shape": "One line in the shape table plus a role map keyed on board_shape. Panel A's accuracy semantic does not apply to a rarity ladder, and forcing it makes the reference-rights fence guard a panel with no reference claim. Stated honestly: Panel A's 3 is charter-FIXED (REALM_DESIGN_PROGRAM 3.2 via read_boards.py:181-182), so this substitutes roles WITHIN the ruled count and never changes the count — the charter number is not mine to move."
    },
    {
     "kind": "authoring_rule",
     "addition": "GENERALIZE THE VRIL SIGNATURE LAW FROM PLACE TO STATE. flores_island.md:66's the waterfall recharge, and nothing else is the per-REGION visible read; add the per-STATE ladder — ambient density band, recharge, cast, withdrawal — as a LANGUAGE board with a ladder plate, sibling to D1-28's negative-vril board.",
     "shape": "A new density class (D1-44, ambient vril state ladder) at LANGUAGE_BOARD unit and cheap, sized off the ruled density bands rather than off regions, so it is one board for the whole game. It gives CF-12's the-world-is-withdrawing read an authored source and stops the difficulty system's own cosmology from being invisible."
    },
    {
     "kind": "process_step",
     "addition": "MAKE THE ELEMENT LAW AND THE TELEGRAPH GRAMMAR RANK 0, not Rank 1. CONCEPT_ART_PRODUCTION_PROGRAM.md section 6 Rank 0 already establishes the principle — populate the rows the art is for, zero GPU, gates everything below. T0_Element_Presentation (31 rows) and T0_Telegraph_Grammar (7 rows) are exactly that shape, and D1-27's own missing_inputs field says so in the model's own data.",
     "shape": "38 authored rows, no GPU, no board. Then Rank 1 runs in the order the program already gives — D1-34, D1-28, D1-27 — with its predecessor present. Building D1-27's 69 slice plates before the element law is 69 regenerations, by the identical arithmetic the program already applies to D1-34."
    },
    {
     "kind": "process_step",
     "addition": "ADD A UI/HUD DENSITY CLASS (D1-45: component plus state_grid plus screen), sized against the 32 counted U11.x rows rather than against a guess.",
     "shape": "Basis COUNTED, matching the density model's own honesty convention: 32 surfaces, of which the four FEEL-critical HUD rows (U11.1 to U11.4) are P0 because they are what the QA loop's captures will contain from the first slice build. Roughly 32 components plus about 10 state grids plus about 8 screens, with the grouping estimate labelled as estimate. The class is cheap and mostly parametric off D1-34's pick, so marginal review cost is a handful of leaves. The counted alternative is what exists today: a ratified asset class with a verification tooth and no producer."
    },
    {
     "kind": "process_step",
     "addition": "ADD A SECTION 12, PRESENTATION LAW, to docs/art_bibles/_TEMPLATE.md, carrying the element row, the tier identity axis, the telegraph shape tokens, the UI component set and the sound register — each with its plate_id and sha256.",
     "shape": "Non-negotiable, because REALM_DESIGN_PROGRAM 3.6 makes the bible the ONLY artifact the asset factory reads (CONCEPT_ART_PRODUCTION_PROGRAM.md:396-410). Anything my domain decides that the 11-field template cannot carry is invisible to the factory AND to the image-critic expectation manifest (art_bibles/README.md:50). The bible is the chokepoint, so the addition lands there or nowhere."
    },
    {
     "kind": "tooling",
     "addition": "GATE 43 tooth P8-SEQUENCE-COMPLETE in harness/check_art_pointers.py: a sequence_id present on any row obliges every declared phase_index in that class's role set to be present, non-empty and hash-distinct.",
     "shape": "Rides the existing 8-tooth structure and its must-fire / must-not-fire fixture discipline. Makes a half-authored effect unrepresentable — the exact thing that reads green today, because a missing plate is simply a row that does not exist. Same argument as P7-BLIND-MODE: an absent frame must not read like a checked one."
    },
    {
     "kind": "tooling",
     "addition": "TWO IMAGE-SPACE MEASURES in the PROPOSED art_quality gate (CONCEPT_ART_PRODUCTION_PROGRAM.md 7.1), numpy and PIL only, no model: (a) GREYSCALE SEPARATION on tell_shape plates — convert to L, measure decal-versus-ground contrast against greyscale_contrast_floor; (b) LADDER MONOTONICITY on ladder plates — per-cell luminance and saturation monotone in ordinal, with no two adjacent cells below a separation floor.",
     "shape": "Both are arithmetic properties whose violation is always a defect, which is section 7.1's own stated admission test, and both follow the palette delta-E precedent already proposed there. (a) turns a ruled accessibility floor into a number instead of a critic's opinion — the strongest single anti-slop tooth available to this domain. (b) catches the ladder failure that per-row human review structurally cannot see."
    },
    {
     "kind": "tooling",
     "addition": "A LADDER LEAF template in the not-yet-built leaf renderer, distinct from the 12-row entity leaf: one full-width ladder plate, one pick line for the whole ladder, and the per-grade rows beneath it as amendments only.",
     "shape": "Named because CONCEPT_ART_PRODUCTION_PROGRAM.md:557 already records the leaf renderer as NOT LANDED, so this is a requirement on work not yet started rather than a rewrite of shipped code. It is the fix for the unpickable-ladder gap and it is what makes the P0 law boards reviewable at all."
    },
    {
     "kind": "tooling",
     "addition": "EXTEND harness/queue.py's intake target resolver with the PLT_ case AND a SEQ_ case.",
     "shape": "The PLT_ hole is already named as not-landed (CONCEPT_ART_PRODUCTION_PROGRAM.md:363-371, :555): plate-level comments land as BLOCKED unresolved_target today. SEQ_ is the new one — a comment on a sequence such as the impact is too soft must regenerate the impact phase and leave the other four alone, or every note costs five regenerations and breaks the family's style_lora consistency the moment it is answered."
    }
   ]
  }
 ]
}

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