WebTug fairness evidence v1 — published October 20, 2026 Report: https://webtug.com/obstacle-fairness Files reproduce.mjs Dependency-free evidence runner. obstacle-path.ts Exact production generator snapshot. transitions.csv All 20,000 transitions, using round-trippable JS numbers. summary.json Parameters, counts, full-precision measurements and SHA-256 hashes. Reproduce with Node.js 24 or newer 1. Save reproduce.mjs and obstacle-path.ts into the same directory. 2. Run: node reproduce.mjs --output ./results 3. Compare results/summary.json and results/transitions.csv with these published files. If all four files are in the same directory, run: node reproduce.mjs --check The command throws an error unless the reproduced CSV and JSON match byte for byte. No packages, browser, network access, or WebTug account are required to run it. Fixture Seed: 20260726; 20,000 consecutive transitions; 700 px high portrait arena. Scale: clamp(700/680, 0.8, 1.08); gap height: 174*scale. Initial gap center: 700*0.48; no previous-previous center at the first transition. PRNG: state=(1664525*state+1013904223)>>>0; value=state/4294967296. Two random values are consumed for each generated transition. A large move is strictly greater than 65% of the maximum step. After a prior move strictly greater than 78%, a move in the same direction must be no greater than 55% of the maximum (comparison tolerance 1e-9 px). CSV columns transition: one-based index previous_previous_y: blank only for the first transition previous_y, next_y, delta_y: px; positive delta moves down the arena large_move: 1 if above the 65% threshold, otherwise 0 continuation_limit_applies: 1 if the prior severe move and current direction meet the protected-pattern condition forbidden_continuation: 1 if that protected pattern exceeds its limit Scope This tests the real generator's bounds, maximum step, and protected pattern. It does not simulate player motion, test every viewport, establish human reaction times, or prove recovery from every possible position and velocity. It is automated evidence, not a human playtest or a measured learning study. The source commit recorded in summary.json identifies the production snapshot from which this unchanged generator was copied; file hashes identify exact inputs.