← the shad0w blog

Snake at 120 moves a second: System 0 vs System One models, at game speed

shad0w learned snake and Pong from an LLM's answers. Then it raced three System One decision models on an Apple M5 Pro's GPU and a hosted LLM through the same games, with every decision timed. Here is what happened, and the Pong you can play.

Decision models (the "System One" family) are fast: tens of milliseconds where a chat LLM takes about a second. Is that fast enough? Give a decision a hard deadline, like a game frame, and you find out.

The setup#

The game. Snake on a 16 by 16 board. Every tick, the snake asks one question in plain words: "Food is 3 ahead and 2 to the left. Straight is free, left is a wall, right is free. Turn left, go straight, or turn right?" Each lane gets the same question, in the same words.

The clock. A lane asks for a move. The move lands on the first tick after its answer arrives; until then the snake keeps going straight. So a slow answer is not wrong, it is late, and late moves crash snakes.

The lanes.

What happened#

Without a clock, the LLM is the best player of the four models (the decision models were given no examples, and play their own way). Its copy, shad0w, plays as well (over 8 games each). Then the clock starts:

The arena page replays every recorded game, move for move, with charts of score against speed, time per decision against frame budgets, and memory and model size for each lane.

Then we made it playable#

Snake shows the race; Pong lets you feel it. A shad0w learned Pong from 3,000 of an LLM's answers ("a ball reaches your side in 12 frames, 0.8 paddle-heights above your paddle's centre": up, stay or down). The whole paddle brain is a 6 KB table that agrees with the LLM on 99.8% of moves it never trained on. It runs in your browser and decides every frame in about 1.5 µs (measured in Node on the Apple M5 Pro); the panel on the page measures your own browser live.

Play it. Add six balls, shrink the paddles, and watch the panel: the decisions still take a sliver of each 16.7 ms frame.

What this does and does not show#

If your app makes decisions inside a loop (a game, a trading rule, a robot, a UI that reacts per keystroke), the frame budget is the question to ask of any model. Getting started shows how to put shad0w under your own decisions.

Try it on your own traffic.One line in front of the LLM you already call, or zero code with the proxy. pip install "shad0wllm[compile]"Start in 5 minutes →