Scheduler stable-sorts the whole level and checks capacity per admission (refill when slots free mid-pass); regression test with the old partial-sort path as negative control. Harness repoints Source/Standalone/uplugin together, records root HEAD/status, builds baselines from fresh worktrees, gates on DWARF struct sizes (480/480/480). Frame-resolution arrival: A/A p90 36.8 ms; fixed-on vs fixed-off -12.2 ms median (4/10 slower). 30 m/s: near 43.3 -> 55.3%, far holes 1.8 -> 0%, p99 <= 7.46 ms, worst <= 12.3 ms. Defaults: StreamingFastTravelWaitForAllCriticalTiles=0, StreamingFastTravelApplyBudgetMilliseconds=1.0, StreamingIncrementalDesiredSet=1, CoreRegionConcurrentAdmission=1, StreamingFastTravelForwardFirst=0, StreamingRebuildOnCoreRegionCompletion=1, StreamingCoreDesiredCacheByCenter=0, audits 0. Source/: VoxelWorld.cpp, VoxelStreamingAdmissionOrder.h (new). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016dhxM43dnWvUu2B5Ph1iG1
6.2 KiB
L172 — repair the UE harness and restore level refill
Result: The scheduler now keeps the full stable candidate order and refills a level when a slot opens during its pass. The UE harness uses all three links from one tree and rejects mixed DWARF layouts. The 10-pair decision passed, so early admission is now the default. The final default-on UE build and fast tier passed.
L171 findings and harness
The reviewer’s mixed-build diagnosis matches the saved evidence. L171’s A/A warm-up logged surface_strates=1, then 858993460 (0x33333334) before throwing std::length_error: vector. Its aa-build-1.log has only two link actions and no Compile VoxelWorld.cpp; the staged aa-build-1, aa-build-2, and l170-head-off plugin binaries contain the L170-only initial_arrival_set_settled and tile_apply_deferred UTF-16 strings, while the saved ca0bf76 binary does not. The L171 DWARF inspection showed WorldAssemblyStratumPlanV1 as 600 bytes in the stale VoxelWorld.cpp.o and 480 bytes in the adapter and Core shim. This is consistent with the vector corruption being an ABI mismatch.
At L172 start, Source, Standalone, and VoxelForge.uplugin in VFHost/PluginDeps/VoxelForge all resolved to the main checkout on wip/l141-liminal. Earlier round reports document restoring Source alone. L172 switches all three links together and asserts their common root. Each run manifest records that root’s HEAD and git status --porcelain. The ca0bf76 comparison used a fresh detached git worktree with its own Source and Standalone; it built VoxelWorld.cpp, passed the 480/480/480-byte DWARF gate, and ran the owner world in its warm-up and all ten pairs. Fixed-tree builds also compiled VoxelWorld.cpp and passed the same gate. All three VFHost links were restored to the main checkout after the last build and run.
Scheduler change
VoxelWorld.cpp no longer sorts only the pass-start free-slot prefix and truncates LevelTiles. It stable-sorts the complete level and checks current capacity as each candidate is admitted. This preserves full-sort order and lets the same level refill when work completes mid-pass. The regression test frees a slot after the first submission, checks the submitted sequence against the full-sort order, and includes the old partial-sort/truncation path as a negative control.
The frame-resolution arrival is the first scheduler_admission frame with both desired_missing_by_lod[0:3] and pending_by_lod[0:3] summing to zero. Re-scoring saved L169 and L170 traces gives paired median deltas of +48.762 ms and +60.475 ms respectively; each candidate was slower in all 7 pairs (14/14 combined). The 0.25 s streaming_sample arrival had obscured this difference.
L172 movement results
Runs used the same fixed binary for both CVar arms, 30 m/s, one warm-up per arm, and ten counterbalanced pairs per batch. The measured movement window was 12 s (first moving samples near 6.05 s, stop near 18.02 s). The trace continued through 45.00 s after movement; those post-move samples were excluded from movement metrics. The pre-run load was 0.45 / 1.43 / 2.00 (1/5/15 min), with no UE or build process running. The harness reported eight effective tile slots.
| Check | Result |
|---|---|
| A/A absolute paired-delta p90 | 36.815 ms |
Fixed-off slower than true ca0bf76 |
6/10 pairs (stop rule: 8/10) |
| Fixed-on minus fixed-off arrival, paired median | −12.203 ms |
| Fixed-on slower on arrival | 4/10 pairs |
| Arrival tolerance | 36.815 ms |
| Near readiness change, fixed-on vs fixed-off | +11.951 pp (55.276% vs 43.325%) |
Near readiness change, fixed-on vs ca0bf76 |
+12.457 pp (55.276% vs 42.820%) |
| Far-hole change, fixed-on vs either control | −1.800 pp (0.000% vs 1.800%) |
| Fixed-on maximum p99 / worst tick | 7.460 / 12.305 ms |
| Maximum p99 / worst tick across both on/off arms | 7.460 / 13.266 ms |
All decision gates pass. For the CVar promotion, movement gates use the fixed-on treatment against fixed-off, and the fixed-on arm also clears the L169-relative near/far gates against ca0bf76. The A/A and true-baseline runs are measurement controls, not the promotion treatment; the baseline control contained one 16.7 ms worst-tick outlier. Both on/off arms stayed below 14 ms. The per-pair traces, manifests, summaries, and decision are in Saved/Linux/l172/ue/.
The default-on smoke run omitted both command-line CVar overrides. Its backend readback was wait=0 and apply budget=1.0 ms; frame arrival was 1.500 s, p99 6.971 ms, and worst tick 13.052 ms.
Defaults, checks, and limits
| CVar | Final default |
|---|---|
voxel.StreamingFastTravelWaitForAllCriticalTiles |
0 |
voxel.StreamingFastTravelApplyBudgetMilliseconds |
1.0 ms |
voxel.CoreRegionConcurrentAdmission |
1 |
voxel.StreamingIncrementalDesiredSet |
1 |
voxel.StreamingFastTravelForwardFirst |
0 |
voxel.StreamingRebuildOnCoreRegionCompletion |
1 |
voxel.StreamingCoreDesiredCacheByCenter |
0 |
voxel.StreamingIncrementalDesiredAuditEvery |
0 |
voxel.StreamingIncrementalDesiredMaterializationAuditEvery |
0 |
voxel.StreamingIncrementalDesiredAuditInjectMismatch |
0 |
- Fast tier: PASS, 269 checks and 5 non-gating diagnostics, 284.7 s. The new mid-pass refill regression and owner W1/W8/W12 determinism checks passed.
- Final default-on VFHost build: PASS, 150.58 s;
VoxelWorld.cppcompiled and the DWARF sizes were 480/480/480 bytes. - Default-on owner-world smoke: PASS, 52.33 s. Saved L169/L170 rescoring, all three 10-pair batches, runner syntax compilation, and
git diff --checkpassed. - Two failed preflight launches were excluded: UE first inherited the standalone 6 GiB address-space limit, then the runner used an export path outside the plugin Saved directory. An initial fixed-off warm-up produced a valid trace but exposed an overstrict latch assertion; the check was corrected and the final warm-up and measured pairs passed. None of these launches contributed paired timing values.
- UE W12 movement was not run; the harness exposes eight effective tile slots. The timing experiment covers the owner four-stratum plan under Null RHI.
Changed Unreal Source/ files:
Source/VoxelForge/Private/VoxelWorld.cppSource/VoxelForge/Private/VoxelStreamingAdmissionOrder.h