wip(assembler): round S6 -- in-game cold view counted; workers mostly idle, apply cap not the floor

Direct per-tile trace on the BuildHost actor (owner plan, 2,578 keys): full set
17.4 s legacy; gated coarse-first (after the 9-tile walkable ring) 11.7 s with
the ring still at 0.63 s, but full LOD0 slips 2.3 -> 10.2 s. Startup apply
boost changed nothing (0.4%). 37.6 worker-s over 17.4 s on 10 slots = ~3.3
busy: the floor is admission/work supply. S5's 251 ms staircase was the trace
sampler. Fixed CVar parsing in headless BeginPlay and the 60 m/s crossing
instrument. All three knobs stay opt-in.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MmSoF64BbRFmk9C3p1VsBJ
This commit is contained in:
Fr0zkaandClaude Opus 5.5 committed 2026-10-19 06:46:54 +02:00
1 parent c0596c5f24
commit b9c13c37c0
11 files changed
+903 -31

No files matched your search

@@ -1265,3 +1265,21 @@ and every failed or corrected run in [WorldAssemblerM3/Round9/REPORT.md](../../W
No owner editor/project or asset was touched; no commit, push or stash was made.
— Luna
## World assembler S6 / M3 Round 10 — 2026-10-19
The 251 ms staircase was the residency sampler cadence; direct tile apply events are the completion
clock. The legacy-order control completed the staged 2,578-key set in 17.412 s. Gating coarse-first
admission behind the nine-tile walkable ring reduced it to 11.704 s without delaying that gate
(0.632 → 0.627 s). The 12-mesh / 14 ms spawn apply boost did not improve the legacy timeline, so it
remains opt-in and the normal 4-mesh / 2 ms guard stays in place. Worker-side work supply/admission
remains the measured floor; the trace does not isolate why worker slots stay idle. The 1.57 s aim is
still unmet and rendered enclosure remains unproven in the null-RHI harness.
The corrected standalone 60 m/s route now counts +Y crossings across multi-chunk deltas. Its
crossing data is valid, though the latency gate still fails. W1/W8/W16 and all nine LOD hashes match
S5. The new trace, regressions, run ledger, exact log-captured command lines, hashes and compile
spots are in [WorldAssemblerM3/Round10/REPORT.md](../../WorldAssemblerM3/Round10/REPORT.md).
— Luna
@@ -0,0 +1,218 @@
# World assembler S6 / M3 Round 10 — in-game cold-view time
**Result:** the 251 ms staircase was trace sampling cadence, not a scheduler tick. On the staged
2,578-key SurfaceWorld actor, the default legacy path reached full residency in 17.412 s. Gated
coarse-first admission reached it in 11.704 s while the walkable ring time stayed at 0.627 s versus
0.632 s. A 12-mesh / 14 ms startup apply budget did not improve the legacy timeline. The remaining
floor is on worker-side work supply/admission, not the game-thread apply budget; the trace does not
isolate why available worker slots stay idle. The 1.57 s aim remains unmet.
This is null-RHI residency evidence, not rendered enclosure proof.
## 1. Cadence and comparison with S5
`AVoxelWorld::UpdateChunksAroundPosition` emits `streaming_sample` only when at least 0.25 s has
elapsed since its previous sample. S5’s near-251 ms per-LOD staircase was quantized by that observer;
it was not a one-LOD-per-tick scheduler throttle. S6 records direct tile-result/apply timestamps and
per-frame `ProcessPendingChunks` samples, so the completion table below does not depend on that
sampler.
S5 reported 3.352–6.367 s for its per-LOD residency samples. The Round 9 report did not retain the
exact BuildHost command line, executable hash, or raw direct-tile trace for that run. S6 uses the
same staged `DA_Settings` SurfaceWorld plan, 25 cm Core scale, 2,578 desired keys, 12-task host setup,
and legacy-order controls, but its direct full-set result is 17.412 s. The 250 ms sampling interval
cannot explain this larger difference. Treat S5’s 3.35–6.37 s values as a different/unidentified
measurement route, not a matched baseline; S6 preserves the direct command lines and hashes below.
The Standalone 3.58–3.64 s S5 measurement was CPU-only over 2,553 keys, so it is also not a matched
BuildHost apply/collision measurement.
## 2. Matched BuildHost actor runs
Fresh sequential processes used the staged owner plan, `CoreVoxelSizeCm=25`, 2,578 desired tiles,
`-corelimit=12` (10 active task slots in the actor trace), null RHI, a manually ticked `UWorld` with
a 16 ms step, and a +Y 600 cm/s move beginning at 30 s. There was no overlapping Unreal process or
build. Full-set time is the actor’s initial desired-set milestone. “LOD0 full” means all 512 visual
LOD0 keys, separate from the 9/9 collision walkable gate.
| Configuration | Full set ready | Walkable ring 9/9 | Full 512-key LOD0 | Count-cap frames / backlog frames | Visible meshes/frame p95/max | Apply CPU p95/max | `UWorld::Tick` spawn p95/max | `UWorld::Tick` walk p95/max |
|---|---:|---:|---:|---:|---:|---:|---:|---:|
| Legacy order, authored 4 / 2 ms budget | 17.412 s | 0.632 s | 2.252 s | 78 / 22 | 4 / 4 | 0.77 / 1.62 ms | 1.406 / 5.059 ms | 1.771 / 29.247 ms |
| Legacy order, startup boost on (12 / 14 ms) | 17.346 s | 0.611 s | 2.190 s | 0 / 0 | 4 / 6 | 0.70 / 1.49 ms | 1.301 / 5.429 ms | 1.798 / 28.489 ms |
| Coarse-first after ring gate, authored 4 / 2 ms | **11.704 s** | **0.627 s** | 10.201 s | 118 / 48 | 4 / 4 | 0.82 / 1.44 ms | 1.396 / 5.027 ms | 1.911 / 28.276 ms |
Coarse-first shortened the full desired-set tail by 5.708 s (32.8%) without a walkable-gate
regression. It did not make all near detail ready sooner: full LOD0 moved from 2.252 s to 10.201 s.
The option therefore stays opt-in pending a rendered view/enclosure check. The apply boost removed
cap frames but changed full-set time by only 66 ms (0.4%), so it also stays opt-in. Normal play
continues to use the authored 4 visible-mesh / 2 ms limit. These are `UWorld::Tick` CPU samples in a
manual null-RHI harness, not full rendered frame times. Walk p95 stayed below 2 ms, but the observed
~28–29 ms maxima remain and were not isolated to a single subsystem. Per-frame apply maxima were
1.62 ms legacy and 1.44 ms gated coarse-first.
### Per-LOD cold set
Each pair is **legacy → gated coarse-first**, from direct tile completion events up to the initial
desired-set milestone. Queue values are cumulative tile-seconds, not elapsed wall seconds. The
initial set contains 2,578 tile results; empty results are included in the result count and apply
time.
| LOD | Last tile apply (s) | Worker task (s) | Worker queue (tile-s) | Result queue (tile-s) | GT apply (ms) / results |
|---:|---:|---:|---:|---:|---:|
| 0 | 2.252 → 10.201 | 3.39 → 3.39 | 0.028 → 0.033 | 5.94 → 5.87 | 27.9 → 35.0 / 512 |
| 1 | 4.785 → 11.765 | 3.21 → 3.05 | 0.007 → 0.006 | 4.43 → 4.79 | 17.0 → 20.4 / 448 |
| 2 | 6.609 → 8.567 | 0.70 → 0.71 | 0.012 → 0.006 | 4.77 → 4.90 | 10.9 → 13.0 / 320 |
| 3 | 8.162 → 7.460 | 1.81 → 1.78 | 0.005 → 0.005 | 2.86 → 3.07 | 10.5 → 11.8 / 272 |
| 4 | 10.317 → 6.530 | 6.02 → 6.08 | 0.004 → 0.006 | 2.16 → 2.62 | 26.5 → 24.9 / 272 |
| 5 | 11.494 → 5.182 | 1.42 → 1.42 | 0.003 → 0.003 | 2.20 → 2.40 | 18.4 → 15.9 / 208 |
| 6 | 12.483 → 4.438 | 1.85 → 1.90 | 0.002 → 0.002 | 1.58 → 1.65 | 15.2 → 12.8 / 144 |
| 7 | 13.198 → 3.852 | 1.74 → 1.75 | 0.001 → 0.001 | 0.88 → 1.02 | 16.7 → 13.5 / 96 |
| 8 | 17.476 → 3.432 | 17.50 → 19.29 | 0.005 → 0.465 | 2.59 → 2.62 | 95.0 → 87.0 / 306 |
Per-frame visible mesh counts and the largest per-LOD apply sample were:
| LOD | Visible meshes/frame p95/max, legacy → coarse | Max LOD apply/frame, legacy → coarse |
|---:|---:|---:|
| 0 | 2 / 4 → 3 / 4 | 0.762 → 0.934 ms |
| 1 | 1 / 4 → 1 / 4 | 0.630 → 0.809 ms |
| 2 | 0 / 4 → 1 / 4 | 0.533 → 0.639 ms |
| 3 | 0 / 4 → 1 / 4 | 0.515 → 0.570 ms |
| 4 | 2 / 4 → 3 / 4 | 0.605 → 1.354 ms |
| 5 | 1 / 3 → 2 / 4 | 1.272 → 0.742 ms |
| 6 | 0 / 4 → 1 / 4 | 0.687 → 0.708 ms |
| 7 | 0 / 4 → 0 / 4 | 0.974 → 0.732 ms |
| 8 | 2 / 4 → 3 / 4 | 1.625 → 1.439 ms |
The 10-task-slot slack estimate was 132.1 slot-seconds on legacy order and 73.3 on coarse-first,
computed as ten slots × (first request to full-set ready) minus measured worker-task seconds. The
shared pool averaged 3.27 / 4.21 running workers on frames with estimated pending results; one
legacy backlog frame had no running worker, versus none in the coarse-first run. Idle worker time
and apply-cap frames are shared-pool/world properties, so a per-LOD split would double-count them.
Legacy used 37.64 worker-seconds and coarse-first 39.36; pre-start worker-queue wait was only
0.067 / 0.527 tile-seconds. Result-queue wait summed to 27.41 / 28.94 tile-seconds. Game-thread
tile-apply time was about 0.24 / 0.23 seconds for the cold set. The boost run had no apply-cap or
result-backlog frames and still took 17.346 s. Thus the apply cap is not the end-to-end floor. The
remaining floor is worker-side work supply/admission; the trace does not isolate why available
worker slots stay idle or identify a safe single worker-side change for this round.
Collision is currently required only on the LOD0 path. The trace captured 60 body-update events in
each cold run; 60 of 125 collision-desired entries were ready by the full-set milestone, while
non-required/empty entries were classified separately. RealtimeMesh submit-to-body-update latency
(not isolated Chaos CPU cooking) was legacy p50/p95/max 17.02 / 17.89 / 18.04 ms, boost 16.80 /
17.51 / 17.70 ms, and coarse-first 17.08 / 18.01 / 18.30 ms. The nine required ring tiles were ready
at the gate times above. LOD1–8 had no collision-ready events in this trace.
## 3. Shared change and standalone crossing instrument
`voxel.StreamingCoarseFirst=1` now starts far-level admissions only after all nine required
walkable-ring collision gates are ready. `voxel.StreamingDynamicNearReserve=1` keeps the authored
near reserve while moving or before that gate; after a stationary gate it lets coarse work use the
reserved slots. Both are explicit, default-off controls. `voxel.StreamingStartupApplyBoost=1` allows
12 visible-mesh applies / 14 ms during the initial desired-set and walkable-ring phase, with a 30 s
ceiling; zero keeps the authored budget. It is not preemptive within one apply, so it remains opt-in.
This behavior is in shared `AVoxelWorld::UpdateChunksAroundPosition` / `ProcessPendingChunks` and
does not change density, tile output, or collision policy.
The standalone 60 m/s flight instrument now counts forward +Y chunk crossings using the actual
center delta, including multi-chunk jumps. The valid viewer route completed 250/250 center samples,
with 226 center updates and max forward delta +2. It reports `crossing_deltas=forward-+Y`,
resident 2,553/2,553 and no missing tiles. Latency still **fails**: nearest-ready p50/p95/max was
9.087 / 20.594 / 128.785 ms and maximum crossing wall time 42.931 s. The earlier
`--stream-benchmark` and `--stream-pipeline` invocations emitted no Flight markers; only the viewer
route is used for this result.
## 4. Hashes, regression checks and async audit
Standalone W1/W8/W16 fresh processes produced identical full-world and all nine per-LOD hashes;
all match S5. Full world identity: density `c10697a8f48380c7`, mesh `430d2be2bdd8b988`, payload
`b7b33e14092225c9`, topology `c5c46d66606a819e`.
- Core-off legacy at 12.5 cm: **PASS**, `VOXELFORGE_CORE_OFF_LEGACY_PASS`.
- M2 V1 and V2: **PASS**, five fixtures plus same-LOD border for each.
- SurfaceWorld and FloatingIslands BuildHost at 25 cm: **PASS**. FloatingIslands W1/W8/W16
matched Standalone; the final Standalone W1/W8/W16 matrix also matched across all nine LODs and S5.
- S4 cap census/agreement and ray coverage: **PASS**; 551 requested/emitted cap bands, 1,584/1,584
coverage rays, 128-point cap agreement max 0.0504 cm against 2 cm tolerance, negative control
detected.
- S3 ground and S4 LOD7/8 ground agreement: **PASS**; max ground delta 0.0427 cm, cross-LOD 0.0 cm,
and the negative control was detected.
- Water remains fixed for the season; player carve/fill stays unrestricted.
Diff audit: `GenerationEpoch` is carried and stale epochs are rejected; the four result queues remain
`EQueueMode::Mpsc`; `EndPlay` sets shutdown, waits for active work and drains the queues; workers
check `bShuttingDown`; `ModsLock` behavior is unchanged; all UObject/RealtimeMesh component creation
and mutation stays on the game thread. No density-sign or determinism path changed. The added C++
comments are French and English. No generated header, `Binaries/`, or `Intermediate/` source edits.
## 5. Exact commands, binaries and run ledger
BuildHost actor runs used `E:\Program Files\Epic Games\UE_5.7\Engine\Binaries\Win64\UnrealEditor-Cmd.exe`
with `-nullrhi -unattended -corelimit=12 -run=VoxelForgeExplore -seed=0 -archetype=TunnelNetwork
-coreworldtest=1 -corevoxelsizecm=25 -settingsref=/Game/VoxelForge/DA_Settings.DA_Settings
-coreworldstreamtrace=1 -voxel.TestMove=1 -voxel.TestMoveSpeedCmPerSecond=600
-voxel.TestMoveStartSeconds=30 -voxel.TestMoveDirection=0,1,0
-voxel.StartupTraceUntilEndPlay=1 -voxel.CollisionGate=0`. The exact expanded `LogInit: Command Line:`
including project, DDC, trace and output paths is preserved verbatim in each [legacy run](../../../../Saved/BuildHost/HostProject/Plugins/VoxelForge/Saved/CoreWorldValidation/Logs/CoreWorldValidation-owner_surface_stream_trace_only_applyboost_0_legacy_order_trace.stdout.log),
[boost run](../../../../Saved/BuildHost/HostProject/Plugins/VoxelForge/Saved/CoreWorldValidation/Logs/CoreWorldValidation-owner_surface_stream_trace_only_applyboost_1_legacy_order_trace.stdout.log),
and [gated coarse run](../../../../Saved/BuildHost/HostProject/Plugins/VoxelForge/Saved/CoreWorldValidation/Logs/CoreWorldValidation-owner_surface_stream_trace_only_applyboost_0_coarse_first_trace.stdout.log).
Their CVar overrides were respectively:
| Run | `StreamingCoarseFirst` | `StreamingDynamicNearReserve` | `StreamingStartupApplyBoost` |
|---|---:|---:|---:|
| Legacy negative control | 0 | 0 | 0 |
| Apply-budget A/B | 0 | 0 | 1 |
| Gated coarse-first | 1 | 1 | 0 |
Standalone 60 m/s exact command (also in [commands.txt](../../../../Saved/BuildHost/S6/standalone/commands.txt)):
```text
Standalone\bin\VoxelForgeCoreStandalone.exe --world-assembler-prototype --force-generate --workers=12 --clip-radius=3 --max-clip-level=8 --camera=0,-35,-487.94,0,-22 --test-flight-crossings=250 --flight-speed-mps=60 --process-priority=Normal --process-affinity=4095 --frame-limit=60
```
| Executable / module | SHA-256 |
|---|---|
| BuildHost `UnrealEditor-Cmd.exe` | `ECCE9996191F7F7E69B3D104EECDD0E678AE69176FDCCD79828C3E75A0654D6D` |
| BuildHost `UnrealEditor-VoxelForge.dll` | `1C083446ED360FBD798EAE4C4D3CA9E5994E906770B5017A51418BFEF46C30FA` |
| BuildHost `UnrealEditor-VoxelForgeCore.dll` | `54259552340FE81EA05640C622E9E5E5C0AC68C95F87DC718326D25EF133B2AC` |
| Standalone `VoxelForgeCoreStandalone.exe` | `1F445760AFDE264E2F28F8F2FB4CB68DBD0C8988AACD5A493B065E74C1827529` |
BuildHost UBT passed twice at 12 actions / Normal priority. `& .\Standalone\Build.ps1 -Target All
-CompileWorkers 12 -BuildPriority Normal` passed. Existing vswhere/C4838 warnings did not fail the
Standalone build. The S6 hash and 60 m/s logs are in [Saved/BuildHost/S6/standalone](../../../../Saved/BuildHost/S6/standalone/).
Failed/retried attempts, including setup failures:
- An earlier full actor attempt reached its 600 s timeout in the Standalone-reference preamble; it
left a partial trace. A first trace-only command omitted its required startup-trace output path
and exited before the actor run; the helper now makes `StreamingTraceOnly` imply trace output.
- Two fresh-shell memory preflights lacked the local `Add-Type` helper and stopped before launching
Unreal. The corrected `GlobalMemoryStatusEx` preflight ran before later launches.
- Early coarse-first attempts did not parse the requested CVar in headless `BeginPlay`; trace values
showed legacy LOD0-first order. Explicit CVar parsing fixed the A/B. An ungated coarse-first run
then delayed the walkable gate to 1.653 s; admission was changed to wait for 9/9 and rerun.
- FloatingIslands at 25 cm hit its 120 s test timeout; the bounded 600 s retry passed in 192 s.
- The first `--stream-benchmark` and `--stream-pipeline` sprint commands emitted no Flight markers.
The corrected viewer command above produced valid crossing deltas, with the latency failure
reported rather than hidden.
- Unsupported `-RunName`, a fresh-shell type reuse, and one PowerShell metric-parser expression
failed before/after measurement without changing an Unreal run. The corrected command/parser
produced the data above.
Every Unreal launch was sequential, with more than 17 GiB free memory at the final launch checks;
actor-harness peak was about 3.5 GiB and all measured processes stayed under 8 GiB. No run returned
`0xC0000142`. Crash audit found no new UECC folder; the only folder is the pre-existing
`UECC-Windows-F1A3EFD5469F5DD62E68EBBACAC84376_0000` dated 2026-09-17. Test stdout and JSONL traces
remain under `Saved/BuildHost/...`; none were copied into `Research/`.
## 6. Files and compile spots
No new C++ source file was added. Modified source files and likely compile spots:
- `Source/VoxelForge/Private/VoxelWorld.cpp`, `Source/VoxelForge/Public/VoxelWorld.h`,
`Source/VoxelForge/Private/VoxelStartupTrace.cpp`,
`Source/VoxelForge/Public/VoxelStartupTrace.h` — VoxelForge runtime module; BuildHost UBT.
- `Source/VoxelForgeEditor/Private/VoxelForgeExploreCommandlet.cpp` — editor module; BuildHost UBT.
- `Standalone/Source/StandaloneViewer.cpp` — `Standalone/Build.ps1 -Target All`.
- `Tools/TestVoxelForgeCoreWorldHost.ps1` — harness argument/default changes; no C++ compile.
- `CODEMAP.md` §3, `ARCHITECTURE.md` §8.27, this report, and
`Standalone/Research/OwnerShapeWorld/gpu_field_port/LUNA_DIALOGUE.md` — documentation.
No owner file or asset was touched; no commit, push or stash was made.