Makone
AGENTS.md27 starsChanged 2 months agoMITView on GitHub
You are in a world-building repo. There is no agent layer here: you (your coding agent) are the agent, skills/ is your knowledge, harness/ is your eyes and hands, and the work lands in worlds/<name>/. Five layers of skills: world/ overall workflow · craft/ general craft · game/ game-specific · object/ single-object-specific · three/ API reference. Every skill directory has a SKILL.md — its index, routing problem → page. Read that one file, then pull only the page you need;…
Where files are headingNew AGENTS.md files have more rules about keeping secrets out of the code, and fewer about code style.
Of the AGENTS.md files we read, the 31,774 first seen in the last six months, against the older ones: the kind of rule that gained most share, and the kind that lost most. About files like this in general, not this one, and an estimate, since a kind is a pattern in the words.
In this repository15 other files it gives its agents.
- craftSkill
- game-architectureSkill
- game-audioSkill
- game-axiomsSkill
- game-feelSkill
- game-mechanicsSkill
- game-narrativeSkill
- game-onboardingSkill
- game-playbooksSkill
- game-qualitySkill
- gameSkill
- objectSkill
- skillsSkill
- threeSkill
- worldSkill
The file
We split this AGENTS.md into the rules it gives an agent
6 rules. About 0 are common, 3 are distinctive, and 3 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
3
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 30
Brief first: before touching code, nail down one specific feeling worth being obsessive about, and write it into the brief field of …
- Very specific: line 36
Only a closed loop counts as done: after changing code you must run node harness/capture.mjs <name>, look at the shots yourself, and …
- Distinctive: line 42
Pure-code assets: no external GLTF/texture libraries.
- Very specific: line 43
Complete contract: every world exports createWorld(container) satisfying the runtime/world.js contract.
- Distinctive: line 45
Reuse, don't rebuild: when an existing work has to move to a new contract, change the wiring only — entry point, loop, contract methods.
- Distinctive: line 46
Physics is opt-in: only put Rapier on things that must move.
≈ “Common” is an estimate: at least 1 in 5 of the 40,246 AGENTS.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Makone — Make Worlds with Code
You are in a world-building repo. There is no agent layer here: you (your coding
agent) are the agent, skills/ is your knowledge, harness/ is your eyes and hands, and
the work lands in worlds/<name>/.
Read first
docs/principles.md— scar-tissue axioms, re-read before every sessiondocs/architecture.md— layers, contracts and the reasoning behind them
Routing: what does the user want to build?
| Intent | Skill to take |
| Scene / world / environment (still or alive) | skills/world/ |
| Game / something playable | skills/world/ + skills/game/ |
| A single object (a thing you hold in your hand) | skills/world/ + skills/object/ |
| Characters / creatures / NPCs · materials, light, colour · performance | skills/craft/ (pull single pages as needed) |
| Choosing the value range / palette / whether to go dark | skills/craft/palette-families.md — read it BEFORE you place lights, from any of the three routes above |
| three.js technical questions | skills/three/ |
Five layers of skills: world/ overall workflow · craft/ general craft · game/ game-specific · object/ single-object-specific · three/ API reference.
Every skill directory has a SKILL.md — its index, routing problem → page. Read that
one file, then pull only the page you need; skills/SKILL.md is the index of indexes.
Everything in this repo — code, comments, docs — is written in English. Talk to the user in their own language.
Hard rules (non-negotiable)
- Brief first: before touching code, nail down one specific feeling worth being obsessive about, and write it into the
brieffield ofworld.json— one sentence, concrete enough to smell. Then commit to a lighting key in the same file —natural(the default) ·low·high.verifymeasures the frame's value range and fails a world that contradicts its own key (skills/world/SKILL.mdstep 3). This exists because "brief first" pulls hard toward dusk, night and rain — evocative writing does — and darkness is the cheapest way to hide unfinished form. Going dark is allowed; drifting there is not. - Only a closed loop counts as done: after changing code you must run
node harness/capture.mjs <name>, look at the shots yourself, and self-assess honestly against the skill's standards. No screenshot evidence, no claiming it's done. Past the first round, shoot it--againstthe last one: judging a new frame against your memory of the old one is how a regression survives a review that looked at it. The single-file HTML is part of done, not a follow-up — a passingverifywrites it for you, andexport.mjs --checkfails if a module world has none. - Pure-code assets: no external GLTF/texture libraries. Form = procedural geometry + CSG + shaders, characters = mannequin-js.
- Complete contract: every world exports
createWorld(container)satisfying theruntime/world.jscontract. Capabilities are not declared — implementingseekTomeans you have a timeline, implementingactmeans you're playable; the harness probes for it (architecture D6). - Reuse, don't rebuild: when an existing work has to move to a new contract, change the wiring only — entry point, loop, contract methods. Its geometry, materials and tuning are the author's. If you want a different work, make a new one.
- Physics is opt-in: only put Rapier on things that must move; quality comes first.
- checkpoint = git commit: one commit per milestone, roll back with git.
worlds (details in worlds/README.md)
Flat structure, one world per directory; the category is a property inside world.json, not a directory:
type (scene/game/object, an open set). format is module for every world.
worlds/index.json is generated by harness/catalog.mjs and is the sole data contract for the gallery and downstream sites.
New works are always module format, named with a single lowercase word (no - or _).
Common commands
node harness/serve.mjs # local static server (open http://localhost:5180/ for the gallery)
node harness/create.mjs <name> --type scene --brief "..."
node harness/capture.mjs <name> --shots 4 # orbit shots; --arc a0,a1 for walled scenes; --at 0,0.5,0.9 for timelines; --after s to simulate first
node harness/capture.mjs <name> --hero # ONE frame at 1920×1080 — the look-before-you-call-it-done shot
node harness/capture.mjs <name> --against # the same frames again, beside last round's, with a
# number on each. Shots are overwritten every run, so
# without this every round is judged against MEMORY of
# the last one — which is how a world lost a starfish
# under its own floor for two rounds and nobody noticed
# something had stopped being in the picture.
# Declare `capture.views` in world.json (named eye/at
# viewpoints) so the labels are stable and the
# comparison means something.
node harness/capture.mjs <name> --play 62,250 # PLAYABLE worlds: drive it through pilot.js and shoot at those
# simulated seconds. Without it a game is only ever photographed
# standing still on its first frame — two of the games in here have
# a complete visual record of four shots of their own title card.
# Combines with --hero: `--play 64 --hero` is the money shot.
node harness/verify.mjs <name> --quick # ~15s: does it still LOAD, is the console clean, is the
# exported bundle still current. Nothing else. Run it after
# any edit you were about to call done without looking —
# a world sat broken for a whole round because a string
# replace missed and nothing had loaded it since
node harness/probe.mjs <name> --scout x,y,z --dist 0.3 # WHERE can this point be seen from? one ray per
# candidate, so a whole sphere of viewpoints costs less than one
# screenshot. A camera inside a wall and a camera looking at a wall
# render the same rectangle — hunting a viewpoint by re-rendering
# is a slot machine, and this is the way out of it
node harness/probe.mjs <name> --look a,b,c --at x,y,z # is that sight line clear, and what blocks it
node harness/probe.mjs <name> --rows # evenly spaced rows of instances that are inside each other
node harness/verify.mjs <name> # console errors / contract / budget / frameMs, JSON output (module format only)
# a PASS also refreshes worlds/<name>/<name>.html (--no-export to skip)
# read `warnings`: material traps that render as "too dark" and
# look like lighting bugs (skills/three/instancing-traps.md)
# read `hands`: real pointer + key input is driven at the world
# and every control it drew is pressed while the world ticks.
# A control that is REBUILT while the button is held can never
# be clicked (a browser only fires click when down and up land
# on the same node) — that is a hard failure, and it is how a
# crafting panel became unusable with every other gate green
# read `rows`: repeated parts whose neighbours intersect. A row's
# pitch bounds it in ONE direction and most published dimensions
# are the other one (docs/principles.md E16)
# read `chroma`: sat + hue spread. spread < 0.15 is a monochrome —
# `luma` cannot see that, and it passes every key (skills/world step 3)
# a world with a long cycle names the moments that must be judged,
# each with its own key — otherwise only its first six seconds are
# ever measured and the night never reaches the gate:
# "verify": { "at": [ { "s": 2, "key": "natural", "name": "day" },
# { "s": 64, "key": "low", "name": "night" } ] }
node harness/sweep.mjs # run verify across the WHOLE library and report
# what has rotted. Nothing else re-measures the
# worlds: export.mjs --check only compares a
# bundle's hash to its sources, so a world can sit
# on main failing its own declared key for months
# — rooftop did (docs/principles.md E14). A sweep
# is a MEASUREMENT: every child runs --no-export,
# so it cannot quietly rewrite 66 bundles.
# --quick for the cheap tier, --changed for just
# what git says you touched, --jobs N for width
node harness/botplay.mjs <name> # playable worlds only: fly the whole thing through worlds/<name>/pilot.js
# the pilot lives OUTSIDE the world and uses only observe/getState/act.
# An autopilot inside main.js proves nothing (docs/principles.md E11)
node harness/export.mjs --check # gate: every module world has a single-file bundle, and every
# bundle still matches the source beside it (each one carries
# a hash of the sources it was built from)
node harness/catalog.mjs # regenerate index.json after editing world.json (--check for a gate)Never reference a file that does not exist. The scripts in harness/ and the skills in
skills/ are the complete committed set; if a workflow seems to call for something else, check
that it is there before you write it into a doc, a comment or an instruction to the user.
One exception, and it exists because it cost a session: the covers next to every world
(cover.png / cover.gif / cover.anim.webp) are NOT made by anything in harness/. They come
from an uncommitted local script, .local/cover.mjs — one run, one camera, one set of frames,
three encodes. .local/ is gitignored, so it is missing from a fresh clone and invisible to
ls harness/ and to git log. Look there before you write a cover script; one was written
from scratch here, and it produced a cover that did not match the gallery it was going into.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

