Files
James Dansereau 4b710728bf v0.5.0 playtest fold-in: fog and near-plane clip, crash fixes, polish (D540-D564)
Deck/Windows playtest fixes: fog rework (D540) and RSP-style CPU near-plane
clip with per-vertex N64 fog (D543), with fog recomputed on near-plane-clipped vertices as the RSP does,
so the haze around the player stays steady (D553); colour-combiner clamp for banded walls
(D548); rocket and thrown-item stack overflows (D545, D549); menu
double-trigger mitigation (D541); Dam ending first-shot camera swivel
restored by removing an old port look-at workaround (D552); settings standardisation (D546), live
All unlocked (D547), F10 mouse (D544); static window title and the project
mark (the in-game crosshair shape, site gold) as window/taskbar icon and
favicon (D550). Reference frames re-based
on Windows, Linux and Steam Deck (A/B-confirmed); capture_p7.sh runs on
Windows. Opt-in update check, off by default (D551: one HTTPS request to
GitHub per launch when enabled; winhttp.dll loaded only then; the tag CI
job checks the tag against GE007_VERSION). Release notes, ROADMAP,
internals and security docs updated; tree-hygiene pass.

Refs: D540 D541 D543 D544 D545 D546 D547 D548 D549 D550 D551 D552 D553 D554 D555 D556 D557 D558 D559 D560 D561 D562 D563 D564
2026-10-06 18:35:44 -04:00
..

Golden baseline frames

<level>/<platform>/frame_NNNNNN.png: reference GE_PCDUMP captures for tools_pc/verify.sh, one folder per solo level (all 21, cuba = the ending) and per platform (win, and linux — 21 levels x 3 frames on each, captured 2026-10-05 at the same stems; deck = the Steam Deck set, captured with capture_p7.sh -p deck, per-level pixel limits = the linux ones for now).

Recipe (2026-10-02 re-base; verify.sh applies all of it):

  • data/ge007.ini pinned to ONLY [Window] Width = 640, Height = 480 (every other option at its compiled-in default). Each run gets its own copy in a temp work dir (see Isolation below); your data/ge007.ini is never touched.
  • GE_RSEED=0x0123456789abcdef (pinned PRNG).
  • GE_INPUTSCRIPT="20:START" (skips the intro flyby; the scripted pad is the only input). Window per level, exactly as verify.sh's golden_dump_for states it (D522 re-base 2026-10-05 — the 900 stem is NOT settled gameplay on every level: it fails the 1% limit on Surface 2 / Streets / Depot / Cradle and is still inside Dam's flyby): 900-1500:300 (900/1200/1500) on the 14 levels where 900 is settled, 1000-1400:200 (1000/1200/1400) on Surface 2 / Streets / Depot / Cradle / Frigate, 1500-1700:100 (1500/1600/1700) on Dam, and Cuba with no input (1:SNONE) and 300-900:300 (the ending cutscene; it returns to the boot screens before frame 1200). framediff walks the CANDIDATE frames, so a sweep's --dump must hit the golden stems exactly — never widen a stride.
  • The gate INSTALLS THE CANONICAL SAVE tools_pc/golden/ge007.eep (2 KB, in-tree; D523, superseded by D529): the frame depends on the save's content, not its presence — D523's "presence, not which save" claim (worst_cell 0.175625 on each of the four candidate saves, 21.557% with none) was only ever measured on Archives, and the 2026-10-05 A/B refutes it (facility 177.47 scene-level on the 2026-10-05 playtest save, 0.0-0.25 on every other candidate on disk). verify.sh and capture_p7.sh install the canonical eep into each run's own work dir (the repo's data/ is never modified), so the gate is reproducible on a fresh clone and in CI. A local playtest save is never the gate's input. The linux 63-frame set was re-captured on the box under the canonical eep 2026-10-05 (D531; the 2026-10-05 re-round, D530, turned out to have run under the box-LOCAL save — the capture_p7.sh per-level re-pin bug, fixed in D531) and is valid.
  • Every run ends via GE_QUITFRAME (orderly quit; never a hard kill, D344).
  • Isolation + parallelism: verify.sh and capture_p7.sh run every level with CWD = a fresh temp work dir holding its own data/ (ROM, pccg-<romid>/, pcmodels-<romid>/, the canonical save, the pinned ini) and its own ppm/; the repo's data/ is only read (the old pin/restore of data/ge007.ini/.eep is gone). That makes levels safe to run concurrently: tools_pc/verify.sh sweep -j 3 / tools_pc/capture_p7.sh -j 2 .... Pixel results assume each instance holds 60 fps (D117): -j 2-3 only on a strong GPU with nothing else loading it (no local LLM loaded), -j 1 on weak boxes. Measured 2026-10-05 with a busy GPU (an LLM resident at ~100%): Surface 1's frame 900 failed at -j 2 and -j 3 and passed at -j 1.
  • Windows set: from Git Bash, bash tools_pc/capture_p7.sh -b build-pc -p win -j 3 <level>:<num> ... (no DISPLAY on Windows; -j 1 if the GPU is loaded).
  • Deck set: on the device (Desktop Mode, DISPLAY=:0, prebuilt binary at <build>/ge007.x86_64): bash tools_pc/capture_p7.sh -b <build> -p deck <level>:<num> ....

