--- name: delegating title: Delegating the writing description: >- Use when a feature has been agreed and somebody has to type it — how to hand the writing to a cheaper agent, what a brief has to contain, and how to review what comes back. Also read it before deciding NOT to delegate, because most of the cost of doing it yourself is invisible until the context runs out. version: 1 --- # Why this exists The owner's architecture, somebody else's typing, and the owner's reviewer in the middle. That division is the whole point: the expensive model should be spending its context on decisions, not on writing out six locale files or the same form for the fourth time. Set as a standing way of working on 2026-08-24. It is not a suggestion to consider per task — when a feature is agreed and the remaining work is typing, it goes to an agent. # What stays here and what goes **Stays.** The design. Which boundary moves, what a thing is called, what the failure modes are, and whether the result is right. If a decision has to be made while the code is being written, the brief was incomplete — that is a fault in the brief, not a reason to take the work back. **Goes.** Everything mechanical and everything wide: a change repeated across many files, translations, a form, a migration over a list of call sites, tests for a rule already agreed. **Does not go.** Anything where a wrong guess is expensive and quiet — permission checks, credential handling, anything that deletes. Not because a smaller model cannot write them, but because reviewing them properly costs as much as writing them, so nothing is saved. # The brief An agent that has to ask a question has already cost more than it saved. So the brief carries: - **The exact files**, by path. Not "the locale files" — list them. - **The pattern to follow**, by pointing at a file that already does it. "Same shape as `pt-PT.json`" is worth more than any description. - **What must not change.** Key names, public exports, anything another file imports. - **How it verifies itself**: `bunx tsgo`, `bun test`, `bunx prettier --write `. Say that a red typecheck is not done, or it will report success with a broken tree. - **What done looks like**, in one sentence it can check itself against. Run it in the background and carry on. A brief good enough to run unattended is the same brief that makes the result reviewable. # Choosing the model **The cheapest one that will get it right.** Not the cheapest one; the cheapest one that will get it right, which is a different question and has to be asked per task. - **Haiku** — mechanical and high-volume with no judgement in it. A rename across forty call sites, a JSON transform, moving a block of files to a new shape. - **Sonnet** — the default, and what most of this work is. A feature whose design is settled and whose brief names the files: translations, a form, tests for a rule already agreed, a migration over a list. - **Opus** — when the work still contains a decision. Which usually means the brief is incomplete, so the first move is to finish the brief rather than to spend more per token on writing it. ## Cheapness is a property of the pair, not the model A cheap model on a vague brief is the most expensive option available: it returns something plausible, you review it, you reject it, you write the brief you should have written, and you pay for the whole round twice. The saving comes from the brief being good enough that a smaller model cannot go wrong — so if you find yourself reaching for a bigger model to compensate for a thin brief, fix the brief. The other direction is real too, and cheaper to correct: a task that comes back wrong from Haiku goes to Sonnet and costs one wasted run. Start low. # Reviewing what comes back **Read the diff, not the summary.** The summary is written by the thing being reviewed. `git diff` is not. **Run the checks yourself.** `bunx tsgo && bun test` in the real tree. An agent reporting green has reported what it believes. **Then it is yours.** It goes out under your commit and your name, so a mistake in it is not the agent's mistake. Review it as if you had typed it, because as far as the history is concerned you did. # What went wrong the first time, so it does not go wrong again Both of these are from one night, 2026-08-24. **A dead agent was reported as running, twice.** A subagent is a sidechain in the parent session, and a tool rejection in the parent had killed it about four hours earlier. Nothing said so and the parent kept answering "still running" when asked. **Never report a subagent's state from memory — look.** If the result is not in the tree, it did not happen. **Interrupting the parent interrupts the child.** Stopping the session to say something also stops the work it was waiting on. Worth knowing before assuming a long silence means progress.