What we shipped.
Built in public. Roadmap for what's next.
Game scoring aligned with the MVP prototype
- N-back now uses percent accuracy as the headline, stored raw score, PR score, and rating score. The stream is back to the 90s / 1000ms-on / 1500ms-blank prototype timing.
- Tiered games now use tier-aware population anchors, while Reaction Time and Sudoku keep their visible lower-better scores and invert only for ratings.
- Completed games now return the XP award in the finish response so the result card can show the earned XP immediately.
Reaction Time joins the live battery
- Reaction Time ships as a five-trial seeded drill with 2-5s delays, false-start retry, keyboard/click/tap input, and server replay verification.
- Visible score is mean reaction time in milliseconds; rating uses a hidden higher-is-better speed score so Glicko remains consistent.
- Replay codec v2 carries stimulus-onset times only for reaction events. Existing game payloads stay on the original v1 layout.
- Today, Profile, and Leaderboards now understand lower-is-better scores and anonymous attempts are grouped by the `mindlsn_guest` cookie.
Compact event codec — 10× smaller submit payloads
- Replay events now ship over the wire as base64url-encoded fixed-width binary records (4-byte header + 11 bytes per event) instead of JSON.
- A 60-event arithmetic session goes from ~5KB JSON (~1.5KB gz) to ~885 bytes b64 (~250 bytes gz). Free latency win on every submit.
- Round-trip and length-mismatch tests guard the format. Verifiers see the same `events` array as before — only the wire format changed.
Public roadmap and changelog
- /roadmap and /changelog routes ship live, sourced from typed TypeScript modules in src/content/. Prerendered for max speed.
- Internal plan still lives in .docs/docs/todo.md; public roadmap is the curated, product-facing slice.
Stroop count scoring + ASDF controls
- Stroop uses correct-count over 30s with an 80% accuracy gate. RT-interference remains a possible post-MVP secondary stat, not the MVP headline.
- ASDF home-row keys map to the visible color pad. R/G/B/Y mnemonic keys still work for power users.
- Enter / Space starts the game and triggers Again across all three games.
HMAC session tokens + DB persistence
- Session tokens are stateless (HMAC-SHA256 signed). The whole session context — seed, rating, pop stats — is embedded in the token at page render. Submit verifies in-memory; no DB read on the rating compute path.
- Postgres persistence wired via dual-driver lazy client (postgres-js for local Docker, @neondatabase/serverless for Cloudflare Workers). Verified attempts INSERT after the response goes out via ctx.waitUntil().
- Initial schema and seed in db/init.sql; docker-compose for local Postgres on port 5432.
First three games + replay verification
- Arithmetic Sprint with 6 difficulty presets (Default, Quant, Optiver 8-min, Wide, Mul-only, Div-only) and a stub for adaptive Dynamic difficulty.
- N-back single (n=2) with accuracy-percent scoring, d-prime support stats, and anticipation flagging.
- Stroop with 4-color palette and replay verification.
- Server re-simulates every session from the seed; tampering, score mismatches, non-monotonic timestamps, and out-of-window events all rejected.
- Astro + Svelte islands on Vercel. Bun for local dev.