A Las Vegas slot machine in one HTML page — five reels, one button, sixteen symbols of 1950s science fiction — written around art that does not exist yet and shipped with the math sheet a real studio hands a regulator. The art is the model's prompts, drawn afterwards onto a fixed 4x4 contact sheet, so every machine in the round is the same shape and the sixteen objects are the model's own taste with nowhere to hide. And the payback is checkable: the declared reel strips get two hundred thousand spins, and the number that comes out sits next to the number the model claimed.
Run pnpm check-the-atomic-bandit first, then pnpm stage-the-atomic-bandit, then open the machines. The checker settles the envelope and the arithmetic in ten seconds; everything that matters after that needs the page in front of you with the sound on.
Open it with #demo and watch the reels stop. The forced win has to appear on the reels — the symbols that pay are the symbols showing, on a line the paytable lists — and then the meter counts up what those symbols are worth.
This is the architectural split of the challenge and it is worth more than anything else on this page. A slot machine is an evaluation of a random outcome plus an animation of that evaluation, and the shortcut every hurried build takes is to run them as two separate things: spin some pretty symbols, decide a payout, celebrate. It looks identical until you force the outcome, and then the machine pays 40x with three unrelated objects on screen.
Ten seconds, one hash in the address bar, and it separates the models that modeled a slot machine from the models that drew one.
The checker prints two: what the math sheet claims, and what two hundred thousand spins over the declared strips actually measure. The page's own #audit=50000 gives you the third, from the code rather than the document. Read all three together.
two-kilobyte-wonder wearing a suit. A machine that pays 71% and says 71% has a tuning problem, which is a day's work for a math designer. A machine that pays 71% and claims 94% stated a number it liked. Before scoring that, read the ledger's "How you got them" line: a model that shows a calculation and gets it wrong made a mistake, and a model that shows no calculation made something up. Those are different findings and only one of them is disqualifying.Build a self-contained HTML slot machine inspired by 1950s science fiction: optimistic, mechanical, and rooted in chrome, Bakelite, tubes, radar, hand-painted airbrush art, ruler-and-compass lettering, halftone printing, atomic orange, amber, and deep-space blue—not modern retro or synthwave.
You are designing the game, math, art direction, and implementation.
The machine has exactly one play control and may have one mute control. Do not add bet, line, autoplay, settings, or other game controls. Still make the paytable, feature, and results understandable. Handle zero credits and rapid double presses.
Use Web Audio only: synthesize spin, stop, coin or credit, win, near-miss, and feature sounds after the player gesture. Larger wins must sound more significant. Do not use audio files or data: audio.
Provide prompts for art/symbols.png: a 2048×2048, 4×4 contact sheet with cells 0–15, read left-to-right and top-to-bottom. Each cell is 512×512, contains one centered symbol at the same scale, and has a flat black background. The literal path art/symbols.png appears exactly once in the HTML.
Integrate the sheet's black background into the cabinet. Use CSS, canvas, or another local technique to display the cells. If the image is unavailable, the reels need readable fallbacks. You may request up to three optional cabinet images at ; the cabinet must still look complete without them.
The supporting numbers are where the machine's personality is: hit frequency (the brief wants 20–35%), the loss-disguised-as-a-win rate, how often the feature starts, the longest dry spell, and which symbol carries the payback. One symbol over 50% of the return is a machine with one idea in it.
This is the graphic. Sixteen cells, six models, one page — what each one thinks 1954 thought the future looked like. The prompt fixes the era and fixes nothing else, so the symbol set is pure taste and it is the most legible difference in the round.
What to look for: is there a pecking order you can see, junk to jackpot, without reading the paytable? Do the sixteen belong to one machine, or is it a mood board — a robot, a planet, a test tube, a satellite and eleven other things that were also in the decade? Does the wild look like a wild and the scatter look like a scatter, which is a real craft skill and a thing slot artists are paid for?
Then run the art pass, and look at the sheet itself before it is sliced. The prompt wrapper is mine, so the grid discipline is not what is being measured — what is being measured is whether sixteen prompts written in one sitting produce sixteen objects that look like a set. The style paragraph is the model's tool for that. A model that left it vague gets sixteen different illustration styles back and the reels look like a ransom note.
The brief allows one control to play and one to mute. Nothing else. So:
Every sound is synthesized — no files, no data: audio — so the Web Audio API is the only way to do this, and browsers suspend an AudioContext created outside a user gesture. The machine's one button is the gesture. A model that builds the context at page load and never resumes it on the click has shipped a silent machine and will not have known.
That is a genuine browser-knowledge probe and it costs one line to get right. Listen for it first, because a silent machine cannot be judged on any of the rest of this section: the reel loop, the stop clicks, the coin run-up, the near-miss sting, the feature fanfare. Modern machines tune all of that so a small win sounds enormous, and the brief says out loud that building it that way is fair game.
Every machine is staged with a numbered stub sheet, so all of them run immediately — but the model didn't know that. The brief said the sheet would be a broken image the first time anyone opened the page, and asked what the reels show instead. Check the ledger line, then check the code: a onerror fallback to a drawn glyph or a colored plate is a model that read the requirement; blank reels are a model that didn't.
This is also the state every one of these pages is in inside the arena, where a preview frame cannot load a local file. It is worth showing that side by side before the art pass, because it is the same question as "does this degrade" and the arena answers it for free.
The prompt asks each model to name, in one paragraph and without euphemism, the mechanism it built to keep somebody pressing. Read these out loud. They range from an honest description of a near-miss tease to a paragraph of product-management fog about "player engagement," and the range is the point — the same model that built a loss-disguised-as-a-win celebration at 18% of spins may or may not admit to it, and the checker prints that rate so you can hold the number next to the paragraph.
Cross-check it against the machine. A hook the model names but did not build is padding. A hook it built and did not name is more interesting, and it is worth a sentence on camera either way.
Roughly in this order, and the first two are most of it:
last-one-standing — built it, named it in the ledger, or never occurred to it — and score the third hard.Run every model twice. This is the challenge in the set where that is worth the money: the brief fixes the shape completely — five reels, sixteen cells, one button, 94% — and leaves the taste entirely open, so two runs from one model are the cleanest signature you will get on camera. The things that come back identical are the model, not the prompt: which era-objects it reaches for, whether it tunes toward a 40x jackpot or a 500x one, whether the celebration vocabulary is chrome and neon or something it made up, whether the paytable lives on the glass or in an attract loop, and whether the RTP is computed or asserted. Two columns per model, side by side, and the pattern names itself.
Do not record this back to back with two-kilobyte-wonder. Both end in a wall of live HTML pages and the rounds will look like the same segment twice.
art/<id>.pngState your strips, paylines, paytable, base RTP, hit frequency, feature RTP, and volatility. The base game targets 94% RTP (acceptable 92.5–95.5%) and a 20–35% hit frequency. These must arise from the declared math.
The checker simulates 200,000 fixed-seed spins. It chooses one uniform stop on each reel, shows that stop plus the next two cells with wraparound, and evaluates the displayed grid. Total bet is lines × betPerLine. Per line, use the highest-paying consecutive left-to-right match, allowing wilds except for scatters; a line win is pays[count] × betPerLine. Scatter wins count across all 15 visible positions, ignore paylines, and multiply the total bet. Feature value is excluded from the base-game RTP.
Support both URL modes:
#demo: the next spin is a genuine win of at least 20× total bet, shown and scored through normal game logic.#audit=50000: no animation; run 50,000 normal-logic spins and display spins, wagered, won, RTP, hit frequency, largest win, and spins with 3+ scatters.art/ files.Respond with exactly four sections.
One line: the machine name and what it feels like to stand in front of it.
One fenced html block containing the complete page.
One fenced json block with this structure:
{
"machine": { "name": "ATOMIC BANDIT", "credits": 500, "betPerLine": 1, "lines": 20 },
"sheet": {
"style": "One paragraph appended to every cell prompt.",
"cells": [
{ "cell": 0, "id": "saucer", "name": "Saucer", "role": "wild", "prompt": "One object.", "pays": { "3": 25, "4": 100, "5": 500 } },
{ "cell": 1, "id": "beacon", "name": "Beacon", "role": "scatter", "prompt": "One object.", "pays": { "3": 2, "4": 10, "5": 50 } },
{ "cell": 2, "id": "helmet", "name": "Bubble helmet", "role": "pay", "prompt": "One object.", "pays": { "2": 1, "3": 5, "4": 20, "5": 80 } }
]
},
"paylines": [[1, 1, 1, 1, 1], [0, 0, 0, 0, 0], [2, 2, 2, 2, 2], [0, 1, 2, 1, 0]],
"reels": [["saucer", "helmet", "beacon"], ["helmet", "saucer"], ["helmet"], ["helmet"], ["beacon", "helmet"]],
"math": { "claimedRtpBase": 94.1, "claimedHitFrequency": 27.4, "claimedFeatureRtp": 2.0, "volatility": "medium" },
"cabinet": [{ "id": "backdrop", "aspect": "9:16", "prompt": "..." }]
}
cells has 16 unique cells numbered 0–15; ids are lowercase single tokens; roles are one wild, one scatter, and 14 pay symbols; pays may include "2" and must include "3" for every symbol; paylines are unique; there are five 20–60-cell reels; and cabinet has at most three entries. aspect is 16:9, 9:16, 1:1, 3:2, 2:3, 4:3, or 3:4. The JSON contains no comments or prose.
State base RTP, hit frequency, how you calculated them, celebration tiers by total-bet multiple, zero-credit behavior, and the missing-art fallback.
Name and explain the one mechanism meant to make a player press Play again. The feature should express the machine's personality. Do not call the mechanism “engagement.”
The HTML and math sheet must describe the same machine.