| name | retrospective |
| description | 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. |
| user-invocable | true |
| paths | ["RETRO-*.md","UPSTREAM-*.md","SYNERGY-*.md"] |
| allowed-tools | ["Read","Edit","Write","Glob","Grep","Bash","Skill","mcp__basic-memory__search_notes","mcp__basic-memory__read_note","mcp__basic-memory__write_note","mcp__basic-memory__edit_note","mcp__basic-memory__schema_validate","mcp__basic-memory__schema_diff","mcp__basic-memory__schema_infer"] |
Sprint Retrospective
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.
Context
Retrospective files are named RETRO-NN.md in the project root. Each covers one
sprint's worth of work.
Workflow
1. Determine sprint number
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.
2. Gather context
Run these in parallel:
Recent commits since last retro:
git log --oneline "$(git log -1 --format=%H -- RETRO-*.md)"..HEAD --no-merges
Current upstream status:
- Glob for all
UPSTREAM-*.md files and read them
- Count open items per file and per section
Current synergy status:
- Glob for all
SYNERGY-*.md files and read them
- Count open entries per file and per section
- Highlight actionable items: Extraction Candidates with
Readiness: ready,
Divergences with Convergence path: adopt-theirs or propose-shared,
They Have / We Don't with Priority: adopt-soon
- Note any Shared Patterns with
Status: drifting
Recent conversation context:
- Review the current session for friction, workarounds, discoveries, and
decisions made during development
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.
3. Draft the retrospective
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:
- What went well — concrete wins: bugs caught, patterns established, clean
commits, test improvements. Reference specific files/commits. Focus on process
and engineering quality, not just features shipped.
- What could improve — honest assessment of friction, false starts, wasted
effort. Not a blame list — focus on systemic issues and what would prevent
recurrence.
- Upstream observations — summarize current state of all UPSTREAM files.
Log any NEW friction discovered in the session to the appropriate UPSTREAM
file using
/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 observations — summarize current state of all SYNERGY files.
Log any NEW cross-project observations discovered in the session to the
appropriate SYNERGY file using
/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.
- Lessons learned — reusable insights. Each should be a principle that
future sessions can apply, not a one-off fact. Format: Bold principle —
supporting evidence from this sprint.
4. Check for trend review
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.
bd doctor --json
bd lint --json
bd stale --json
bd orphans --json
bd graph check --json
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):
- Run the knowledge-gardener agent for automated audit (orphans, schema, stale notes, duplicates)
- Validate both schemas: call
mcp__basic-memory__schema_validate with note_type="npm_package" and again with note_type="engineering"
- Call
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)
- If notes cluster around a new unschemaed
type, call mcp__basic-memory__schema_infer and consider creating a new schema
- Verify all notes have: frontmatter
type and tags, ## Observations, ## Relations
- Flag notes missing any layer; fix or create beads issues
Basic 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:
- Update notes that have been superseded by new learnings this sprint
- Remove notes that are too project-specific — generalize or delete
- Check for duplicate notes across directories and merge them
- Verify tags are consistent and discoverable
5. Create beads issues from findings
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.
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:
- A choice between two or more viable approaches with rationale recorded
- A reversal or revision of a previous decision (use
supersede to link)
- A constraint accepted (e.g., "we will not support X until Y") that future
work must respect
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.
6. Knowledge gap audit
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:
- Run
/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.
- Include Tier 1 gaps in the retrospective under "What could improve"
- Create beads issues for the top 3 undocumented packages or tools
7. Write project-independent learnings to Basic Memory
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:
- If no matching note exists: call
mcp__basic-memory__write_note to create it
- If a note exists with new content: call
mcp__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:
- Only write notes for patterns confirmed this sprint — not speculative
- Use concrete code examples, not abstract principles
- Tag notes for discoverability
- No project-specific internals — replace project file paths with generic
descriptions (e.g., "route handler file" not "lib/routes/settings.js"),
omit table names, and describe patterns in terms of the technology, not
the application. Referencing vendor packages by npm name (e.g.,
@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.
- Division of labor with upstream-tracker and synergy-tracker. This step
writes
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.
8. Suggest documentation updates
After writing the retro, suggest updates to:
- Project
CLAUDE.md — new conventions, gotchas, or commands discovered
MEMORY.md — stable patterns confirmed across sprints
README.md — if project structure or commands changed
Present suggestions to the user for approval before editing.