Add a reconcile step to finalize-plan that compares a plan against the commits that actually shipped it, then records work that was shipped but unplanned and work that was built differently into the plan spec, so a published plan artifact describes what was built rather than only what was imagined before the work started.
finalize-plan only ever asked whether each planned thing was built, so a plan that grew scope during implementation was marked completed while its published artifact still described the original scope. Step 3d asks the other direction and routes the answer into sections the renderer already handles; done means unplanned work and changed approaches reach the shared page.
Read and implement all steps in the plan at docs/plans/add-shipped-scope-reconcile.md — Reconcile a plan against what actually shipped. Verify against the plan's Tests, Verification, and Acceptance Criteria before reporting done. If everything passed, mark completion in docs/plans/add-shipped-scope-reconcile.md — tick each step's [x] marker and each criterion's - [x], set status: completed — and re-render the HTML from the spec. If any check failed, leave status: in-progress and say which.
More ways to run this plan — goal & workflow prompts, file path
Achieve this goal: Reconcile a plan against what actually shipped. The plan at docs/plans/add-shipped-scope-reconcile.md describes one approach — use it as reference, but optimize for the outcome. Fan out across parallel subagents where that serves the outcome. Verify against the plan's Tests, Verification, and Acceptance Criteria before reporting done. If everything passed, mark completion in docs/plans/add-shipped-scope-reconcile.md — tick each step's [x] marker and each criterion's - [x], set status: completed — and re-render the HTML from the spec. If any check failed, leave status: in-progress and say which.
Run a workflow to implement the plan at docs/plans/add-shipped-scope-reconcile.md — Reconcile a plan against what actually shipped. Brief subagents with the plan file at docs/plans/add-shipped-scope-reconcile.md. Reserve a final verification phase for the lead agent, not a subagent. Verify against the plan's Tests, Verification, and Acceptance Criteria before reporting done. If everything passed, mark completion in docs/plans/add-shipped-scope-reconcile.md — tick each step's [x] marker and each criterion's - [x], set status: completed — and re-render the HTML from the spec. If any check failed, leave status: in-progress and say which.
add-shipped-scope-reconcile.html
docs/plans/add-shipped-scope-reconcile.html
docs/plans/add-shipped-scope-reconcile.md
Context
The story behind this plan — what prompted the work and why it matters now.
plan-agent already keeps a published plan's todo and status state current.finalize-plan ticks criteria from codebase evidence, writes a## Completion Report, re-renders, and republishes to the spec'sartifact-url: (9.9.0); plan-status Step 8 republishes after a status write.
All of that answers one direction of one question: was each planned thing
built? Nothing ever asked what got built that the plan never mentions. A
plan whose implementation grew a new file, a new flag, or a different approach
was marked completed with its shared claude.ai page still describing the
original scope. The under-reporting is silent and public — the page is what
everyone else reads.
The obvious shape, a new ## What Shipped section, was rejected: the spec
parser in plan-spec.mjs recognises a fixed set of headings and silently drops
anything else on the next rebuild, so a new section costs parse, render,buildDigest round-trip, extractSections, and CSS. Reusing the existing## Completion Report was also rejected — every entry there renders with a red
dot (.report-list dt::before), which reads as a defect, and work that shipped
fine is not a defect. Routing the four buckets into sections the renderer
already handles costs no renderer change at all.
Decisions
Choices already settled — read these before re-opening any of them.
- Reconcile extends
finalize-planrather than becoming its own skill — that skill already resolves the plan, scores evidence, writes the spec, re-renders, and republishes to the artifact URL; a separate skill would duplicate all five. - Evidence comes from git, not
gh— the spec's own commit history is precise because this repo commits the plan file alongside the change it describes, and it needs no auth. - Unplanned work is written as a
[x]step rather than a prose note — the step list is what a reader treats as the record of what was built.
Files that change
Every file this plan touches, and what happens to each one.
- `kit/plugins/plan-agent/skills/finalize-plan/references/
evidence-analysis.md`modified Step 3d, the commit range and the bucketing tablewrite-completions.md`modified 5c2, 5d2, and the scoped 5d removal
`kit/plugins/plan-agent/skills/finalize-plan/SKILL.md`modified names 3d and 5c2/5d2 so the model reaches them- `kit/plugins/plan-agent/
README.md`modified user-facing descriptionCHANGELOG.md`modified 9.11.0
`.claude-plugin/marketplace.json`modified version 9.10.1 to 9.11.0`tests/plugins/test-plan-reconcile.sh`new the objective test
Steps
The step-by-step work, in order — each step says what to do, why it matters, and how to check it worked.
tests/plugins/test-plan-reconcile.sh and confirm it fails.
bash tests/plugins/test-plan-reconcile.sh exits non-zero, reporting 11 failures.### 3d — Reconcile against what shipped to references/evidence-analysis.md, between 3c and Step 4.
5c2 and 5d2 to references/write-completions.md, and scope 5d's removal rule to its own section.
finalize-plan/SKILL.md.
plan-agent to 9.11.0 in .claude-plugin/marketplace.json.
BASE_REF=main node scripts/check-plugin-versions.mjs exits 0.bash scripts/verify.sh exits 0.Tests
The tests that prove the change does what it promises.
finalize-plan carries a rule for every reconcile bucket, so unplanned and differently-built work reaches the spec. File: tests/plugins/test-plan-reconcile.sh; Type: smoke; Asserts: the core names Step 3d, 3d derives its range from git log --follow with an ...HEAD fallback and names both new buckets, 5c2 writes an Unplanned: step under a trailing ### Phase: Unplanned in phased specs, 5d2 routes a changed approach to ## Decisions, and 5d's removal is scoped so it cannot discard either write; Run: bash tests/plugins/test-plan-reconcile.shDefinition of done
The plan counts as done when every statement below is true — check each one off as you verify it.
Final check
One last pass to confirm the whole change works end to end.
Run bash tests/plugins/test-plan-reconcile.sh — 11 checks, all passing.
Then run bash scripts/verify.sh and confirm it exits 0, which covers the
skill-frontmatter, description-budget, and progressive-disclosure tests that a
prose addition to a SKILL.md can trip. Confirm git diff --stat touches no
file under kit/plugins/plan-agent/scripts/, which is the claim that the
feature needed no renderer change.
Wrapping up
Three gates that must all pass before this plan is marked completed.
Completion Report
No items to report — all requirements met.