Skip to content
Back to skills

Retrospective

ASecurity

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.

  • 2 stars
  • 0 votes
  • 0 copies
  • 4 views
  • Added May 27, 2026
developmentpythonrustgorubyphpbashsqlnodedockertesting

Works with

  • vscode
  • mcp

Security analysis

A100/100

Scanned May 27, 2026

npx -y skills add voxpelli/claude-beads --skill retrospective --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Retrospective?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Retrospective
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/voxpelli-retrospective/badge)](https://www.skillsdirectory.com/skills/voxpelli-retrospective)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
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

```bash
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:**

```bash
# 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:**

- 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:

1. `npm test` (if a `test` script exists)
2. `npm run test:node` (if a `test:node` script exists)
3. `npm run test` (if a `test` script exists under another variant)
4. `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):

```markdown
## 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.

```bash
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:

```markdown
### 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):

1. Run the knowledge-gardener agent for automated audit (orphans, schema, stale notes, duplicates)
2. Validate both schemas: call `mcp__basic-memory__schema_validate` with `note_type="npm_package"` and again with `note_type="engineering"`
3. 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)
4. If notes cluster around a new unschemaed `type`, call `mcp__basic-memory__schema_infer` and consider creating a new schema
5. Verify all notes have: frontmatter `type` and `tags`, `## Observations`, `## Relations`
6. 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:

```bash
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:

1. **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.
2. **Or create directly via `bd create --type=decision`** with the four-section
   template:

   ```markdown
   ## 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:

1. 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.
2. Include Tier 1 gaps in the retrospective under "What could improve"
3. 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.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.