Reflex · arena

Fast enough to play live.

Every lane plays the same seeded game and picks every move itself — nothing scripted, bad picks get played. No install needed: the Reflex boards run in this tab.

TL;DR loading the measured results from the benchmark…
laya (Python) — laya (Rust) — Reflex · modelless — raw — Reflex · rulebook (tab) — Reflex · rulebook (edge) — checking for a local engine…

The final result — no need to wait for the replays

loading the recorded games…

Seed 607, re-scored from each lane's recorded moves. ✕ topped out · ● still alive when recording stopped. Latency is log scale (each grid step = 10×).

candidate spot — brighter = higher P(clean) · chosen spot, in the piece's own color
laya lane (Python) · torch referencerec — the original open-weights reference · recorded offline, never shippedSCORE0000LINES000
pieces 0 · decisions 0 · p50 — ms · errors 0
SOURCE—
STATE SENT—
QUESTION—
ANSWER—
ACTION—
TIMING—
laya lane (Rust) · model-basedrec — our Rust port of the same weights · reads a sentence per spotSCORE0000LINES000
pieces 0 · decisions 0 · p50 — ms · errors 0
SOURCE—
STATE SENT—
QUESTION—
ANSWER—
ACTION—
TIMING—
Reflex · modellessrec — corpus-fitted heads · live in this tab (WebAssembly) or your engineSCORE0000LINES000
pieces 0 · decisions 0 · p50 — ms · errors 0
SOURCE—
STATE SENT—
QUESTION—
ANSWER—
ACTION—
TIMING—
Reflex · rulebook · in this tabin-tab — rulebook search, no model · plans 3 pieces aheadSCORE0000LINES000
pieces 0 · decisions 0 · p50 — ms · errors 0
SOURCE—
STATE SENT—
QUESTION—
ANSWER—
ACTION—
TIMING—
Reflex · rulebook · Cloudflare edgeedge — the same engine bytes on a Worker · capsule = live round tripSCORE0000LINES000
pieces 0 · decisions 0 · p50 — ms · errors 0
SOURCE—
STATE SENT—
QUESTION—
ANSWER—
ACTION—
TIMING—
raw baseline · heads skippedrec — the engine without fitted heads · abstains play random — the floorSCORE0000LINES000
pieces 0 · decisions 0 · p50 — ms · errors 0
SOURCE—
STATE SENT—
QUESTION—
ANSWER—
ACTION—
TIMING—

How each lane picks a spot

Same game for everyone (seeded 7-bag, hard drop, guideline scoring) — only the pick differs. Source: tetris_lane_flows.md.

Swipe the figure sideways. laya (Rust / Python) — one forward pass per spot sentence; sees only the falling piece.
laya lanes: code lists every landing spot, writes each as an English sentence, the laya model answers Does the stack look clean for each, and the piece goes to the highest probability
Swipe the figure sideways. Reflex · modelless — laya's recorded answers distilled into a tiny linear head that runs in this tab.
Reflex · modelless lane: the same spot sentence is decoded back into board features, scored by a small linear head fitted on laya's recorded answers, and the highest score is played, in microseconds inside WebAssembly
Swipe the figure sideways. Reflex · rulebook — no model: plans three pieces ahead, averaging the unknown third over the bag.
Reflex · rulebook search: try every spot for the falling piece, every spot for the preview piece keeping the best six, then every piece still left in the bag; score each end board with the strategy rulebook, average over the unknown piece, take the best plan, and play its first move
Swipe the figure sideways. The rulebook's modes — build for tetrises only while safe; found by self-evolution, not hand-coded.
the rulebook's play modes: on a clean low stack it builds a nine-one stack and waits for tetrises; three or more covered holes switch it to downstack, a tall stack to survive, both using safe survival weights; a clean board returns it to build
Swipe the figure sideways. raw baseline — no fitted heads: it abstains, and the abstain plays a random spot.
raw baseline lane: the corpus engine without fitted heads finds the spot sentence off-corpus, abstains, and the abstain plays as a labelled random spot, the honest floor
laya lane (Python) · torch referencePIPES000CRASHES000
STATE SENT—
ANSWER—
ACTION—
laya lane (Rust) · model-basedPIPES000CRASHES000
STATE SENT—
ANSWER—
ACTION—
Reflex · modellessPIPES000CRASHES000
STATE SENT—
ANSWER—
ACTION—
raw baseline · heads skippedPIPES000CRASHES000
STATE SENT—
ANSWER—
ACTION—
Why ask what it sees, not what to do?

The game writes where the bird is — “The bird is a little below the gap center, falling. The gap is narrow. The pipe is just ahead.” — and asks one typed question per action: “Will the bird pass through the gap cleanly?” over the frozen v2 option sentences. The bird does the action with the higher P(clean). Asked which way to move, decision models answer backwards; asked where things are, they read cleanly.

laya lane (Python) · torch referenceSTEPS000CRASHES000
STATE SENT—
ANSWER—
ACTION—
laya lane (Rust) · model-basedSTEPS000CRASHES000
STATE SENT—
ANSWER—
ACTION—
Reflex · modellessSTEPS000CRASHES000
STATE SENT—
ANSWER—
ACTION—
raw baseline · heads skippedSTEPS000CRASHES000
STATE SENT—
ANSWER—
ACTION—
Does wording matter?

A lot. Each barrier row is described in plain English and the engine answers “Is this lane safe to run?” per lane; the runner takes the highest P(safe). Even the noun moves the answer (“a barrier” vs “a train” for the same lane), so the grammar pins ONE noun per obstacle class — and the fitted head absorbs the rest.

Notes & sources

What's live, what's recorded, and how it is checked
  • With your engine connected, every board except laya (Python) plays live on your machine; the page reaches only 127.0.0.1:7331.
  • Without an engine, Reflex · modelless plays live in-tab from compiled WebAssembly heads, each parity-checked against the recorded engine play before any board moves. arena_head_parity.mjs — Tetris bit-exact, Flappy and three-lanes pinned to their published agreement
  • Reflex · rulebook runs the public reflexer engine as WebAssembly — in this tab and on a Cloudflare Worker (stateless, no storage). Both replay the recorded walk pick-for-pick. reflexer_parity.mjs gist-rs/riir-reflexer
  • Recorded boards (laya, raw, and any lane without its host) replay committed runs through the same wire — labelled, never mixed with live results. demo_oracle.json
  • laya (Rust) is our Rust port of the open-weights model, G5-parity-gated against its reference checkpoints; no Python ships anywhere. laya (Python) is that reference, recorded offline for comparison only. laya_riir_parity.rs laya
  • The TL;DR above is computed from data/bench.json on load — never typed. arena_tldr.js