world/translation/T99_Translation_UE5_Build.md
Translation Doc — UE5 Pipeline. Realizes T1_Build_Pipeline_Contracts §1's fourteen-subsystem
UE5 roster as concrete Unreal Engine 5.8 build mechanics — the platform-specific runtime layer
T1_Build_Pipeline_Contracts §0 always deferred. Status: ACTIVE v1.0 (flipped 2026-07-15 — the three-critic fresh-context pass PASSED, the fix-forward and the contracts-corrections pass both landed: the §0 flip condition). First authored pass —
derived from the adjudicated research chain ahead of any real region build. Several dependent
engineering spikes are still open (§4); nothing below is licensed to be read as settled where a
spike names it. Repo-native home: docs/translation/T99_Translation_UE5_Build.md — the first of
the six initial Translation Docs the Pipeline Contract names (UE5, Meshy, AIVA, ElevenLabs,
Cinematic, SFX).
Cited short-form below: UE_BUILD_AUTOMATION = docs/pipeline_review/tech_research/UE_BUILD_AUTOMATION.md
· RESEARCHED_STACK = docs/pipeline_review/RESEARCHED_STACK.md · ALTERNATIVES_MATRIX =
docs/pipeline_review/ALTERNATIVES_MATRIX.md · NEOSTACK_AI = docs/pipeline_review/tech_research/NEOSTACK_AI.md
· T1_Region_Page_Template = _source/01_Tier_1_Foundation/T1_Region_Page_Template [ACTIVE v2.0].md
· T1_Build_Pipeline_Contracts = _source/01_Tier_1_Foundation/T1_Build_Pipeline_Contracts [ACTIVE v1.0].md
· SPINE_SCHEMA_v3 = docs/SPINE_SCHEMA_v3.md.
---
This doc is the runtime realization layer under T1_Build_Pipeline_Contracts §1 (the UE5 Pipeline
Contract) — it turns the fourteen-subsystem canon-to-engine roster (§1.2) into concrete APIs,
commandlets, seams, and per-step artifacts. It does not carry canonical authority of its own.
Authority hierarchy, per Contracts §0: subordinate to the CVD on world canon; subordinate to
T1_Build_Pipeline_Contracts on foreign-key mapping, required columns, and state-machine behavior
— this doc never contradicts those, it only supplies mechanism; subordinate to
T1_Region_Page_Template on the page-side input contract this doc consumes (the Machine Blocks,
Section 17). Where the Contract is silent on platform-specific runtime-parameter inference, this
doc owns the inference layer [SRC: T1_Build_Pipeline_Contracts §0].
Versioning discipline it inherits: Translation Docs version per platform update; a UE version
revision produces a new Translation Doc version, while the Pipeline Contract surface stays stable.
This is v0.1 against a stack that itself still carries open spikes (§4) — "iterate as build
experience accumulates" is the governing posture, not a one-shot lock [SRC:
T1_Build_Pipeline_Contracts §0].
The reconciliation this doc performs: Contracts §1.2 was authored against UE 5.7 and named
Cesium for Unreal, Gaea2Unreal, and SRTM Heightmap Import as three separate terrain-import
pipelines. The since-ADJUDICATED research (RESEARCHED_STACK, ALTERNATIVES_MATRIX Slot 1) supersedes
that specific tool split on the terrain leg with a single DEM-GDAL-Landscape backbone (Gaea narrowed
to its erosion-detail role; classic heightfield Landscape held over 5.8's Experimental Mesh Terrain)
and pins UE 5.8 throughout. This is exactly the "platform volatility absorption" Contracts §0
anticipates: the fourteen subsystems (the WHAT) are unchanged; §3 below supplies the HOW at the
currently-ruled tool selection. T0_Region_Index.terrain_pipeline_type's `cesium/gaea/srtm/hybrid/
custom enum stays schema-valid — this doc defaults new regions to the gaea/hybrid` path per the
ruling, which is a Translation Doc call, not a Contract amendment [SRC: T1_Build_Pipeline_Contracts
§1.2, §1.6; RESEARCHED_STACK Chain 3 + ADJUDICATED v2; ALTERNATIVES_MATRIX Slot 1].
Scope boundary: covers the fourteen §1.2 subsystems as they resolve into the region-build chain
(§3). Does not cover the other nine Pipeline Contracts except where UE5 consumes their output as an
opaque foreign key (mesh_id_ref, voice_signature_ref) — those get their own Translation Docs.
Does not invent canon or schema: every field, column, and enum this doc names is one already
defined by T1_Build_Pipeline_Contracts, T1_Region_Page_Template, or SPINE_SCHEMA_v3 — this doc
supplies mechanism, never a new FK, column, or numerical fact.
---
UE 5.8 is confirmed current and the last planned major UE5 release (shipped 2026-06-17; UE6 Early
Access targeted late 2027, full release 12-18 months after). Do not target 5.9 (maintenance-only if
it ships at all) and do not design against pre-EA UE6. Several APIs moved across the 5.x line
specifically relevant here — EditorLevelLibrary deprecation (split across
EditorActorSubsystem/LevelEditorSubsystem/UnrealEditorSubsystem), MetaHuman's cloud-to-in-editor
migration (5.6+), PCG's Experimental-to-Production-Ready climb (5.7) — re-check every API name
against 5.8-era documentation specifically, not older tutorial-era assumptions [SRC:
UE_BUILD_AUTOMATION §0; RESEARCHED_STACK Chain 3].
Ruled principle, verbatim-faithful: Claude Code drives NeoStack with every action — code,
Blueprints, PCG, LLM-placed generation — matched to OUR SCHEMA. The v3 spine graph
(SPINE_SCHEMA_v3 §3) plus region pages (T1_Region_Page_Template) plus registries are the input
contract; NeoStack never generates freehand against an unstructured prompt. Every step in §3 traces
its input artifact to a named schema field for exactly this reason [SRC: RESEARCHED_STACK ADJUDICATED
v2; ALTERNATIVES_MATRIX "Fixed constraints"].
Not a single tool — three seams, routed by step CLASS, never by preference:
| Seam | Handles | Examples in this chain (§3) |
|---|---|---|
| NeoStack (owned; INTERPRETATION/judgment) | canon intent to first-draft asset graph, authored ONCE per pattern/template, then reused at scale by a bulk seam | quest Blueprint/State-Tree logic from a beat's objective + a fork's options (Step 8); a Behavior Tree first draft from a boss's verb-set (Step 6's marker-to-fight-logic handoff); Sequencer shot TEMPLATES from scene_type descriptions (Step 9); the landscape auto-material design (Step 5); the MetaHuman coefficient-sampling script design (Step 7); a Niagara effect matched to a vril signature (Contracts §1.2) |
| Native Python + Remote Control + commandlets (BULK/STRUCTURED/already-specified, zero judgment, same op times 69 regions) | registry/spine-row to DataTable ingestion; World Partition scaffolding; Data Layer tagging; per-zone PCG instantiate + headless bake; MetaHuman batch execution once the sampling script exists; Sequencer per-row population from templates; DataValidation; cook/package/CI | Steps 2, 3, 6 (execution half), 7 (execution half), 9 (population half), 10 (DataTable half), 11 |
| Epic first-party MCP (Experimental, free, engine-bundled) | PCG-graph AUTHORING specifically — its one strong, sanctioned toolset, gated behind the mandatory "PCG graph generation skill" (Epic: without it the LLM "misunderstands PCG concepts, overcomplicates, misuses nodes") | Step 6's template-graph authoring; as it matures past Experimental, the narrow Scene/Actor/Material tier |
Fallback: chongdashu/unreal-mcp (OSS, 2,034 stars, actively maintained) is the pinned fallback
for the NeoStack interpretive seam if the pre-flight install verify fails. **Two pre-flight gates
bind before any region build** (§4): gate 1, NeoStack-on-5.8, is SATISFIED (verified 2026-07-19) —
NeoStack is installed as source in the project Plugins/, rebuilt against the engine BuildId
(55116800), and its MCP channel (http://127.0.0.1:9315/mcp, server unreal-editor) was
smoke-tested end-to-end (actor spawn + viewport screenshot); the chongdashu/unreal-mcp fallback is
now dormant, not the active branch. Gate 2 still binds — impose a human-in-the-loop checkpoint policy
in the orchestrator, since NeoStack's only built-in safety is undo, not pre-approval. The checkpoint policy must define
its own mandatory-pause triggers explicitly — at minimum, any operation touching hard-line/§17
content and any bulk/destructive operation — since the tool itself does not enforce that boundary
[SRC: ALTERNATIVES_MATRIX Slot 4; UE_BUILD_AUTOMATION §3.6; NEOSTACK_AI "What the Translation Doc
needs to specify"].
Every player-facing string lands in a string table (FText, never a hard-coded FString/literal),
starting with the FIRST asset built, not retrofitted later — the ship-everywhere ruling makes this
non-negotiable [SRC: T1_Region_Page_Template §17]. Mechanically this is already partially
load-bearing in Step 2's codegen convention: every player-facing column in a generated USTRUCT
(FBossRow.DisplayName, dialogue text, quest objective text) types as FText, never FString — a
DataTable-imported FText field participates in UE's text-gather/localization pipeline by
construction. The exact String Table (UStringTable/LOCTABLE) authoring and gather-commandlet
automation surface was not covered by any source read for this doc and is not confirmed here —
treat the FText-column convention as the binding rule and the specific String Table mechanism as
an open item (§4) before the first asset ships text [SRC: T1_Region_Page_Template §17;
UE_BUILD_AUTOMATION §4.2; RESEARCHED_STACK "Missing lanes opened"].
---
Contracts §1.2 subsystem to chain-step index (what this doc realizes, and where):
| Contracts §1.2 subsystem | Realized at |
|---|---|
| Blueprints | Step 8 (quest logic), Step 6 (PCG-marker hookups) |
| Procedural Content Generation | Step 6 |
| World Partition and Streaming | Step 3 |
| Niagara VFX | NeoStack interpretive seam (§2.3) — no dedicated step; effects follow the same author-once/apply-many pattern as Steps 5 and 9 |
| Cesium for Unreal / Gaea2Unreal / SRTM Heightmap Import | Superseded by Steps 4-5 (the adjudicated DEM-GDAL-Gaea-Landscape backbone; §1 reconciliation) |
| MetaHuman Pipeline | Step 7 |
| Animation Asset Authoring | NeoStack interpretive seam per Contracts §1.2's own routing ("via NeoStack tool surface"); generation content (mocap/keyframe/generative) stays at the deferred Animation Pipeline Contract, out of scope here |
| Cinematic Sequencer | Step 9 |
| Save State System | Step 10 |
| Quest System | Step 8 |
| Combat System | Step 6's boss-marker placement + Step 8's flagged fight-AI gap (§4) |
| Performance Budget | Step 3 (WP cell sizing) + Step 11 (cook/validation budgets); region page §17 perf fields |
A pre-step precedes Step 1 on every build: site/beat/fork/scene/SQ rows live embedded in typed
markdown inside docs/spine/CH_NN.md, not as standalone tables. A markdown-table-extraction step
(our own tooling, not an Epic API) pulls them into the same CSV/JSON shape as the registries before
Step 2 can run [SRC: UE_BUILD_AUTOMATION §9 Pre-step].
.uproject plugin references + Config/DefaultEngine.ini entries.Plugins/ and rebuild it against the engine BuildId — a prebuilt or marketplace binary drop-in re-breaks on a BuildId mismatch, so prebuilt drops are forbidden (verified 2026-07-19); load Epic's Experimental Unreal MCP plugin (ModelContextProtocol, server unreal-mcp, default http://127.0.0.1:8000/mcp — enabled but NOT auto-started, no toolset enabled yet) + its PCG toolset + the mandatory "PCG graph generation skill." Install chongdashu/unreal-mcp as a dormant fallback.USTRUCT : FTableRowBase per registry/table (FBossRow, FCreatureRow, FSiteRow, FBeatRow, FForkRule, FSceneRow, …) with player-facing text fields typed FText (§2.4); generated Config/Tags/*.ini for the GameplayTag taxonomy (THREAD_01..22 refs, ws.* keys, the closed enums from SPINE_SCHEMA_v3 §4); CSV for flat rows, JSON wherever a row nests (boss phases, fork option tables).UnrealEditor-Cmd.exe -run=pythonscript) via unreal.CSVImportFactory/unreal.AssetImportTask for first creation and unreal.DataTableFunctionLibrary.fill_data_table_from_json_file/_csv_file for refresh, producing DT_Bosses, DT_Creatures, DT_Sites, DT_Beats, DT_ForkRules, DT_Scenes. Cross-registry FKs resolve via FDataTableRowHandle (1:1) or UDataRegistrySubsystem (the many-to-many namespace across the ~30-registry graph).DT_* DataTable assets + a registered GameplayTag taxonomy (tags load at engine init only — this step must complete before the editor/game next boots).RowName = the registry's own stable ID (boss_id, beat_id, site_id — never a display name or positional index); re-import fully overwrites the DataTable and silently breaks any FDataTableRowHandle keyed to a renamed row. DataTables are binary .uassets, not git-diffable — the CSV/JSON stays source of truth; the .uasset is a regenerable build artifact.region_id, chapter_set) + Zone Catalog area_bounds..umap per region_id (~69 total).WorldPartitionConvertCommandlet (sets CellSize — default runtime cell 25,600 cm via RuntimeGrid/RuntimeHashSet in World Settings — plus HLOD defaults) or Tools > Convert Level; no clean scripted "set WP grid size" call exists, this is a level/World-Settings property. Builder commandlets (-run=WorldPartitionBuilderCommandlet -Builder=<Name>) handle HLOD, minimap, and navmesh headlessly. Data Layers tag the Zone Catalog's protected sites into a SafeZone layer via unreal.DataLayerEditorSubsystem (create_data_layer, add_actor_to_data_layer, set_data_layer_is_loaded_in_editor) — cleanly Python-scriptable, no flag..umap per region, protected zones already tagged for downstream hostile-suppression.terrain_type (SPINE_SCHEMA_v3 §3b site rows) via Copernicus GLO-30 DEM → GDAL/rasterio reproject/resample/carve → a Gaea erosion-detail pass, per the terrain chain the region page's Section 1 points to. 16-bit grayscale only (PNG16 or .r16 — 8-bit terraces visibly; EXR is not a supported classic-heightmap format, a common trap since Gaea/Houdini/World Machine default to EXR for other exports).ALandscape::Import() C++ call parameters — bounds, sections-per-component, quads-per-section, a TMap<FGuid,TArray<uint16>> of height data, an FLandscapeImportLayerInfo array for initial per-layer weightmaps.spawn_actor_from_class yields a LandscapePlaceholder that supports no heightmap operations; unreal.LandscapeSubsystem exists but exposes no documented one-call import; the landscape.landscape_import(...) calls surfacing in search results belong to a deprecated third-party plugin, not the official API. The one confirmed path is C++: World->SpawnActor<ALandscape>() → Landscape->Import(...) → RegisterAllComponents() → PostEditChangeProperty(...), wrapped as a UFUNCTION(BlueprintCallable) shim callable from a commandlet/Python (reference implementations: FDatasmithLandscapeImporter::ImportLandscapeActor, FLandscapeEditorDetailCustomization_NewLandscape::OnCreateButtonClicked), or a third-party plugin (TAPython's unreal.PythonLandscapeLib).ALandscape actor per region, textured with its initial WorldCover-derived weightmaps (feeds directly into Step 5).terrain field per zone/site.LandscapeLayerBlend/LandscapeLayerWeight/LandscapeLayerCoords nodes, self-assigning layers by slope/height/WorldCover-class (no manual painting) — or per-layer weightmaps supplied at Step 4's import call.zone_id | source site_id(s) | terrain | gameplay functions | ambient_threat | vril_density | climactic_affordances | protected | area_bounds | build_priority) + DT_Creatures/DT_Bosses etc. from Step 2.Load Data Table (point data/attribute set) and Data Table Row to Attribute Set — one zone row to one Attribute Set, parameterizing that zone's graph: density from ambient_threat, creature-tier filter from vril_density, boss/set-piece marker placement from climactic_affordances.unreal.PCGComponent.generate() — silently fails if called before the owning actor has a valid world/transform, sequence after actor spawn); whole-region HEADLESS BAKE runs via UnrealEditor.exe -run=WorldPartitionBuilderCommandlet -Builder=PCGWorldPartitionBuilder -IncludeGraphNames=... -Unattended -AllowCommandletRendering. Raw-Python graph authoring (add_node_of_type/add_edge) exists but is brittle — templates plus parameterization is the reliable path by design choice, not a hard blocker.DT_Bosses by RowName), protected zones suppressing hostiles via the Step 3 Data Layer.PCGWorldPartitionBuilder (iterative cell loading + a Grid Size node can throw an executor error) — test against the SPECIFIC template graphs before CI reliance. A PCG-spawned boss marker is not a fight — everything downstream of "a boss exists here" (attack patterns, phase transitions) is bespoke gameplay code, flagged separately at §4 and comparable in scope to Step 4's shim.T0_Character_Index/T0_Antagonist_Network_Registry rows (mesh_pipeline_type defaults metahuman for these two registries per Contracts §1.5.1).GetFaceModelCoefficients/SetFaceModelCoefficients (5.8's PCA conform-to support) as the concrete lever mapping persona/appearance-range data to parametric face variation. request_auto_rigging + request_texture_sources round-trip Epic's CLOUD per character for the rig/texture bake — this is not scriptable away.beat rows (objective/actors/systems/threads/in:/out:/reveal), fork_node + ACTION-keyed option tables (direction/delta/axis_value/mark_write/relationship-faction/opportunity_effects/ws_writes), and SQ beat rows (sq_id · questline · stage · gate {condition-expr} · beats · reward) — SPINE_SCHEMA_v3 §3a/§3c/§3d.gate {condition-expr} mini-grammar (has(local.key), at(site_id), flag(local.key), ws.key {==|>=|<=|in} val, read(surface), boolean &/|, produce-before-consume) is the literal condition surface both targets translate — SPINE_SCHEMA_v3 §5.3.T0_Questline_Index, T0_Worldstate_Variables, T0_Chapter_Index, T0_Character_Index, T0_Antagonist_Network_Registry, T0_Ability_Tree_Registry, T0_Trade_Registry, T0_Vril_Site_Registry, T0_Inscription_Spine, T0_Hard_Lines per Contracts §1.3's Quest System dependency line.ws_writes/out: delta becomes a call into the Step 10 WorldStateSubsystem.local.* produce-before-consume is already gate-checked upstream at the spine layer (harness/check_spine_graph.py) — the UE graph must not introduce a token the spine gate didn't already resolve. State Tree is the right consumer for RUNTIME reaction to ws.* (Property Bindings read AND write a tag) but the wrong PARADIGM for the stateless rule-row table itself — do not re-author fork tables as tree nodes.mark_write's shape ({community_id, valence, persistence, forward_track:[CH_NN]}) is richer than a scalar ws.* value — whether it lives in its own DataTable-backed ledger or extends the WorldState map is unresolved by any source read for this doc; it is scoped into the Step 10 validation spike, not decided here.scene_anchor_id | beat_ref | scene_type | path_bucket | anchor_type | participant_refs | hard_line_relevance (uniform across all 79 live nodes; the intent trio thematic_anchor / audio_priority_layer / scene_audio_intent defers by rule to the Scene_Spec population pass, per each node's own §13 preamble — SPINE_SCHEMA_v3 §3d is corrected to this shape, 2026-07-15) — plus the region page's own ambient-cinematic additions (the only scene rows a page may author, per its Derived Indexes Scene index).scene_type "shot template" sequences (pre-authored camera-cut tracks/cadence, one per the 11 VERBATIM scene_type values).scene_anchor_id becomes the generated sequence's asset name/path (also the idempotent-regeneration key); beat_ref selects which parent sequence's MovieSceneSubTrack (Shots/Takes) this shot slots into; scene_type selects which template gets duplicated (the highest-leverage mapping — templates carry the camera blocking that should not regenerate per row); the level/sub-level the sequence renders against (MapName in the MRQ command line) comes from the beat→site→region join (beat_ref → §3a site → region map — corpus-corrected 2026-07-15: anchor_type is the TRIGGER-CONDITION class scene_entry/beat_transition/dialogue_initiation/branch_decision_point/reveal, consumed by trigger wiring, never a map anchor); participant_refs resolve to possessable (add_actors) or spawnable (add_spawnable_from_class/instance, create_camera) bindings against the Step 7 NPC/MetaHuman assets. Audio tracks populate from dialogue SoundWave assets and facial animation from MetaHuman Animator's audio-driven mode where a dialogue/VO source exists.-MoviePipelineConfig=... -windowed -resx -resy -log -notexturestreaming, or MoviePipelinePythonHostExecutor for a fully scripted pipeline).hard_line_relevance (the executed 7th column — HELD/LIFTED + HL refs) has no renderable engine equivalent — it is the care/reveal-discipline trace, consumed as a QA/verification signal on the generated sequence, never a track; thematic_anchor is not a spine column at all (deferred to the Scene_Spec pass with the audio pair). Camera blocking, timing, and cut rhythm are not in the schema at all — they come from the scene_type templates or a separate heuristic step; this is the single biggest gap between "scene row" and "finished cinematic." The schema carries no dialogue/audio line reference — a dialogue-to-SoundWave linkage is a genuine schema gap, not a UE limitation, if auto-populated audio + lip-sync is wanted.ws_writes/mark_write values, beat rows' in:/out: ws.* deltas, T0_Worldstate_Variables (WS_NNN).DT_ForkRules DataTable (condition key/comparator/value, target key, set value, scope) ingested via Step 2's standard mechanism; a custom UWorldStateSubsystem : UGameInstanceSubsystem holding TMap<FGameplayTag, FWorldStateValue> (FWorldStateValue a small tagged-union struct — enum discriminator + bool/int/enum payload, so all three ws.* types share one map); a UWorldStateSaveGame : USaveGame persisting the map via AsyncSaveGameToSlot.USaveGame docs cover basic serialization only, with no architectural guidance for dozens of independently-tracked flags; Lyra — Epic's own flagship sample — ships no save/persistence reference at all. State Tree is a CONSUMER of ws.* at runtime (Enter Conditions/Property Bindings can read and write a tag) but the wrong paradigm for the rule table itself — fork tables are stateless per-node rows evaluated at story beats, State Tree is a hierarchical state machine; forcing ~39 keys times per-chapter rules into tree nodes is an impedance mismatch. GAS is unsuited for a different reason — loose tags model booleans only, not the enum/int payloads ws.* needs, and are not auto-persisted.GameInstance-scoped, survives level loads by construction) plus a persisted save slot mirroring T0_Worldstate_Variables.ws.* keys end to end — before committing the full ~39-key architecture** (§4). Never report this subsystem as settled; it is a synthesized recommendation built from verified subsystem-lifecycle facts, not a cited Epic pattern.mark_write's shape ({community_id, valence, persistence, forward_track:[CH_NN]}) is richer than a scalar FWorldStateValue — whether it needs its own DataTable-backed ledger or an array extension is unresolved by any source read for this doc; fold it into the same spike rather than deciding it here.region_id across all ~69 regions — then this step runs once over the whole project (or per-region for iteration)..pak.-run=DataValidation first (extensible with custom UEditorValidatorBase subclasses in C++/Blueprint/Python), then RunUAT.bat/.sh BuildCookRun -project=... -noP4 -platform=Win64 -clientconfig=Shipping -cook -allmaps -build -stage -pak -archive -archivedirectory=... -nocompileeditor -utf8output -unattended -nosplash, fully headless (-nullrhi for pure data/cook work, -RenderOffScreen if a GPU-dependent step like lighting is involved). Epic's own Horde system (BuildGraph XML, Unreal Build Accelerator for distributed compilation) is the proven at-scale orchestration pattern for exactly this step — heavy to stand up fully for a solo dev, but the BuildGraph/UAT/commandlet primitives it wraps are what this pipeline calls directly.---
Every row is a genuine open question — none of these outcomes are settled by this doc, and none
should be treated as settled by anyone reading it. Trigger = what gates the spike; Owner = who
resolves it.
| # | Spike | Trigger | Owner | Not yet settled because |
|---|---|---|---|---|
| 1 | NeoStack-on-5.8 install verify | Before Step 1 gates any region build | Josh (direct install) | RESOLVED — VERIFIED 2026-07-19. NeoStack is installed as source in the project Plugins/, rebuilt against the engine BuildId (55116800), and its MCP channel (http://127.0.0.1:9315/mcp, server unreal-editor, single execute_script Lua meta-tool) was smoke-tested end-to-end (actor spawn + viewport screenshot). The chongdashu/unreal-mcp fallback stays pinned but dormant [ALTERNATIVES_MATRIX Slot 4; engine pin verified 2026-07-19]. |
| 2 | Landscape-import C++ shim | Before any region's Step 4 | Engineering (one-time build, reused x69) | Not yet written; reference implementations are named but this project's own shim doesn't exist — the single highest-priority engineering dependency in the chain [UE_BUILD_AUTOMATION §2.3, §10 item 6]. |
| 3 | ws.* WorldStateSubsystem validation spike | Before committing the full ~39-key architecture (Step 10) | Engineering | Entire architecture is SYNTHESIZED — no Epic reference exists, Lyra ships none; wire 3-4 real keys end to end first; mark_write's richer shape is unresolved [UE_BUILD_AUTOMATION §7.6-7.7, §10 item 17]. |
| 4 | MetaHuman batch cloud-throughput test | Before committing to MetaHuman-per-NPC at full roster scale (Step 7) | Production/engineering | Throughput/latency/rate-limits at "hundreds of characters" is undocumented by Epic — the real risk, not a gap that resolves itself [UE_BUILD_AUTOMATION §5.6, §10 items 11-13]. |
| 5 | Epic-MCP PCG-toolset verify | Before Step 6's template-authoring seam is trusted | Whoever stands up the first template graph | STILL PENDING (2026-07-19): the ModelContextProtocol plugin is enabled (server unreal-mcp, http://127.0.0.1:8000/mcp) but NOT auto-started and no toolset (EditorToolset/PCGToolset/AllToolsets) is enabled yet. Experimental ("use caution when shipping"); large-graph analysis is resource-expensive; no direct attribute inspection without a Dataview workflow [UE_BUILD_AUTOMATION §3.6]. |
| 6 | PCGWorldPartitionBuilder edge-case test | Before the headless whole-region bake (Step 6) runs in CI | Whoever wires the bake | Community-reported iterative-cell-loading + Grid Size node executor error, untested against our template graphs [UE_BUILD_AUTOMATION §3.3, §10 item 8]. |
| 7 | PCG Biome Core experimental-status verify | Before Step 5's flora/biome spawn is load-bearing | Whoever wires terrain population | Versioned v0.2, Experimental as of this research — verify runtime performance before shipping this specific sub-feature [UE_BUILD_AUTOMATION §3.1]. |
| 8 | Gaea CLI-automation tier confirm | Before Step 4's heightmap input is generated headlessly | Whoever scripts terrain generation (install-now, no hardware dependency) | Indie ($99) tier may not include headless CLI; Pro ($199) may be required; Gaea 3.0 shipped-status is also unconfirmed [RESEARCHED_STACK; ALTERNATIVES_MATRIX Slot 1]. |
| 9 | Boss phase-to-beat fight-AI framework | Before Step 6's encounter marker means anything playable | Gameplay engineering (bespoke, State-Tree-plausible) | Not a documentation question at all — no UE-doc answer exists; comparable in scope to the Step 4 shim, but for gameplay code [UE_BUILD_AUTOMATION §7.4, §9 Step 8, §10 item 20]. |
| 10 | Localization / String Table mechanism | Before the first asset ships a player-facing string (§2.4) | Whoever finalizes Step 2's codegen FText convention | No String Table Python/gather-commandlet API was confirmed in any source read for this doc — the FText-column rule is binding, the automation surface is not yet verified [T1_Region_Page_Template §17; RESEARCHED_STACK]. |
| 11 | Remote Control /remote/batch crash bug | Before any automation script depends on batched Remote Control calls | Whoever builds the CI/automation harness | A forum-reported crash bug under some conditions, untested against our usage pattern [UE_BUILD_AUTOMATION §1.2, §10 item 2]. |
| 12 | EULA generative-AI clause legal read | Before the pipeline architecture is treated as locked | Josh (legal review — explicitly not resolvable by research) | The "prompt-based input" scope is genuinely ambiguous per Epic's own community; exact section numbers are unconfirmed (EULA pages returned 403 to automated fetch). Safe working design meanwhile: AI authors/drives, Epic content never becomes training data [UE_BUILD_AUTOMATION §8.4-8.5, §10 items 18-19]. |
---
The repeatable loop a Build Ready region page drives. Precondition: the page's status field reads
Build Ready, harness/check_region_page.py is green, and every chapter in chapter_set passes
harness/check_spine_graph.py. Scope mirrors T1_Region_Page_Template's own Consumer Loading
Pattern for UE5 Build: the Machine Blocks + Sections 1, 2, 3, 4, 6, 7, 9, 12, 17, 18 [SRC:
T1_Region_Page_Template "Consumer Loading Patterns"].
1. Extract — pull this region's site/beat/fork/scene/SQ rows from every docs/spine/CH_NN.md in chapter_set into CSV/JSON; pull the region page's Zone Catalog + Derived Indexes (Step 2 pre-step).
2. Ingest — refresh/create this region's DataTable rows (Step 2); verify RowName stability against the last build.
3. Scaffold — convert/create the region's .umap, set CellSize, tag protected zones into the SafeZone Data Layer (Step 3).
4. Terrain — synthesize the region's heightmap (DEM → GDAL → Gaea) at a valid vertex size; run the Landscape-import shim with WorldCover-derived initial weightmaps (Step 4).
5. Materials — confirm the pre-authored auto-material self-assigns correctly for this region's WorldCover mix; spot-check for terracing/mismatched layers (Step 5).
6. Populate — instantiate + parameterize the biome-matched PCG template(s) per zone; run the headless per-region PCGWorldPartitionBuilder bake (Step 6).
7. NPCs — batch-generate this region's named/principal MetaHuman roster from Section 12 persona data; assign Crowd/modular actors for background factions; budget the cloud round-trip (Step 7).
8. Quests — wire this region's beat/fork/SQ rows into Blueprint/State-Tree quest logic; confirm every ws_writes/mark_write calls the WorldStateSubsystem (Steps 8, 10).
9. Cinematics — duplicate scene_type templates for this region's scene rows (spine-bound plus the page's own ambient-cinematic additions); resolve participant_refs to the Step 7 NPC assets (Step 9).
10. Validate — run -run=DataValidation against this region's new/changed assets plus custom validators (RowName integrity, reveal-ladder compliance, hard-line checks) (Step 11).
11. Iterate or cook — fold into the next full-project BuildCookRun, or cook this region alone for fast iteration (Step 11).
12. Record — note this region's build state against §4: a region can reach Build Ready on the page and still be blocked by an unresolved spike (no landscape shim yet means no region clears Step 4, regardless of page status).
This doc updates as spikes resolve and as the first real region build surfaces edge cases the
adjudicated research couldn't anticipate — per the versioning discipline in §1, that is a Translation
Doc refinement, not a Pipeline Contract amendment, unless a region build surfaces an actual canonical
schema gap.