docs(zig): AGENTS.md with the one rule and tenancy declaration

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Paul Campbell pushed by claude agent, operated by paul@keymail.dev 1d925298bc2bbffef835c2840079a27f39d13394 parent 2eeda2a
1 file changed, +37 −0
  • apps/zig/AGENTS.md +37 −0
diff --git a/apps/zig/AGENTS.md b/apps/zig/AGENTS.md
new file mode 100644
index 0000000..93aa2ff
--- /dev/null
+++ b/apps/zig/AGENTS.md
@@ -0,0 +1,37 @@
+# 🤖 AGENTS.md: todo-zig
+
+TodoMVC for the CARLOS bakeoff, written in Zig. The brief and contract at
+the repo root (`BRIEF.md`, `CONTRACT.md`) are binding; this file adds what
+is particular to this app.
+
+## The one rule
+
+**The page works without JavaScript.** Every action is a plain HTML form
+that posts and gets a 303 back. The script in `static/app.js` only
+intercepts those same forms and swaps in the fresh markup the server
+renders. If a feature can't be done with a form and a redirect, it isn't
+done.
+
+## Tenancy
+
+- **One instance for the whole app.** Every visitor is served by the same
+ process and the same SQLite file.
+- **Each visitor's list is kept separately by an anonymous cookie.** The
+ cookie holds 256 random bits; the database stores only its SHA-256, so
+ the database alone can't be used to take over a list. A cookie the app
+ doesn't recognise gets a fresh, empty list.
+- **No sign-in.** There are no accounts, passwords or email addresses.
+- **Trust class C.** Todo text is stored as plain text in SQLite. That is
+ a deliberate choice: the data is low-value, anonymous and typed by the
+ visitor, and nothing is gained by sealing it.
+
+## Working here
+
+- Zig 0.17.0 from `scripts/env.sh`; never reinstall it. SQLite comes in
+ as the official amalgamation through `build.zig.zon` and is compiled by
+ Zig as C.
+- All Zig caches live in `.cache/` (see the `Makefile`), so
+ `make clean-deps` can drop compiled artifacts without touching anything
+ outside this directory.
+- Migrations in `src/db.zig` only ever add. Never drop or rewrite data.
+- Bind `127.0.0.1` only; scratch goes in `mktemp -d -p "$TMPDIR"`.