Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ED33VnqepD4YY6gDAAA832
8.7 KiB
Linux6 report
Result
The screen-space gate rejects today’s far meshes at every sampled LOD3–8: the largest measured same-field error is 92.0 px, and the largest sampled swap pop is 70.3 px at LOD6→5. Same-LOD regeneration is exact, the reported swaps have no cracks or floaters, and no display mesh changed in this round.
Source base: wip/l5-far-cutoff at b21a19d; L4 reference: 7770074.
Screen-space method
For one surface tile nearest the L1 camera at each LOD, the gate rasterizes triangles on a 65×65 XY grid, excluding skirts. It compares the mesh hit to direct Heightfield2D ground/cap roots; slopes use ±1-voxel finite differences. For vertical residual Δz and slopes sx,sy, it computes normal distance |Δz|/sqrt(1+sx²+sy²), projects that normal onto the camera’s screen plane, then divides by the one-pixel world distance at that LOD’s closest display distance. The view uses 90° horizontal FOV, 2560 px, yaw 0°, pitch −22°; one pixel is 0.000613592 rad. Same-LOD regeneration is the mesh reference for swaps; direct field roots are the reference for true surface error.
The known failure control is a 1 m cell on an 89.427° plane, shifted sideways by 5 mm (0.005 cell): its vertical metric says 8.488 px, while its true normal distance is 5 mm and projected screen error is 0.0849 px. This confirms that vertical height can badly overstate visible displacement.
| LOD | Closest distance (m) | Field error p50 / p99 / max (px) | Max normal distance (m) |
|---|---|---|---|
| 3 | 96 | 0.81 / 4.16 / 6.00 | 0.423 |
| 4 | 192 | 1.01 / 5.12 / 7.93 | 0.952 |
| 5 | 384 | 0.79 / 16.37 / 92.02 | 25.122 |
| 6 | 768 | 0.51 / 9.75 / 70.34 | 37.644 |
| 7 | 1,536 | 0.29 / 9.04 / 42.36 | 42.714 |
| 8 | 3,072 | 0.83 / 18.03 / 47.18 | 93.175 |
| Swap | Distance (m) | Pop p50 / p99 / max (px) | Max normal distance (m) |
|---|---|---|---|
| 3→2 | 96 | 0.61 / 3.77 / 6.05 | 0.367 |
| 4→3 | 192 | 0.75 / 4.63 / 7.51 | 0.896 |
| 5→4 | 384 | 0.00 / 9.58 / 31.78 | 8.139 |
| 6→5 | 768 | 0.00 / 9.75 / 70.34 | 37.644 |
| 7→6 | 1,536 | 0.00 / 9.04 / 42.36 | 42.714 |
| 8→7 | 3,072 | 0.83 / 18.03 / 47.18 | 93.175 |
The tails are not confined to cliffs. The field maximum slopes at LOD5–8 are 8.34°, 14.09°, 6.76°, and 9.33°; LOD5’s p99 is 19.8 px below 30° and 21.1 px at 45–60°. The sampled LOD6→5 maximum is at (-472, -1432, -463.151) m; the marked offscreen capture shows that location at the 768 m swap distance. This is a sampled-tile result, not a whole-world supremum.
All same-LOD mesh comparisons at LOD3–8 pass with zero error. The S13 octave-drop and corrected stride-2 column-interpolation controls are rejected at every LOD3–8, as are missing displayed surface, 2 m floating surface, and missing fine-ring injections. The measured swap rows have zero cracks and floaters; they reject solely on displacement.
Far worker time, W12
The L1 view has 2553 tiles. Clean-run phase totals for LOD3–8 are shown below. A separate temporary timer measured complete FractalNoiseQ16 calls; “column outside” is clean column time minus that subtotal. The timer added 3–6% to worker time, so the split between those two column subphases is approximate; it has been removed from the final tree.
| LOD | Worker (s) | Column outside noise (ms) | Fractal/noise calls (ms) | MC (ms) | Ground refine (ms) | Cap refine (ms) | Skirts (ms) | Assembly (ms) |
|---|---|---|---|---|---|---|---|---|
| 3 | 1.084 | 171 | 276 | 473 | 0 | 0 | 118 | 33 |
| 4 | 2.581 | 1,000 | 534 | 440 | 0 | 304 | 196 | 102 |
| 5 | 1.829 | 658 | 358 | 100 | 464 | 22 | 161 | 70 |
| 6 | 2.761 | 1,608 | 284 | 59 | 385 | 58 | 162 | 70 |
| 7 | 1.192 | 234 | 198 | 32 | 275 | 202 | 153 | 96 |
| 8 | 2.224 | 264 | 469 | 256 | 424 | 299 | 333 | 177 |
| Total | 11.671 | 3,934 | 2,119 | 1,360 | 1,548 | 885 | 1,123 | 548 |
Column work outside the fractal calls is the largest single phase (33.7% of far worker time); all column work is 51.9%. Ground and cap refinement total 2.43 worker-s, skirts 1.12 worker-s, MC 1.36 worker-s, and assembly 0.55 worker-s. The earlier 7–13% profile timed individual Perlin calls; the L6 subtotal times complete fractal calls, including their octave accumulation.
The listed subphases total 11.52 worker-s; about 0.15 worker-s remains in timer and per-tile residuals.
The overlap scan counted about 411,000 cross-worker neighboring duplicate XY evaluations at LOD3–8 (about 166,000 at LOD4 alone). Exact column reuse is the largest plausible lever because it targets the largest phase. I did not build it: no candidate has yet shown a screen-gated, greater-than-3% whole-view win. Stride-2 interpolation is not a safe substitute; its control fails at every far LOD.
Cost with the feature off
Three interleaved W12 runs per binary, same L1 camera and forced generation. whole_view_ready is the comparison metric; the six whole-view hashes matched exactly.
| Binary | Runs (s) | Median |
|---|---|---|
| L4 reference | 2.082, 2.180, 2.183 | 2.180 s |
| L6 cleaned tree | 2.127, 2.185, 2.223 | 2.185 s (+0.2%) |
Run-to-run spread was about 0.10 s, so the 5 ms median difference is within noise. The no-op visual cutoff contract, plan, and CLI flag were removed. The opt-in research gate retains its negative controls; skirt timing uses the existing optional stage-timing pointer, which is null on the default path. Governor stayed powersave; runs used CPUs 0–11, W12, 6 GiB address-space limits, and normal priority. Peak runtime RSS was 403 MiB; peak build process RSS was 874 MiB (GCC).
Determinism and hashes
Clang 19 -ffp-contract=off W1/W12 and GCC default W1/W12 produced the same hashes. LOD0–2, exact queries, and all whole-view hashes equal L4; no recipe bump is needed.
- Recipe / plan / manifest:
83b616a3f4fe781d/1ca84619c8600ee5/e55991385bf0ca29(recipe version 1). - Whole view (density / mesh / payload / topology):
c10697a8f48380c7/e75c9119a1498cd5/49a9a8d1835a6c8c/edcb23288b5e8724. - Full detail (density / mesh / payload / topology):
0ee0579bd15cbbe4/32e5d4964d610fee/1932b96ee4b1d910/69743c6bad3447dc. - Exact queries (density / unclamped / detail / collision):
e4d4a8eb95b35933/e4d4a8eb95b35933/efcba20c0c70c415/e604823a249029bf. - SHA-256 L4 binary / Clang L6 binary / GCC L6 binary:
6efb8f19a41ca3cd23aca9294ceee1e9cdd1d3dc8da23b3ee61ef8ae943aa763/3f5a4f88b0d911e8e66af9ef72e294926a5507a73d44fcfe868df27c666bf01e/de872e8fdaa9f40e8a6c096700fd998bcf35f232b06f2b4e35a374b4b0e9fa07. - Capture JPEG SHA-256:
483b434f3ad752dd09b82cd1c78fe81ee8cd31803ecf4dcd3c2918a8ae5d66b1(156 KiB).
Failed or retried runs
- First Clang build failed on a missing view argument in
LinuxScreenSpaceGate.h; fixed and rebuilt successfully. - First gate pass paired extra mesh hits incorrectly and reported same-LOD floaters at LOD5–8. The reference pairing was corrected; the final gate reports zero same-LOD displacement and no floaters.
- A
/usr/bin/time -vwrapper attempt exited 127 because that binary is unavailable; the runs were retried with/procRSS monitoring. - The final quality gates exit 6 by design because measured displacement exceeds the 1 px rule. Builds, captures, determinism runs, and cost runs completed successfully. EGL could not write
~/.cachein this environment, disabled shader caching, and rendered successfully on llvmpipe.
Note for the owner
Today’s assembler/world remains at L4; this sampled view measures up to 92.0 px from the field and a 70.3 px LOD6→5 pop at the tested display distances, with the largest point marked in the capture. This round changes no default mesh or recipe output, removes the no-op cutoff, and leaves W12 cost within run-to-run noise.
Orchestrator review (Claude)
- Cost re-run by me (interleaved W12, L1 view): L4 2.098/2.138/2.171 s vs L6 2.116/2.150/2.197 s
(median +0.6%, within noise), density
c10697a8f48380c7; the L6 binary SHA matches the report. Merged intoassembler/worldwith L5 squashed in. - The marked LOD6→5 maximum sits on the rim of a flat-topped hill (mesa edge), not on open gentle ground: the "8–14° slope" is the field slope at the sample, on the plateau top beside the drop. The coarse mesh rounds the rim by about a cell (16–32 m at LOD5–6), so the pop is a real silhouette snap at sharp rims (tens of px at 768 m), while p50 stays at 0 px. That is ordinary LOD-switch behaviour without geomorphing or cross-fade, so a fix belongs in rendering (Unreal), not in generation. The owner decides whether it is visible enough to matter.
- Next speed lever, per the far breakdown: exact cross-tile column reuse (column work outside noise is 34% of far worker time; ~411k duplicate XY evaluations at LOD3–8).