acdream/tools
Erik 86afbe2ecd test(render): add the Campaign V offline pixel gate
Seven of the campaign slices (V2, V4a-V4g) are renderer ports whose entire
acceptance criterion is that no pixel changed, and the existing connected
lifecycle route needs both a live ACE server and the user watching. That would
have made the campaign advance only when someone is at the keyboard.

The client renders the world from the DATs without ACDREAM_LIVE, so the existing
UI automation probe can capture a settled frame with no session created and no
ACE state to disturb. The gate wraps that: capture at the parent commit, capture
at slice HEAD, compare through the existing compare-screenshots CLI at the
project's pinned tolerance 2 / 0.001.

Determinism was measured rather than assumed, and the first measurement failed:
two captures at the same commit differed in 0.29% of pixels. The differences
were confined to the top ~180 rows, which is correct behavior rather than a bug
- the sky animates and the Dereth clock advances with wall time, so two launches
cannot agree there. Below the horizon everything was stable. Masking the top 280
rows brings two independent same-commit pairs to 15 and 17 differing pixels out
of 563,200 compared, a ~33x margin under the threshold. Masking the animated
band keeps the rest a strict identity check; relaxing the tolerance instead
would have hidden real regressions everywhere else.

Covers terrain and blending, scenery, static meshes, water, fog, and the whole
retained UI. Does not cover sky (masked), EnvCell interiors, particles, or the
paperdoll viewports, since the offline scene is a fixed outdoor view - so V4e,
V4f and V4g keep a user visual gate on top of this one.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-27 15:19:43 +02:00
..
A8CellAudit diag(render/physics): flap root-caused to physics rest µm-jitter; refute prior diagnoses 2026-06-08 09:16:12 +02:00
cdb fix(#186): render side-cull mis-sided thin connectors — use dat PortalSide bit, not AABB centroid 2026-07-08 15:06:33 +02:00
cdb-scripts fix(motion): full queue reset on locomotion-cycle direct transitions 2026-05-03 17:00:55 +02:00
diag-logs diag(motion): instrumentation for remote walk↔run leg-cycle bug (Commit A) 2026-05-03 20:38:47 +02:00
dump-keymap docs(research): canonical retail keymap + dump-keymap tool 2026-04-25 23:01:58 +02:00
ghidra_project feat(core): port decompiled AC client physics — CollisionPrimitives + PhysicsBody 2026-04-12 23:54:51 +02:00
InspectCoatTex docs(issues): #37 — Investigation 2 narrows bug to SubPalette coverage gaps 2026-05-05 14:45:50 +02:00
jsonl test(phys): A6.P5 fixture — 3 ticks from live door-stuck capture 2026-05-25 12:43:51 +02:00
pdb-extract CLAUDE.md: adopt the condensed structure, updated to current truth (-503/+176) 2026-06-12 12:42:27 +02:00
PesChainAudit feat(vfx): decode retail hooks and typed tables 2026-07-14 08:17:44 +02:00
ProjectileVfxAudit fix(vfx): classify hardwareless particle emitters once 2026-07-27 00:03:44 +02:00
RainMeshProbe feat(sky): load Setup-backed (0x020xxx) sky objects via SetupMesh.Flatten 2026-04-27 23:24:09 +02:00
RetailTimeProbe sky(phase-8): retail-faithful night sky + README refresh 2026-04-24 20:34:36 +02:00
SkyObjectInspect sky(phase-8): retail-faithful night sky + README refresh 2026-04-24 20:34:36 +02:00
StarsProbe tools(probe): add StarsProbe to dump every SkyObject's geometry + UVs 2026-04-26 22:19:28 +02:00
TextureDump fix(combat): restore retail power bar layers 2026-07-12 21:14:14 +02:00
WeatherEnumerator docs(research): sky/weather investigation handoff + diagnostic tools 2026-04-26 21:40:34 +02:00
WeatherSetupProbe docs(research): sky/weather investigation handoff + diagnostic tools 2026-04-26 21:40:34 +02:00
analyze_resolve_capture.py tools+plan(#182): resolve-capture histogram classifier + verbatim player-physics rebuild plan 2026-07-07 13:37:15 +02:00
connected-dense-town.route.txt fix(diag): bind stationary samples to route checkpoints 2026-07-24 12:54:57 +02:00
connected-r6-soak.route.txt fix(diag): bind stationary samples to route checkpoints 2026-07-24 12:54:57 +02:00
connected-world-lifecycle.route.txt test(runtime): add connected lifecycle gate 2026-07-20 22:39:34 +02:00
connected-world-reconnect.route.txt test(runtime): add connected lifecycle gate 2026-07-20 22:39:34 +02:00
decompile_acclient.py research: decompile acclient.exe terrain/physics via Ghidra headless 2026-04-12 23:18:27 +02:00
decompile_full.py research: full acclient.exe decompilation — 22,225 functions, 688K lines 2026-04-12 23:25:51 +02:00
DecompileTargets.java research: decompile acclient.exe terrain/physics via Ghidra headless 2026-04-12 23:18:27 +02:00
ghidra_decompile.py research: decompile acclient.exe terrain/physics via Ghidra headless 2026-04-12 23:18:27 +02:00
run-connected-r6-soak.ps1 feat(streaming): shadow-publish flat collision assets 2026-07-25 16:38:54 +02:00
run-connected-world-lifecycle-gate.ps1 refactor(runtime): acknowledge exact world host projections 2026-07-26 18:27:41 +02:00
run-offline-pixel-gate.ps1 test(render): add the Campaign V offline pixel gate 2026-07-27 15:19:43 +02:00
verify_un2_fmul.py UN-2 RESOLVED: GetMaxSpeed x4 is byte-verified retail; doc-comment was the misread 2026-06-12 13:17:50 +02:00