streaming: bounded early admission - partial level sort, apply preflight, sorted transition index (L169, opt-in)

With StreamingFastTravelWaitForAllCriticalTiles=0 and ApplyBudget=1 ms (test values; defaults stay 1 and 0), 7 pairs
vs ca0bf76: near 43.3 -> 56.1%, forward 15.5 -> 17.9%, far holes 1.8 -> 0.0%, p99 7.06 -> 6.52 ms, worst 12.2 ->
11.8 ms, every run p99 <= 7.4 and worst <= 13.8 ms; arrival 1.671 -> 1.683 s (slower in 7/7) so not promoted.
Source/: VoxelWorld.cpp, VoxelWorld.h.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016dhxM43dnWvUu2B5Ph1iG1
This commit is contained in:
Fr0zkaandClaude Opus 5.5 committed 2026-11-02 16:45:20 +01:00
1 parent ca0bf767ca
commit 786ecc4cdf
4 files changed
+664 -15

No files matched your search

@@ -0,0 +1,54 @@
# L169 — Early admission stays opt-in
**Result:** Do not promote L157 early admission. Six of seven promotion gates passed, but candidate LOD0–2 arrival was slower in every pair: median **1.683 s** versus **1.671 s** on `assembler/world` `ca0bf76` (+12.4 ms). The source defaults are restored to wait-for-critical **1** and apply-budget **0 ms**. The candidate settings remain explicit overrides in the runner.
## Measurement
Seven interleaved W8 pairs used the four-strata owner plan, 25 cm core voxels, 30 m/s movement, a 12-second move from t=6 to t=18, and a 5-second dwell. Each run had about 46 moving samples; one warm-up per binary was excluded. No product CVar was changed except the two L157 switches under test. At measurement time, the candidate binary compiled those settings as defaults; the runner now supplies the same values explicitly so the experiment can be repeated with shipping defaults off.
| Moving-window metric (median across seven runs) | `ca0bf76` | Candidate | Result |
|---|---:|---:|---:|
| Tick p99 | 7.060 ms | 6.519 ms | lower |
| Worst tick | 12.219 ms | 11.776 ms | lower |
| Near LOD0–2 readiness | 43.28% | 56.12% | +12.84 pp |
| Forward-cone readiness | 15.52% | 17.93% | +2.41 pp |
| Far holes | 1.80% | 0.00% | lower |
| First settled LOD0–2 | 1.671 s | 1.683 s | **12.4 ms slower** |
Every run stayed below 11 ms p99 and 14 ms worst tick. The largest observed p99 was 7.400 ms; the largest worst tick was 13.776 ms. Candidate worst-tick median was not worse. Arrival remained slower after subtracting each run’s first streaming sample (1.305 s vs 1.299 s), so the raw arrival failure is not explained entirely by trace start time.
## Spike count and changes
All counts below use the 12-second moving window unless identified as a startup diagnostic.
- **Level sorting:** With L157 on at the base defaults, the largest full-sort sample was 0.865 ms and no sample exceeded 1 ms; the L167 8.3 ms spike did not recur. Candidate partial sorting reduced the largest sample to 0.123 ms, with no sample above 1 ms.
- **Desired rebuild and overlay:** Base per-run desired-rebuild peaks had a 7.476 ms median and reached 8.110 ms. Candidate peaks had a 6.928 ms median and reached 7.260 ms; rebuilds over 5 ms still occurred (median four per run, maximum five). Overlay materialization never exceeded 2 ms; its candidate maximum was 1.094 ms. The transition descendant index now uses sorted arrays and binary-search deltas. In a separate pre-move startup trace with 2,233 Core keys, the initial index build took 1.605 ms; the maximum moving-window index phase was 3.626 ms.
- **Mesh apply:** The 2.8 ms historical apply spike did not recur. Maximum per-frame apply time fell from 2.548 ms at base to 1.590 ms candidate; largest individual candidate apply was 1.512 ms. The preflight deferred 21–145 results per run (median 109), with a largest estimate of 3.447 ms for 8,979 triangles. RealtimeMesh submission remains atomic, so the estimate is a heuristic and does not split a single upload.
The cold-start arrival gate prevents default promotion even though movement readiness and tick behavior improved. No further adjustment was made after the seven-pair result.
## Defaults and checks
| CVar | Final default | Candidate test value |
|---|---:|---:|
| `voxel.StreamingFastTravelWaitForAllCriticalTiles` | 1 | 0 |
| `voxel.StreamingFastTravelApplyBudgetMilliseconds` | 0 ms | 1 ms |
| `voxel.StreamingIncrementalDesiredSet` | 1 | 1 |
| `voxel.StreamingFastTravelForwardFirst` | 0 | 0 |
| `voxel.StreamingRebuildOnCoreRegionCompletion` | 1 | 1 |
| `voxel.StreamingCoreDesiredCacheByCenter` | 0 | 0 |
| `voxel.StreamingIncrementalDesiredAuditEvery` | 0 | 0 |
| `voxel.StreamingIncrementalDesiredMaterializationAuditEvery` | 0 | 0 |
| `voxel.StreamingIncrementalDesiredAuditInjectMismatch` | 0 | 0 |
- Final VFHost Linux Development build passed with `-NoUBA -MaxParallelActions=4`; three existing deprecated RealtimeMesh API warnings remain.
- Final-source `verify.py fast` passed in 289.8 s: 268 passes, 0 failures, 5 diagnostics. Clang and GCC geometry hashes and W1/W8/W12 determinism passed.
- `git diff --check` and the runner AST syntax check passed. The direct live `TileHashDump` hook returned zero records for the Core path on both binaries and is inconclusive; the fast-tier geometry and determinism checks passed.
- UE W12 movement was not run: this VFHost procedure exposed eight effective tile slots. Fast-tier W12 determinism was run.
Remaining risk: desired rebuilds still reach 7.260 ms in the candidate, and the apply estimate cannot bound an atomic RMC upload. Most importantly, the arrival gate failed, so early admission remains opt-in.
Changed Unreal `Source/` files:
- `Source/VoxelForge/Private/VoxelWorld.cpp`
- `Source/VoxelForge/Public/VoxelWorld.h`