Lab Console
Define protocols, record runs/measurements, bind platform/version, review/publish results, and retest — all versioned and R2-backed.
Workflow: Question → ResearchTicket → TestProtocol → TestRuns (append-only) → Measurements (immutable, units validated) → Result (derived, uncertainty required) → Review → Publish → retest via VersionChange. No invented GTA VI values.
Protocols
Define method, controls, sample size, retest policy
Runs
Record TestRuns with platform/version + environment snapshot + R2 captures
Measurements
Immutable rows per run, units per family (§10.9)
Results
Derived (mean/median/two-way mean), uncertainty, reproducibility
Review Queue
Reviewer approves; PRELIMINARY until REPRODUCED
Methodology
Public pages per family — method only, no fake numbers
R2 evidence path
Lab captures land in R2
evidence/tests/<protocol_slug>/<batch_id>/ via presigned PUT (short-lived). Postgres stores media_asset_ids per run; sha256 required before public. Never proxied through Worker large path.Allowed prefixes include
evidence/tests/, images/evidence/, video/gameplay/. See src/lib/validators.ts:r2AllowedPrefixes.Validation & bindings
- Units validated per family (§10.9): mph, seconds, dollars_per_hour, fps, etc. — not free text.
- Run counts enforced: Result sample_count = number of bound measurements; aggregation deterministic.
- Platform + GameVersion required on every TestRun/Result (no unbound rows).
- Evidence/history immutable: TestRun + Measurement append-only; Result superseded via new row + VersionChange diff.
- Reproducibility: UNTESTED → SINGLE_RUN → REPRODUCED (≥2 batches within uncertainty) → CONTESTED/BLOCKED; only REPRODUCED powers leaderboards.
- Retest hook: new GameVersion → new Result + VersionChange (absolute + percent) — patch diff pages generated from VersionChange, not copy.
ResearchTicket integration: every protocol links to a ticket (
researchTickets.protocol_id) and results link back (researchTickets.result_id). Launch-readiness = researcher can do this end-to-end without engineer help.