pipelines/WORLD_GENERATION_PROGRAM_2026-08-06.md
What this is. Josh's charter, verbatim, inside the factory-complete publish ruling: *"all while the
engine and quests and seeds and world and everything continue to build, all asset factories are also
continuing to build. world needs a lot of work on its generation too."*
(docs/spine/DECISIONS_PENDING_JOSH.md, THE FACTORY-COMPLETE PUBLISH GATE). This file is the
director-level assessment of world GENERATION against the AAAAA bar, and the ranked wave program that
follows from it. It assesses and ranks; it builds nothing and it rules nothing.
Authority. PROPOSAL-TIER. Canon, the CVD, and Josh's rulings bind every row here. Where a wave
proposes something beyond the floor of what was asked, it is marked VETOABLE and named as such.
Scope, drawn tightly. GENERATION — the chain that turns geodata and canon rows into a playable
space: terrain, landcover, biome rules, scatter, water, caverns, settlement placement, and the
region-to-region scale-out. It does NOT re-litigate lighting, capture profile or composition; rungs
W1-W7 own those and their verdicts are cited, not re-derived. Where a generation defect has already
been measured by an existing record, this file carries that record's own number and its own word.
What this file refuses to do. It does not restate a measurement it did not verify at HEAD; it does
not report a zero without the positive control that proves the search could have matched; and it does
not propose an instrument without naming the shippable artifact that instrument unblocks
(docs/spine/DECISIONS_PENDING_JOSH.md, THE CREATION-FIRST LAW + gate moratorium).
---
1. The world generation TOOLING is more finished than anything it has produced: a real COP30 → UTM → composed-island → sculpt → import → procedural-landscape-material → PCG → grass → lookdev chain exists and works, and the scripts are the mature asset.
2. The chain is missing four stages, and the canon region page's own build recipe names three of them — erosion, the Liang Bua cave-mouth carve, and World Partition — plus a fourth Josh ruled separately (D-MPV's per-AOI resolution ladder). None of the four is an invention of this file.
3. The single deepest defect is that the landform is interpolated, not eroded: COP30 at 30 m authored to 3.9 m posts, a 7.69× cubic upsample, with only 14.65% of the island's ground being real DEM patch and zero erosion or detail synthesis anywhere in the chain. The meta says so in its own words.
4. Landcover is a nearest-neighbour step function on a 27.3 m cell, so there is no ecotone anywhere; six painted layers sit at forest 87.93% / grass 10.2% / everything else under 1%, and the wetland layer that the mud surface needs has no weightmap at all.
5. Generation is one biome file, three scatter layers, one region, one of the three layers empty by declaration, with no per-species rule on slope, altitude, moisture or aspect — against a slice that needs seven distinct region classes and an arc that needs seventy-six regions.
6. Read against the AAA chain the public record actually describes — the same eleven layers in the same order across Guerrilla, CDPR, Sucker Punch and Ubisoft (§2.4) — we run layer 1 and a thin layer 10, and almost nothing else. The two highest-leverage layers, both fully automatable and both publicly specified, are the abiotic field bake (slope · curvature · flow · wetness · illumination · aspect, baked before any plant exists) and species arbitration by priority → viability → radius; we have neither. And the one layer every studio refuses to automate — the biome mask, which is their art-direction lever — is the one we automated.
7. 225 rows of T0_Environment_Grammar reach zero generation code (positive-controlled), and the Zone Catalog's own build columns are 0/11 on worldcover_biome, asset_routing and ambient_population_band — the world's canon vocabulary is authored and inert.
8. Three whole classes have no pipeline at all, and each is on the slice's critical path: caverns (the game's first built minute happens inside one), water (the arc's first vril mechanic happens in a waterfall), and settlement (one 10,000-triangle massing mesh stands in for every village).
9. All three pre-registered world kill-tests are without a verdict — erosion-vs-Landmass BLOCKED, 69-region throughput BLOCKED, World-Partition-plus-PCG at the hero tier INCONCLUSIVE because PCG was off during the capture. The pipeline's three structural choices were settled by default, not by evidence.
10. Two instruments are reporting about the wrong subject — a far-field probe that moved 3.65 km and 802 m under an unchanged id, and a material allowlist that failed all 18 Flores shots on BAD_MATERIAL — and the world comparator itself is armed: [], with its own rubric recording that no world teacher lens has ever been run.
11. The program is seven waves, slice-first and exemplar-first: substrate + instruments (free, and 10.12 GB of licence-clean scan content is already on disk unbound), then landform, cavern, water, biome ruleset, settlement, and only then the second region — because the second region is the moment the factory opens, and opening it early is the failure the depth law exists to prevent.
---
The world generation chain, stage by stage, read off the tools and the records rather than off a doc.
| # | Stage | What actually runs | Evidence | Honest tier | |||||
|---|---|---|---|---|---|---|---|---|---|
| 1 | Source geodata | Copernicus GLO-30 (COP30) DEM via the OpenTopography API; ESA WorldCover landcover | GAME:Tools/terrain_fetch_preprocess.py | real | |||||
| 2 | Reprojection + void fill | UTM (EPSG:32751), bilinear for height, void fraction 0.0 | Tools/terrain_fetch_preprocess.py:241; E:/terrain/flores_island_terrain_meta.json void_fraction | real | |||||
| 3 | Landcover rasterize | six class weightmaps, nearest-neighbour resample | Tools/terrain_fetch_preprocess.py:294 resampling=Resampling.nearest | defective — see 2.1 finding 2 | |||||
| 4 | Composition | 11 real-DEM zone patches composited into ONE island; a detrended Manggarai background window and an inverse-distance base fill between them | flores_island_terrain_meta.json composition | real, and thin — real_patch_ground_fraction 0.1465 | |||||
| 5 | Resolution | one uniform 3.9 m/post, upsampled 7.69× from a 30 m native DEM by cubic interpolation | same file, meters_per_vertex, upsample_factor, resolution_honesty | defective — see 2.1 finding 1 | |||||
| 6 | Erosion / detail synthesis | NOTHING RUNS | positive control: `grep -ril "gaea\ | erosion\ | hydraulic\ | flow_accum\ | world_machine\ | worldcreator" over GAME:Tools/ returns hits ONLY in Tools/bench/ fixtures; zero hits in terrain_fetch_preprocess.py, compose_flores_island.py, sculpt_region_pads.py` | MISSING STAGE |
| 7 | Sculpt | flat encounter pads with skirts, sized off a slope audit | E:/terrain/sculpt_report.json (11 pads); Tools/sculpt_region_pads.py, Tools/audit_encounter_spaces.py | real — and it is playfield levelling, not landform detail | |||||
| 8 | Import | HumanityLandscapeImporter, 255quads × 1sec × 14×10 comp, one monolithic 610 MB FloresIsland.umap | GAME:Source/HumanityEditor/…/HumanityLandscapeImporter.cpp; map bytes | real — not World Partition; see 2.1 finding 4 | |||||
| 9 | Landscape material | procedural base (elevation + slope + multi-octave noise) MODULATED by the six weightmaps — never LandscapeLayerBlend as base (BUG-0016) | GAME:Tools/dress_flores_look.py header; M_Landscape_Flores_Scanned (973 expressions) | real, and a good design | |||||
| 10 | PCG scatter | ONE biome JSON → 1 assembly graph + 1 biome graph + 3 layer graphs; runtime-partitioned over 2,240 PCGPartitionActors | Tools/world/biomes/flores_monsoon.json; Content/PCG/ (5 assets); Tools/world/build_pcg_scaffold.py | real system, thin content | |||||
| 11 | Grass bed | 7 LandscapeGrassTypes via LandscapeGrassOutput | Content/Foliage/Grass/GT_* | real | |||||
| 12 | Dressing | script-placed props, markers, gather nodes; the crater lakes as materials | Tools/dress_flores_look.py, dress_kelimutu_lakes.py, stage_flores_ch02/ch03.py | greybox | |||||
| 13 | Lookdev | physical sun 128,000 lux @ 5778 K, sky, cloud, fog, one PP volume | QA/bench/world/lookdev_*, WORLD_RUNG_W3.md | real (Flores only) | |||||
| 14 | Interaction layer | contact-displacement ring + 7 physical materials + brush/trunk collision profiles | WORLD_RUNG_W6.md; Content/Environment/Interaction/ | real mechanism, unseen (W6's own headline) | |||||
| 15 | Navigation | invoker-driven dynamic recast; island navigates 8/8 bearings | QA/bench/world/navmesh_L5a_20260806T044944Z.json | structure — obstacles never reached it | |||||
| 16 | Water | NOTHING RUNS — one custom trigger volume, an ocean material and three lake material instances | four positive controls, all zero: grep -c '"Water"' Humanity.uproject → 0; find Content -iname "*WaterBody*" → 0; grep -ac WaterBody Content/Maps/*.umap (all 8) → 0; `grep -ril "waterbody\ | /Script/Water" Source Tools Config` → 0 | MISSING STAGE | ||||
| 17 | Caverns / interiors | NOTHING RUNS | T0_Interior_Space_Registry 44 rows, no DT_InteriorSpace, no interior build artifact (docs/PIPELINE_LEDGER.md D9); no cave-carve stage in any terrain tool | MISSING STAGE | |||||
| 18 | Settlement / architecture | one greybox massing mesh | Content/Meshes/Architecture/ = 8 assets, exactly one building (SM_AR_MBARU_MASS, 10,000 tris) | MISSING STAGE |
This is not an invention and not a wishlist. The region page — _source/02_Tier_2_Region_Pages/flores_island.md, the v2.0 template exemplar — states the build chain in its own Section 1, lines 102-108. Four of the things it states do not exist in the built chain:
kt1_gaea_vs_landmass) is BLOCKED — see §2.5.dress_kelimutu_lakes.py); the Liang Bua cave mouth is not carved anywhere. docs/spine/CH_02.md L339-341 leans on this exact recipe line to seat the CH02_B06 fail state, and then says the honest half itself: *"There is no id to bind to"* (L376).Content/__ExternalActors__/Maps/ contains exactly one entry, LiangBua_TerrainSmoke (139 external actors); FloresIsland.umap has none, so its ~2,576 actors live inside a single monolithic 610 MB package with no streaming grid over them. The smoke test proved the World-Partition import path works and the shipping map did not adopt it.docs/spine/DECISIONS_PENDING_JOSH.md, restated in docs/BUILD_PLAN_END_TO_END.md at items H4 and the D-MPV ruling note). The flores Zone Catalog implements it per zone — 1 / 2 / 5 across the eleven rows (build/zones/flores_island.csv, meters_per_vertex). The built tile is a single uniform 3.9 m/post. Zero of eleven zones conform. Liang Bua, Kelimutu and Todo are ruled 1 m hero and are built 3.9× coarser than the ruling.---
FINDING 1 — THE LANDFORM IS INTERPOLATED, NOT ERODED, AND THE RECORD SAYS SO ITSELF.
The tile is COP30 at a 30 m native ground sample authored at 3.9 m/post — a 7.69× upsample whose own
meta states the honest half verbatim: *"the 31 m-scale landform is real measurement; sub-30 m detail is
cubic interpolation, not survey"* (E:/terrain/flores_island_terrain_meta.json
resolution_honesty). Between the 30 m truth and the 3.9 m surface the player's camera actually sees
there is nothing but interpolation — no hydraulic erosion, no thermal talus, no gully network, no scree,
no detail synthesis of any kind (stage 6, positive-controlled). The missing band is quantifiable: at a 30 m
ground sample, Nyquist means nothing under roughly a 60 m wavelength survives the source at all — no
gullies, no boulder benches, no streambanks, no terrace risers, no trail cuts — so everything the player
sees between about 1 m and 60 m is interpolation and nothing else. Every AAA open-world terrain chain puts
an erosion and detail-synthesis stage exactly here, and the region page's own recipe names one. Two
compounding numbers: only 14.65% of the island's ground is real DEM patch (composition.real_patch_ground_fraction), the remaining ~85% being a detrended background window plus an
inverse-distance base — so most of the playable surface is synthesized filler with neither survey nor
erosion behind it; and the only post-DEM operation that runs is eleven flat pads
(E:/terrain/sculpt_report.json), which is playfield levelling and removes detail rather than adding it.
This is the root cause of the read Josh gave the world, and it sits under every outdoor frame in every region.
FINDING 2 — THE LANDCOVER IS A NEAREST-NEIGHBOUR STEP FUNCTION, AND THE FAR-FIELD ARTIFACT IT WAS BLAMED FOR IS NOT ACTUALLY CLOSED.
Two things are true and they must not be merged. The generation defect is certain:
Tools/terrain_fetch_preprocess.py:294 resamples ESA WorldCover with Resampling.nearest, producing
binary class masks on a ~27.3 m cell, which is a hard-edged step function where a real landscape has an
ecotone — at every range, in every region, for every future biome. **The far-field MECHANISM is not
closed, and the honest record says so.** W5 ran six single-subsystem renderer ablations against the
blocky artifact on the 2.2 km mountain; the best moved it 2.7% against a repeatability floor of 0.002
and a baseline patch_area_frac of 0.2846 with an axis-aligned boundary fraction of 0.2549
against a 0.222 random expectation (GAME:QA/bench/world/blocky_mechanism_W5.json verdict) — so it is
not the renderer, and it is not chance. W5 then named the landcover mask as the mechanism and its own
material fix moved 0.2846 → 0.2834, i.e. nothing. W7a subsequently DERIVED that the mask cannot be the
mechanism at that range at all: at 2.2 km mask_fade saturates at 1.0 (near 30,000 / far 150,000 cm),
total_w ≡ 1.0 and coverage = 1, so the painted landcover has no path to shading at 2.2 km
(blocky_station_drift_W7a_20260806T042431Z.json). The surviving candidate the record leaves standing is
the heightfield NORMAL — W5's unlit arm eliminated the heightfield as a source of base COLOUR, which is
not the same as eliminating it as the source of the normal — and the composed tile's normals are
computed on a 3.9 m post grid carrying 30 m data, which is exactly where an axis-aligned terrace would
come from. The instrument that could decide it photographs the wrong place (see §2.5), and W7a's own
verdict is verbatim: *"THE ITEM IS NOT DONE, AND IT SHOULD NOT BE ATTEMPTED IN THE SHAPE IT WAS NAMED."*
Three ablation numbers were RETRACTED for the drifted station and the run-to-run spread there measured
0.0205, ten times the 0.0020 floor. W7b (the mid-distance lattice) is blocked by the same defect;
W5's lattice numbers 0.884 → 0.840 stand.
FINDING 3 — GENERATION IS ONE BIOME, THREE LAYERS, ONE REGION, AND ONE OF THE THREE LAYERS IS EMPTY.
The whole generation ruleset for a 76-region world is a single JSON — Tools/world/biomes/flores_monsoon.json — with three scatter layers and three GLOBAL multiplicative gradients. Measured against its own targets: ground clutter 1.8014 / 1.8 (landed), understory 0.2737 / 0.35 (and the file states this is a measured ceiling, not a tuning miss: three sampler runs at 0.66 / 0.744 / 0.95 points/m² delivered 0.3110 / 0.3109 / 0.2917 — more input delivers FEWER instances, because PCGSelfPruning is greedy and prunes on point bounds), canopy 0.0 / 0.02 with meshes: [] and substrate_gap: true. The file's own words: the canopy *"is the layer that most decides whether a frame reads as jungle"*. Three further structural limits, all in the file's own known_limits: parameters are BAKED into the graphs because PCG user parameters are unreachable from UE 5.8 Python, so nothing is runtime-tunable; two authored keys (density_noise_scale, self_pruning_radius_cm) are not consumed by the 5.8 node set at all; and there is no per-species rule on slope, altitude, moisture or aspect anywhere — the only spatial variation in the entire generator is one bowl-to-cone height/slope multiplier applied identically to every layer. Against the slice this is the wrong order of magnitude: Prologue→Ch 13 alone demands tropical monsoon forest AND equatorial rainforest (Ch 11 Ituri) AND volcanic highland AND karst cavern AND ocean coast (Ch 8 Swahili) AND rift savanna (Ch 10) AND temple-urban (Ch 4/5/7/12) AND highland escarpment (Ch 9/13) — one biome file covers one of them.
FINDING 4 — THE CANON VOCABULARY OF THE WORLD REACHES NO GENERATOR, AND NEITHER DO THE ZONE CATALOG'S OWN BUILD COLUMNS.
T0_Environment_Grammar_Registry carries 225 rows typing every environmental feature by
feature_category, physical_properties_array, elemental_affinity, tactical_affordance_class,
attack_verbs, exposure_hazard, mass_class / hardness / fragility / flexibility. Every flores
zone names its own refs (environment_grammar_refs — EG_0005;EG_0006;EG_0007 at Liang Bua, EG_0003;EG_0009-11 at Kelimutu, and so on for all eleven). **Positive-controlled grep for EG_00 over
GAME:Tools/ and GAME:Source/ returns ZERO hits**, with the control (GN_00|CH_02 over the same
trees) returning five files. Nothing generates a fumarolic vent field, a lava vent or a sieidi stone;
the world generates as foliage-on-terrain and the canon feature set is inert. The same is true of the
Zone Catalog's own build columns: across all eleven flores rows, worldcover_biome is 0/11,
asset_routing 0/11, ambient_population_band 0/11 (build/zones/flores_island.csv). At
region grain the picture is the same — T0_Region_Index (76 rows): env_density_band_default 4/76,
weather_cycle_profile 4/76, movement_modifier 4/76, terrain_feature_class_ids 7/76,
generation_tier 10/76, env_emitter_site_ids 0/76, ambient_population_band_default 0/76.
FINDING 5 — THE SLICE'S FIRST MINUTE, ITS FIRST MECHANIC AND ITS FIRST VILLAGE HAVE NO GENERATION PIPELINE AT ALL.
Three whole classes are absent, and each of them is on the critical path of the ruled Prologue→Ch 13 slice.
docs/spine/CH_02.md L24). The zone is cave_system, P1, "origin node", 220×180×60 karst interior plus a 400 m forest approach (build/zones/flores_island.csv). There is no cave geometry, no carve stage, no modular kit, no DT_InteriorSpace for the 44 authored interior rows. Kelimutu carries a second interior (a "cavern climax pocket 90×70") and Mama Klara's a third. Josh named this class himself in the chapter-IA ruling: *"building layouts and caverns etc"*.recharge_waterfall, P1, "first vril mechanic"), plus the Kelimutu crater lakes and a synthesized 80 m-deep shoreline. Water does not exist as a system (stage 16, four positive controls). Ch 5 adds the Musi river and Lake Toba, Ch 8 the Indian Ocean, Ch 10 the Rift lakes.flores_island.md L63: COP30 mean elevation 941.2 m, slope mean 3.3°, ESA WorldCover 84% cropland). The built answer is one 10,000-triangle massing mesh.The bar column is what the class has to do in a frame for the pantheon comparator
(harness/qa/comparator_rubrics/world.json teachers: GTA VI, RDR2/GTA V, Witcher 3, Monster Hunter
Wilds, FF7R). The tier register is the honest one: structure / greybox-feel / final.
| Region class | Slice nodes that need it | What the bar is | What we have | Tier |
|---|---|---|---|---|
| Jungle / cloud forest | Ch 2-3 Flores; Ch 11 Ituri | three read-able vertical storeys, canopy light breaking, wet foliage, ground answering a body | ground clutter at target, understory at a measured ceiling 0.31/0.35, canopy 0.0/0.02 with an empty mesh list; substrate is decimated 307-1,789-tri scan cards | greybox-feel |
| Highland / volcanic | Ch 2 Inerie + Kelimutu; Ch 5 Merapi; Ch 9 Simien; Ch 13 Drakensberg | silhouette that reads as rock at 2 km, gully and scree at 50 m, ash/scree material transition | real COP30 landform at 31 m; no erosion, no gully, no scree; far field blocky at 0.2846 patch area | structure |
| Coast / ocean | Ch 8 Swahili; Flores shoreline | horizon water, surf line, wet sand, coral-stone shore | synthesized shoreline in the heightfield; no water system; M_Ocean material only | structure |
| Urban / village / temple | Ch 3 Wae Rebo + Todo; Ch 4 Besakih; Ch 5 Borobudur; Ch 7 Madurai; Ch 12 Ile-Ife | settlement layout by cultural rule, building interiors, street/plaza legibility | one massing mesh; T0_Dwelling_Registry = 2 rows under a 76-region world | structure |
| Cavern / rock-cut interior | Ch 2 Liang Bua (origin) + Kelimutu pocket; Ch 3 Mama Klara; Ch 9 Lalibela; Ch 13 rock shelters | enterable interior volume, low-light navigation, a mouth seam where daylight is a real light | nothing | absent |
| Savanna / arid / desert | Ch 10 Rift Valley; Ch 14-15 Nubia/Egypt (just past the slice) | sparse-scatter realism, heat haze, dune or hardpan surface variety | nothing — no biome file, no region terrain | absent |
| Realm (otherworld) | Prologue, Ch 1 | grandest display in the game | nothing, correctly — Josh ruled the fairy realm designed LAST on the matured concept-art pipeline | deferred by ruling |
Five of the seven sister maps that exist at all (AngkorKhmer, Bali, BorobudurMerapi,
PalembangMusi, SamosirToba) are a Landscape, a SkyAtmosphere, a DirectionalLight and a PlayerStart —
no PCG, no fog, no post-process. One region of seventy-six has a biome.
bare_rock class covers *both* western limestone (holds no print) and Inerie ash (holds one for minutes), and the karst/ash split is owed (WORLD_RUNG_W6.md §3). The wetland class is worse than conflated — a LI_wetland LayerInfo and a PM_Flores_RiverbankMud physical material both exist and no flores_island_wc_wetland.png weightmap does, so the one surface authored with TrackCarry 0.85 covers zero square metres of the island.QA/bench/world/runtime_density_W5_BOUND_TO_RESHOOT_20260805T161310Z.json generated_area_m2_per_layer, generations_per_layer_cell), i.e. 0.14% of the island's 138.5 km² ever measured. The whole-island authored instance count is 31,785 over 138,464,235 m² = 0.00023 instances/m² — one plant per 4,348 m² (world_comparator_score_at_head.json, W1). Beyond the runtime generation radius the world is the landscape material, the grass bed (its own ceiling 0.7027/m²) and 80 static mesh actors. That is why the cine-tier composed frame reads as a flat plain with countable plants while the density probe reads 2.07/m² — both are true, and only one of them is what the camera sees at 2 km. The substrate under that density is the other half of the reading: W1 measured the mean ground plant at 307 triangles against a comparator range of 155,864-17,427,094 — *"library cards wearing a Nanite flag"*, in WLD-C1's own words.T0_Interior_Space_Registry rows, the origin node of the build order, and a Josh-named page class.QA/bench/world/navmesh_L5a_20260806T044944Z.json WHAT_IS_OWED). The hypothesis is correct and documented: PCG's GPU-mode instances are runtime-only, with no persistence, no collision, no physics, no navigation, no ray tracing and no distance-field lighting (Using PCG with GPU Processing). A generator whose output the pathfinder, the physics system and the distance fields cannot see is a generation defect, not a navigation defect — and it means the same absence is silently costing Lumen and collision as well as AI.Two research lanes read the public record — Guerrilla's GDC 2017/2018 ecotope and vegetation talks, CDPR's
REDengine 3 landscape talk (GDC 2014), Sucker Punch's *Samurai Landscapes* and *Procedural Grass*
(GDC 2021), Ubisoft's *Ghost Recon Wildlands terrain* (2017) and *Procedural World Generation of Far Cry 5*
(2018), plus Epic's PCG, Landscape, Water and Biome Core documentation. Rockstar publishes nothing on
terrain or vegetation, and three commonly-cited talks do not exist at all (no Horizon Forbidden West
terrain talk; the Tsushima talk is *Building and Rendering Tsushima Island on PS4*, not "Bringing Ghost of
Tsushima to Life"; there is no Ghost of Tsushima water talk) — named here so nothing downstream cites them.
Across four studios with four completely different authoring surfaces, the same eleven layers recur in the
same order. A = artist-authored, P = procedural.
| # | Layer | A/P | What the studios do | What we do |
|---|---|---|---|---|
| 1 | Macro heightfield / silhouette | A→P | Never noise. World Machine import then in-editor sculpt (CDPR, Ubisoft); mountains hand-crafted outright (Guerrilla, Rockstar) | Real COP30, composed — good. 85% of ground is filler base, and no sculpt above the eleven flat pads |
| 2 | Erosion / hydrology | P, from artist splines | Rivers authored as splines; erosion emits masks and scalar fields, not just geometry | absent |
| 3 | Abiotic field bake | P | Slope, curvature, altitude, occlusion/illumination, flow/moisture, wind vector, distance-to-water, latitude — baked BEFORE any plant exists. Guerrilla's World Data Maps, CDPR's per-cell water-accumulation + sun-exposure sim, Far Cry 5's explicit abiotic layer | absent — the single most transferable idea in the public record, and we have none of it |
| 4 | Landcover / biome mask | A | Hand-painted at every studio, every time. No studio auto-derives the biome map from climate — it is the art-direction lever they refuse to surrender | auto-derived from ESA WorldCover, nearest-resampled, never art-directed |
| 5 | Ecotope / rule assignment | A rules, P resolution | Node graph (Guerrilla) · GPU functional language (Sucker Punch) · Houdini HDA (Ubisoft) · brush+settings (CDPR). All four: artists write RULES, not positions | one JSON with three global multipliers |
| 6 | Species arbitration | P | Competition model. Far Cry 5 publishes it completely: priority evaluated first, viability breaks ties, viability radius excludes competitors, size variants bound to viability bands so forests taper at edges | none — every layer scatters independently |
| 7 | Write-back / second order | P | Instances modify the terrain under them; one species' mask feeds another's rules; colour coherence by write-back (CDPR's pigment map, Far Cry's viability tint) — this is the fix for "foliage looks pasted on" | none |
| 8 | Artist override | A | Universal and non-negotiable — exclusion masks, mask-out-then-hand-paint, direct edit without re-cook. Guerrilla's bar: every procedural element individually editable | emit_grass_exclusion.py only |
| 9 | Hero set-dressing | A | Always on top; RDR2 is the limit case where it is the whole world | script-placed markers and props |
| 10 | Runtime materialization | P | Regenerate around the player (Guerrilla, Sucker Punch) vs bake-and-stream (Ubisoft, CDPR) | runtime PCG — the right family, at 0.14% measured coverage |
| 11 | One global wind field | P, art-directed | Universal. Sucker Punch drives cloth, particles and millions of grass blades off a single field | a per-pack wind material function |
The honest read of that table: we have layer 1 and a thin layer 10, and almost nothing else. The two
layers with the highest leverage per hour — the abiotic field bake (3) and species arbitration (6) —
are both fully automatable, both publicly specified, and both absent. And the one layer every studio
insists on keeping human — the biome mask (4) — is the one we automated.
Three engine-side facts change the calculus and are worth carrying: PCG Biome Core / Biome Sample
ship with the engine (Experimental in 5.8) and encode exactly the studio pattern above — priority-based
biome difference, per-biome Blending Range (~64 m default) with noise control, and projection filters
named for flow and sun exposure; Nanite Foliage (Experimental, 5.8) takes a 3.5 GB tree to 29 MB on
disk with Nanite Voxels for distant aggregates, which is directly aimed at both our 307-triangle substrate
and our empty canopy; and UE 5.8's Mesh Terrain (experimental, PCG-native, World-Partition-integrated)
explicitly supports overhangs and caves. All three are free and none is in use.
Three of the world's own instruments currently report about the wrong subject or report nothing.
1. The far-field probe photographs the wrong place. composed_view_04 moved 3.65 km horizontally and 802 m down under one unchanged site id (W4 elevation 913.8 m → W5 111.59 m). At HEAD the blocky-artifact probe photographs understory foliage while believing it frames a 2.2 km cone, and three mask-authority ablation numbers were RETRACTED for it (GAME:QA/bench/world/blocky_station_drift_W7a_20260806T042431Z.json). W7a was REFUSED and W7b BLOCKED on this single defect. The fix is a marker at (−200070, −10530) cm, world Z 91378.8, under the subject-named id blocky_probe_inerie_2200m. The general form of the defect — an ordinal station id that names a camera index rather than a subject — is the class, and it is the reason a human comparing two committed camera plans was the only thing that caught it.
2. All three pre-registered world kill-tests are without a verdict. They are pre-registered with a criteria lock (criteria_lock_sha256 5f8b3f9c…, pre_registered_utc 2026-07-27), which is the right discipline, and then:
kt1_gaea_vs_landmass — *"Gaea erosion vs UE Landmass + auto-material — the terrain-tool bake-off"* — BLOCKED, *"input record not found"*. This is the decision that would have either built the erosion stage or ruled it out; instead the pipeline shipped neither.kt2_region_throughput — *"69-region terrain/import throughput extrapolation"* — BLOCKED, same cause. The scale-out question has no answer.kt3_wp_pcg_runtime — *"World Partition + PCG runtime cost at the 1 m/vertex hero tier"* — INCONCLUSIVE: *"pcg_enabled=false — a World-Partition+PCG cost measured with PCG OFF measures nothing"*. The measurement that decides whether D-MPV's hero tier is affordable was taken with the subject switched off.The finding this makes: the three structural choices in world generation — whether to erode, whether the chain scales to 76 regions, and whether the ruled hero resolution is affordable — were each given a pre-registered test, and all three were then settled by DEFAULT rather than by evidence.
3. The frame tail has never been attributed. FrameTime p99 61.486 ms against GPUTime p99 13.282 ms inside a 16.67 ms budget, with GameThreadTime p99 23.73 ms and a 5,297 ms worst sample over 9,038 samples (world_comparator_score_W5_selfview.json). Every rung since W5 has known the tail is not the GPU and none has named what it is; run_world_loop_fps.py --csv-channels still returns BLOCKED (W6 owed item 9). The GPU has ~3.4 ms of unspent p99 headroom — which is the budget every generation wave below wants to spend.
4. The world comparator is not armed anywhere a gate can read it. harness/comparator_rubric_scorecard.json (regenerated 2026-08-06) censuses 180 sections, 11 wave closes and 17 rubrics and reports armed: [] — zero; grep -c "COMPARATOR VERDICT - world" docs/FACTORY_CONTINUATION.md returns 0, so no canon wave-close has ever carried a world verdict. The canon harness holds exactly one world-adjacent gate of 74 (region_pages, harness/gates_config.json). Every world score to date lives as a game-repo JSON a human chose to read. Worse for the bar itself: the rubric's own known_limits[1] states that "No world/environment TEACHER LENS has been run" — the pantheon (GTA VI, RDR2, Witcher 3, MH Wilds, FF7R) is named from Josh's sentence rather than from a lens return, so the comparator asks the right questions with no studied answer behind them. Two of nine instrument slots were short at mint: WLD-C5 (per-biome authoring) PARTIAL, WLD-C8 (composition) NONE — *"the one axis of the five with no ruler"* — and W5 built C8's ruler, which promptly moved 311 of 462 tracked values across five already-published records.
5. There is no world judge, and there is no W7 rung document. The only *judge* records in the game repo are VFX (d127_family_judge*.json); *"the W6 judge"* referenced in W7a is a prose critic pass inside WORLD_RUNG_W5.md, not a scored artifact. WORLD_RUNG_W1-W6.md exist; W7 exists only as four per-item JSONs. So the world's own ladder has 62 capture directories and 241 PNGs behind it (QA/bench/world/captures/) and no cold grader.
6. A material allowlist silently failed every Flores shot. Every Flores QA pass had been failing all 18 shots on BAD_MATERIAL because the allowlist never learned M_Landscape_Flores_Scanned — found while re-measuring BUG-0054 (game 1fdcf0f). Same class as items 1 and 2: an instrument reporting confidently about the wrong thing.
One §8.5 item has moved past the handoff and the program should not re-queue it as written. BUG-0054's rim: freezing creature AI collapsed the OFF-arm spread 0.0339 → 0.0023 (15×), and at x2000 (90,000 cd) the guardian's subject luma moved 0.3905 → 0.4159, about ten times the noise floor — so *"TOO WEAK was the answer"* and the §8.5 root-cause line is superseded by measurement. But the same run found the silhouette gets WORSE (edge separation 0.0454 → 0.0223 at x2000; only azimuth 130° moved the right way), and the ship rule held: default stays OFF, no shipped frame changed. The improvement register's rows 24 and 26 are therefore already spent.
---
Every wave is slice-first (the Flores / CH_02 chain, then the Ch 4-13 order), exemplar-first
(one region segment driven to a Josh-gradeable frame before anything widens), and carries a
verification instrument that measures rather than looks — the correspondence lesson, and the reason
§2.5 exists. Cost classes follow the improvement register's four
(docs/pipeline_review/AAAAA_IMPROVEMENT_REGISTER_2026-08-06.md §2): free/config · tooling-day ·
model-swap · spend.
Ranking is slice impact ÷ cost, with the binding constraints named separately in §3.8 so a ranked list
cannot bury them — the same method the improvement register uses, deliberately, so the two documents
compose instead of competing.
One note on instruments, before the waves. The research lane's clearest finding about AAA verification
is that the free UE stack is the whole stack — Gauntlet driving a scripted route, the CSV Profiler writing
one row per frame, CSVToSVG rendering those channels with BUDGET LINES, Functional Screenshot Tests
comparing against ground truth with per-channel per-brightness tolerance (which exists precisely because
modern rendering injects noise to hide aliasing), and Data Validation runnable headless via
-run=DataValidation. A solo operation can stand that up in a week and run it unattended overnight on the
5090, which is why no wave below proposes a bespoke instrument where one of these will do. The lesson
worth taking whole is Ubisoft Montreal's, from *AC Origins: Monitoring and Validation of World Design Data*
(GDC 2018): at world scale the deliverable is **not the test — it is the daily report that communicates
world-data state back to its creators, visually.** That is exactly what this world program's own status
surface should be emitting, and it is the honest successor to a rung document written by hand.
Two negatives worth carrying so no wave wastes time hunting them: **no published AAA per-region ms /
draw-call / triangle budgets exist** (derive our own from stat unit + stat scenerendering per region
class and enforce them as CSVToSVG budget lines — do not import numbers from blogs), and **no
games-industry vegetation-density methodology exists at all**.
What changes in the pipeline. Bind the photogrammetry substrate that is already licence-paired on
disk and unbound, and restore the instrument that is lying about the result.
ACQUIRED_UNBOUND + 6 PLANNED_NOT_IMPORTED rows off the 86-row / 10.12 GB CC0 acquisition (GAME:QA/bench/world/substrate_acquisition_manifest.json bind_state_counts; 13 BOUND, 19 DECLINED). The bound 13 already read as real photogrammetry — Game/Environment measures nanite_tris_max 1,537,926 against the foliage libraries' 569-1,789 (render_census_20260805T144430Z.json). The far field's rock and cliff mass is sitting on disk.blocky_probe_inerie_2200m at the recorded marker, and re-point both far-field probes at it. Generalize the fix: every probe asserts its SUBJECT — a station id naming what it frames plus an in-frame check that the intended feature is present — so the ordinal-station class cannot recur silently.flat_m arm), since the landcover mask is now shown to have no path to shading at 2.2 km.humanity.UI.Hidden doing the chrome removal it already proves (5 panels / 4.430% → 0 / 0.000%), and with r.Humanity.FreezeCreatures on, which is now measured to cut capture noise 15×.BAD_MATERIAL, and arm the world comparator into the wave-close ritual — not as a new quality gate, but because the artifact it unblocks is this program's own evidence trail: every wave below claims a frame moved, and today armed: [] means no such claim is checkable at exit 0.Exemplar. One frame: the Mount Inerie 2.2 km cone from the restored station, with the bound
substrate in the far field. It is the exact frame the artifact lives in, so it is simultaneously the
exemplar and the measurement.
Instrument (measured). patch_area_frac at the restored station against its own repeatability floor
(0.002 measured); bind_state_counts.ACQUIRED_UNBOUND 48 → 0; render_census tris_max per folder for
the WLD-C1 reading; navmesh max_ratio moving off 1.0000 with the hand-placed-trunk control firing.
Cost. free/config, except the substrate import GPU/editor time. Depends on: nothing.
The wave that closes finding 1, finding 2 and half of §2.5. It is the highest-value generation change
in this program because it sits under every outdoor frame in every region, and it is the wave that makes
the region page's own recipe true.
What changes in the pipeline.
heightfield_erode is to STACK passes (Noise → Erode → Distort → Erode → Distort → Erode) varying feature size and flow force per pass, and to cache between them. The framing number: at 30 m posts, Nyquist says nothing under roughly a 60 m wavelength survives — no gullies, no boulder benches, no streambanks, no terrace risers. That entire band is what this stage puts back.TWI = ln(a / tan β), the standard soil-moisture proxy and the best single predictor of riparian species), aspect encoded as sin/cos so 0°/360° does not discontinuity, distance-to-water and wind vector. These are 100% derived, they are what Guerrilla exposes as World Data Maps and Far Cry 5 computes as its abiotic layer, and one bake feeds texturing, scatter, audio, wildlife, fog and W11's hydrology at once. It belongs in W9 because it is a function of the heightfield, and every wave after W9 consumes it.kt1_gaea_vs_landmass in either direction: the bake-off runs, and either the erosion pass earns its place or it is dropped on evidence.Resampling.nearest (terrain_fetch_preprocess.py:294) with a CONTINUOUS classification. The specific move, and it is the highest-leverage cheap fix in the whole program: ESA WorldCover gives an argmax LABEL, but Google/WRI Dynamic World ships nine per-class PROBABILITY bands at the same 10 m resolution under CC BY 4.0, and CGLS-LC100 ships continuous fractional cover. Feed the probability field, not the label, and the ecotone comes free from the data — a transition is simply where two probabilities are both mid-valued. Then perturb before thresholding (mask' = mask + amplitude × fBm, amplitude PER CLASS so a mangrove or water edge stays sharp and a forest/grassland edge stays wide) so the isoline fingers instead of tracing a pixel staircase, and height-blend rather than lerp so layers interlock at grain scale. Normalize the stack to sum to 255 per texel in GDAL rather than in the material, or the seams darken. Split the conflated classes W6 named — karst limestone vs volcanic ash out of bare_rock — and emit the missing wetland weightmap, which retires the §8.5 owed item and gives PM_Flores_RiverbankMud and its authored TrackCarry 0.85 (deposit depth 0.8796, the deepest of the seven surfaces) a place to exist. The class distribution is also radically lopsided: the 2026-08-02 proven-chain run over its own Flores derivation measured forest 87.93% · grass 10.2% · crop 0.96% · urban 0.9% · bare_rock 0.01% · water 0.0% (GAME:QA/bench/TERRAIN_CHAIN_PROVEN_2026-08-02.md; that run is a 5356×5356 @ 2.08 m tile, not the shipped composed island, so treat the shape as indicative and re-measure on the shipped tile). Six classes with one at 88% is a second reason the island reads as one thing everywhere.meters_per_vertex column: 1 m at Liang Bua / Kelimutu / Todo, 2 m standard, 5 m ambient. Today 0/11 conform.Import Type = Subregion) is the mechanism. The canon recipe already specifies WP at the 8,129-vertex actor cap; LiangBua_TerrainSmoke already proves the import path works; PCG is already partitioned into 2,240 partition actors WP is the natural streaming host for. Convert, then re-run kt3 with PCG on.Exemplar. mount_inerie_cone_country — one 2.5 km slope corridor plus its agility pod, eroded,
feathered, at its ruled resolution, framed from the restored station and from one aerial. It is the same
subject as W8's exemplar deliberately: the wave is judged on whether it moved the frame W8 made
trustworthy.
Instrument (measured).
(a) slope and curvature histograms of the built heightfield against the source COP30 tile, so the claim
"detail was added below 30 m and the 31 m landform was not disturbed" is a number and not a look;
(b) the blocky patch_area_frac at the restored station, against the 0.002 floor;
(c) landcover class-boundary gradient — the fraction of boundary pixels that are a hard step, before and after;
(d) D-MPV conformance: post spacing read back off the landscape per zone against the Zone Catalog column, today 0/11;
(e) kt1 and kt3 moving off BLOCKED/INCONCLUSIVE to a verdict, whichever way they land.
Cost. tooling-day ×3 to ×5, plus a possible tool acquisition if the bake-off picks an external
erosion tool over an in-chain implementation. Depends on: W8's restored station (the artifact
measurement is meaningless without it).
The origin node. The first thing a player ever sees in the first built chapter is a cave interior
that has no pipeline.
What changes in the pipeline.
says procedural buys the least. The research lane could not verify a single shipped AAA title using
procedural cave/interior LAYOUT generation; every concrete cave-generator artifact found is portfolio or
tutorial work. The verified practice is Skyrim's modular approach (Burgess & Purkeypile, GDC 2013), and
its two load-bearing specifics scope the work honestly: a cave "small hallway" sub-kit ran ~50 pieces
where a simpler hall sub-kit ran 7, and **off-angle interior kits need generous "glue" pieces, called out
as essential specifically for tunnel and cave kits.** Procedural belongs in the kit and the gross volume
(SDF/VDB boolean subtract, Worley F2−F1 for blocky cellular rock), not the layout.
and explicitly supports overhangs and caves. It did not exist a year ago. If it holds, it removes a
large part of the manual work and it is a one-day spike to find out.
heightfield at the interior-to-approach seam, which is the anchor docs/spine/CH_02.md L339-352 needs
and currently cannot bind to. Geometry Script's ApplyMeshBoolean on Dynamic Meshes is the in-engine
carving path if the heightfield route is not enough.
DT_InteriorSpace for the 44 authored T0_Interior_Space_Registry rows — one of the 35 registries with no DataTable (docs/PIPELINE_LEDGER.md D9). Data Layers are the standard interior
load/unload gate and are Blueprint-controllable.
Epic issue UE-256471: building HLODs in a World Partition level containing Packed Level Actors
and/or Level Instances often fails to include them and emits only a warning, and Epic's own listed
workaround is to rebuild until it works or not use them. Level Instances and Packed Level Blueprints are
exactly how Epic recommends authoring a cave interior, and W9 is putting Flores on World Partition.
Discovering this after both are committed is a structural rewrite; the test is cheap and must be first.
Lumen bounds its ray-trace distance for cost and a missed occluder leaks. The named mitigations —
raising Lumen Scene Detail and Max Trace Distance, and **Distance Field Resolution Scale from 1.0 to
2.0+ (3.0-5.0 for critical enclosure geometry)** — are a real budgeted task in this wave, not a toggle.
Exemplar. The Liang Bua cave mouth and first chamber: the wake, the crack, and the 400 m forest
approach, played from CH02_B01 through the CH02_B11 find-beat.
Instrument (measured). Illuminance in lux at the mouth seam, proving the daylight is a real light
and not an authored glow (the D1-27 light law, and the same class of arithmetic that caught BUG-0054's
8.36-lux rim against a 128,000-lux sun); interior traversal proven on the navmesh; and the CH02_B06
fail-state anchor bound to a real feature id rather than a timer.
Cost. tooling-day ×3, plus acquisition if the kit is bought rather than assembled from the CC0
substrate. Depends on: W9's heightfield (the carve edits it), so it lands after or alongside.
What changes in the pipeline. Water becomes a system.
UE_5.8/Engine/Plugins/Experimental/Water and **absent from Humanity.uproject's nineteen enabled
plugins**, both verified — versus a lighter custom river/shore layer. The plugin brings rivers, lakes,
ocean and shoreline blending with landscape deformation for free and is the genre-standard answer; the
two objections are that it is an Experimental module and that it is a new dependency taken mid-flight on
the one shippable map. That is exactly why the choice is evidenced rather than assumed.
breach (the tools are explicit that this must come first), D8 or D-infinity flow direction, flow
accumulation, threshold, vectorize, then Strahler stream order. Then let the order pick the class:
order 1-2 = a decorative non-navigable stream mesh, 3-4 = a Water Body River spline, 5+ = wide river or
lake. That is a recommendation rather than industry canon, and it is named as such — but it removes the
need to hand-decide "stream or river" several hundred times across 76 regions. GRASS r.watershed /
r.stream.extract and WhiteboxTools D8Pointer / D8FlowAccumulation / StrahlerStreamOrder all do
this off the shelf, and W9's abiotic bake already computes flow accumulation, so this leg is nearly free
once W9 lands. It is also why W9 precedes W11: erosion and hydrology are the same physics and should be
solved in the order the real landscape solved them.
recharge_waterfall (P1, first vril mechanic), wae_water_spring, mama_klaras_waterfall, and the Kelimutu crater lakes — the last currently three
material instances. Two documented limits to design around rather than discover: **Water Body River
generates no wave simulation (flow-map only), and Custom water bodies do not use the Water Mesh
Actor and therefore do not auto-carve terrain. A Water Body Exclusion Volume** is the mechanism for
a submerged passage that plays as above-water, which is what W10's cavern route will want at Mama
Klara's. Waterfalls themselves are mesh + Niagara whitewater + a shoreline wetness mask, which is
ubiquitous practice with no single authoritative talk behind it — treat it as craft, not as a citation.
Water Advanced / Shallow Water River (Niagara-Fluids-based, shipped in 5.6, used in theWitcher 4 tech demo) as a polish-tier item — worth knowing, not a slice blocker.
Exemplar. recharge_waterfall, the arc's first vril recharge — the beat where *"the emptied vessel
first fills again"* (docs/spine/CH_02.md L30) — with falling water, spray, a wet threshold ring and the
player standing in it.
Instrument (measured). Water-surface continuity at the shore (no gaps or z-fighting across the
synthesized 900 m coast margin and 250 m shore blend the meta already declares); a wet-surface response
measure at the spray ring paired to the contact layer; and a paired FPS run, because water is the first
new full-screen cost since the contact layer measured at −0.1 ms.
Cost. tooling-day ×3. Depends on: W9 for the hydrology-from-terrain leg; the water bodies
themselves do not.
The wave that turns one region's parameters into a generator.
What changes in the pipeline.
flores_monsoon.json from one region's baked constants to a biome ruleset schema reading W9's abiotic stack — per-species rules on slope, altitude, TWI/moisture, aspect, curvature and landcover probability, which is the ecotope model every studio in §2.4 runs.BiomeDefinitionTemplate with BiomePriority, per-biome Blending Range (~64 m default) with noise control, and projection filters already named for flow and sun exposure — and they are Experimental, which is the objection. Building our own is defensible; building our own *without looking at theirs first* is not.wet_green_to_ash_grey gradient authored as a scatter-time colour attribute waiting for exactly this. This is the named fix for "foliage looks pasted on."environment_grammar_refs per zone → real placement of the 225 T0_Environment_Grammar features (fumarolic vent fields at Kelimutu, EG_0005-7 at Liang Bua), which is the difference between a landscape and a world with things in it. Fill and consume the Zone Catalog's worldcover_biome / asset_routing / ambient_population_band columns (0/11 each today) and the T0_Region_Index generation columns (4-10 of 76).PCGSelfPruning prunes on point bounds and prunes harder the more points arrive. The fix is a placement strategy that does not fight the pruner — per-species point extents, or a Poisson/blue-noise pass ahead of the sampler — not another sampler value.substrate_acquisition_manifest.json fab_path.verdict = GUI_AND_SIGNIN_GATED), and it stays deliberately empty until then rather than substituted, which is correct. Two facts change the shape of the buy: Megascans stopped being blanket-free after 31 Dec 2024 (only the ~1,500-asset free subset remains), so canopy is a real budget line; and Nanite Foliage (Experimental, 5.8) takes a 3.5 GB tree to 29 MB on disk via Nanite Assemblies, adds Nanite Voxels for distant aggregates, and replaces WPO wind with Nanite Skinning (~100k bones ≈ 0.1 ms GPU) — which is aimed squarely at both the empty canopy and the 307-triangle card substrate. Its documented limits are no player/object wind collision and a global wind direction only, which collides with W6's contact layer and should be checked before it is adopted for the understory.Source/HumanityEditor (improvement register row 21, the QE wave). Without it every biome is a rebuild, and 76 biomes is 76 rebuilds.Exemplar. The lingko_forest_edge → mount_inerie_cone_country transition — one ecotone segment
where the biome changes by rule across a measured width instead of at an edge. It is chosen because it
is the exact defect finding 2 measures, seen from the ground instead of from 2.2 km.
Instrument (measured). Ecotone width in metres across the transition (today: a step); species-vs-slope
and species-vs-altitude conformance to the declared ruleset, sampled off the spawn records the density
probe already reads; understory delivered density against 0.35 with the saturation curve re-run as its
own control; Zone Catalog column fill 0/11 → 11/11; and EG_00 grep over the generation tools moving off
zero, with the control kept.
**And the density instrument this program needs but does not yet have, named as a PROPOSAL rather than a
finding.** No games-industry vegetation-density methodology exists — the research lane searched for one
directly and found none. The transferable body is remote sensing, and the pairing that fits our two
failure modes is: **(a) an orthographic top-down capture scored as fractional vegetation cover against a
reference satellite crop of the real Flores terrain**, which measures density TRUTH and is the honest
answer to §2.3's 2.075-vs-0.00023 confusion; and **(b) eye-level shot-matching against reference
photography scored with SSIM** — the metric a 2024 *Scientific Reports* study found performed best when
evaluated specifically against real-time-engine artifacts (aliasing, shadow anomalies, peter-panning,
Z-fighting) across LOD levels — which measures what the PLAYER sees. That pairing is a construction, not a
citation, and one calibration caveat transfers directly and matters: dimensional canopy cover correlated
with photographic canopy cover at R²=0.93 but underestimated it by roughly 15%, i.e. a top-down
instanced-foliage count will systematically read lower than what the camera sees at eye level. Calibrate
it before it gates anything.
Cost. tooling-day ×3, plus spend for the canopy substrate. Depends on: W9 (a ruleset keyed on
slope and moisture wants a landform that has both).
What changes in the pipeline. Settlement placement becomes a grammar driven by the region pages'
own zone catalogs and cultural arrangement, not hand placement — the same reasoning WLD-C5 applies to
density (*"hand placement does not scale to 79 nodes and is how a world stays sparse"*).
placement rule reading the region page's Section 7 arrangement — settlement radiating from the compang
centre-stone, lingko fans on the lower ground — which the page has already MEASURED on the real
terrain (flores_island.md L63). The public precedent is Ubisoft's Wildlands **settlement builder with
70+ rules**, whose load-bearing property is not the rule count but that its output was written to files
and instanced, so a town could be tweaked without a full re-cook. That property is what makes 76
regions of settlements survivable, and it should be designed in from the first village rather than
retrofitted.
T0_Dwelling_Registry beyond its 2 rows, and join it to the interior route W10 mints. camps, villages and roads, and emit_grass_exclusion.py is the only override tool we currently have.
Exemplar. Wae Rebo — seven *mbaru niang* in the cloud-forest bowl, placed by rule, enterable.
Instrument (measured). Layout conformance — each house's distance and bearing from the compang
centroid against the arrangement the page states; slope under every structure footprint against the
existing audit_region_spaces.py bar (mean ≤ 10°, max ≤ 20°), which is an instrument that already
exists and already refuses.
Cost. tooling-day ×3 plus asset-factory generation. Depends on: W9 (footprint slope), W10
(interiors).
What changes in the pipeline. Nothing new — the point is that nothing new is needed. Take Bali
(Ch 4) from bare heightmap through the whole W9-W13 chain, and MEASURE the cost of doing it, which is
what kt2_region_throughput was pre-registered to answer and has never answered.
Exemplar. One Bali zone at the same bar as the Flores exemplar, produced by running the chain rather
than by re-inventing it.
Instrument (measured). kt2 with a real record: hours and GPU-hours per region, split by stage, and
the extrapolation to 76. Until that number exists, no world scale-out claim is admissible.
Cost. tooling-day, dominated by GPU/editor time. Depends on: W9-W12 landing on Flores first —
this is the exemplar → wiring → factory law applied at region grain, and it is the wave that must NOT
start early.
Three things bind this program, and none of them wins on ratio.
1. No erosion or detail-synthesis stage (W9). Everything downstream — the far field, the ecotone, the settlement footprints, the aerial — is a function of a heightfield that is 85% synthesized filler and 100% un-eroded. It is the one change that improves every region class at once.
2. One biome for seventy-six regions (W12), with its parameters baked out of reach. The generator cannot be re-parameterized from Python, so every biome is a graph rebuild. Seventy-six regions at one rebuild each is the factory that never opens.
3. Three pre-registered kill-tests without verdicts (§2.5). Erosion, throughput and the hero tier under World Partition are the three structural choices in this pipeline, and all three are currently settled by default. Every wave above closes one of them by construction, which is deliberate.
A fourth thing binds nothing and costs everything: the frame tail has been un-attributed since W5
(FrameTime p99 61.486 ms against a 13.282 ms GPU p99). Every wave here wants to spend GPU headroom that
measurement says is available and the tail says is not reachable. Attributing it is cheap and it is
inside W8.
Both are cheap, both are inside waves already ranked, and both are structural rewrites if discovered late.
1. Enable Landscape Edit Layers before any landscape is rebuilt (W9 before W11). It is the home for
the erosion stack (DEM pinned to the bottom layer, synthesis above it, silhouette always recoverable)
AND a hard prerequisite for Landmass water carving in W11 — and it is a landscape-CREATION-time
decision. Getting it wrong means building the landscape twice.
2. Test UE-256471 before committing to World Partition plus Level Instances (W10's spike inside W9).
HLOD builds in a World Partition level often silently drop Packed Level Actors and Level Instances,
which are exactly how Epic recommends authoring the cave interiors W10 needs, in exactly the streaming
architecture W9 adopts. A one-day test now, or an architecture rewrite later.
---
Josh's ruling is explicit that building never pauses and only publishing waits
(docs/spine/DECISIONS_PENDING_JOSH.md, THE FACTORY-COMPLETE PUBLISH GATE: *"all asset factories are
also continuing to build … only PUBLISHING waits for completeness"*, and the non-asset builds —
*"engine, quests, seeds, world, UI, music"* — continue in full parallel throughout).
The world factory's completion line, stated in the gate's own terms. The gate is Josh-graded
exemplar → built asset → wired in-game (package-bytes verified) → full motion where the class carries
motion. For the world, "full motion" is the depth law's own finish line, which already exists and does
not need re-inventing: *the flores playable space — terrain, density, lighting, post — passing every
world-rubric axis at final-candidate in CINE-TIER captures AND running in-game at playable frame rates
on real input* (docs/FACTORY_CONTINUATION.md, THE DEPTH LAW). Until that line is crossed, world pages
show canon text and the honest empty state, and no world asset figure publishes.
Continues at full pace, independent of any publish decision:
_source/02_Tier_2_Region_Pages/), text-tier, no visual floor gating them. They are the substrate every later biome ruleset reads, and W12's ruleset schema is only as good as the pages behind it. The eleven slice regions Ch 2-13 all have a page; the other 64 regions do not.worldcover_biome, asset_routing, ambient_population_band, env_density_band_default, weather_cycle_profile, terrain_feature_class_ids. Canon-side authoring with no visual floor, and W12 consumes it directly. This is the single highest-leverage thing a text lane can do for world generation.build/zones/ holds seven (flores_island 11 rows, bali 7, sri_lanka 7, south_india 7, swahili_coast 5, angkor_khmer 5, sumatra_java 4). Of the eleven slice regions, five have an authored page and no zone census — Ch 9 Ethiopia, Ch 10 Rift Valley, Ch 11 Congo, Ch 12 West Africa, Ch 13 Drakensberg. The census is the generation chain's first input; producing it is text work that unblocks terrain the day a wave reaches those chapters.kt1 and kt2 are BLOCKED on a missing input record, not on a hard problem. Producing the inputs is zero-token, GPU-cheap work that can run in any window.Explicitly does NOT continue: D10 realms (Josh ruled the fairy realm designed LAST, on the matured
concept-art pipeline — do not start), and W14 (the second region) until the Flores exemplar chain lands,
because starting it early is exactly the breadth-over-depth failure the depth law was written against.
---
Josh asked for an assessment and a program. These are the items inside it that go further than that, each
named so it can be struck without touching the rest.
1. Converting FloresIsland.umap to World Partition (W9's structural leg). A structural change to
the one shippable map mid-flight. The case for it: the canon recipe specifies it, the smoke map proves
the path, and the ruled 1 m hero tier is not affordable without it. The strongest objection: the depth
law says drive this pipeline to shippable, and re-architecting the map is the opposite of finishing it.
Recommendation: do it, and do it in W9 rather than later, because every wave after W9 adds content
to the map and the conversion gets more expensive with each one.
2. Enabling the UE Water plugin (W11). A new engine plugin dependency on the shippable map. The
alternative is a custom shore/river layer, which is less capable and entirely ours.
Recommendation: evidence the choice with a one-day A/B rather than assume either, per the
assume-genre-standard-defaults ruling — the genre-standard default here is the plugin.
3. A modular karst kit as an ACQUISITION rather than a generation (W10). Buying a cave kit is faster
than generating one and is a human-gated Fab touchpoint. Recommendation: acquire if licence-clean,
consistent with the D5 flora ruling that acquire-first is correct where the content is not
canon-specific — a limestone chamber is not culturally specific; the Liang Bua *mouth* is.
4. Replacing Resampling.nearest with soft classification (W9). This changes a source-data stage that
every region will inherit and that six existing weightmaps were produced by. Regenerating them is
cheap; the objection is that it invalidates the W5 ablation baselines, which is true and is exactly
why W8's restored station and repeatability pair come first.
5. The aerial as a standing capture class. Josh named aerials as page floor; this program additionally
proposes the aerial as the *instrument* for findings 1-3, because it is the one frame that cannot hide
an un-eroded island. Cheap, and beyond what was asked.
6. The FVC-plus-shot-matching density instrument (W12). Explicitly a construction, not an industry
practice — no games-industry vegetation-density methodology exists to copy. It needs empirical
calibration before it gates anything, and the ~15% systematic underestimate is a known offset to
calibrate against, not a defect to discover later.
7. Adopting Epic's PCG Biome Core / Biome Sample rather than authoring our own schema (W12). They are
Experimental, which is a real objection on a shippable map. **Recommendation: evaluate before
authoring**, because they encode the same studio pattern the research independently derived and the
evaluation is cheap; adopt only if the Experimental risk reads acceptable at the spike.
The research lane surfaced three source-data licence facts that bear directly on any attempt to improve
the DEM under W9. They are recorded here so no wave discovers them at ship time.
and exactly what the hero tier wants. **No English licence text or explicit commercial-redistribution
grant was found. Treat commercial use as UNVERIFIED** and resolve it before any pilot hardens on it.
outright) is CC BY-NC-SA — it cannot ship commercially. Do not build on it.
for video games while the Product Terms prohibit redistributing Map Assets from a cache or as static
images. Avoid entirely.
ESA WorldCover and Dynamic World (both CC BY 4.0), Sentinel-2 (attribution notice), and
AW3D30 v4.1 (free for commercial and non-commercial under JAXA terms). The proposed W9 upgrade path
therefore stays inside licence-clean sources without touching DEMNAS.
As expected, this assessment surfaced no canon fork. It did surface three canon-side FINDINGS that belong
to the region-page and registry owners rather than to a ruling:
_source/02_Tier_2_Region_Pages/flores_island.md L63 cites Saved/Terrain/flores_island_heightmap_5611x1531.r16; the built tile is 3571x2551 and the
2026-08-04 composed-island ruling superseded the earlier one. Tools/audit_encounter_spaces.py carries
the same superseded filename in its docstring and notes it "outlived its file twice". The measurements
the note reports are not in question; the coordinate is.
docs/BUILD_PLAN_END_TO_END.md item H4 already records the live spec/gate mismatch — check_build_readiness.py:263 reads a single Section-1 meters_per_vertex while
D-MPV rules it PER AOI. W9 implements the ruling; the gate realignment rides with it.
bare_rock conflation and the missing wetland weightmap are canon-adjacent build gaps thatW6 and W7 already named and W9 closes.
---
The research half. Four lanes read the public record against source URLs, and their negative findings
are carried as carefully as their positive ones. Do not cite, because they do not exist: any Horizon
Forbidden West vegetation or terrain GDC talk; "Samurai Landscapes: Bringing Ghost of Tsushima to Life"
(the real title is *Building and Rendering Tsushima Island on PS4*); any Ghost of Tsushima water talk;
any Rockstar terrain or vegetation talk; any Houdini "HeightField Erode Precise" node. **Do not mine City
Sample as a PCG showcase — it uses the Rules Processor, PCG's predecessor. Unverified and load-bearing,
flagged as such:** UE 5.7's water status (two failed fetches); HLOD behaviour for runtime-only PCG
instances; whether Epic publishes any Landscape-Grass-vs-PCG decision rule (none was found); published
per-region AAA performance budgets (none found); Epic's own grid-size and biome-structure numbers for the
Electric Dreams demo (not published). Primary sources leaned on: Guerrilla GDC 2017/2018, CDPR GDC 2014,
Sucker Punch GDC 2021, Ubisoft GDC 2017/2018 (Wildlands terrain, Far Cry 5 procedural world generation,
AC Origins world-data validation), Epic's PCG / Landscape / Water / Biome Core / Nanite Foliage
documentation and the 5.8 release notes, SideFX Houdini heightfield docs, and the SIGGRAPH ecosystem
literature (Deussen 1998; Génevaux 2013; Makowski 2019; Kapp 2020).
The repo half. Read cold at HEAD on 2026-08-06 across both repos: docs/HANDOFF_2026-08-05_ACCOUNT_SWITCH.md §4 and
§8.5; docs/pipeline_review/AAAAA_IMPROVEMENT_REGISTER_2026-08-06.md (world rows 4, 8, 11, 25, 35, 39,
45, 51 and §4's world paragraph); docs/PIPELINE_LEDGER.md §5 Domain D (D1-D11);
docs/FACTORY_CONTINUATION.md (the world-visual charter and the depth law);
_source/02_Tier_2_Region_Pages/flores_island.md (Zone Catalog + Section 1 build recipe);
docs/spine/CH_02.md (site rows, the Liang Bua light ruling, the beat order);
build/zones/*.csv; registries/T0_Environment_Grammar_Registry, T0_Region_Index, T0_Chapter_Index;
harness/qa/comparator_rubrics/world.json; and, read-only in the game repo,
QA/bench/world/WORLD_RUNG_W1-W6.md, world_comparator_score_W5_selfview.json,
world_comparator_score_W6_interaction.json, blocky_mechanism_W5.json,
blocky_station_drift_W7a_20260806T042431Z.json, navmesh_L5a_20260806T044944Z.json,
runtime_density_W5_BOUND_TO_RESHOOT_20260805T161310Z.json, render_census_20260805T144430Z.json,
substrate_acquisition_manifest.json, QA/bench/kt1_gaea_vs_landmass_*.json,
kt2_region_throughput_*.json, kt3_wp_pcg_runtime_*.json, Tools/bench/bench_criteria.json,
Tools/terrain_fetch_preprocess.py, Tools/world/biomes/flores_monsoon.json, and
E:/terrain/flores_island_terrain_meta.json + sculpt_report.json.
Every zero in this file was positive-controlled and the control is stated beside it. Where a lane
declared a figure RETRACTED, BLOCKED or INCONCLUSIVE, this file carries that word rather than a
substitute. Nothing here changes canon; every canon-side observation is routed to its owner as a finding.