release-sweep · git:20261030.5a5a348 · 2026-10-30 · sha256 f275e201863c8d52

release-sweep git:20261030.5a5a348B

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

---
argument-hint: "[repo[@version]...]"
description: Cuts the releases that are ready across the philoserf repos, one background agent per repo, after one up-front confirmation of the list. Use when asked to cut, ship or release what is ready, or after /milestone-sweep leaves repos ready to release. Tags and GitHub releases are public, so the list is confirmed once before anything ships.
allowed-tools:
  - Agent
  - Bash
  - Read
  - Edit
  - AskUserQuestion
---

# Release sweep

The shipping half of `/milestone-sweep`. Separate on purpose: the sweep stops before
shipping, and a release is a public step the user takes on purpose.

One `repo-releaser` agent per repo cuts its release with `release-ship`. You find what is
ready, get the list confirmed once, launch the agents, and clean up afterwards.

**Run it on `almanac`, from a session started in `~/source/philoserf`**, for the same reasons
as `/milestone-sweep`.

## 1. Find what is ready

```bash
cd ~/source/philoserf && task sync
```

Stop if `sync` reports a repo as diverged or errored. With arguments, consider only those
repos; `repo@version` fixes the version.

Otherwise, a repo is a candidate when:

- `release-check.sh` exits 3 with 0 FAIL and 0 WARN,
- its `Changes since last tag` row shows at least one commit, and
- it is not one of the unversioned sites named in `~/source/philoserf/CLAUDE.md`, which release by
  deploying, not tagging.

Skip `obsidian-vault-changelog`, which `CLAUDE.md` excludes from all workspace work.

**Propose a version for each candidate.**

- **An open milestone named for a version:** use that.
- **No such milestone:** use the next semver step for what changed. A patch for tooling, docs
  and dependencies. A minor for a behavior change, including one that moves values callers
  may have pinned (`issue-triage`'s rules). A prerelease line continues its suffix:
  `-beta.3` becomes `-beta.4`.
- **A repo versioned only by tags** (obsidian-starter): pass the version explicitly.

Run `release-plan.sh <version>` for each candidate and note `prerelease` and `deploy_cmd`.

## 2. Confirm once

Present the list as a table: repo, current release, proposed version, prerelease or not,
deploys or not, and the commits since the last tag in one line. Ask with `AskUserQuestion`
whether to cut them all, and offer the chance to drop a repo or change a version.

**This is the only question before anything ships, and it is a real one: wait for it.**
Tags and releases are public and permanent. Everything after this answer is pre-approved,
and the agents will not ask again.

## 3. Launch

One `Agent` call per confirmed repo, all in one message, with
`subagent_type: "repo-releaser"`; agents run in the background on their own. The prompt names `REPO` and
`VERSION`, plus anything repo-specific:

- the tag prefix
- the version source
- that it deploys
- any exception the user granted, such as writing dusk's CHANGELOG
- evidence the CHANGELOG should record, such as a live check the user ran

## 4. While agents report

Relay each report as it lands, briefly. **Assume the user is not watching.** A relay is a
heads-up; nothing waits on an answer.

**Act on a fleet-wide hazard.** When one agent finds a gap the others are about to hit (a
beta about to be published as "Latest", say), warn the running agents with `SendMessage`.
Then fix the skill that caused it, so the next run doesn't need the warning.

**Never run a command an agent was blocked from running.** A blocked step goes to the user
as the exact commands that remain.

## 5. Close out

When every agent has reported:

- **List what didn't finish,** with each one's remaining commands, ready to paste. A release
  the user then finishes by hand still needs the cleanup below.
- **Verify each release,** whoever finished it:
  - **Release:** `gh release view <tag>` shows the right prerelease flag.
  - **Milestone:** deleted, if all of its issues are closed.
  - **Prep PR:** merged.
  - **Local branch:** none left behind.
  - **Checkout:** clean and level with origin.
- **`NEXT.md`:** a released repo's row is deleted, or becomes the deferred idea its work left
  behind, stated as an action (`~/source/philoserf/CLAUDE.md`). Commit and push it with
  `dot`, as part of the close-out.
- **Report** one line per repo: tag, release link, and deployed or not. Then offer a co-log
  line for today's daily note.

## Do not use when

- The repos have not been through `/milestone-sweep` and its gate — run that first. This
  skill only ships what the gate already left ready.
- You are cutting one release and want to drive it yourself — run `/release-ship` in that
  repo.