The plan-todo loop¶
Statefulness is compaction made durable. The sprint mandate lives in two files, not in any agent's head — agents get compacted, files don't.
The loop¶
- Receive the big ask. A huge list of instructions, a pivot, a brain-dump. It MUST include (or you must extract) explicit testing criteria — what "verified" means for each chunk. If criteria are missing, derive them from the repo's test suite and say so; don't ask.
- Write the unordered TODO (
TODO.mdat repo root). Every item goes in — scope capture, nothing lost. No ordering, no priority anxiety. Include the verification criteria with each item where they're known. - Write the ordered PLAN (
PLAN.mdat repo root). Numbered phases, numbered items inside phases. Each item: do it, verify it, mark it done, move on. Put the build command at the top. If phases execute out of numeric order, say so at the top ("Current trajectory: 10 → 11 → 12 → 9.6–9.8"). -
Put the mandate at the top of BOTH files, verbatim:
## DO NOT ASK USER FOR FEEDBACK — THIS IS THE USER FEEDBACK. ## DO NOT ASK USER FOR NEXT STEPS — THESE ARE THE NEXT STEPS.
Any future agent — compacted, delegated, or fresh — reads the files first and inherits the mandate without needing the conversation that produced it. 5. Work the PLAN, top uncompleted item first. When you finish an item: - Verify it against its stated criteria (build, test, live eyeball — whatever the item says). No criteria were written? The repo's test suite is the floor. - Do NOT stop to seek feedback. - Mark it done in BOTH TODO.md and PLAN.md (with a one-line evidence note: date + what verified it). - Proceed to the next PLAN item. - Continue until everything in TODO and PLAN is complete. 6. Done means done. Only when every item is checked (or explicitly deferred with a reason written in TODO) do you report completion and ask what's next.
Rules that keep the loop honest¶
- Scope discovered mid-work goes into TODO.md IMMEDIATELY. Never hold it in head — context gets compacted and the next agent only has the files.
- Blocked ≠ stopped. If an item is genuinely blocked (missing credential, destructive/irreversible action, real intent ambiguity), don't stall and don't guess: write the blocker into TODO/PLAN with the reason, skip to the next unblocked item, surface it in the end-of-sprint summary. Facts are for search; only genuine intent is ever asked — and a sprint almost never needs it.
- Uncommitted = unfinished. Commit at each natural checkpoint (one item or one coherent unit). A working tree full of never-compiled edits blocks everyone.
- Edit the plan files in place. One TODO.md, one PLAN.md, one truth. Never
-v2. Re-read before editing; never edit from memory. - Evidence over vibes. "Marked done" requires the thing actually ran: the build passed, the tests passed, the command was eyeballed. Write what verified it.
- The user's rapid direction changes ARE the feedback. When they interject, fold it into TODO/PLAN on the spot and keep moving — don't restart the loop.
Picking up someone else's sprint (compacted/next agent)¶
- Read
TODO.mdandPLAN.mdtop to bottom — the mandate headers apply to you. git status+git log --oneline -5: find uncommitted work. Uncommitted edits are the most likely place the last agent died — finish them FIRST (they may never have compiled).- Find the first unchecked PLAN item in the stated trajectory. Do it. Verify it. Mark it. Move on.