Files
VoxelForge/Standalone/Research/WorldAssemblerM3/Round6/REPORT.md
T
Fr0zkaandClaude Opus 5.5 6ddb834b1c wip(assembler): round S2 (Sol) -- shared per-tile feature queries for every Core family; island placement 30x faster
Island-only worker context replaced by a shared worker-local candidate domain
(WorldAssemblyFeatureTileListV1 / ScopedWorldAssemblyFeatureQueriesV1) serving
SurfaceWorld, FloatingIslands and far-shell queries; a per-domain cost hint keeps the
full scan on small plans. Content placement prepares the same queries and skips proven
air: owner island cell p95 7.07 -> 0.24 ms; populated fixture 572 exact placements,
3.27 s -> 29 ms. Full/candidate hashes equal with dropped-feature controls on both
families; S1 default W1/W8/W16 hashes reproduced; Core-off and M2 fixtures pass.
Default contract for future families in ARCHITECTURE 8.23. Run on gpt-6.1-sol medium.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MmSoF64BbRFmk9C3p1VsBJ
2026-10-18 19:50:45 +02:00

270 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# World assembler S2 / M3 Round 6
Date: 2026-10-18. Author: Sol. Base: `d6e6942`, branch `assembler/world`. No commit, push or stash.
## Shared engine change
The island-only worker context has been removed from `ShapeWorldInternal.h`.
`WorldAssemblyFeatureTileListV1` and `ScopedWorldAssemblyFeatureQueriesV1` now carry a shared,
worker-local candidate domain, keyed by immutable recipe/plan identity. Nested scopes restore their
predecessor; samples outside the prepared domain use the full evaluator. Tile preparation includes
the mesher's normal halo and prepares both existing native families. Derived far-shell field calls
stay in that scope too. The old island payload names remain aliases so S1 research tools still build.
Families retain their mathematics: SurfaceWorld declares XY influence for column writers and finite
no-op boxes for volumetric exceptions; islands retain S1's root-aware positive-density certificate
and ordered island/connector groups. The engine never assumes that density magnitude is Euclidean
distance. Unknown operations stay active. A shared `candidateEvaluationUseful` cost hint is resolved
once per domain. The measured one-feature SurfaceWorld and four-island plans prefer the full scan;
larger plans retain culling. Audits force candidates on small plans to prove their bounds too. No density arithmetic, recipe serialization/version,
voxel-size resolution, queue, Epoch, edit lock or streaming policy was changed.
The default contract for future caves, shafts, pits, passages and rivers is documented in
ARCHITECTURE §8.23. Declare conservative bounds and any value-side proof needed to preserve exact
positive values. Preserve operation order; unknown proofs evaluate normally. An air-base family can
also declare conservative solid support, allowing the shared column union to shorten a search.
Solid-base caves cannot use that air proof. Every new proof needs equal full/candidate hashes and a
dropped-needed-feature control.
Surface biome-site selection already searches a fixed local lattice and is cached by XY. It is not
a global feature scan. We preserve that machinery and target its finite feature loops. Existing
cave extraction keeps its existing line/spatial bins; this round makes no new cave performance claim.
FarShells remains derived repair geometry with existing connector/stratum candidate filtering, rather
than becoming another canonical generator. Its field queries inherit the shared scope.
## Placement cause and correction
Native island placement previously scanned the entire owner strate, calling a full-plan evaluator
at each step. The owner workload used about 7,763 density queries per cell in S1. Its sampling cell
was mostly air, so optimizing only the top-anchor helper did not remove the dominant work.
Snapshots now declare conservative support bounds once. Decoration cells and landmark columns
prepare the same shared feature queries as meshing. A shared support-union query skips proven air,
including entirely empty columns. The march retains its original lattice phase, crossing budget,
four bisections, interpolation, normals and placement hashes. No alternate approximate top surface
was introduced. Companion queries get their own nested domain when needed.
Validation preserves the owner's palette and reports it separately from a deliberately populated
fixture. That fixture uses dense deterministic floor placements, both water classifications, the
resolved biome tags, and a staged decoration mesh (engine cube fallback if none is available).
It checks exact full/candidate transforms and canonical island density residuals, then merges and
applies real HISM regions and clears them immediately. CPU totals include cell preparation, merge
and region application; the identical application/merge cost is shared by both comparison totals.
The isolated HISM fixture bypasses live landmark footprints, which otherwise suppress its instances.
Normal region application keeps those footprints enabled. Null RHI does not measure GPU upload,
rendering, a rendered frame, or asynchronous cluster-tree completion. Existing native content
snapshots still describe the planned base field; this round does not add edit-aware reanchoring.
## Measurements and proof
The field audit replays the plans exported from BuildHost's staged owner route. These are the
same transient owner-height fixtures described in Round 4: the saved settings point to `DA_Strate4`,
while the logged SurfaceWorld layout is reconstructed from `DA_Strate1` without saving an asset.
No Season is assigned in these copies. The island plan has 4 islands and 3 connectors; the surface
plan has one finite type-4 shelf. The stress cases extend those plans to 256 islands/240 connectors
and 64 surface shelves plus one XY height writer and one XY cap writer. They do not change any production recipe.
### Forced candidate proof and cost
Each island row samples 64 tiles / 64,000 points, including the normal halo. Each surface row
samples 64 tiles / 46,656 points and hashes density, ground, cap and biome ID (186,624 values).
Surface timings start both paths with cold column caches by changing only the local validation
cache epoch. Final timing replay ran without an overlapping build or Unreal process.
| Family / plan | Full-scan p95 ms | Forced-candidate p95 ms | List build p95 ms | Full and candidate hash | Negative control |
|---|---:|---:|---:|---|---|
| Islands, staged owner | 0.9803 | 1.0194 | 0.0012 | `cb94db3ca317d001` | detected |
| Islands, 256 stress | 110.570 | 7.3619 | 0.0803 | `d83bac7778f3d62a` | detected |
| Surface, staged owner | 0.4748 | 0.4559 | 0.0003 | `4207efd4ac869108` | detected |
| Surface, 64 shelves + height/cap writers | 0.7084 | 0.4078 | 0.0011 | `f1c6ea123284cc38` | detected |
Every row has zero mismatches. Each control removes a needed feature; the island control removes
its group certificate too. The shared-scope audit also checks identity/domain fallback, nested empty
scope restoration, scope teardown and the full-scan cost hint.
The owner island point audit offers no useful culling gain. Stress p95 improves about **15×**;
3,362 stress lists cost 216.615 ms in total (108 owner lists cost 0.0766 ms). The stress template comes
from the actual staged owner plan, whereas S1's standalone audit used Round 3's manifest; its 57×
figure is not an apples-to-apples regression comparison.
Surface's single feature has no material point-query gain. Its column computation alone is about
0.368 ms of the 0.475 ms p95, and the existing bounded biome/cap path stays intact. The stress case
reduces p95 by about 42% while column cost stays similar (0.3699/0.3552 ms). There is no reason to
force a global biome/cap feature list into this owner plan.
Warmed BuildHost tile timings initially exposed a 7–13% island regression from forcing group
bookkeeping on four islands. That led to the shared cost hint. The final default path keeps its small-plan timing:
| Staged plan | LOD | Full tile p95 ms | Default shared-engine p95 ms | Full / shared shell p95 ms |
|---|---:|---:|---:|---:|
| Islands | 0 | 94.984 | 95.094 | 0.0002 / 0.0003 |
| Islands | 1 | 87.280 | 87.577 | 0.0005 / 0.0003 |
| Islands | 7 | 20.442 | 20.409 | 16.918 / 16.882 |
| Islands | 8 | 73.038 | 72.923 | 69.930 / 69.844 |
| Surface | 0 | 11.238 | 11.178 | 0.0001 / 0.0001 |
| Surface | 1 | 7.346 | 7.354 | 0.0001 / 0.0001 |
| Surface | 7 | 32.739 | 32.381 | 26.378 / 26.021 |
| Surface | 8 | 168.545 | 168.063 | 135.960 / 136.310 |
Each row measures eight owner clipmap keys after warming both routes, including list preparation,
meshing and density hashes. All four output hashes match on every paired key. This is a small,
hash-capture workload, not a rendered-frame percentile. The far-shell stage excludes LOD8 cap
refinement. There is no measured reason to add another shell-specific feature index for these
small owner plans; larger canonical fields inherit their family culling through the shared scope.
### Island placement and active populated cost
| Workload | Full scan | Shared engine | Result |
|---|---:|---:|---|
| Owner palette, cell p95 | 7.0706 ms | 0.2385 ms | about 29.6× faster |
| Owner palette, 64-cell preparation | 412.960 ms | 3.840 ms | same zero authored placements |
| Populated fixture, populated-cell p95 | 53.9875 ms | 2.1501 ms | 14 populated cells / 572 placements |
| Populated fixture, all 64 cells | 3270.478 ms | 28.436 ms | exact transforms match |
| Merge / real HISM apply | 0.0623 / 0.6068 ms | same products/cost | 572 applied instances |
| Populated active batch CPU total | 3271.147 ms | 29.105 ms | about 112× faster |
Candidate density calls are 58.84 per authored cell, versus S1's 7,763.38 for the same owner plan.
Legacy remains 193.25 calls/cell and 0.2855 ms p95. Stationary manager update p95 is 0.0005 ms;
that idle number is separate from the active batch totals above.
All 572 populated transforms match their full-scan counterparts exactly. All 572 canonical island
anchor checks pass; maximum density residual is 0.035156 Core voxel density units. The existing
terrain/content tests pass on both island and connector: island height difference is 0.373 cm,
connector difference 0.096 cm. Capsule contacts, Blueprint carve/fill, water and atmosphere pass.
No approximate anchor shortcut is used.
The six-entry authored palette still produces zero placements in these 64 cells. The populated
fixture is explicit synthetic coverage; it does not claim the cost of the owner's tree Blueprint
logic or rendered foliage. Active totals sum worker preparation and synchronous merge/application
calls over the whole batch, not one frame. Footprint suppression is disabled only for the isolated
fixture, which is immediately cleared. Async HISM tree completion and rendering are not included.
The earlier SurfaceWorld populated diagnostic produced 8,192 synthetic transforms with exact
full/candidate agreement, but had no mesh application in that build and warm-cache ordering;
its speed figures are not used as a SurfaceWorld improvement claim.
### Default identity
No recipe version was bumped: all changes select exact evaluators or skip certified air.
The full SurfaceWorld actor run reproduced S1's W1/W8/W16 matrix:
`0cd2a1a4152ee4aa / 17775c835711e5a3 / a27224958fc27d7b / 3821fea90b134ce4`
(density / mesh / payload / topology). Island assembly/recipe/plan remain
`9c372e7bfb5b8310 / 5e0370d9f95f1c15 / dbbda4932378047a`.
The final-source island W1/W8/W16 matrix is also exactly S1:
`4dcfb37585d7d986 / 725a18374c5623de / fb345d8cb319d18b / 76f2846be8efb5f4`.
The full SurfaceWorld actor pass precedes the final cost hint; the final-source focused replay
checks its LOD0/1/7/8 full-versus-default hashes after that selection-only change. Core-off's separate
final run proves unchanged legacy density at three probes and 12.5 cm. M2 V1/V2 five-fixture repeats,
same-LOD borders, V2 MC identity and 125 doorway phases all pass. Existing doorway contour
mismatch remains 22.844 cm in that fixture audit; this round does not claim a new seam solution.
### Run ledger and limits
| Run | Result / limit |
|---|---|
| Standalone Core library builds (four iterations) | all first-attempt passes; final link-safety audit checks 220,200 symbol lines |
| BuildHost UBT/UHT builds (six iterations) | all first-attempt passes; latest 62.03 s; 18 Core shims, link-safety 95,738 symbol lines; five staged asset hashes verified |
| Preliminary island actor | pass, about 3m57s, 3.19 GiB peak; canonical hashes and 572 anchor checks |
| Full SurfaceWorld actor | pass, about 12m15s, 3.58 GiB peak; streaming, collisions, motion, edits, geometry/anchors, W1/W8/W16 |
| Island actor with new HISM fixture | exit 1, about 4m14s; landmark footprint suppression hit the fixture count assertion; field/worker/anchor gates passed |
| Final island actor, cost hint and isolated HISM fixture | pass, about 3m52s, 3.03 GiB peak; W1/W8/W16, 572 exact anchors and applied instances |
| Final focused SurfaceWorld tile replay | pass, about 21s, 2.70 GiB peak; 32 paired LOD0/1/7/8 keys, all hashes equal |
| Final M2 V1/V2 fixtures | pass, about 17s, 2.34 GiB peak; repeats, borders, MC identity, 125 doorway phases |
| Final Core-off | pass, about 14s, 2.14 GiB peak; legacy density and scale unchanged |
| Final composed standalone audit | pass, 7.87s, about 64 MiB peak; all four full/candidate rows exact and controls detected |
Build iterations cover initial integration, added diagnostics, active fixture application, warmed
measurements, duplicate-validation removal, and the cost-hint/fixture fix. Their logs are the six
`results/host_build*.log` files and four `results/core_build*.log` files. The standalone audit was
replayed as those diagnostics were refined; the final composed stress also exercises XY height/cap
writers at unrelated Z values. Every replay passed its field/control assertions.
One actor run failed its new populated-HISM count
assertion after passing field/worker/anchor gates: normal `ApplyRegion` also clears live landmark
footprints. The fixture now explicitly isolates those footprints; normal application defaults to
keeping them enabled. The failed log is `results/islands_hism_fixture_failed.log` (exit 1, no crash).
Preliminary surface tile timings used a cold full path followed by a warm candidate path. Those
numbers are discarded; the final focused replay warms both paths. The first standalone audit
also overlapped compilation; it passed functional controls, but its timings are discarded. Idle
replays and the final-source replay are all recorded in `results/shared_audit_ledger.txt`.
An audit iteration removed duplicate plan validation from scoped island samples. All standalone
field audits passed; `vswhere.exe` was not found by the installed VC setup script, but CL compiled
and the audit ran successfully. A documentation-edit attempt failed on Python's default Windows
encoding; it changed no files and was corrected with UTF-8/apply_patch.
The first preliminary island launch used the existing launcher; I applied 12-CPU affinity during
that run, then added `-corelimit=12` and 12-CPU affinity to the launcher for subsequent runs. Builds
used at most eight UBT actions, or eight UBT plus four standalone compiler actions. W16 remains a
logical determinism partition under the 12-CPU execution cap. Each Unreal launch checks 4 GiB free
RAM and refuses another Unreal process. Every process is guarded at 8 GiB and 900 seconds.
No viewer or GPU capture was launched. No run exceeded its memory/time guard, no timeout occurred,
and no run returned `0xC0000142` (so its one-retry rule was never needed).
Crash audit: `Saved/BuildHost/HostProject/Saved/Crashes/` still contains only
`UECC-Windows-F1A3EFD5469F5DD62E68EBBACAC84376_0000` (2026-09-17). The isolated User crash root
still contains only `UECC-Windows-7B23387E4235BCFEDE42BC9D637E41CB_0000` (2026-10-08).
No new UECC folder exists in the host, staged plugin or isolated User crash roots. The final
commandlets finished with zero errors; known missing staged `/Game/VoxelForge/Blocks/NewDataAsset`
and certificate-store warnings remain. The failed fixture run logged its explicit test error and
exited normally.
Evidence: `results/SUMMARY.json`, `results/shared_audit_attempt_1.stdout.log`,
`results/island_tile_lists.json`, `results/shared_audit_ledger.txt`, `results/surface_full_actor.log`,
`results/islands_full_actor_final.log`, `results/surface_warmed_final.log`,
`results/m2_fixtures_final.log` and `results/core_off_final.log`. Owner plans exported under
BuildHost's isolated User Saved directory are the standalone replay inputs.
No owner project/editor was opened, closed or built, no `.uasset` was edited, and no junction,
symlink, commit, push or stash was created. All authored writes and build outputs stayed inside
this plugin's workspace/BuildHost.
## My view of the boundary
The next structural improvement should be a prepared immutable family-provider table per strate.
Today the shared scope is generic, but the world and content snapshot adapters still enumerate the
two concrete field families, and preparation rebuilds metadata vectors for each query. A provider
could publish stable feature IDs, bounds, an optional value certificate and optional surface/support
queries once, while the engine handles consumer domains, ordering, cache lifetime and instrumentation.
That would also give future cave/rivers placement the same entry point without adding another
content snapshot class. I have not rebuilt the architecture for that proposal in this round.
Evidence required before doing it: a many-strate preparation profile showing the cost of rebuilding
bounds/group summaries; separate point-evaluation and list-build allocation counts; equal full versus
prepared hashes across owner plans, halos and edited epochs; a deliberately stale-provider control;
and no regression in time to collision-ready terrain or peak memory. Preserve the current bounded
lattice path for procedural biomes and the current cave interval engine until a measured replacement
wins. A universal list of shapes would not capture those processes or their proofs.
## Files and compile spots
New source files:
- `Standalone/Research/WorldAssemblerM3/Round6/SharedFeatureListAudit.cpp` — standalone owner/stress audit.
- `Standalone/Research/WorldAssemblerM3/Round6/BuildSharedFeatureListAudit.ps1` — guarded audit compile/run script.
Modified runtime/Core sources:
- `Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h`
- `Standalone/Core/src/WorldAssemblerInternal.h`
- `Standalone/Core/src/FloatingIslandsInternal.h`
- `Standalone/Core/src/ShapeWorldInternal.h`
- `Standalone/Core/src/VoxelForgeCore.cpp`
- `Source/VoxelForge/Private/VoxelContentManager.cpp`
- `Source/VoxelForge/Public/VoxelContentManager.h`
- `Source/VoxelForgeEditor/Private/VoxelForgeExploreCommandlet.cpp`
Also updated `Tools/TestVoxelForgeCoreWorldHost.ps1`, CODEMAP §3, ARCHITECTURE §8.23 and the dialogue.
Likely compile spots: the public Core API/export boundary and canonical Core shim; shared scope/TLS
linkage; `VoxelContentManager.h` parsing and its runtime translation unit; editor commandlet timing
and fixture code. No new runtime translation unit or manifest shim is required.
## Owner note
Keep Core enabled at the existing 25 cm setting. There is no new generator setting to configure.
The shared engine now narrows terrain searches for both native families and skips empty space when
placing island content. Terrain shapes and default hashes are preserved. The populated validation
fixture measures placement without changing your decoration assets. Ready to build your project
when you choose; I only build and launch the isolated plugin BuildHost.