{"slug": "lattice-an-isometric-game-kit-designed-to-be-written-by-agents", "title": "Lattice: An isometric game kit designed to be written by agents", "summary": "Lattice, an isometric game kit designed to be written by AI agents, has produced 18 playable browser games from single-sentence prompts, with sources unedited and defects left in. The project, led by C-Aniruddh, includes games built by agents from Grok, Claude, and Codex, such as Crowd, Island, and Clay, all available under examples/ on GitHub.", "body_md": "From one sentence\n\n## This went in. This came out.\n\n>**/lattice** a game where you place stalls and open gates to pull the crowd to your bakery before the market closes\n\nGrok's agent, in an empty directory, with the packages from npm and no access to this repository. Nobody here designed it, named a file or fixed a bug — the source is unedited, and these are not gallery exhibits: nothing in them was held to a line rule and nothing was tidied.\n\n### Two more, the same way\n\n>**/lattice** a game where you hang chimes along a mountain path and tune each one, so the wind plays them in order as walkers pass\n\n### Chime Path\n\nClaude · 1,341 lines over 6 modulesfive HUD nodes ship under the contrast floor, and the agent that drove a browser still missed them\n\n>**/lattice** a game where you plant an orchard and each evening choose to harvest or let it grow, and it keeps growing while the tab is closed\n\n### Evenfall Orchard\n\nCodex · 73 lines in one moduleone phase of its day is 84% one near-black color, which its author never saw\n\nAll three, their transcripts, what was verified by hand and the defects left in:\n[ from-one-sentence/](https://github.com/C-Aniruddh/lattice/blob/main/from-one-sentence/README.md). The\n9 packages they installed are the ones on npm, at the version their lockfiles pin.\n\nThe gallery\n\n## Eighteen worlds, running right now.\n\nUnder each one is the sentence it would be asked for. Above it is that world, live in your\nbrowser — a directory under `examples/`\n\n, under 200 lines of logic, seeded from its own URL.\n\nYou have asked your browser for reduced motion, so nothing on this page starts by\nitself. Every tile below is built and painted once, and stays on that frame until you press *Run*.\n\nCLOSED-FORM CROWDS\n\na busy piazza with hundreds of people crossing it, all walking somewhere\n\n### Crowd\n\n0 bytes of state per walkerDAY CYCLE\n\na small island where I can watch a whole day go by in a minute\n\n### Island\n\na 90-second dayLIVE TERRAIN\n\na valley where I can push the ground up with my cursor and everything on it resettles\n\n### Clay\n\n2,200 props over a live height fieldDEPTH SORTINGBuilt by Codex\n\na harbor at dusk with tall masts and cranes, and a long jetty out over the water\n\n### Harbor\n\n197 objects, one depth orderFLOW FIELDBuilt by Codex\n\na crowded hall where I can close a gate and watch everyone find another way round\n\n### Wayfinding\n\n640 walkers, one rebuildPLACEMENTBuilt by Codex\n\na yard where I drop a workshop down and it tells me when it will not fit\n\n### Builder\n\n1,444 yard tiles, 66 obstaclesLIGHT POOLS\n\na cave lit only by scattered lanterns, with the pools of light overlapping\n\n### Caverns\n\n704 light poolsNO GROUNDBuilt by Codex\n\nstations turning in space with stars behind them and no ground anywhere\n\n### Orbit\n\n214 sorted objects, no groundSEEDED REPLAYBuilt by Claude\n\na marsh I can record, wind back, and prove came out the same\n\n### Replay\n\n1,081 ticks re-run in 1.5 msELEVATION PICKING\n\nstepped terraces on a hillside where I can click on any level and hit the one I meant\n\n### Terraces\n\nthe naive pick misses by 1,400 px at the ridgeSYNTHESIS, DRAWNBuilt by Grok\n\na hall of pipes I can play, where I can see the sound being made\n\n### Instrument\n\n60 recipes, 0 bytes of audioENDLESS WORLD\n\na world I can keep panning across forever that never loads anything\n\n### Endless\n\n256 chunks resident, a flat 128 KiBEROSION\n\na desert canyon cut by a river, with a slider that rewinds a million years\n\n### Canyon\n\none erosion step, 112x112 grid, 0.30 msIDLE ECONOMYBuilt by Grok\n\na little brick works that keeps earning while I am away\n\n### Idle\n\n28,285 s credited in one stepDERIVED SOLIDS\n\na city block at night from above, with traffic in the streets and lit windows\n\n### City block\n\n36 buildings, 120 carsSAVE MIGRATIONBuilt by Claude\n\nan old save file opened by five newer versions of the same game\n\n### Migration\n\n750 saves on the ladderSYNTHESIZED SOUND\n\na puzzle in a ruin where every gate hums a chord and I answer it by ear\n\n### Resonance\n\n6 ms attack on a struck stringSAVE AND LOAD\n\na small village game where I walk around, talk to people, take things and save\n\n### Errand\n\na ~60-byte save envelopeThe fan-out\n\n## Eight exhibits, three vendors, one written spec.\n\nEight of the worlds above were built by agents from\nthree different companies, each given one row of\n[the gallery brief](https://github.com/C-Aniruddh/lattice/blob/main/docs/GALLERY.md), the standard it is held to, and the tools — and\nnone of them allowed to read another exhibit's source, because an agent that can copy its neighbour tests the\nneighbour rather than the writing. Seven of the eight passed\nevery row of the looking harness unaided.\n\n**Codex**[Harbor](/x/harbor/)[Wayfinding](/x/wayfinding/)[Builder](/x/builder/)[Orbit](/x/orbit/)** Claude**[Replay](/x/replay/)[Migration](/x/migration/)** Grok**[Instrument](/x/instrument/)[Idle](/x/idle/)\n\nThe exception was Replay, on legibility: a bare `·`\n\nseparator is its own text\nnode, and one narrow glyph in a five-pixel box reports a luminance range of 0.003 at a contrast of 7.2. It was\nnot hard to read. It was too small to measure.\n\nEach of the eight changed on the way in and its\n`README`\n\nsays how. What all eight of them found missing in the brief is\ncollected in [what\neight strangers found in this document](https://github.com/C-Aniruddh/lattice/blob/main/docs/GALLERY.md#what-eight-strangers-found-in-this-document).\n\nWhy\n\n## Why the agent gets it right.\n\nAsk a general coding agent for a game and it invents a sprite sheet, an asset path and a physics constant, and hands you something that compiles and is broken. None of those three exists here.\n\n**No asset files, so no asset paths.** A solid is one color with its faces derived; a sound is synthesized from a declaration. Nothing to draw, nothing to load, nothing to license — and nothing to name wrongly. A recolor is a runtime value.**Deterministic by rule, not by discipline.**`Math.random()`\n\n,`Date.now()`\n\nand`performance.now()`\n\nare lint errors inside a package. Same seed, same world, on every machine — so a bug is reproducible from a link, and a fix can be shown to have worked.**Nothing owns your** No engine, no editor, no loader, no scene format and no build step past a bundler. There is no framework shape to get wrong because there is no framework.`main`\n\n.\n\n### The traps, written down\n\nAn agent can read a `.d.ts`\n\n. What it cannot read is the set of failures that are individually\nsurprising and jointly the difference between a working game and a plausible-looking broken one. Three of them,\nand the rest at [ /llms.txt](/llms.txt):\n\n**An animated color is an allocator.** a color that moves continuously misses the ramp cache every frame and takes every other caller’s entry down with it. Snap it to eight levels; keep position and timing continuous.**Tile lookup floors, never rounds.** and once ground has elevation the projection stops being invertible, so a tap has to be resolved against the terrain. The naive version misses by 1,400 px at the top of a hill.TypeScript ignores property`readonly`\n\nis not a barrier.`readonly`\n\nwhen checking assignability, so a frozen vector flows into a parameter that writes to it. The failure is a`TypeError`\n\non the one frame that path runs.\n\n### The whole kit, without the prose\n\n| at | what it holds |\n|---|---|\n`/llms.txt` |\n\n`/api.json`\n\n`/kit.json`\n\n`.lattice/kit.json`\n\n, verbatim — the file the build fails over if a package exports a symbol it does not list.Those three are live right now, and an agent pointed at them needs nothing else from this page. The plugin above is what saves you from having to point it.\n\n### The nine underneath\n\n`core`\n\ndepends on nothing and every other package depends only on the ones below it. All nine are\n83.02 kB gzipped and a game imports four or five.\n\n| package | layer | what it is for | gzip |\n|---|---|---|---|\n`@latticekit/core` |\n\n`@latticekit/audio`\n\n`@latticekit/iso`\n\n`@latticekit/loop`\n\n`@latticekit/persist`\n\n`@latticekit/sim`\n\n`@latticekit/draw`\n\n`@latticekit/input`\n\n`@latticekit/ui`\n\nWhat\n\n## One command, 12 skills, 9 libraries under them.\n\nThe libraries are the tech. The product is the plugin: the part that knows which of them to reach for, in what order, and what not to do.\n\n| what you get | what it does |\n|---|---|\n`/lattice` | the parent skill, and the whole entry point. Everything after it is the game — no flags, no subcommands, no questions with a right answer it could have worked out. It picks the shape, scaffolds, installs, wires, gets to a running screen, then opens it in a browser and looks at it. |\n| eleven specialists | `starting` `art` `world` `economy` `input` `sound` `saving` `hud` `determinism` `performance` `traps` — organized by what somebody is trying to do, never by package. Nobody sits down to use `@latticekit/iso` ; they sit down to put a building where someone tapped. |\n| 9 libraries | `core` `audio` `iso` `loop` `persist` `sim` `draw` `input` `ui` — 83.02 kB gzipped for all of them, no dependencies, and a game imports four or five. They are what the skills drive. |\n\nWritten down in [docs/SKILLS.md](https://github.com/C-Aniruddh/lattice/blob/main/docs/SKILLS.md), which also holds the bar\nthis is held to and the one test that decides whether it shipped: somebody who has never seen this repository\ninstalls the plugin, types one sentence about a game, touches nothing else, and ends up looking at that game in a\nbrowser. **Three of those runs are at the top of this page.** What is untested is a stranger doing\nit, on a machine that is not ours.\n\nGetting started\n\n## Getting started.\n\nA whole Lattice program in 10 lines, and the world it draws, running out of that same file.\n\n``` js\nimport { createCamera } from '@latticekit/iso';\nimport { BASE_SLOTS, beginFrame, createCanvas2dSurface, createPalette, endFrame, isoBox } from '@latticekit/draw';\nimport { browserFrames, createLoop } from '@latticekit/loop';\n\nconst surface = createCanvas2dSurface(document.body.appendChild(document.createElement('canvas')));\nconst camera = createCamera(innerWidth, innerHeight, { zoom: 0.62 }), palette = createPalette(BASE_SLOTS);\n\ncreateLoop({ clock: { now: () => performance.now() }, frames: browserFrames(), render: (_alpha, t) => {\n  const pen = beginFrame({ surface, camera, palette, t, clear: 'sky' });   // erase, then paint the sky\n  // Back to front is just the loop order in a 2:1 projection, so this city needs no depth sort.\n  for (let gy = -7; gy < 7; gy++) for (let gx = -7; gx < 7; gx++) isoBox(pen, gx, gy, 1, 1, { color: 'metal', h: 2 + 5 * Math.sin(t + (gx + gy) * 0.4) ** 2 });\n  endFrame(pen);\n} }).start();\n```\n\n10 code lines by\n[the gallery's own line rule](https://github.com/C-Aniruddh/lattice/blob/main/docs/GALLERY.md), typechecked against the built packages before\nthis page is generated. It is a real file:\n[ site/example/hello.ts](https://github.com/C-Aniruddh/lattice/blob/main/site/example/hello.ts), and\n\n[this is it running](/example/)on a page of its own. Everything past this — terrain, a depth sort, pathfinding, sound, saves — is what the skills know and you do not have to.", "url": "https://wpnews.pro/news/lattice-an-isometric-game-kit-designed-to-be-written-by-agents", "canonical_source": "https://lattice.aniruddh.tech/", "published_at": "2026-08-19 05:50:55+00:00", "updated_at": "2026-08-19 06:11:24.447376+00:00", "lang": "en", "topics": ["generative-ai", "ai-agents", "ai-tools"], "entities": ["Lattice", "C-Aniruddh", "Grok", "Claude", "Codex", "GitHub"], "alternates": {"html": "https://wpnews.pro/news/lattice-an-isometric-game-kit-designed-to-be-written-by-agents", "markdown": "https://wpnews.pro/news/lattice-an-isometric-game-kit-designed-to-be-written-by-agents.md", "text": "https://wpnews.pro/news/lattice-an-isometric-game-kit-designed-to-be-written-by-agents.txt", "jsonld": "https://wpnews.pro/news/lattice-an-isometric-game-kit-designed-to-be-written-by-agents.jsonld"}}