asset_budgets.json

assets/asset_budgets.json

{
 "_doc": "THE BUDGET DECLARATION -- the machine-readable form of the per-asset triangle / LOD-chain / material-slot / collision / vertex-ratio budgets that were ALREADY CANON and that NOTHING READ. Every number here is transcribed from a canon line and carries that line's file, line number and a verbatim ANCHOR substring; GATE 75 `asset_budgets` re-reads every anchor on every run and exits 2 if one no longer resolves, so this file cannot rot away from the canon it mirrors. It invents no number. Where canon declares nothing (a material-slot cap for a skinned class, a collision-primitive measurement, a foliage triangle cap) this file says NOT_DECLARED and the gate prints that tooth under DECLARED NOT-ARMED with its arming condition rather than inventing a threshold.",
 "schema_version": "1.0.0",
 "emitted_for": "GATE 75 `asset_budgets` (harness/check_asset_budgets.py) and the game-repo LOD-stage checker Tools/assetgen/check_budgets.py, which read THIS file and never carry a number of their own.",
 "minted_by": "W-BUDGET, the FACTORY ENHANCEMENT ROSTER item 5 ruling, 2026-08-06",
 "declaration_status": {
  "tag": "ILLUSTRATIVE-until-5090-benchmark",
  "verbatim": "EVERY number below is ILLUSTRATIVE-until-5090-benchmark -- a structural placeholder superseded by the benchmarked value when region build data and the 5090 benchmark day land; the numbers lock no shipped commitment, only the metric set and the per-category governance model do.",
  "cite": "T1_DPOLY_PREAMBLE",
  "illustrative_does_not_mean_unenforced": "The roster ruling is explicit: 'per-asset triangle/material budgets enforced at the LOD stage (the hood measured 5.59x over floor with no gate anywhere - the factory stamps hundreds; budgets must be teeth, not notes).' An illustrative floor that nothing reads produced a 5.59x LOD0. An illustrative floor that a gate reads produces a NAMED, RATCHETED, SHRINKING backlog. The status governs what a number MEANS (a placeholder, not a ship commitment), never whether it is CHECKED.",
  "illustrative_cite": "ROSTER_ITEM_5",
  "repin_path": {
   "what": "Every number in `classes` is superseded IN THIS FILE by the benchmarked value on the day the 5090 benchmark and real region build data land. The re-pin is one edit to `classes` plus a `--emit-baseline` in the same commit; the gate's B7 anchor check keeps the citation honest across the re-pin, and the baseline ratchet makes the change visible as a movement in the measured backlog rather than a silent loosening.",
   "veto_surface_still_open": "the doctrine call to drop triangle budgets entirely as a static-geometry control (an engineering veto -- whether Nanite makes source-triangle caps on statics obsolete), the eventual sign-off on the benchmarked numbers once the 5090 benchmark day runs, and confirmation that the steam_deck_minimum floor is a real ship commitment",
   "cite": "T1_VETO_SURFACE"
  }
 },
 "spec_classes": [
  "steam_deck_minimum",
  "mid_range_pc",
  "high_end_pc",
  "ultra"
 ],
 "enforced_spec_class": "steam_deck_minimum",
 "enforced_spec_class_why": "Canon authors it first as the ship-viability floor -- 'The steam_deck_minimum column is authored first as the ship-viability floor; mid_range_pc, high_end_pc, and ultra scale up from it, ultra unconstrained per the four-spec-class enum above.' A floor is the only column that can fail an asset; the other three are reported as multipliers so the whole picture is on the scorecard.",
 "enforced_spec_class_cite": "T1_DPOLY_PREAMBLE",
 "citations": {
  "T1_S17_HEAD": {
   "file": "_source/01_Tier_1_Foundation/T1_Build_Pipeline_Contracts [ACTIVE v1.0].md",
   "line": 164,
   "anchor": "1.7 Target Platform and Performance Budget"
  },
  "T1_DPOLY_PREAMBLE": {
   "file": "_source/01_Tier_1_Foundation/T1_Build_Pipeline_Contracts [ACTIVE v1.0].md",
   "line": 185,
   "anchor": "EVERY number below is ILLUSTRATIVE-until-5090-benchmark"
  },
  "T1_CREATURES": {
   "file": "_source/01_Tier_1_Foundation/T1_Build_Pipeline_Contracts [ACTIVE v1.0].md",
   "line": 187,
   "anchor": "Creatures (skinned non-Nanite) — triangle budget LOD0: 24k / 60k / 120k"
  },
  "T1_CREATURES_CHAIN": {
   "file": "_source/01_Tier_1_Foundation/T1_Build_Pipeline_Contracts [ACTIVE v1.0].md",
   "line": 187,
   "anchor": "LOD chain: 4 / 4 / 3 / 2-to-3 steps"
  },
  "T1_FAMILIARS": {
   "file": "_source/01_Tier_1_Foundation/T1_Build_Pipeline_Contracts [ACTIVE v1.0].md",
   "line": 188,
   "anchor": "Familiars (skinned non-Nanite) — triangle budget LOD0: 18k / 45k / 90k"
  },
  "T1_WEAPONS": {
   "file": "_source/01_Tier_1_Foundation/T1_Build_Pipeline_Contracts [ACTIVE v1.0].md",
   "line": 189,
   "anchor": "Weapons (static Nanite) — triangle cell: Nanite source-uncapped, memory-governed"
  },
  "T1_MATERIAL_SLOT_CAP": {
   "file": "_source/01_Tier_1_Foundation/T1_Build_Pipeline_Contracts [ACTIVE v1.0].md",
   "line": 189,
   "anchor": "Material-slot cap: 4 / 6 / 8 / unconstrained"
  },
  "T1_VRIL_SITES": {
   "file": "_source/01_Tier_1_Foundation/T1_Build_Pipeline_Contracts [ACTIVE v1.0].md",
   "line": 190,
   "anchor": "Vril Sites (static Nanite)"
  },
  "T1_ARCHITECTURAL": {
   "file": "_source/01_Tier_1_Foundation/T1_Build_Pipeline_Contracts [ACTIVE v1.0].md",
   "line": 191,
   "anchor": "Architectural Features (static Nanite)"
  },
  "T1_NPCS": {
   "file": "_source/01_Tier_1_Foundation/T1_Build_Pipeline_Contracts [ACTIVE v1.0].md",
   "line": 192,
   "anchor": "falls to the skinned non-Nanite triangle budget as for Creatures"
  },
  "T1_SPECIAL_CLASS": {
   "file": "_source/01_Tier_1_Foundation/T1_Build_Pipeline_Contracts [ACTIVE v1.0].md",
   "line": 193,
   "anchor": "Special Asset Class — inherits whichever bucket its closest analog falls into"
  },
  "T1_VETO_SURFACE": {
   "file": "_source/01_Tier_1_Foundation/T1_Build_Pipeline_Contracts [ACTIVE v1.0].md",
   "line": 195,
   "anchor": "Preserved veto surface for Josh or the UE-build owner"
  },
  "T1_TAXONOMY": {
   "file": "_source/01_Tier_1_Foundation/T1_Build_Pipeline_Contracts [ACTIVE v1.0].md",
   "line": 343,
   "anchor": "2.2 Meshy Generation Categories"
  },
  "DOCTRINE_5_1_HEAD": {
   "file": "docs/ENGINE_OPTIMIZATION_DOCTRINE.md",
   "line": 1355,
   "anchor": "5.1 Every static mesh"
  },
  "DOCTRINE_A1": {
   "file": "docs/ENGINE_OPTIMIZATION_DOCTRINE.md",
   "line": 1359,
   "anchor": "vertex:tri ratio >2:1 inflates Nanite data and cost"
  },
  "DOCTRINE_A3": {
   "file": "docs/ENGINE_OPTIMIZATION_DOCTRINE.md",
   "line": 1361,
   "anchor": "hold the material-slot cap: 4 / 6 / 8"
  },
  "DOCTRINE_A4": {
   "file": "docs/ENGINE_OPTIMIZATION_DOCTRINE.md",
   "line": 1362,
   "anchor": "ship simple collision only"
  },
  "DOCTRINE_5_3_HEAD": {
   "file": "docs/ENGINE_OPTIMIZATION_DOCTRINE.md",
   "line": 1382,
   "anchor": "5.3 Every skinned asset"
  },
  "DOCTRINE_C1": {
   "file": "docs/ENGINE_OPTIMIZATION_DOCTRINE.md",
   "line": 1386,
   "anchor": "hold LOD0 triangle budgets: Creatures 24k/60k/120k, Familiars 18k/45k/90k"
  },
  "DOCTRINE_C2": {
   "file": "docs/ENGINE_OPTIMIZATION_DOCTRINE.md",
   "line": 1387,
   "anchor": "ship the LOD chain: 4/4/3/2"
  },
  "DOSSIER_3_14": {
   "file": "docs/pipeline_review/AAA_WORKFLOW_CORRESPONDENCE_2026-08-06.md",
   "line": 870,
   "anchor": "3.14 LOD chains"
  },
  "DOSSIER_THE_DEFECT": {
   "file": "docs/pipeline_review/AAA_WORKFLOW_CORRESPONDENCE_2026-08-06.md",
   "line": 904,
   "anchor": "the arrival chest ships"
  },
  "DOSSIER_DEAD_SLOTS": {
   "file": "docs/pipeline_review/AAA_WORKFLOW_CORRESPONDENCE_2026-08-06.md",
   "line": 909,
   "anchor": "Material slots: 4 per garment piece with exactly ONE used"
  },
  "DOSSIER_W_BUDGET": {
   "file": "docs/pipeline_review/AAA_WORKFLOW_CORRESPONDENCE_2026-08-06.md",
   "line": 1292,
   "anchor": "W-BUDGET — ARM THE DECLARED GATES"
  },
  "ROSTER_ITEM_5": {
   "file": "docs/spine/DECISIONS_PENDING_JOSH.md",
   "line": 4715,
   "anchor": "BUDGET GATES IN-CHAIN"
  }
 },
 "classes": {
  "Creatures": {
   "governance": "skinned_non_nanite",
   "cite": "T1_CREATURES",
   "restated_by": "DOCTRINE_C1",
   "status": "ILLUSTRATIVE-until-5090-benchmark",
   "lod0_triangles": {
    "steam_deck_minimum": 24000,
    "mid_range_pc": 60000,
    "high_end_pc": 120000,
    "ultra": null
   },
   "lod_chain_steps": {
    "steam_deck_minimum": 4,
    "mid_range_pc": 4,
    "high_end_pc": 3,
    "ultra": [
     2,
     3
    ]
   },
   "lod_chain_cite": "T1_CREATURES_CHAIN",
   "material_slot_cap": "NOT_DECLARED",
   "material_slot_cap_why": "The §1.7 table declares a material-slot cap on the three STATIC Nanite classes only (Weapons, Vril Sites, Architectural Features). No cap is declared for a skinned class, and doctrine A3 sits in §5.1 'Every static mesh'. Inventing one here would be inventing canon.",
   "memory_cap_mb": "NOT_DECLARED",
   "collision": "simple capsule-plus-convex matched to the skeleton at every spec class",
   "nanite": false
  },
  "Familiars": {
   "governance": "skinned_non_nanite",
   "cite": "T1_FAMILIARS",
   "restated_by": "DOCTRINE_C1",
   "status": "ILLUSTRATIVE-until-5090-benchmark",
   "lod0_triangles": {
    "steam_deck_minimum": 18000,
    "mid_range_pc": 45000,
    "high_end_pc": 90000,
    "ultra": null
   },
   "lod_chain_steps": {
    "steam_deck_minimum": 4,
    "mid_range_pc": 4,
    "high_end_pc": 3,
    "ultra": [
     2,
     3
    ]
   },
   "lod_chain_cite": "T1_CREATURES_CHAIN",
   "material_slot_cap": "NOT_DECLARED",
   "material_slot_cap_why": "as Creatures -- §1.7 declares slot caps on the static Nanite classes only",
   "memory_cap_mb": "NOT_DECLARED",
   "collision": "simple capsule-plus-convex matched to the skeleton at every spec class",
   "nanite": false
  },
  "Weapons": {
   "governance": "static_nanite",
   "cite": "T1_WEAPONS",
   "status": "ILLUSTRATIVE-until-5090-benchmark",
   "lod0_triangles": "NANITE_SOURCE_UNCAPPED",
   "lod0_triangles_why": "the static Nanite classes Weapons, Vril Sites, and Architectural Features carry no triangle cap -- their triangle cell reads Nanite source-uncapped, memory-governed",
   "lod_chain_steps": "NOT_DECLARED",
   "material_slot_cap": {
    "steam_deck_minimum": 4,
    "mid_range_pc": 6,
    "high_end_pc": 8,
    "ultra": null
   },
   "material_slot_cap_cite": "T1_MATERIAL_SLOT_CAP",
   "memory_cap_mb": {
    "steam_deck_minimum": 8,
    "mid_range_pc": 16,
    "high_end_pc": 32,
    "ultra": null
   },
   "collision": "simple convex, hand-finished regardless",
   "nanite": true
  },
  "Vril Sites": {
   "governance": "static_nanite",
   "cite": "T1_VRIL_SITES",
   "status": "ILLUSTRATIVE-until-5090-benchmark",
   "lod0_triangles": "NANITE_SOURCE_UNCAPPED",
   "lod_chain_steps": "NOT_DECLARED",
   "material_slot_cap": {
    "steam_deck_minimum": 4,
    "mid_range_pc": 6,
    "high_end_pc": 8,
    "ultra": null
   },
   "material_slot_cap_cite": "T1_VRIL_SITES",
   "memory_cap_mb": "NOT_DECLARED",
   "draw_calls_per_view": {
    "steam_deck_minimum": 2000,
    "mid_range_pc": 5000,
    "high_end_pc": 10000,
    "ultra": null
   },
   "vram_streaming_pool_gb": {
    "steam_deck_minimum": 1.0,
    "mid_range_pc": 2.5,
    "high_end_pc": 5.0,
    "ultra": null
   },
   "collision": "simple convex or box per structural component",
   "nanite": true
  },
  "Architectural Features": {
   "governance": "static_nanite",
   "cite": "T1_ARCHITECTURAL",
   "status": "ILLUSTRATIVE-until-5090-benchmark",
   "lod0_triangles": "NANITE_SOURCE_UNCAPPED",
   "lod_chain_steps": "NOT_DECLARED",
   "material_slot_cap": {
    "steam_deck_minimum": 4,
    "mid_range_pc": 6,
    "high_end_pc": 8,
    "ultra": null
   },
   "material_slot_cap_cite": "T1_ARCHITECTURAL",
   "memory_cap_mb": "NOT_DECLARED",
   "draw_calls_per_view": {
    "steam_deck_minimum": 2000,
    "mid_range_pc": 5000,
    "high_end_pc": 10000,
    "ultra": null
   },
   "vram_streaming_pool_gb": {
    "steam_deck_minimum": 1.0,
    "mid_range_pc": 2.5,
    "high_end_pc": 5.0,
    "ultra": null
   },
   "collision": "simple convex or box per structural component",
   "nanite": true
  },
  "NPCs": {
   "governance": "metahuman_native_or_skinned_fallback",
   "cite": "T1_NPCS",
   "status": "ILLUSTRATIVE-until-5090-benchmark",
   "lod0_triangles": "INHERITS:Creatures",
   "lod0_triangles_why": "MetaHuman-native LOD and collision in the MetaHuman-first case; 'a non-MetaHuman archetype mesh falls to the skinned non-Nanite triangle budget as for Creatures'. Nothing in this repo is MetaHuman-authored today, so every NPC-class mesh measured here takes the Creatures budget.",
   "lod_chain_steps": "INHERITS:Creatures",
   "material_slot_cap": "NOT_DECLARED",
   "collision": "MetaHuman-native, or the skinned capsule-plus-convex rule on the fallback path",
   "nanite": false
  },
  "Special Asset Class": {
   "governance": "inherits_nearest_analog",
   "cite": "T1_SPECIAL_CLASS",
   "status": "ILLUSTRATIVE-until-5090-benchmark",
   "lod0_triangles": "INHERITS_BY_RULE",
   "lod0_triangles_why": "'a boss-tier or materializing-construct mesh takes the skinned non-Nanite triangle budget, a static device or structure (the Vimana body) takes the static Nanite governance'. This is canon's OWN mechanism for a mesh whose category is not a table row, and it is the mechanism the `routing` block below uses -- never an invented category.",
   "lod_chain_steps": "INHERITS_BY_RULE",
   "material_slot_cap": "INHERITS_BY_RULE",
   "collision": "INHERITS_BY_RULE",
   "nanite": null
  }
 },
 "rules": {
  "A1_vertex_tri_ratio_max": {
   "value": 2.0,
   "declared_scope": "static_nanite",
   "cite": "DOCTRINE_A1",
   "scope_cite": "DOCTRINE_5_1_HEAD",
   "severity_in_scope": "ERROR",
   "severity_out_of_scope": "WARN",
   "out_of_scope_why": "The grounding is Nanite data inflation, and the row lives in §5.1 'Every static mesh'. A skinned mesh whose vertex count exceeds twice its triangle count is still a measured anomaly (it means the mesh is split rather than welded, which inflates the skinned vertex pipeline too) so it is REPORTED with its scope stated, and it never fails a build on a rule canon wrote for a different class."
  },
  "A3_material_slot_cap": {
   "cite": "DOCTRINE_A3",
   "value_source": "classes[<class>].material_slot_cap",
   "severity": "ERROR",
   "not_armed_for": "skinned_non_nanite -- no slot cap is declared for a skinned class anywhere in §1.7 or §5.3",
   "arming_condition": "a §1.7 D-POLY-BUDGETS row that states a material-slot cap for Creatures / Familiars / NPCs, or a benchmark-day re-pin that adds one"
  },
  "A4_collision_simple_only": {
   "cite": "DOCTRINE_A4",
   "rule": "collision is ALWAYS simple convex, capsule, or box regardless of class or spec class",
   "rule_cite": "T1_DPOLY_PREAMBLE",
   "severity": "ERROR",
   "armed": false,
   "arming_condition": "an asset record that states its collision primitive type. NO record surface in either repo carries one today: the import results record lod_count, material_slot_count, bind height and skeleton, and never a collision primitive. The tooth is declared and unarmed rather than quietly dropped."
  },
  "C1_lod0_triangle_budget": {
   "cite": "DOCTRINE_C1",
   "value_source": "classes[<class>].lod0_triangles[enforced_spec_class]",
   "severity": "ERROR",
   "not_armed_for": "static_nanite -- the triangle cell reads 'Nanite source-uncapped, memory-governed', so a triangle count is not a budget violation for a static class"
  },
  "C2_lod_chain_steps": {
   "cite": "DOCTRINE_C2",
   "value_source": "classes[<class>].lod_chain_steps[enforced_spec_class]",
   "severity": "ERROR",
   "interpretation": {
    "reading": "'4 / 4 / 3 / 2-to-3 steps' is read as the LOD COUNT of the shipped chain (LOD0..LOD3 = 4).",
    "why": "The dossier reads the landed 4-LOD arrival chain as satisfying the chain figure and flags only the triangle number against it -- 'The arrival garment carries 4 LODs at 85,358 / 44,565 / 24,270 / 13,686 verts' beside 'The budgets are declared ... chain 4/4/3/2-3'. Canon does not disambiguate steps-vs-rungs, so the reading is DECLARED here rather than assumed silently, and a re-pin may change it in this file alone.",
    "cite": "DOSSIER_3_14"
   },
   "arms_per_asset_when": "the record demonstrates the asset reached the LOD stage -- it carries an LOD list or a lod_count. An asset staged before the LOD stage has no chain to check and is counted under DECLARED NOT-ARMED with its census, never silently passed and never failed for work it has not reached."
  },
  "C2b_lod_chain_reduces": {
   "derived_from": "DOCTRINE_C2",
   "rule": "each rung of an LOD chain carries strictly fewer triangles than the rung above it",
   "severity": "ERROR",
   "authored_reading": "Canon says 'LOD chain: 4 ... steps' and does not spell out that a step reduces. A chain whose later rung is not smaller is not a reduction chain, so this is a reading of the word chain rather than a second number -- and it is named here as a reading, not smuggled in as canon. It fires only on a rung that is EQUAL TO or LARGER THAN the rung above, never on a reduction the gate merely finds shallow."
  },
  "MATERIAL_SLOT_OCCUPANCY": {
   "observation_only": true,
   "cite": "DOSSIER_DEAD_SLOTS",
   "what": "a declared material slot with nothing assigned to it -- 4 declared with 1 used on every arrival garment piece",
   "severity": "OBSERVATION",
   "why_not_a_tooth": "No canon line states that a declared slot must be used. It is a measured fact the dossier names (register row 29) and the scorecard prints it so the factory can see it, but it is NOT a rule and must never fail a build on this file's authority."
  }
 },
 "routing": {
  "_doc": "Record class tokens (what the measurement surfaces actually write) -> the §1.7 class whose budget binds. Every entry is either DIRECT (the token names a §1.7 table row) or INHERITED (the token has no table row and canon's own Special-Asset-Class inheritance rule at §1.7 routes it). An asset whose class token matches nothing here is a FINDING, never a silent skip -- a router that cannot route must not read as clean.",
  "by_record_class": {
   "creature": {
    "class": "Creatures",
    "derivation": "DIRECT",
    "cite": "T1_CREATURES"
   },
   "creatures": {
    "class": "Creatures",
    "derivation": "DIRECT",
    "cite": "T1_CREATURES"
   },
   "familiar": {
    "class": "Familiars",
    "derivation": "DIRECT",
    "cite": "T1_FAMILIARS"
   },
   "weapon": {
    "class": "Weapons",
    "derivation": "DIRECT",
    "cite": "T1_WEAPONS"
   },
   "weapons": {
    "class": "Weapons",
    "derivation": "DIRECT",
    "cite": "T1_WEAPONS"
   },
   "npc": {
    "class": "NPCs",
    "derivation": "DIRECT",
    "cite": "T1_NPCS"
   },
   "vril_site": {
    "class": "Vril Sites",
    "derivation": "DIRECT",
    "cite": "T1_VRIL_SITES"
   },
   "env": {
    "class": "Architectural Features",
    "derivation": "DIRECT",
    "cite": "T1_ARCHITECTURAL"
   },
   "architecture": {
    "class": "Architectural Features",
    "derivation": "DIRECT",
    "cite": "T1_ARCHITECTURAL"
   },
   "equipment": {
    "class": "Weapons",
    "derivation": "INHERITED",
    "cite": "T1_SPECIAL_CLASS",
    "why": "a staged EQS_ piece is a hand-held static mesh with no skeleton; canon's inheritance rule sends 'a static device or structure' to the static Nanite governance, and Weapons is the static row that also carries the per-prop memory-sanity cap"
   },
   "gather_prop": {
    "class": "Weapons",
    "derivation": "INHERITED",
    "cite": "T1_SPECIAL_CLASS",
    "why": "static prop -> static Nanite governance; the Weapons row is the prop-memory-capped static row"
   },
   "env_prop": {
    "class": "Architectural Features",
    "derivation": "INHERITED",
    "cite": "T1_SPECIAL_CLASS",
    "why": "a static environment structure -> the static structural row"
   },
   "mineral": {
    "class": "Architectural Features",
    "derivation": "INHERITED",
    "cite": "T1_SPECIAL_CLASS",
    "why": "a static world-placed structure -> the static structural row"
   },
   "flora": {
    "class": "Architectural Features",
    "derivation": "INHERITED",
    "cite": "T1_SPECIAL_CLASS",
    "why": "static, world-placed, Nanite-path -> the static structural row. Foliage carries its own doctrine table (§5.2) but that table declares NO triangle number, so nothing stricter is available to bind here without inventing one"
   },
   "char_skinned_piece": {
    "class": "Creatures",
    "derivation": "INHERITED",
    "cite": "T1_NPCS",
    "why": "a protagonist garment / body / face piece bound to the character skeleton is a non-MetaHuman skinned mesh, which §1.7 sends to the skinned non-Nanite triangle budget as for Creatures. This is the routing the repo's own LOD records already cite: build/3d/candidates/face_pivot/lods/CHAR_0001_FACE_LODS.json carries budget_cited = 'T1_Build_Pipeline_Contracts section 1.7 D-POLY-BUDGETS, the Creatures line, reached via its own NPC routing clause'"
   },
   "face": {
    "class": "Creatures",
    "derivation": "INHERITED",
    "cite": "T1_NPCS",
    "why": "as char_skinned_piece"
   },
   "characters": {
    "class": "Creatures",
    "derivation": "INHERITED",
    "cite": "T1_NPCS",
    "why": "the character lane's own class token for a protagonist mesh -- a non-MetaHuman skinned mesh, so the Creatures budget"
   },
   "character": {
    "class": "Creatures",
    "derivation": "INHERITED",
    "cite": "T1_NPCS",
    "why": "as characters"
   },
   "gatherprops": {
    "class": "Weapons",
    "derivation": "INHERITED",
    "cite": "T1_SPECIAL_CLASS",
    "why": "the assetgen lane's CamelCase form of gather_prop -- a static prop"
   },
   "equipments": {
    "class": "Weapons",
    "derivation": "INHERITED",
    "cite": "T1_SPECIAL_CLASS",
    "why": "as equipment"
   },
   "props": {
    "class": "Weapons",
    "derivation": "INHERITED",
    "cite": "T1_SPECIAL_CLASS",
    "why": "the assetgen stage's fallback class for an id whose prefix names no registry -- a static prop on the prop-memory-capped static row. It is routed rather than rejected so an unclassified prop is measured, and the class token remains visible in the scorecard"
   }
  },
  "by_asset_name_prefix": {
   "_doc": "Used only where the record carries no class token -- the engine import results and the assetgen batch records key their assets by id or by UE object name. LONGEST PREFIX WINS, so SK_EQ_0004 resolves as a skeletal mesh and never as an EQ_ prop.",
   "SK_": {
    "class": "Creatures",
    "derivation": "INHERITED",
    "cite": "T1_NPCS",
    "why": "the UE SK_ prefix is a SKELETAL mesh; a non-MetaHuman skinned mesh takes the Creatures budget per §1.7"
   },
   "SM_": {
    "class": "Weapons",
    "derivation": "INHERITED",
    "cite": "T1_SPECIAL_CLASS",
    "why": "the UE SM_ prefix is a STATIC mesh -> static Nanite governance"
   },
   "CR_": {
    "class": "Creatures",
    "derivation": "DIRECT",
    "cite": "T1_CREATURES",
    "why": "the T0_Creature_Roster id prefix"
   },
   "FAM_": {
    "class": "Familiars",
    "derivation": "DIRECT",
    "cite": "T1_FAMILIARS",
    "why": "the T0_Familiar_Registry id prefix"
   },
   "WPN_": {
    "class": "Weapons",
    "derivation": "DIRECT",
    "cite": "T1_WEAPONS",
    "why": "the T0_Weapon_Registry id prefix"
   },
   "VS_": {
    "class": "Vril Sites",
    "derivation": "DIRECT",
    "cite": "T1_VRIL_SITES",
    "why": "the T0_Vril_Site_Registry id prefix"
   },
   "AR_": {
    "class": "Architectural Features",
    "derivation": "DIRECT",
    "cite": "T1_ARCHITECTURAL",
    "why": "the architecture id prefix"
   },
   "EG_": {
    "class": "Architectural Features",
    "derivation": "INHERITED",
    "cite": "T1_SPECIAL_CLASS",
    "why": "an env_prop id -- a static environment structure"
   },
   "MN_": {
    "class": "Architectural Features",
    "derivation": "INHERITED",
    "cite": "T1_SPECIAL_CLASS",
    "why": "a mineral id -- a static world-placed structure"
   },
   "FL_": {
    "class": "Architectural Features",
    "derivation": "INHERITED",
    "cite": "T1_SPECIAL_CLASS",
    "why": "a flora id -- static, world-placed, Nanite-path; §5.2 declares no triangle number to bind instead"
   },
   "GN_": {
    "class": "Weapons",
    "derivation": "INHERITED",
    "cite": "T1_SPECIAL_CLASS",
    "why": "a gather-node prop id -- a static prop on the prop-memory-capped static row"
   },
   "EQS_": {
    "class": "Weapons",
    "derivation": "INHERITED",
    "cite": "T1_SPECIAL_CLASS",
    "why": "a staged static equipment id -- a hand-held static mesh"
   },
   "EQ_": {
    "class": "Weapons",
    "derivation": "INHERITED",
    "cite": "T1_SPECIAL_CLASS",
    "why": "an equipment id measured OUTSIDE the character lane's skinned chain -- a static device. NOTE: a skinned garment piece is measured through the character surfaces, which carry the char_skinned_piece class token and therefore route to Creatures BEFORE this prefix is ever consulted."
   },
   "CHAR_": {
    "class": "Creatures",
    "derivation": "INHERITED",
    "cite": "T1_NPCS",
    "why": "a protagonist/NPC mesh id -- a non-MetaHuman skinned mesh"
   }
  }
 },
 "surfaces": [
  {
   "id": "canon_staging_manifests",
   "scope": "canon",
   "glob": "build/3d/manifests/staging_manifest_*.json",
   "adapter": "staging_manifest",
   "what": "the volume factory's own staging manifests -- assets[] with id, class and measurements.tris. This is where 'the factory stamps hundreds' is actually measurable."
  },
  {
   "id": "canon_char_manifests",
   "scope": "canon",
   "glob": "build/3d/characters/*IMPORT_MANIFEST*.json",
   "adapter": "lod_chain_blocks",
   "default_class_token": "char_skinned_piece",
   "what": "the character lane's import manifests -- per-piece skinned_lods / lods lists carrying per-rung tris and verts"
  },
  {
   "id": "canon_lod_chain_records",
   "scope": "canon",
   "glob": "build/3d/candidates/**/*LODS*.json",
   "adapter": "lod_chain_blocks",
   "default_class_token": "face",
   "what": "the face/head LOD chain records -- steps[] with per-rung tris and verts, each already citing the same §1.7 line this file transcribes"
  },
  {
   "id": "game_import_results",
   "scope": "game",
   "glob": "QA/bench/*_import_result.json",
   "adapter": "engine_import_result",
   "what": "the ENGINE READ-BACK: assets{} with registry.Triangles / registry.Vertices, lods[], lod_count and material_slot_count, plus _expectations[].tris per LOD. This is the strongest measurement surface in either repo and it is the one that recorded 134,136.",
   "degrade_honestly": "If the game repo is not present on this box the surface is reported under DECLARED NOT-ARMED with its arming condition, its baseline rows are excluded from the ratchet, and the gate never reads a missing repo as a clean corpus."
  }
 ],
 "instrument_gap": {
  "what": "in-engine PER-LOD triangle readback",
  "why": "UE 5.8's Python exposes no lod_info on SkeletalMesh, so per-LOD absorption cannot be read from a live editor (AAAAA register row 37, restated at the dossier's §3.14: 'Per-LOD absorption in engine reads UNMEASURED because UE 5.8's Python exposes no lod_info on SkeletalMesh').",
  "cite": "DOSSIER_3_14",
  "what_this_gate_reads_instead": "the import manifests, the FBX/source-mesh census the Blender-side chain already writes per rung, and the emitted QA read-back records -- all three of which carry real per-rung numbers. The gate never claims an in-engine per-LOD measurement it cannot make."
 }
}

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