An agent is not done when the code compiles; it is done when it has run the thing and shown you the output.
π§ Explain like Iβm fiveBefore you say you cleaned your room, you open the door and look. You don't just say you did it.
Agents hallucinate β they will confidently report a fix that was never exercised. The single highest-leverage investment is giving them a way to check their own work: run the app, drive the UI, read the logs, render the output. Trust scales with the verification layer, not with the model.
β Do thisOne command runs everything CI runs β typecheck, lint, format check, tests, build. A verify skill tells the agent to run it and paste the real output, and to say which step could not run instead of skipping it quietly. Add scripts that exercise the app without a human: render a fixture, replay a request, drive a browser.
a single verify command.claude/skills/verify/SKILL.mdfixture / replay scriptsbrowser automation
Write down every user-facing surface with where it lives and the exact command that reproduces it.
π§ Explain like Iβm fiveA treasure map with an X on every room, so a new kid can find the kitchen without opening every door.
A vague report β βthe dialog that lists times is wrongβ β makes an agent flail through the codebase. A table mapping each surface to its entry point, renderer, data and reproduce command turns that report into a lookup. CI keeps it honest: a surface that is not on the map fails the build.
β Do thisA table with one row per route, command, screen or endpoint: its id, the file that handles it, the file that renders it, the data it touches, and a copy-pasteable command or selector that reaches it. A CI script fails when a surface id in code is missing from the table.
docs/FEATURE_MAP.mdsurface ids as named constantsa map-coverage check in CI
If you leave the same review comment twice, turn it into a lint rule or a CI check.
π§ Explain like Iβm fiveInstead of reminding your brother not to touch the stove every day, you put a gate in front of it.
Instructions in a prompt are suggestions; a failing build is not. Ban whole patterns mechanically β a risky API, cross-layer imports, secrets in client code. The agent does not have to remember the rule, because the rule will not let it through.
β Do thisLayer boundaries enforced by import-restriction lint rules, not by a paragraph in the agent guide. Server-only modules that fail the build if pulled into client code. Migrations checked against the schema and applied from empty in CI. The package manager pinned so the wrong one refuses to install. A table in the docs that maps each rule to what enforces it.
lint import restrictionsserver-only guardsrequired CI checksrule β enforcer table
Put everything one feature needs β handler, renderer, parser, tests β in one directory.
π§ Explain like Iβm fiveEach board game keeps its own pieces in its own box, so you never have to dig through a giant pile.
An agent scoped to one directory makes small, reviewable changes and cannot accidentally reach into another feature. Organizing by type (all handlers here, all views there) forces every change to touch the whole tree, which is exactly the kind of diff you cannot trust.
β Do thisfeatures/<name>/ holds that feature's entry point, rendering, input parsing and tests. Pure domain logic sits in its own layer with no I/O. A skill spells out the steps for adding a new surface so it lands in the right places the first time.
features/<name>/a pure domain layer.claude/skills/add-<surface>/SKILL.md
Agent instructions are code: test them with fixed scenarios and hill-climb until they pass reliably.
π§ Explain like Iβm fiveWhen you teach someone a card game, you play a few practice rounds to check they really got the rules.
Changing a sentence in the agent guide can silently change behavior. An eval playbook is a set of prompts with pass criteria, run in fresh sessions and scored. A scenario that needed a nudge is an instruction bug β fix the sentence, and add a guardrail if the mistake was mechanical.
β Do thisA table of scenarios β including ones the agent should refuse, like putting I/O in the domain layer β each with pass criteria. Score 2 (passed alone), 1 (passed after one nudge), 0 (failed). Log runs as dated, append-only notes, and change skills only through PRs.
docs/EVALS.mddated eval logsAGENTS.md.claude/skills/