Recap the work unit as one page
What it produces
.ai/reports/NNN-recap-<slug>.html — a committed record of one range's change, printed in
chat as a file:// link beside the spec digest it carries.
Steps
Read
policy/visual-pages.mdfirst; it owns the budgets and the editorial bar. If that path is absent, refuse to author the page and restore the file — a recap written against remembered budgets is the drift the file exists to prevent.Scope the whole work unit, not the last fix: the implementation, the follow-ups, the tests and the record changes this thread made. Separate them from unrelated dirty files that existed before; if the boundary is genuinely unclear, say the assumption in one line and proceed.
Pick the base the range starts from — the approval commit for a build, the merge base for a PR — and run the command that derives the page from real bytes:
ai-eng report recap --spec <NNN> --base <ref> --summary "<1-3 paragraphs>"The file-tree and every excerpt come from
git diffover that range; the renderer refuses an excerpt that is not a real hunk. The summary is yours, and every claim in it names a file the diff touches.Show the link the command prints. A recap nobody clicks is a file.
Skip the page for a change that reviews faster as a plain diff — a small, single-file or obvious one. A recap is review overhead; say "one file, plain diff is enough" and stop.
UI changes need the visual named. When the range changed rendered UI, the summary names the components the diff touched and the before/after wireframes live on the plan's view page, where blocks are authored — the recap is derived from bytes and invents none.
Never re-read the whole diff twice: the budgets are the cost ceiling as much as the shape rule, and a recap that dumps is a recap the reviewer scrolls past.
Done when
ai-eng report recapexited 0, the page matches the reports-home shapedoctorchecks, and itsfile://link is in the reply.- The page's file list equals
git diff --name-statusover the same range.
What this is not
- "The agent that built it can vouch for it, so the narrative can come from memory" — a recap block invented from conversation instead of the diff is the failure this page exists to prevent; the command refuses the fabricated hunk, and the reviewer's job starts where the tool's does.
- "Every change deserves a recap" — under the tab floor the change is small, and the honest output is the plain diff plus one sentence saying why no page.