When a change is non-trivial (a plan, a PR create or update, or a request for a visual recap), put one marker-delimited block in the PR description. GitHub renders it. It does not replace reading the diff.
When
Run the classifier. Roll up to the highest of adds, then extends, then
composes. You still choose composes vs extends from the diff. adds is a
new map entry.
| Rollup | Risk | Also |
|---|---|---|
composes |
low | Wiring and call sites only. |
extends |
medium | preview-manual-test as the seeded user with data for this change |
adds |
high | Update primitives.yaml, npm run primitives:check, and the same preview |
Update primitives.yaml when this PR adds, removes, or materially reshapes a
primitive (new id, renamed meaning, or ownership roots that must change). Do
not edit summary for ordinary feature work. Call out a touched invariant from
that map at every risk.
Plan mode uses **Mode:** plan before a PR exists. Recap mode replaces that
block from git diff <base>...HEAD.
The block shape is one example: references/block-format.md.
Command
node .agents/skills/visual-recap/scripts/classify-primitives.mjs --base <base> --head HEAD --json
node .agents/skills/visual-recap/scripts/upsert-recap-block.mjs <pr-number> <block-file>
The upsert script checks mermaid, then replaces the marker block or appends it. It does not edit text outside the markers. Re-run both commands after a significant push.
Failure
- The mermaid check exits non-zero. Fix the diagram. Do not put
;in sequence notes or messages.npm run mermaid:checkuses the same parser. - The block file must start with
<!-- system-recap:start -->and end with<!-- system-recap:end -->. gh pr editfails withResource not accessible by integration (updatePullRequest). The script still prints the merged body. Apply that body with Cursor ManagePullRequest. Do not have Kody edit the PR.- A health check or login smoke is not the medium or high preview. Do not cat the session cookie into curl or Python.