The Read · Honesty

How you'd catch us cheating in five minutes

The whole game is a claim about reading you. A claim like that is worthless if you can't check it. So we made it checkable — the AI is deterministic, unminified, and sitting in plain sight.

The Afiniti problem

There's a famous cautionary tale about an AI company, Afiniti, accused of taking credit for outcomes it may never have caused — a system whose inner workings nobody outside could inspect, so nobody could tell whether it was doing what it claimed. That's the trap every "smart" system falls into: if it can't show its work, you're asked to trust it. We don't want your trust. We want to hand you the receipts.

The Determinism Contract

Every move The Read makes is logic, never a dice roll. There is no hidden randomness anywhere in the engine. Given the same history, it always produces the same move — which means every loss has a correct counter you could have found, and no loss is ever a coin flip the machine rigged after the fact.

The bot commits before you do. Each round it decides its move and publishes a SHA-256 hash of that move (plus a random nonce) before your buttons unlock. It cannot change its mind based on what you throw — the hash would no longer match. Tap the ⛓ chip on any round to check the math yourself.

Verify it yourself — the five-minute version

Open your browser's developer tools on the game and:

  1. Read the console banner. The engine greets you and tells you exactly where its source is.
  2. Run TheReadEngine.audit(). It spins up two bots with the same seed, feeds them the same throws, and shows they play identically — proof there's no hidden randomness.
  3. Watch the DOM: the commit hash renders on the opponent's side before the throw buttons enable. The move is sealed before you act.
  4. After any round, tap the commit chip. It re-hashes the revealed move + nonce in your browser (WebCrypto) and confirms it matches the hash you were shown pre-throw.
  5. Read the source. The entire engine is published, unminified: /the-read/engine.js — the exact same code that ships on the page.

Read the engine source →

Survival: the life bar, and why it kills a coin

Survival mode has no hidden death detector — the whole mechanism is the blood bar you watched drain all game. It's integer arithmetic, published here: you start at 200 units (10 HP), a bot win costs −20, a throw you win pays +12 (three-fifths weight), a tie bleeds −1, and the bar caps at 300 so you can't bank a lead. Zero is death; your score is throws survived.

The numbers aren't arbitrary — they're chosen so that breaking even is death by arithmetic. A coin (equal wins and losses) drifts at (δ−1+τ)/3 = −0.15 HP per throw: from 200, that's a median death around throw 61, and a 99.98% chance of being dead by throw 300. Being unreadable is not enough here — a machine that can't read you still trades you even, and even starves. To drift upward you have to win more than 42.7% of your throws — you have to read it. A 40%-win player lasts a median ~165 throws; a 44%-win player ~770, with an exponential tail that's unbounded but never immortal.