Gate (two tiers): the structural framediff (cell means, coverage, phash) catches gross breakage; then a per-pixel --exact --tol 2 check with a per-level limit: 1% of pixels, 3% for Jungle and Surface 2, Cuba structural only. Measured run to run: <= 0.57% on 18 levels, Jungle 1.75%, Surface 2 2.33%, Cuba 36%; a global texture-filter switch measured 22%.

Cross-platform rule (D521, P7): a frame stem is comparable across platforms only if it is settled gameplay on every platform in the set. The intro flyby is wall-clock paced (D117): a box that cannot hold 60 fps stretches wall time without advancing the sim-frame counter, so the flyby settles at a different frame per box. On the Linux capture box (Mesa / Intel HD 3000; the golden stems rendered in 11.8-15.1 ms) frame 900 is still inside the flyby (it settles between ~830 and ~1130 run to run) while the win/ golden at 900 is settled -- linux/900 vs win/900 is a scene offset (92.863% over tol 2, phash 83 on Dam), NOT a renderer defect. After the 2026-10-05 re-round both platforms sit at the same stems and the cross-platform spread is 0.348-3.983% over tol 2 (structural tier 21/21 clean, phash <= 6 except cradle at 40; Cuba 23.7-36.3% is structural-tier-only) — informational only. The gate each platform ships is its own captures against its own goldens; never call the cross-platform spread a parity gate. 1200/1500 are settled on both and measure the real driver delta. GE_DETERM=1 is for Linux-vs-Linux regression runs only (it changes the frame -> sim mapping; against the win/ goldens it measures 15.788% at 900, 14.594% at 1200 and 16.171% at 1500, which is expected and must never be read as a delta).

