From vp-beads
Run a sprint retrospective for this project. Use when the user says 'retrospective', 'retro', 'close out the sprint', 'what went well', 'generate retro', or wants to generate a RETRO-NN.md file. Reads UPSTREAM-*.md files, recent git history, and conversation context to pre-populate the retrospective. Do NOT use for read-only sprint summaries — use the sprint-review agent for that.
How this skill is triggered — by the user, by Claude, or both
Slash command
/vp-beads:retrospectiveRETRO-*.mdUPSTREAM-*.mdSYNERGY-*.mdThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Generate a sprint retrospective for this project. If the project `CLAUDE.md` has
Generate a sprint retrospective for this project. If the project CLAUDE.md has
a Sprint retrospectives section with a template, use it; otherwise use the
template below.
Retrospective files are named RETRO-NN.md in the project root. Each covers one
sprint's worth of work.
Beads is available iff a .beads/ directory exists and command -v bd
succeeds; this component is Tier C per CLAUDE.md
### Beads-availability convention. Steps 1–3 and the UPSTREAM / SYNERGY /
Basic Memory parts of the trend review are beads-independent and run unchanged.
When beads is unavailable, the three bd-dependent steps degrade and
announce (never skip silently):
bd health checks with an announced
skip line in the RETRO ### Health audit subsection (see step 4).### Follow-ups (untracked) task list to the
RETRO file instead of running bd create (see step 5).### Decisions
block in the RETRO file instead of bd create --type=decision (see step 5).ls RETRO-*.md | sort -V | tail -1
Extract the highest sprint number and increment by 1.
This file count is canonical for the trend-review heuristic in step 4 —
do not substitute a user-asserted topic number, release number, or bd
sprint label. If RETRO-NN.md count is divisible by 4, this IS a
trend-review sprint regardless of how the work is verbally framed.
Run these in parallel:
Recent commits since last retro:
# Anchor to the commit that created/last modified the previous RETRO file.
# Edge cases that both result in full-history range (correct for Sprint 1):
# 1. No prior RETRO-*.md files exist yet
# 2. RETRO files are gitignored — git log -- RETRO-*.md returns empty
# In both cases the inner git log returns empty, making the range "..HEAD"
# which shows all commits — the right behavior for a first retrospective.
git log --oneline "$(git log -1 --format=%H -- RETRO-*.md)"..HEAD --no-merges
Current upstream status:
UPSTREAM-*.md files and read themCurrent synergy status:
SYNERGY-*.md files and read themReadiness: ready,
Divergences with Convergence path: adopt-theirs or propose-shared,
They Have / We Don't with Priority: adopt-soonStatus: driftingRecent conversation context:
Test and coverage status:
Check package.json scripts for a test command. Try in order:
npm test (if a test script exists)npm run test:node (if a test:node script exists)npm run test (if a test script exists under another variant)npm run check (if a check script exists — used by validation-suite projects like this one, vp-knowledge, vp-git)Run the first that exists and show the last 5 lines of output.
Create RETRO-{N}.md using this template (omit ### Synergy observations
if no SYNERGY-*.md files were found in step 2):
## Sprint {N} Retrospective — {YYYY-MM-DD}
### What went well
- ...
### What could improve
- ...
### Upstream observations
<!-- Review recent work — anything to add to UPSTREAM-*.md files? -->
- ...
### Synergy observations
<!-- From SYNERGY-*.md: extraction-ready candidates first, then drifting
patterns, then active convergence paths. Omit if no SYNERGY files. -->
- **Extraction Candidates ready:** <!-- e.g. "validate-helpers (vp-knowledge) — Readiness: ready" or "none" -->
- **Drifting shared patterns:** <!-- e.g. "BM note format — drifting since 2026-01" or "none" -->
- **Active convergence paths:** <!-- e.g. "error handling — adopt-theirs from vp-knowledge" or "none" -->
- **New patterns logged this sprint:** <!-- e.g. "Logged 2 new Extraction Candidates" or "none" -->
- **Stale entries flagged:** <!-- entries >3 months old, or "none" -->
### Lessons learned
- ...
Section guidelines:
/upstream-tracker workflow 1 (Log a new entry). Review recent
session work — did any workarounds or local extensions get built this sprint
that are self-contained enough to contribute back? If yes, log via
/upstream-tracker workflow 1 (Log a new entry) with type "Upstream
Opportunity". Note trends across packages.
Flag stale items (>3 months old)./synergy-tracker workflow 1 (Log a synergy
entry). Report
extraction candidates with Readiness: ready as sprint-actionable. If any
candidates were acted on this sprint, record the outcome. Review recent
session work — did any implementation reveal shared patterns with sibling
projects, or produce logic worth extracting into a shared package? If yes,
log via /synergy-tracker workflow 1 (Log a synergy entry). Note trends across sibling projects.
Flag stale entries (>3 months old). If no SYNERGY files exist, omit this
section from the generated RETRO-NN.md entirely.If this is every 4th sprint (Sprint 4, 8, 12, ...), also perform a trend review: (Sprint number is the file count from step 1, not a topic-asserted number.)
UPSTREAM files: Review all UPSTREAM-*.md files — identify common trends,
evaluate whether open items are still valid, delete non-vendor files with no
remaining entries.
SYNERGY files: Review all SYNERGY-*.md files — identify stale entries
(>3 months), evaluate whether Shared Patterns are still aligned or have
drifted, check if Extraction Candidates with Readiness: ready have been acted
on, and review whether adopt-theirs Divergences have been adopted.
Health audit: Run bd's full health vocabulary in parallel — five focused
checks covering infrastructure, template compliance, lifecycle hygiene,
reference integrity, and dependency-graph integrity. Each command emits JSON
for stable parsing. Surface counts plus the top 3–5 affected items per check
in the generated RETRO-NN.md under a ### Health audit subsection.
Beads unavailable (Tier C): skip the bd health checks and render the
subsection as a single announced line instead — - _Skipped — beads not active in this project._ The UPSTREAM and SYNERGY trend-review parts above and the
Basic Memory graph health below are beads-independent and still run.
bd doctor --json # Infrastructure: outdated hooks, gitignore drift, remote config
bd lint --json # Template compliance: issues missing required sections per type
bd stale --json # Lifecycle: issues with no recent activity
bd orphans --json # Reference integrity: refs in commits but issue still open
bd graph check --json # Dependency graph: cycles, dangling refs (schema_version: 1)
Per-check guidance:
bd doctor --json — parse warnings[]. Auto-fix is gated on user
consent: present the warning list and prompt before invoking
bd doctor --fix --yes. Never auto-apply. Note the false positive on the
Claude Hook Completeness check — it sometimes flags hooks that are
intentionally absent or installed via a plugin (see UPSTREAM-brew--beads.md
for the open friction entry); skip the prompt for that warning class until it
is resolved upstream.bd lint --json — parse issues[]. No auto-fix; lint findings require
human triage. List affected issue IDs with the missing section names so the
maintainer can update them (e.g., bd update <id> adding
## Acceptance Criteria to a feature).bd stale --json — parse issues[]. No auto-fix; suggest one of three
human actions per issue: defer (lower priority), close (no longer relevant),
or work (claim and progress).bd orphans --json — parse issues[]. If --json is unavailable on the
installed bd version, fall back to text parsing of bd orphans output.
No auto-fix; suggest closing the issue or unmarking the orphan reference.bd graph check --json — parse the schema-versioned envelope
({"clean": bool, "cycles": [...] | null, "schema_version": 1, "summary": {...}}).
When clean: false, surface cycle paths and dangling refs with fix
recommendations (typically bd dep remove <blocker> <blocked> to break
a cycle, or bd close for stale references — bd dep uses subcommands,
not flag-form). No auto-fix.Render in the RETRO file as:
### Health audit
- **Infrastructure (`bd doctor`):** {N} warnings — {top items, or "clean"}
- **Template compliance (`bd lint`):** {N} issues — {top items, or "clean"}
- **Lifecycle (`bd stale`):** {N} stale issues — {top items, or "clean"}
- **Reference integrity (`bd orphans`):** {N} orphans — {top items, or "clean"}
- **Dependency graph (`bd graph check`):** {clean | N cycles, top items}
- **Stats (`bd stats`):** {total / open / in_progress / closed / ready / blocked counts}
- **Blocked review (`bd blocked`):** {list blocked issues; for each, run `bd show <id>` to identify its blockers and flag any blockers whose status is currently `closed` — these need `bd update` to re-evaluate readiness}
- **`bd compact` candidates:** {manual judgment — list closed-issue count and flag if >150 closed since last compact, otherwise "below threshold"}
Basic Memory graph health (via Basic Memory MCP tools):
mcp__basic-memory__schema_validate with note_type="npm_package" and again with note_type="engineering"mcp__basic-memory__schema_diff on both types to detect drift (new observation categories in use but not in schema, or schema fields rarely used)type, call mcp__basic-memory__schema_infer and consider creating a new schematype and tags, ## Observations, ## RelationsBasic Memory notes (project-independent knowledge base): Basic Memory is a
cross-project knowledge store — notes there must be written from a general
engineering perspective, not referencing project-specific file paths, table names,
or project structure. Vendor package names (e.g., @scope/vendor-package) are
fine since they're real npm packages. Mentioning this project by name is okay
when genuinely relevant — just don't make notes only useful within this project.
Call mcp__basic-memory__search_notes and:
Review the "What could improve" and "Lessons learned" sections for actionable items that aren't already tracked. Create beads issues for each:
bd create "..." -t bug|task|feature|chore -p N --description "..."
(-t = type; -p = priority: 0=critical, 1=high, 2=medium, 3=low, 4=backlog)
Include code quality issues, process improvements, and any findings that need follow-up work. Skip items that are purely observational or already have open issues.
Beads unavailable (Tier C): there is no backlog to file into — instead
append a ### Follow-ups (untracked) task list to the RETRO-NN.md file, one
checkbox per actionable finding, so the items are still captured:
### Follow-ups (untracked)
- [ ] {finding} — {type}, {priority}
Announce that follow-ups were written to the RETRO file rather than created as beads (they can be filed later if beads is adopted).
Decision capture. When a sprint outcome is a decision (an architectural
or product choice with explicit rationale and rejected alternatives) rather
than a task, bug, or feature, file it as the decision issue type — not a
generic task. Decision-typed issues are queryable as ADRs and follow the
supersede workflow.
Recognize a decision when the sprint surfaced any of:
supersede to link)For each decision, prompt the user to either:
Invoke the upstream /beads:decision slash command — preferred path.
The command lives in the upstream beads plugin (NOT vp-beads) and wraps
bd create --type=decision with structured templates plus
record/list/show/supersede operations. Use this for the full lifecycle.
Or create directly via bd create --type=decision with the four-section
template:
## Decision
## Rationale
## Alternatives Considered
## Affects
The first three are required by validation.on-create=error; ## Affects
is conventional and lists impacted components, files, or future work.
Lifecycle: decision-typed issues stay open while the decision is in
force. open = active decision, closed = superseded or reversed (NOT
closed-on-create). The retrospective never auto-closes decisions — the
upstream /beads:decision slash command handles supersession when the
decision is later revised. Cross-reference that command for the full
lifecycle (record/list/show/supersede) rather than implementing it here.
Beads unavailable (Tier C): record the decision inline in RETRO-NN.md as a
### Decisions block carrying the same four sections, instead of
bd create --type=decision:
### Decisions
**{decision title}**
- **Decision:** {the choice made}
- **Rationale:** {why}
- **Alternatives considered:** {rejected options}
- **Affects:** {impacted components, files, or future work}
Announce that the decision was captured in the RETRO file; it can be promoted
to a decision-typed bead later if beads is adopted.
Run /knowledge-gaps (if vp-knowledge is installed):
/knowledge-gaps scans all package manifests in the project (npm, Rust crates,
Go modules, PHP Composer, Python PyPI, Ruby gems) and tool manifests (Brewfile,
GitHub Actions workflows, Dockerfile, VSCode extensions). It cross-references
each dependency against Basic Memory notes to identify undocumented packages and
tools.
Steps:
/knowledge-gaps — it handles all manifest types automatically. If
vp-knowledge is not installed, skip this step and note in the retrospective
under "What could improve" that knowledge gap coverage was not audited.Basic Memory is a cross-project knowledge base — it persists across all
repositories and sessions. Notes written here must be generalizable engineering
knowledge, not project-specific implementation details. Ask: "Would this note help
me on a completely different project using the same technology?" If yes, write it.
If it only makes sense in the context of this codebase, it belongs in MEMORY.md
or the project CLAUDE.md instead.
For each learning, search first, then create or update:
mcp__basic-memory__write_note to create itmcp__basic-memory__read_note first
to get exact content, then call mcp__basic-memory__edit_note with
find_replace or replace_section — never call write_note on an existing
note (it requires overwrite=True and risks replacing the full note content)Organize by engineering domain:
| Directory | Topics |
|---|---|
engineering/fastify/ | Plugin patterns, lifecycle, error handling |
engineering/frontend/ | Web components, CSS, dark mode, SSR, a11y |
engineering/database/ | Query patterns, migrations, PostgreSQL |
engineering/testing/ | Test conventions, infrastructure, coverage |
engineering/tooling/ | Linter config, build pipelines, knip |
engineering/agents/ | Orchestration, workflow, quality gates |
Guidelines:
@scope/vendor-package) is fine — they're real published packages.
Mentioning this project by name is okay when genuinely relevant — just
don't make the note only useful within this project.engineering/* notes (patterns, conventions, lessons learned). For
upstream friction about specific packages or tools, use /upstream-tracker
workflow 6 (Promote to Basic Memory) instead — it writes to the
## Upstream Friction section of entity notes (npm/*, brew/*, etc.),
avoiding duplication. For cross-project extraction opportunities tracked in
SYNERGY-*.md files, use /synergy-tracker — it manages the extraction
lifecycle and any corresponding Basic Memory notes. For packages not yet in
Basic Memory, suggest /package-intel or /tool-intel for enrichment first.
NEVER write to engineering/agents/vp-plugins-* paths from this step
— those are sibling-relationship notes owned by /synergy-tracker workflow 5
(Promote to Basic Memory). For cross-project lessons that touch a
sibling-relationship, log via /synergy-tracker workflow 1 (Log a synergy
entry) and let workflow 5 (Promote to Basic Memory) promote them; do not
shortcut the relationship-note ownership boundary by writing
engineering/agents/vp-plugins-* directly here.After writing the retro, suggest updates to:
CLAUDE.md — new conventions, gotchas, or commands discoveredMEMORY.md — stable patterns confirmed across sprintsREADME.md — if project structure or commands changedPresent suggestions to the user for approval before editing.
npx claudepluginhub voxpelli/vp-claude --plugin vp-beadsGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.