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

18 KiB
Raw Blame History

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.