Regenerate one level after a deliberate visual change: run tools_pc/verify.sh <level> twice to confirm the new look is stable, then capture with the recipe above and replace <level>/<platform>/*.png.

History

  • D531 (2026-10-05): capture_p7.sh's D529 adaptation was incomplete — the per-level re-pin restored the pre-capture LOCAL save (D524-era line), silently overwriting D529's pre-loop canonical install, so the 2026-10-05 box re-round (D530) ran under the box-local save, not the canonical one. Fixed (loop now re-pins the canonical save per level; cd "$ROOT" added) and re-captured: fresh 21/21 box round, 63 frames committed, replacing the D530 set (47/63 frames differ — save content demonstrably moves the frames; 16 byte-identical save-independent scenes).

  • D530 (2026-10-05, AMENDED BY D531): the linux set was re-rounded on the box (X220, tree 442eb2ff; ~/p7-reround.log hit P7 re-round DONE 2026-10-05 12:53 EDT, 21/21 rc=0) and committed, replacing the D525 cleared-eep set (51/63 frames differ; 12 save-independent scenes byte- identical). The "canonical eep" provenance claim was wrong — see D531.

  • D168 (2026-09-01): the GE_PCDUMP PPM writer emitted glReadPixels rows unreversed, so every capture — and this baseline set — was vertically flipped. Writer fixed (port/fast3d/gfx_opengl.cpp); this set regenerated from a fresh, correctly-oriented -level_09 run.

  • 2026-09-23 (v0.4.0): re-baselined. The 2026-09-09 (D215) set was captured while the port still rendered at 30 fps (2 sim ticks per frame); D248 moved it to 60 fps (1 tick/frame), so frame N now lands at half the sim time, and frames 200/320/440 fell in the intro cutscene, whose camera is nondeterministic (D117); two fresh captures disagreed at 440. The window moved to 640-1120:240, the same sim ticks the original set sampled. Two independent captures of it agree 3/3. The capture ini is now defaults-only, and verify.sh pins it the same way (it used to rewrite only Width/Height, which kept personal settings).

  • 2026-09-23 (later): window moved again, 400-880:240 → 640-1120:240. Frame 400 is the last beat of the intro cutscene (Bond in the shaft) and its camera is nondeterministic (D117): 1 in ~5 gate runs failed it (dmean 0.7 vs 20.7 run to run). All three frames are now settled gameplay; three independent captures agree (worst dmean ≤ 6.8).

  • 2026-10-02: re-based and extended to all 21 levels (<level>/win/), recipe above. The flat bunker1 set at the folder root was retired. Two independent 21-level passes agreed; noise per level measured as listed. verify.sh no longer hard-kills (taskkill of every ge007.x86_64.exe, including a maintainer's game); it quits via GE_QUITFRAME and only stops its own PID as a watchdog fallback.

  • 2026-10-04 (P7): first <level>/linux/ set captured (21 levels, the recipe above verbatim) on a real-GL Linux box; verify.sh's linux pixcount/ framediff skip is now driver-conditional (a glxinfo renderer probe, D521) -- llvmpipe/softpipe/swrast still skip, a real driver runs the full pixel gate. Structural framediff linux-vs-win: 19/21 clean; Dam (frame 900, the flyby) and Streets (frame 1200, a diagonal region delta) fail. Exact over- tol2: 1.1-6.6% on 17 levels; Archives 20-24.6% (a constant ~20 delta over the top 3 grid rows only), Cuba 10.7-26.4% (uniform d 3-6, cell means <= 11: dither noise floor), Jungle 5.9-6.6%, Streets 1200 9.6%. See D521.

  • 2026-10-05 (D522/D523 re-base): the win set's window moved on six levels — Surface 2 / Streets / Depot / Cradle / Frigate to 1000-1400:200, Dam to 1500-1700:100. Measured, same build, honest sequential passes: at 900 those levels fail the per-pixel limit (Dam 6.542% @900 worst_cell 12.11, Surface 2 3.752%, Streets 1.001%, Depot 1.267%, Cradle 1.754%, Frigate 8.391% on a later run) and Dam's 900 is still flyby (run-to-run 3.6-3.8% over tol 2, maxchan 168); Dam's 1200 looked settled on two runs (0.000%) then diverged 5.761% on a third, so it moved to 1500-1700 (1500/1700 0.000% across three runs, 1600 keeps ~40 moving pixels at 0.013%). At the new stems three independent runs agree within tol 2. verify.sh now pins the save file (D523). The <level>/linux/ set was stale everywhere, not only on those six levels: P7's 2026-10-04 round ran with data/ge007.eep cleared, and D523 measures that save-file presence moves ~every level (Archives 21.557% with none, 0.175625 worst_cell with any of four saves).

  • 2026-10-05 (P7b, linux re-round): the box re-captured all 21 levels (63 frames, 21/21 rc=0, frames=3, 25-29 s each) at the windows verify.sh carries, with the save pinned present, on the same real-GL box (Mesa 23.0.3 / Intel HD 3000). The set is now one frame per recipe stem on every level, both platforms. Cross-platform framediff (linux vs win, tol 2): structural 21/21 PASS (worst cell mean 4.43 on streets; phash <= 6 except cradle at 40, a hash tie with cell means 1.17), exact 0.348-3.983% on the 20 non-Cuba levels (Cuba 23.7-36.3%, structural tier only) — about half the stale set's 1.142-6.958%. D521's two residual bands are closed by this measurement: Archives 19.956-24.554% (cell means to 50.8, rows 0-2) is now 3.590-3.859% (worst cell 2.31, phash 1) and Streets 1200's 16.0-148.4 cell-mean band is now 3.616-3.983% (worst cell 4.43, phash 0) — both were the save-state difference, not a renderer. Dam's 900 (92.863%, phash 83) is out of the set; at 1500-1700 Dam measures 2.964-3.443%. Caveat: the box's own sweep is crash-detect only — glxinfo -B fails there (rc 255, "unable to open display :0" from a non-login ssh shell) so verify.sh's fail-closed probe keeps the pixcount/framediff skip even though the game's readback works; the cross-platform numbers are computed on Windows against the merged linux PNGs. See D525.

  • 2026-10-05 (isolated + parallel capture, deck platform): verify.sh and capture_p7.sh now run each level in its own temp work dir (own data/ copy, pinned ini, canonical save, ppm/) instead of pinning/restoring the repo's data/; added -j N (concurrent levels, verdicts in level order) and a deck platform (verify.sh --platform deck, capture_p7.sh -p deck).

  • 2026-10-05 (D540 re-base #2, win only): final fog design (far clip scales by min(Fog, Draw distance); the game's fog math untouched, so fogged levels render the N64's own fog at defaults). Re-captured whole levels: aztec, cradle, dam, egypt, jungle, statue, surface1, streets (24 frames, win). Side-by-sides: fog only (Cradle's distant truss is a faint ghost, Frigate's sea unchanged); props, characters, gun and HUD present, no overlays. Pass-A vs pass-B (over tol 2): <=0.30% (aztec 0.19, egypt 0.26, statue 0.30), cradle/dam/jungle/ surface1 <=0.003%; streets 0.75-2.1% (timer digits jitter; promoted from the pass whose state the confirming runs reproduce). Confirming pass 21/21 PASS (silo failed once with worst_cell 127 and passed on the single re-run; streets failed twice before its re-promotion, then passed twice). The <level>/linux/ set is stale on the re-captured levels until the box re-captures.

  • 2026-10-05 (D540, linux re-base + first deck set): same final fog code, captured concurrently on the two boxes. linux (X220, -j 1, rebuilt from the working tree): pass A against the existing set; 13 levels already within limit and were left; re-captured aztec, cradle, egypt, statue, surface1, dam, jungle (A/B 0.00-0.45%, dam 0.000%, jungle 1.7% under its 3% limit; dam/jungle differ from the old set by the fog change, 8.4% / 37.9%). streets/silo A/B run 0.3-3.0% on the box (left as captured earlier; they match their goldens). deck (Steam Deck, Desktop Mode, the X220-built binary + bundled SDL2, capture_p7.sh -p deck -j 2): all 21 levels, A/B <= 0.04% except jungle 1.65% and statue 0.44%; -j 3 failed its validation on the Deck (archives 4.96%, frigate 7-11%), -j 2 agreed (<= 0.031%), 286 s per 21-level pass. Both tools now set GE_FAKE_DECK=0 on every run: on a Deck the D283 preset otherwise forces 1280x800 fullscreen over the pinned ini. Also on 2026-10-05, before the final fog design, a first D540 win re-base (17 levels) was superseded by re-base #2 above; the levels it alone touched pass re-base #2's confirming pass. Run sweeps with the GPU otherwise idle (no local LLM loaded): 60 fps pacing is part of the gate (D117).

  • 2026-10-06 (v0.5.0 re-base, linux + deck): D543 (CPU near-plane clip + per-vertex N64 fog) and D546 (Draw/LOD 2.0x default) re-captured on both boxes concurrently from one X220-built binary (tree 21c5b5c5), canonical eep md5-checked on each box. Two full passes each (X220 -j 1 551 s/pass, Deck -j 2 286 s/pass, every run rc 0). Pass A vs B over tol 2: deck 63/63 within limit; linux 60/63 — Dam drifted 5.2-6.0% between A and B (Bond's settle position after the wall-clock-paced flyby, D117), so two Dam-only runs C/D were taken: C vs D <= 0.022% and C vs the previous golden <= 0.023%, so C was promoted (A and B were the outliers). Change vs the previous set is concentrated where fog/draw distance bites: Statue ~26%, Surface 2 20-27%, Streets 19-20%, Surface 1 ~13%, Depot ~10%, Cradle ~5%; indoor levels <= 0.4%. Cradle and Frigate compared by eye against 1964/GEPD stills: match. win (same day, same tree): capture_p7.sh now runs on Windows too (Git Bash; -b build-pc -p win, no DISPLAY; picks the python that has Pillow). Two passes at -j 3 on the dev box (190 s each, every run rc 0, a local LLM resident on the GPU): 62/63 A/B-stable; Streets 1400 jittered 1.5% (timer digits), two Streets-only -j 1 runs C/D sat within 0.81% of pass B, so B was promoted for Streets, A elsewhere. Deltas vs the previous win set mirror linux/deck (Statue ~26%, Surface 2 ~27%, Streets ~20%, Surface 1 ~13%, Depot ~10%, Cradle ~5%). Cross-platform spread on the new sets, over tol 2, non-Cuba: win-linux 0.406-4.553%, win-deck 0.188-3.264%, linux-deck 0.281-3.828% (informational, not a parity gate).

  • 2026-10-06 (D553, near-clip fog recomputed): Windows sweep after the change flagged surface1/depot/cradle; re-captured surface1/depot/statue/ cradle on all three platforms, two passes each. Only cradle really moved (~4.9% over tol 2, A/B <= 0.12% on every platform; the near walkway is very slightly lighter, still in line with the 1964 still) and was re-based x3. depot/surface1 "regressions" were -j 3 pacing flakes with a local LLM on the GPU: captured alone, depot is pixel-identical to its golden and surface1/statue are within 0.5% -- those sets were left as-is. The Deck must be in Desktop Mode for captures (Game Mode = Wayland/ gamescope: every run times out with 0 frames).