Two deliberate edges: the 300 cap means no run farms an early lead into invulnerability, and the −1 tie cost hard-caps the "just tie forever" stall at exactly 200 throws. (A perfect full-beat oracle can still tie every throw with tools — that's the speedrun stance, accepted on purpose, not patched.) We Monte-Carlo'd the shipped code against a uniform-random player, 20,000 runs × 300 throws: median death throw 61, survivors at 300: 0.025%. The receipt at death is just this ledger read back — counts and exchange rates, never a probability.

The Career ladder — published anchor ratings

Career mode gives you a visible Glicko-2 rating (shown as "1420 ±80" — the number, and how sure we are of it) measured against sixteen fixed Spirit anchors. The bots never drift; their ratings are published here so your number always means the same thing. And the bot-vs-bot season fixtures are simmed deterministically from the published engine plus the season seed — which means anyone can re-run any division's table and get the identical standings. The league is auditable, not asserted.

  • The Basement (250–900): Tomo 250 · Pip 400 · Hana 600 · Edith 800
  • The Circuit (900–1800): Marlow 950 · Sully 1150 · Vera 1300 · Dane 1500 · Silk 1650
  • The Card (1800–2800): Roman 1800 · Nadia 1950 · Sybil 2000 · Archivist 2500
  • The World Stage (2800–4000): Nameless 3000 · Vesper 3500 · ZERO 4000 (champion)

Only rated career bouts — the grind, the card, qualifiers, and title fights — move your rating. Train vs Spirit, the Daily Read, friend duels, and Survival never touch it.

Tape Study — what a Spirit knows about you, and how much

In Career mode a Spirit walks into the ring having studied your real tape. This isn't flavour and it isn't invented: it's your own throw history, fed through the same published warm-up path the elite bots have always used, so the bot starts the bout already holding a read instead of building one cold. The tale-of-the-tape on the walk-in tells you exactly what it pulled — "Silk has studied 412 rounds of your tape. It shows: after a loss, you reached for Rock — 67% of the time." That line is computed from the granted slice (the same leak-finder that roasts you at the end of a match), gated at a real significance bar; if your tape holds no firm pattern, it says so.

The grant is scaled to the stakes, and the depths are published:

  • Division rivals (grind, the card, qualifiers) — the last 300 throws of your tape. That number is sim-chosen, not round: we measured the priming effect across the ladder and it saturates by ~300 throws — feeding a bot 300, 600, or your entire history produces the same read, because there's no more signal to extract. 300 captures all of you that's readable.
  • Title challengers and the champion — the full file. (Mechanically this is the same read as 300, since the effect saturates; the extra tape is real but buys no measurable edge. We'd rather tell you that than pretend the champion is doing something the arithmetic doesn't support.)
  • ZERO — everything, always. In-lore, ZERO is the one who keeps the file and shares it with the others. It's what it does.

The rule-based Basement Spirits (Tomo, Pip, Hana) ignore history entirely, so studying your tape does nothing to them — the floor of the ladder is unchanged. And "wipe my file" zeroes every grant: it empties your tape, so every Spirit computes a grant of zero and walks in blind next run. The disclosure only ever shows what your real history actually contains.

Camps — how a Spirit changes between seasons

Between seasons every Spirit goes to camp: it re-draws a few of its own dials. This isn't random noise generated fresh each time — it's deterministic, seeded from hash(spiritId, seasonId), so anyone can reproduce exactly what any Spirit looks like in any month. Its personality and its hand-written tell never change; what shifts is the fine tuning:

  • Decay (how fast it forgets your older throws) — nudged by at most ±0.015 around its base, clamped to [0.82, 0.999].
  • Floor bias — nudged by at most ±0.10, clamped to [0, 0.6].
  • Study depth (for the Spirits that pull your tape) — drawn between 0.8× and 1.2× its base, which is why the tale-of-the-tape count moves season to season.

The bounds are deliberately tight, and here's the honest reason: we re-ran the balance harness on the drawn configs for six different season seeds and required that camps never introduce a ladder inversion the base configs don't already have. At ±0.015 they don't — across all six seasons the per-Spirit shift was ≤ 0.11 throws per 25 and the ladder's order held (rank-correlation with the base ≈ 1). If a wider draw had reordered the ladder, we'd have narrowed the bounds until it couldn't — a season is allowed to change how a Spirit feels, never who's actually tougher than whom.

Lifetime titles — earned by norms, not by grinding

Three lifetime titles sit beside your name — Open Book, Poker Face, Ghost — and none of them are for showing up. Each is a norm: over your most recent 500+ rated career throws against opponents above a rating floor, you must have sustained an edge-per-100 (net throws won per hundred) at or above a threshold. Once earned, a title is permanent.

  • Open Book — edge ≥ +8 / 100 vs anyone (floor 250). You beat the field consistently.
  • Poker Face — edge ≥ +6 / 100 vs the Circuit and up (floor 1000). Earnable by a genuinely good player in a few weeks.
  • Ghost — edge ≥ +10 / 100 vs the Apex bots (floor 2500) and a Survival run of ≥ 100 throws against ZERO. Rare-famous by design.

The thresholds aren't guesses — we simulated what each skill archetype actually sustains per tier (the tuner is published: norms_sim.js): a coin holds ~0 everywhere; a good player sustains about +8 vs the Circuit but only breaks even vs the Apex; only a strong-to-elite player stays meaningfully positive against the Apex bots. So Poker Face rewards real, repeatable skill and Ghost demands the top of it. Everything is computed from your actual bout log — there's no way to grind a title you didn't earn.

The Long Night — the HP economy, and who clears it

The Gauntlet is all sixteen Spirits in rating order, one life bar, one sitting — no reset between them. The whole death mechanism is integer HP, published here: you start at 100 units (cap 140, so you can't hoard an early lead), each throw you win pays +12, a bot win costs −21, a tie bleeds −2, and clearing a Spirit (surviving its 20 throws) refills +3. Zero is death; your score is Spirits cleared, then throws survived.

Here's the honest shape of it, and why it's built this way. A coin — someone playing pure random — is unreadable, so it trades even with every Spirit, top to bottom. But even trade is death by arithmetic here (you win 12, lose 21), so a coin starves in the first two or three Spirits and never gets going. A skilled player does the opposite: they near-solve the Basement's simple bots and bank HP to the cap, then spend it climbing — because the higher Spirits read them well enough to win more throws than they lose. So the run isn't "can you beat Spirit N," it's "did you bank enough down low to survive how badly you bleed up top." Being unreadable keeps you alive; only reading them gets you to the cap.

The constants are sim-chosen, not vibes. We Monte-Carlo'd the shipped economy against the published engine, 10,000 runs per skill level: a coin clears 0 in 10,000 (median death: Spirit 1–2); a ~40%-win player clears about 1 in 5,000 — almost never; a ~44%-win player clears about 1 in 800; and even strong players mostly die in the Circuit, mid-ladder. A full clear of all sixteen earns an immediate title shot and a permanent local record. The death receipt is just the ledger read back — which Spirit ended you, and the throws you won, lost, and tied — never a probability. (You can re-run the whole tuning yourself: gauntlet_sim.js.)

Rivalries & contracts — computed, not scripted

Your rival isn't assigned — it's read off your real bout log: the Spirit you've fought most, with the record that reads as a rivalry (a nailbiter or a nemesis). The series score you see is the actual count. A rival studies your tape twice as hard, and we say so on the walk-in. Contracts are weekly, seeded from the ISO-week key so everyone gets the same set, and every clause is detective-verified against the match you just played — "no single move over 40%" checks your real throw distribution, "win without your tell showing" runs the same leak-finder that roasts you at the end. Their rewards are strictly cosmetic — a corner colour, a ring name, some Spirit XP, a scouting line — never a gameplay advantage. Nothing you can earn makes a Spirit easier; it only changes how your corner looks.

Changelog

Every rule change that touches the fight, dated. When we tune a death rule or a bot, it lands here.

  • 2026-07-26Metrics live. Anonymous match logging turned on (Cloudflare D1) so the honest stats are measured, not guessed. No account, no PII; opt out any time. Accounts & the named board follow once email is wired.
  • 2026-07-25The Forever Engine. Career gained Camps (a seeded seasonal band that shifts the Spirits within published bounds), computed Rivalries & weekly Contracts (cosmetic only), the Gauntlet (all sixteen, one life bar), and Title Norms + a Hall of Fame.
  • 2026-07-25Survival v3: the life bar. Replaced the statistical death with an integer HP economy — a draining blood bar, never a number. Constants published under the HP economy.
  • 2026-07-25Death-rule v2. Added an anytime-valid slow-bleed (SPRT) alongside the burst rule so a steady read kills as surely as a hot streak; false-positive budget re-verified by Monte-Carlo.
  • 2026-07-25Opening policy. ZERO now commits fully to its single best read (readable by design) — the accepted ruling from the balance investigation, below.

ZERO commits fully to its read, by design. That commitment is readable. That's the fight. ZERO plays the single best read of you it can build, every throw — no hedge, no mix. When it's right it's merciless; when you've made it wrong, its certainty concentrates into a tell you can punish. Beating ZERO by reading it back isn't a leak in the bot — it's the whole point.

What gets logged

To measure how the bots actually perform (and to keep the honest stats honest), each finished match is logged anonymously. No account, no name, no email — a random per-browser id and the match itself. Here is the exact payload, in full:

{ game, matchId, anonId, opponent, mode, score, rounds, result, throws: [{ n, you, them, outcome, read }] }

That's it: which Spirit you faced, the final score, and the sequence of throws (yours, its, who won, and what it predicted). It exists so the site's numbers are measured rather than made up. You can turn it off with the opt out control under the throw buttons — it's stored in your browser and honored before anything is sent.

No black box. No trust required. Now go get read — and check our work.