blueprint-plugin/skills/blueprint-story-reconcile/SKILL.md
Reconcile PRD requirements with a story-audit drift report. Use when marking PRD entries implemented/partial/missing, or promoting code-only stories into the PRD.
npx skillsauth add laurigates/claude-plugins blueprint-story-reconcileInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Apply the drift findings from /blueprint:story-audit back to the PRDs. Adds status markers, a Known Drift section, and (with consent) promotes candidate stories. Does not delete unimplemented requirements — they remain the roadmap.
Usage: /blueprint:story-reconcile [--audit <path>] [--prd <path>] [--apply-all] [--dry-run]
| Use this skill when... | Use alternative when... |
|------------------------|-------------------------|
| Marking PRD requirements as implemented / partial / missing after an audit | Producing the audit itself (/blueprint:story-audit) |
| Adding a "Known Drift" section to a PRD | Generating PRDs from scratch (/blueprint:derive-plans) |
| Promoting a single candidate story into the PRD with user consent | Bulk-rewriting PRDs (this skill is deliberately conservative) |
This skill only edits PRDs. Code changes belong to /blueprint:work-order. Audit re-runs belong to /blueprint:story-audit.
find docs/blueprint/audits -maxdepth 1 -name '*-story-audit.md'find docs -maxdepth 1 -name 'prds' -type dfind docs/prds -maxdepth 1 -name '*.md'find docs/blueprint -maxdepth 1 -name 'manifest.json'git branch --show-currentgit status --porcelain=v2 --branchParse $ARGUMENTS:
--audit <path>: Path to the audit artifact. Default: most-recent file matching docs/blueprint/audits/*-story-audit.md (sort lexically — date-stamped names sort correctly).--prd <path>: Limit edits to a single PRD. Default: every PRD referenced by the audit's drift table.--apply-all: Skip per-row prompts and apply every drift entry as an edit. Use only when the audit was reviewed elsewhere.--dry-run: Show the planned edits as unified diffs without writing.Execute this PRD-reconciliation workflow.
--audit <path> provided, read that file.docs/blueprint/audits/*-story-audit.md, pick the lexicographically last one (date-stamped names sort correctly)./blueprint:story-audit first."Read the audit's Drift Report section (Section 4 in the canonical template). Extract every row into a structured list:
{ status: ✅|⚠️|❌|🆕, prd_ref: <id-or-null>, capability: <name>, evidence: <text> }
Skip ✅ implemented rows — they're informational; reconcile only adds value for ⚠️, ❌, and 🆕.
If the audit also has a Story Inventory → Candidate section, merge those rows into the 🆕 group with their entry-point evidence.
For each non-✅ drift entry, determine the target PRD:
| Status | Target PRD |
|--------|-----------|
| ⚠️ partial / ❌ missing | The PRD whose prd_ref matches the entry (e.g. FR-2.3 → docs/prds/PRD-002.md) |
| 🆕 candidate | Ask the user which PRD to promote into; if no PRD covers the area, suggest creating a stub via /blueprint:derive-plans |
If --prd <path> is set, drop entries whose target PRD doesn't match.
For each target PRD, plan two kinds of edit:
A. Inline status markers for ⚠️ and ❌ entries — locate the line containing the requirement (search by prd_ref or substring of capability) and prepend the marker to the requirement line:
- FR-2.3 OCR support → server runs tesseract over uploads
becomes
- ❌ FR-2.3 OCR support → server runs tesseract over uploads (drift: dep declared but never imported)
B. A "Known Drift" appendix at the bottom of the PRD, in this exact format (idempotent — replace the section if it already exists):
## Known Drift
> Tracked by audit: `docs/blueprint/audits/<YYYY-MM-DD>-story-audit.md`
| Status | Requirement | Evidence | Action |
|--------|-------------|----------|--------|
| ❌ | FR-2.3 OCR support | dep `tesseract` declared but never imported | <work-order id or "open"> |
| ⚠️ | FR-1.4 deskew on import | implemented but only for landscape orientation | open |
For 🆕 candidate entries (Step 3 mapped them to a PRD): append a new requirement row at the end of the relevant FR section, with explicit text:
- FR-N.M (candidate, promoted from audit <YYYY-MM-DD>): <verbatim capability name>
Evidence: <entry-point file:line>
Do not renumber existing FRs — append at the end.
Skip this step when --apply-all is set.
For each PRD, show the planned edits as a unified diff and ask via AskUserQuestion:
If --dry-run is set, print the diffs and exit without prompting.
For each accepted edit, use the Edit tool to modify the PRD. Keep edits idempotent: re-running this skill against the same audit + same PRD must produce no further changes (the inline marker is already there; the Known Drift table already reflects the same rows).
After all PRD edits land:
git status --porcelain=v2 docs/prds/
If any non-PRD file shows up as modified → abort and report. This skill must only touch PRDs.
Update the task registry entry:
jq --arg now "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
--arg result "${RECONCILE_RESULT:-success}" \
--argjson edits "${EDITS_APPLIED:-0}" \
--argjson prds "${PRDS_TOUCHED:-0}" \
'.task_registry["story-reconcile"].last_completed_at = $now |
.task_registry["story-reconcile"].last_result = $result |
.task_registry["story-reconcile"].stats.runs_total = ((.task_registry["story-reconcile"].stats.runs_total // 0) + 1) |
.task_registry["story-reconcile"].stats.items_processed = $edits |
.task_registry["story-reconcile"].stats.prds_touched = $prds' \
docs/blueprint/manifest.json > docs/blueprint/manifest.json.tmp \
&& mv docs/blueprint/manifest.json.tmp docs/blueprint/manifest.json
Print the suggested commit message but do not commit automatically — the user owns the commit boundary:
docs(<scope>): reconcile PRD with story-audit <YYYY-MM-DD>
Refs docs/blueprint/audits/<YYYY-MM-DD>-story-audit.md
- Marked <N> drift entries (✅ <a> ⚠️ <b> ❌ <c>)
- Promoted <N> candidate stories
- Touched: <list of PRD paths>
Choose <scope> as the PRD prefix shared by edits (e.g. prd-001) or omit if multiple PRDs were touched.
Use AskUserQuestion to surface the obvious follow-on:
/blueprint:work-order per Tier-3 row/blueprint:story-audit| Off-limits | Why |
|------------|-----|
| Edit source code | Code changes go through /blueprint:work-order so the change has a TDD packet behind it |
| Delete unimplemented requirements | They are the roadmap. ❌ is a tracked status, not a delete signal. |
| Auto-create GitHub issues for drift | Audit + reconcile are local artifacts; issue filing is an explicit user action |
| Renumber FRs to "tidy up" | FR numbers are referenced from tests, commits, and other PRDs — renumbering is an unsafe, non-idempotent edit |
| Commit changes | Commit boundaries are the user's decision; this skill prints the suggested message and stops |
Re-running this skill against the same audit + same PRDs must be a no-op. The two mechanisms:
⚠️ , ❌ , 🆕 ) are detected before insertion. If the requirement line already starts with the right marker, skip.## Known Drift section is replaced wholesale by the new content, never appended.If a re-run produces changes, that is a bug — file it.
| Context | Command |
|---------|---------|
| Find latest audit | find docs/blueprint/audits -maxdepth 1 -name '*-story-audit.md' |
| Show audit drift section | awk '/^## 4\. Drift Report/,/^## 5\. /' <audit-path> |
| Detect existing Known Drift | grep -c '^## Known Drift' docs/prds/*.md |
| Locate FR by id | grep -n 'FR-2\.3' docs/prds/*.md |
| Count PRD files | find docs/prds -maxdepth 1 -name '*.md' |
| Verify only-PRDs touched | git status --porcelain=v2 docs/prds/ |
For drift-marker conventions, the full Known-Drift section format, and idempotency edge cases, see REFERENCE.md.
tools
Scaffold a new ComfyUI custom-node repo (pyproject, CI, release-please, vitest+pytest, JS extension skeleton) in the picker/gesture vein. Use when bootstrapping or init-ing a comfyui node pack.
tools
Orchestrate a ComfyUI node pack from idea to registry: scaffold, create + seed the repo, open the gitops adoption PR. Use when releasing or spinning up a new comfyui node pack.
testing
macOS EndpointSecurity/EDR high CPU & battery drain. Use when Kandji ESF / XProtect pegs a core; trace the exec storm via powermetrics + eslogger.
development
odiff pixel-by-pixel image diffing. Use when comparing screenshots, detecting visual regressions, diffing before/after PNGs, asserting golden images.