Two Sparks, Four Models
Four open models, each on its own pair of DGX Sparks, given the same five rounds: reflex, a film, an arena, a house and real terminal work.
Most model comparisons run in someone else's cloud. This one runs on a desk. Each of four open models gets exactly two NVIDIA DGX Spark boxes, joined by one cable, and its own serving recipe. Three of the four quants and recipes are ours and public; the fourth is Mia-AiLab's.
Then every model gets the same jobs. Answer a question fast. Make a film. Write a bot that has to survive 200 games against the others. Design a house. Do real work in a terminal, graded by tests it cannot see.
We are not crowning a winner. Same hardware, different minds: each round shows something different about how a model thinks, where it is quick, where it is careful, and where it runs out of road. Every file is published exactly as the model wrote it, with its hash, and every number links to the record it came from.
Four models, two Sparks each
Each model runs on its own pair of NVIDIA DGX Spark boxes (GB10, 128 GB each), joined by one 200 Gb/s cable, on the TensorFold engine. Nothing runs in the cloud.
Same question, real time
One short question to every model, thinking off where the model allows it. The clip is drawn from the logged token stream: every word and timer is as measured. Each lane ran in its own quiet window; the clocks are aligned at the moment each request was sent.
| MODEL | FIRST TOKEN | TOK/S | TOKENS | GPU POWER / SPARK |
|---|---|---|---|---|
| GLM-5.3-Flash | 0.21 s | 44.2 | 144 | 31 W |
| DeepSeek-V4.1-Flash-1017 | 0.17 s | 67.7 | 124 | 37 W |
| Beam-1.0 501B | 0.53 s | 50.3 | 1,038 | 41 W |
| Ling-3.1-flash-1019* | 0.06 s | 35.0 | 145 | 26 W |
Best of three identical takes per model. GPU board power from nvidia-smi, sampled four times a second, mean per Spark. Beam has no thinking-off switch, so it reasoned for about 2,400 characters before it answered; its token count includes that.
Night Bloom
Each model wrote one HTML file: a 20-second looping film of a meadow that blooms at night, with no text and nothing loaded from outside. We recorded every frame by calling the file's own renderAt(t), so the films are exact. Beauty is your call.
The arena: 200 games
Each model wrote one light-cycle bot from the same rules. A fixed referee ran 200 seeded games, all four bots in every game. No model saw another model's bot.
| BOT | POINTS | WINS | CRASHED INTO OWN TRAIL | INTO ANOTHER TRAIL | INTO WALL / BLOCK | |
|---|---|---|---|---|---|---|
| GLM-5.3-Flash | 412.5 | 86 | 92 | 9 | 12 | BOT ↗ |
| DeepSeek-V4.1-Flash-1017 | 294 | 58 | 78 | 49 | 14 | BOT ↗ |
| Beam-1.0 501B | 262.5 | 26 | 140 | 3 | 31 | BOT ↗ |
| Ling-3.1-flash-1019 | 231 | 30 | 124 | 17 | 29 | BOT ↗ |
Points: 3 for a win, then 2, 1, 0 by survival order. Every replay rebuilds exactly from the referee's log. Ling wrote its bot with reasoning on, before the serve problem began.
The House
A single-story home of about 2,400 square feet. Three bedrooms and two bathrooms were the only requirements; everything else was up to the model. Each answer is one HTML file: a to-scale SVG blueprint, a short design note, and a machine-readable room list.
Checked in code from each file's room list: exactly 3 bedrooms and 2 bathrooms, living area within 5% of 2,400 sq ft. How the house looks and lives is yours to judge.
Terminal-Bench 2.1, through Pi
Fifteen fixed Terminal-Bench 2.1 tasks, the same for every model, run in Harbor with the Pi coding agent: git repair, log parsing, a COBOL port, SQLite recovery, certificates, an nginx config and more. Each task is graded by its own tests. Same limits for every model: 65,536 output tokens per turn and Terminal-Bench's own time limit per task.
| TASK | GLM | DEEPSEEK | BEAM | LING |
|---|---|---|---|---|
| build-cython-ext | ✓ | ✓ | ✓ | – |
| cobol-modernization | ✗ | ✓ | ✗ | – |
| constraints-scheduling | ✓ | ✓ | ✓ | – |
| fix-git | ✓ | ✓ | ✓ | – |
| git-leak-recovery | ✓ | ✓ | ✓ | – |
| largest-eigenval | ✗ | ✓ | ✗ | – |
| log-summary-date-ranges | ✓ | ✓ | ✓ | – |
| multi-source-data-merger | ✓ | ✓ | ✓ | – |
| nginx-request-logging | ✓ | ✓ | ✓ | – |
| openssl-selfsigned-cert | ✓ | ✓ | ✓ | – |
| overfull-hbox | ✗ | ✓ | ✗ | – |
| prove-plus-comm | ✓ | ✓ | ✓ | – |
| regex-log | ✓ | ✓ | ✓ | – |
| sanitize-git-repo | ✓ | ✗ | ✗ | – |
| sqlite-db-truncate | ✓ | ✓ | ✓ | – |
| Passed | 12/15 | 14/15 | 11/15 | DNF |
A task that hit its time limit is graded on whatever the agent left behind, as Terminal-Bench does. Ling-3.1-flash-1019: did not finish. Ling's two-Spark serve hung during both attempts (3 tasks at a time, then one at a time); no valid score.
RigMark, the appliance view
| MODEL | CODE TOK/S | PROSE | STRUCTURED | OUTPUT GATES | COLD TTFT AT 64K | 4 STREAMS, TOK/S | RECEIPT |
|---|---|---|---|---|---|---|---|
| GLM-5.3-Flash | 67.8 | 62.5 | 102.6 | 9/15 | 32.1 s | 130.1 | CARD JSON |
| DeepSeek-V4.1-Flash-1017 | 99.5 | 80.8 | 130.2 | 12/15 | 26.3 s | 139.7 | CARD JSON |
| Beam-1.0 501B | 41.8 | 37.1 | 59.4 | 15/15 | 48.0 s | 63.3 | CARD JSON |
| Ling-3.1-flash-1019* | 44.0 | 32.5 | 47.1 | 15/15 | not measured | not measured | CARD JSON |
RigMark (github.com/alexellis/rigmark), default settings, one comparison ID. GLM and DeepSeek miss output gates because their reasoning runs past RigMark's 8,192-token cap before the answer; their cards say not to headline them. Ling's card skips prefill (its serve has no /v1/completions) and concurrency (two requests at once hang its serve).
- Same prompt text to every model, one shot, no human edits. Every answer file is published exactly as written, with its SHA-256.
- Reasoning on for every model in the build, film, arena, house and agent rounds, except where noted. The race asked for reasoning off.
- * Ling ran with reasoning off. It was the only way to get anything done with this model: with reasoning on, its long replies hung our two-Spark serve again and again, so no reasoning-on run finished. The other three models ran with reasoning on.
- A harness or setup failure voids a run; it is fixed and rerun, never scored against the model. A round that every model fails is a bad round, and we drop it.
- Quant levels differ by model and are named next to each one. GLM-5.3-Flash runs Mia-AiLab's quant; the other three run our own quants and public recipes.
- No winner is declared. Each round is reported as scores.
ROUND 1 · REFLEX
In about 120 words, explain how two small desktop computers joined by a single 200 gigabit cable can run an AI model that is too big for either one alone. Plain language, no lists.
ROUND 2 · NIGHT BLOOM
Make "Night Bloom": a twenty-second film, rendered live in the browser, of a dark meadow coming alive. It opens on near-black: a few fireflies drift in. Bioluminescent flowers begin to unfurl one by one, glowing from within, their light spilling onto the grass around them. The bloom spreads across the meadow in waves, colours shifting from deep teal through violet to warm gold, until the whole scene is a field of light under a slow aurora. Then it settles and dims back toward the opening, so the film loops without a seam.
Build it as a single HTML file with everything inline: no other files, images, libraries or web fonts, so it runs offline. Canvas 2D or WebGL, your choice. Aim for something people stop scrolling for: depth, soft glow, motion that feels organic, not a screensaver.
Requirements: - It fills the window at any size and aspect; it must look composed both in portrait (1080x1920) and in landscape (1920x1080). - No text, no UI and no controls on screen. - The film is exactly 20 seconds long and loops seamlessly. - Deterministic: the same frame time always draws the same picture (seed any randomness from a fixed number). - Expose one global function, window.renderAt(seconds), that draws the frame for that time (0 to 20) immediately and synchronously, so the film can be recorded frame by frame. The normal animation loop just calls it with the current time. - Keep the file under 30 KB. Write clean, careful code: it runs exactly as you write it, with no chance to fix it afterwards.
ROUND 3 · ARENA
Write a bot for the four-player light-cycle game below. Your bot plays against three other bots written by other AI models. The referee runs 200 seeded games; the bot with the most points wins. One shot: you will not see results before your bot is final.
THE GAME - Grid: 64 columns x 64 rows. x grows to the right, y grows downward. Cells outside the grid are walls. - Four players start in four corners (8 cells in from each edge), each facing clockwise along the edge. Seats rotate between games, so every bot plays every corner equally often. - Obstacles: each game has some wall cells placed with four-fold rotational symmetry, so every corner faces the same layout. - Every tick all living players choose a move at the same time: "L" (turn left), "R" (turn right) or "S" (keep straight). Turns are relative to the current heading. Then every living player moves one cell forward and leaves a permanent trail in the cell it left. - A player dies if it moves into a wall, an obstacle, any trail (its own included) or any cell another player occupies or enters this same tick (both die on a head-on or same-cell collision). - Dead players' trails stay on the board. - The game ends when at most one player is alive, or after 4,000 ticks. - Points per game: the last player alive gets 3, the second-last 2, the third-last 1, the first out 0. Players that die on the same tick share the points of the places they cover equally. If the game reaches 4,000 ticks, all living players share the points of the top places equally.
YOUR CODE Reply with one JavaScript code block that defines exactly this function, and nothing the referee must call besides it:
function createBot() { // called once per game; keep any memory you want in this closure return { move(state) { // return "L", "R" or "S" } }; }
state (read-only, a fresh copy every tick): - state.width, state.height: 64, 64 - state.tick: 0 on the first move - state.me: your player index (0-3) - state.players: array of 4 objects { x, y, dir, alive }, dir is 0 = up, 1 = right, 2 = down, 3 = left - state.grid: Uint8Array of width*height cells, index y*width + x: 0 = empty, 1 = wall or obstacle, 2 + i = trail of player i. Current heads are also marked as 2 + i.
RULES FOR THE CODE - Plain JavaScript (ES2020). No require, import, fetch, timers, DOM or global objects beyond Math, JSON, Array, typed arrays, Map, Set and Date.now. Math.random is allowed; the referee seeds it, so games repeat exactly. - At most 50 ms per move on a modern CPU core. A move that takes longer, throws, or returns anything other than "L", "R" or "S" counts as "S". - At most 40 KB of source. One code block, no explanation needed after it.
ROUND 4 · THE HOUSE
Design a single-story home of about 2,400 square feet: 3 bedrooms and 2 bathrooms. Everything else is up to you: the style, the layout, the rooms you add, how the house lives.
Deliver it as one HTML file with everything inline (no other files, images, libraries or web fonts), containing:
1. The floor plan as an inline SVG blueprint, drawn to scale: exterior and interior walls with real thickness, doors with their swing arcs, windows, room names with their dimensions, overall dimension strings on the outside, a scale bar, a north arrow and a title block (project name, total area, scale, date). Make it look like a real architect's blueprint. 2. A short design note under the drawing (at most 120 words): the idea of the house and how it lives. 3. A room schedule as machine-readable JSON in `<script type="application/json" id="plan">`, in this shape: {"total_sqft": <number>, "rooms": [{"name": "...", "type": "bedroom|bathroom|kitchen|living|dining|garage|utility|circulation|other", "width_ft": <number>, "depth_ft": <number>}]} Count conditioned living area in total_sqft (not a garage or covered porch, if you add one); it should be within 5% of 2,400. List every room. Exactly 3 rooms of type "bedroom" and 2 of type "bathroom".
The drawing must fit the window at any size. Write it carefully: it is used exactly as you write it.
Terminal-Bench tasks are the benchmark's own; the task list is above.