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
63 lines
6.2 KiB
Markdown
63 lines
6.2 KiB
Markdown
# 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.cpp` compiled 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 --check` passed.
|
||
- 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.cpp`
|
||
- `Source/VoxelForge/Private/VoxelStreamingAdmissionOrder.h`
|