release · git:20260617.c8da235 · 2026-06-17 · sha256 259ec4f00934d4a8

release git:20260617.c8da235A

Immutable. This exact content never changes and is served at /api/v1/blob/259ec4f00934d4a8.

---
name: release
description: Cut a PPDS Skills package release — get the recapture, decide the version bump, clean up prose, update CHANGELOG, tag + GitHub Release. Use when PPDS ships a new stable CLI/MCP that the skills package must track, or to publish any skills-package version bump.
---

# Release (PPDS Skills package)

No NuGet/npm pipeline — users install from the repo / plugin marketplace, so a
"release" is a reviewed version bump on `main` plus a tag and GitHub Release. The
recapture is automated; this skill covers the judgment + finalization left to a
human.

## When

- A new **stable** PPDS CLI/MCP shipped (the usual trigger — the engine's
  `release` skill §8 dispatches the recapture automatically), or
- any change warranting a published version bump.

## 1. Get the recapture

Preferred — let the automation produce the PR:

```bash
gh workflow run recapture-on-release.yml
```

It installs the released CLI/MCP, regenerates `captured-help/` + references, bumps
the frontmatter pins, runs the gate, and opens a PR. **Gotchas:** the *Allow
GitHub Actions to create and approve PRs* repo setting must be on, and a
bot-opened PR shows no CI — **close/reopen it** to fire `skill-evals`.

Offline alternative: `dotnet tool update -g PPDS.Cli && dotnet tool update -g PPDS.Mcp`
then `python3 tools/recapture.py`. See CONTRIBUTING "Regenerating the references".

## 2. Read the capture diff → decide the version bump

Diff `captured-help/` against the previous tag. Per the package's semver
(`plugin.json` / `marketplace.json`):

- **PATCH** — captures byte-identical, or only version strings moved (pure
  alignment, e.g. `rc` → stable).
- **MINOR** — new commands / flags / MCP tools (new documented capability), or
  new skill content.
- **MAJOR** — a skill renamed or removed.

## 3. Prose cleanup the gate can't catch

`check_skills.py::check_prose_version_drift` early-returns on a **stable** pin, so
hand-check these when moving rc → stable:

- **Drop** `--prerelease` install guidance and stale `rc` mentions in `README.md`,
  `DESIGN.md`, `skills/*/SKILL.md`, and hand-written `skills/*/references/*.md`.
- **Leave alone:** `CHANGELOG.md` (immutable history) and `CONTRIBUTING.md`
  (intentionally version-agnostic runbook guidance).
- MCP pin tracks the captured `serverInfo.version` (which can lag the NuGet
  package), so bump `ppds_mcp_version_tested` only if that value changed.

## 4. Version + CHANGELOG

- Bump `version` in `.claude-plugin/plugin.json` **and** the `marketplace.json`
  plugin entry — the eval enforces they match.
- Add a `CHANGELOG.md` entry (Keep a Changelog sections) **and** the `[X.Y.Z]`
  release-link footer.

## 5. Gate + merge

```bash
python3 evals/check_skills.py    # must pass: validates against the new capture
```

Open the PR, link/close the tracking issue (e.g. `Closes #N`), resolve any review
threads (conversation resolution is required to merge). Squash-merge.

## 6. Tag + GitHub Release

```bash
git checkout main && git pull          # main now at the squash-merged release
git tag -a vX.Y.Z -m "release: X.Y.Z"
git push origin vX.Y.Z
gh release create vX.Y.Z --title "vX.Y.Z" --notes "<the CHANGELOG X.Y.Z section>"
```

## References

- `CONTRIBUTING.md` — "Regenerating the references" + "Release process".
- `.github/workflows/recapture-on-release.yml` — the recapture automation.
- Engine `release` skill §8 — what triggers our recapture on a PPDS stable.