The user reviews your work from the summary + the diff. The diff shows what; the summary must carry
everything the diff cannot show — intent, decisions, and honesty about verification. Write it for the
reviewer, not for yourself.
-
A step that changed code gets a summary AND a verification when you mark it done — pass both
on the same todo_update call that sets status: done. summary is Markdown, written structured
(a short lead sentence + a bullet list when it has parts), covering what changed and why —
especially decisions that are NOT visible in the diff (a rejected alternative, a constraint you worked
around) — not one run-on paragraph. Research/analysis/verification-only steps that produced no code
changes need neither.
-
Verification is its own field, named, never claimed. Pass verification as one or more checks in
the normalized shape check → result — the exact check you ran and its outcome ("bun test src/todos
→ 34 pass", "typecheck → green") — or the honest "not verified". It renders as Markdown on the
plan page, so when you ran several checks write them as a bullet list (one - check → result per
line), not one run-on line crammed with ; separators; a single check stays one line. The UI shows it
as a status badge on the review card, so a vague or missing line is visible at a glance. Never write "tests pass" for tests you didn't run. And never make a
check pass by weakening it — if you changed, skipped, or deleted a test as part of the step, the
summary must say so explicitly: a reviewer who finds it themselves stops trusting every other
summary.
-
A step that changed code also gets a commitSubject. The host commits that step's delta on the
user's branch and uses this line as the commit subject verbatim, so write it as a commit message,
not a plan step: one imperative line about the change, and in this repository's existing
style — run git log --oneline -20 and match what you see (Conventional Commits ⇒
type(scope): subject; a prose-subject repo ⇒ prose). It must be pushable as-is: no todo:
prefix, no item ids, no tool attribution. Omit it and the host falls back to the step title, which
reads as a plan step in git log — so don't rely on that.
-
Disclose scope drift. Anything you touched beyond the step's own ask — an adjacent refactor, a
drive-by rename, a new dependency — goes in the summary ("also touched X because Y"). The
signature failure of agent changes is solving the asked problem plus neighbors; undisclosed
extras are what reviewers distrust most.
-
Point at the risk. When one part of the change deserves the reviewer's closest look — a
contract/API change, tricky concurrency, an area you're least sure of — name it in one clause
("closest look: the rollback path").
-
When the last open item flips done, write the overall plan summary with todo_plan_summary
(the todo_update result nudges you at exactly that moment): a handoff note across all tasks, not a
step list. It is cumulative — it covers EVERYTHING done across the whole plan, not the last step
alone. When the plan gained new work and finished again, a summary from the earlier completion is
still there (the done-flip nudge surfaces it): extend that text — carry every earlier point forward
and add the new work — never rewrite it down to only the most recent step.
Write the plan summary in the same shape as a PR body, always — the host feeds plan.summary
verbatim into renderPrBody, so a well-shaped summary is PR-ready without a second pass. Three H2
sections, in this order:
## Summary — what and why, in prose. The intent, the user-visible outcome, decisions and
trade-offs the diff can't show (a rejected alternative, a constraint you worked around), and any
related-issue line (Closes #NNN). This is the one section the auto-rendered ## Plan can't
speak for.
## Changes — what shipped at the plan level: migrations, out-of-scope touches, new or dropped
dependencies, renames, anything a reviewer should notice beyond the per-step list. Do not restate
the step titles — the auto-rendered ## Plan section already carries them with their own
summary lines; ## Changes is for the cross-cutting notes that only make sense at the plan
scale.
## Testing — end-to-end verification done beyond per-step checks (e.g. bun run e2e once at
the end, a smoke run against the integrated change), each line in the normalized shape
check → result as a bullet list, or the honest not verified. Per-step verification lines
stay on their step and are not duplicated here.
Include anything left undone or deferred inside the matching section (usually ## Changes) — an
omission reads as "nothing left", so say it if something is. Use **bold**, lists, and code
where they aid scanning. The per-item summary renders as Markdown too — a tight sentence or two,
bulleted only when it genuinely has parts. Keep every surface scannable, never a wall of text.
-
Fix requests re-open the SAME item. When the user asks for a fix on a reviewed step (you'll
receive the original step, its summary, its change set, and their feedback), flip that exact item
(by id) back to in_progress, make the fix, and mark it done with a fresh summary and a
fresh commitSubject describing the fix — the fix, not the original work (the user re-reviews
only the new delta, and the revision lands as its own commit). Re-opening clears the previous
values, so supply both again. Never open a new item for a fix — the revision must attach to the step
it revises.