agentleFS
zircotezircote/rlm-rs/.claude/skills/release/SKILL.md

release

Skill57 starsChanged 10 months agoMITView on GitHub

Orchestrate and monitor a full attested release of rlm-rs end-to-end: release-prep PR, tag, attested binaries + SBOM, crates.io Trusted Publishing with .crate attestation, Homebrew propagation, and independent workstation verification. Use this skill whenever the user invokes /release v<n.n.n> or /release patch|minor|major, or says "cut a release", "ship a release", "release version X", "bump and release", "do a patch/minor/major release", "tag a new version", or anything else that means publishing a new version of this project. Do not improvise the release process from memory — this skill encodes hard-won fixes for failure modes that are invisible until a release breaks.

  • Installs packages
  • Commits and pushes

We split this skill into the rules it gives an agent

6 rules. 0 are common, 2 are distinctive, and 4 are very specific to this project.

  • 0

    Common

    Most of the 184 edited versions we read keep these.

  • 2

    Distinctive

    This author's own choices. Worth a look.

  • 4

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Run a complete attested release for this repository.

    line 19
  2. Very specific:

    If invoked with no argument, --help, or help, print this and stop — do not start a release:

    line 39
  3. Very specific:

    Commit as chore(release): v<X.Y.Z>, push, open the PR.

    line 105
  4. Very specific:

    When green, merge with gh pr merge --squash --delete-branch, then git checkout main && git pull and confirm HEAD is the release commit.

    line 122
  5. Distinctive:

    Test, Cargo Audit, 4 × Build, SBOM (generate + attest), Verify Attestations, Create Release — all success.

    line 151
  6. Distinctive:

    Check exit codes, not grepped output — a filtered pipe that matches nothing looks identical to success (this mistake was made once.

    line 200

“Common” is measured: kept by at least 6 in 10 of the 184 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

rlm-rs Release Orchestration

Run a complete attested release for this repository. The argument is either an explicit version (/release v1.4.0) or a bump type (/release patch|minor|major), which computes the target from the current Cargo.toml version. Every phase below ends with a verification; do not proceed past a failure — fix it or stop and report.

The pipeline this skill drives (all already wired in .github/workflows/):

prep PR ──merge──> tag push ──┬─> release.yml  (test + audit gates → 4 platform
                              │    binaries → provenance + SBOM attestations →
                              │    fail-closed verify → GitHub Release)
                              └─> publish.yml  (pre-publish checks → crates.io
                                   Trusted Publishing → download registry .crate
                                   → sha256 match → attest)
release.yml completion ─workflow_run─> package-homebrew.yml (formula update)

Help / no argument

If invoked with no argument, --help, or help, print this and stop — do not start a release:

/release — attested release orchestration for rlm-rs

USAGE
    /release v<X.Y.Z>     release an explicit version (e.g. /release v1.4.0)
    /release patch        bump 1.3.1 -> 1.3.2 and release
    /release minor        bump 1.3.1 -> 1.4.0 and release
    /release major        bump 1.3.1 -> 2.0.0 and release

WHAT IT DOES
    prep PR (5 version locations) -> required-checks green -> squash merge
    -> annotated tag -> monitors: attested binaries + SBOM + fail-closed
    verify -> GitHub Release; crates.io Trusted Publishing + .crate
    attestation; Homebrew auto-update -> independent workstation
    verification of every artifact.

NOTES
    - Publishing to crates.io is irreversible; versions are immutable.
    - CHANGELOG [Unreleased] must have content; empty means stop and ask.
    - Never re-runs release.yml against an existing tag (asset immutability).

Phase 0 — Preflight

  1. git checkout main && git pull; working tree must be clean of tracked changes (untracked noise is fine).
  2. Resolve the target version from the argument:
    • v<major>.<minor>.<patch> → use as given.
    • patch | minor | major → read version from Cargo.toml on freshly-pulled main and bump that component, zeroing the lower ones (1.3.1 + minor → 1.4.0; 1.3.1 + major → 2.0.0).
    • Anything else → stop and ask. Strip the v for file edits; keep it for the tag. State the resolved version in the first progress message so a wrong bump is caught early.
  3. Sanity checks, all hard stops:
    • New version is greater than version in Cargo.toml.
    • Tag does not already exist (git tag -l v<X.Y.Z>, and check remote).
    • CHANGELOG.md has content under ## [Unreleased] — a release with an empty changelog means something is off; ask the user what this release contains.
    • Latest CI run on main is green (gh run list --workflow=ci.yml --branch main --limit 1).
  4. Semver gut-check: if Unreleased contains breaking changes or an MSRV bump and the user asked for a patch, raise it before proceeding.

Phase 1 — Release prep

Branch release/v<X.Y.Z> off main, then update all five version locations (missing one ships inconsistent metadata):

FileWhat to change
Cargo.tomlversion = "<X.Y.Z>"
Cargo.lockrun cargo check after the Toml edit — never hand-edit
CHANGELOG.mdinsert ## [<X.Y.Z>] - <today> under ## [Unreleased]; update the [Unreleased]: compare link and add the new version's compare link at the bottom
CITATION.cffversion: and date-released: — both occurrences (top level and preferred-citation)
SECURITY.mdthe rlm-cli-<version>-linux-amd64 example version

Validate locally before the PR: cargo fmt -- --check and cargo check minimum. The PR's CI and the release workflow's own gates run the full suite, so don't duplicate the entire gauntlet here — but a broken lockfile or fmt failure should never reach the PR.

Commit as chore(release): v<X.Y.Z>, push, open the PR. The body should list what the release contains and note anything operator-relevant.

Phase 2 — PR through merge

Required status checks on main are All Checks Pass and pin-check / pin-check. Monitor the PR with the Monitor tool — and use the aggregate-gate guard, not a naive all-non-pending check:

# Terminal only when the "All Checks Pass" check itself has reported and
# nothing is pending. Right after a push there is a window where only 1-2
# checks are registered; "zero pending" alone declares victory in that
# window (this produced a false ALL GREEN once).
gate=$(jq -r '[.[] | select(.name=="All Checks Pass")][0].bucket // "absent"' <<<"$checks")

When green, merge with gh pr merge --squash --delete-branch, then git checkout main && git pull and confirm HEAD is the release commit.

Phase 3 — Tag

Annotated tag on the merge commit, then push:

git tag -a v<X.Y.Z> -m "Release v<X.Y.Z>

<one-paragraph summary from the changelog>" <merge-sha>
git push origin v<X.Y.Z>

The tag push is the release trigger. Facts that matter here:

  • Tag pushes bypass branch protection — release.yml carries its own test and audit gates precisely because the tag is untrusted input.
  • Never re-dispatch release.yml against an existing tag. Builds are not reproducible; it would overwrite published release assets with different bytes, violating the immutability the attestations exist to protect.

Phase 4 — Monitor the chains

Three things run; watch all of them with the Monitor tool (one monitor, multiple conditions — report each as it lands):

  1. Release run (release.yml, ~10 jobs). Expect: Resolve Version, Test, Cargo Audit, 4 × Build, SBOM (generate + attest), Verify Attestations, Create Release — all success.
  2. Publish run (publish.yml). Expect: pre-publish checks, Trusted Publishing auth, cargo publish, then the crate-attestation steps ("Download published crate from registry" and "Attest crate provenance"). Report these step conclusions explicitly — they are the newest links in the chain.
  3. Homebrew run (package-homebrew.yml) must appear on its own after the Release run completes, via workflow_run. If no run appears within a few minutes of Release success, the trigger regressed — fall back to manual dispatch (gh workflow run package-homebrew.yml -f version=<X.Y.Z> -f dry_run=false) and investigate.

Failure playbook

SymptomCauseAction
Publish auth fails: "No Trusted Publishing config found"crates.io TP not configuredOne-time setup on crates.io: rlm-cli → Settings → Trusted Publishing → repo zircote/rlm-rs, workflow filename publish.yml, environment copilot. Then gh workflow run publish.yml --ref v<X.Y.Z> (dispatch-on-tag sets github.ref to refs/tags/v<X.Y.Z>, so the startsWith(github.ref, 'refs/tags/v') gates pass and the tag-gated steps run).
Publish fails: "crate rlm-cli@X.Y.Z already exists"Duplicate publish attempt raced a successful oneBenign. Verify the version is live (cargo search rlm-cli), report, move on. crates.io versions are immutable.
Publish fails at "Assert tag version matches Cargo.toml"The prep PR missed Cargo.toml, or the wrong commit was taggedNothing was published — the guard fails before cargo publish precisely because publishing is irreversible. Fix the version via a new prep PR (or tag the correct commit) and restart at Phase 0.
Crate download step exhausts retriesstatic.crates.io CDN propagationRe-run the failed job; the publish itself succeeded.
Crate sha256 mismatch (registry vs local package)Should never happen — cargo packaging is deterministic per commitHard stop. Do not attest. Investigate before anything else.
Cargo Audit job failsReal advisory in Cargo.lockFix the dependency (usually cargo update <crate>) via a normal PR, then start the release over at Phase 0. Note: cargo-deny may NOT have flagged it — deny analyzes the feature/target graph, audit scans the raw lockfile; an unreachable phantom lock entry trips audit only. Both gates are intentional; keep both.
A build leg failsPlatform/toolchain issuemacos-amd64 is intentionally absent (ort ships no x86_64-apple-darwin onnxruntime). The four legs are linux-amd64, linux-arm64 (ubuntu-24.04-arm), macos-arm64, windows-amd64. Binaries build with default features (matches cargo install), not the Makefile's --all-features.
Release event didn't trigger Homebrew (pre-workflow_run behavior)Releases are authored by github-actions[bot]; the tap PAT is scoped to homebrew-tap only and bot events don't trigger workflowsThe workflow_run trigger handles this; head_branch in the workflow_run payload IS the tag name for tag-triggered runs (verified empirically — and the payload has no ref field, whatever a reviewer may claim).

Phase 5 — Independent workstation verification

In-pipeline success is necessary; this is the acceptance test. Run from the local machine, in a scratch dir:

gh release download v<X.Y.Z> --repo zircote/rlm-rs
# Expect 6 assets: 4 binaries, rlm-cli-<X.Y.Z>-sbom.cdx.json, checksums.txt

for f in rlm-cli-<X.Y.Z>-{linux-amd64,linux-arm64,macos-arm64,windows-amd64.exe}; do
  gh attestation verify "$f" --repo zircote/rlm-rs                  # provenance
  gh attestation verify "$f" --repo zircote/rlm-rs \
    --predicate-type https://cyclonedx.org/bom                      # SBOM binding
done
shasum -a 256 -c rlm-cli-<X.Y.Z>-checksums.txt

# crates.io: needs a User-Agent or the API/CDN rejects silently
curl -fsSL -A 'rlm-rs-release-check' \
  -O https://static.crates.io/crates/rlm-cli/rlm-cli-<X.Y.Z>.crate
gh attestation verify rlm-cli-<X.Y.Z>.crate --repo zircote/rlm-rs

Check exit codes, not grepped output — a filtered pipe that matches nothing looks identical to success (this mistake was made once; silence is not success). No --signer-workflow flag anywhere: artifacts here are attested by this repo's own workflows, not a central signer.

Confirm crates.io shows the version: curl -s -A 'rlm-rs-release-check' https://crates.io/api/v1/crates/rlm-cli | jq .crate.max_version

Final report

Summarize for the user: version, merge commit, tag; per-channel status (GitHub Release / crates.io / Homebrew); workstation verification results; and anything from the failure playbook that fired. If any channel is incomplete, say exactly what is pending and what unblocks it.

Download now (ZIP)

  • Other versions194 projects use a version of this.

    Word for word · 0

    None found.

    Edited · 0

    None found.

    Wrote their own version · 194

    1. paperclipai/paperclip★ 110ksame name
    2. modelcontextprotocol/servers★ 92ksame name
    3. remotion-dev/remotion★ 70ksame name
    4. traefik/traefik★ 65ksame name
    5. usememos/memos★ 64ksame name
    6. tw93/Pake★ 63ksame name
    7. Yeachan-Heo/oh-my-claude-sisyphus★ 40ksame name
    8. Yeachan-Heo/oh-my-claudecode★ 40ksame name
    9. tobi/qmd★ 30ksame name
    10. jlowin/fastmcp★ 28ksame name

    184 more not listed

    How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.

  • Used alongsideProjects with it also use create-agent-adapter, changelog-style and 10 more.

    Other files people use alongside this one.

    Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
    • MicrosoftSkill

      create-agent-adapter

      Technical guide for creating a new Paperclip agent adapter. Use when building a new adapter package, adding support for a new AI coding tool (e.g. a new CLI agent, API-based agent, or custom process), or when modifying the adapter system. Covers the required interfaces, module structure, registration points, and conventions derived from the existing claude-local and codex-local adapters.

      Also in 5 projects that use this

    • GrinvSkill

      changelog-style

      Turn a commit range into CHANGELOG.md entries following common-changelog style. Use when finishing a PR (adding to the [Unreleased] section) or cutting a release (moving [Unreleased] under a new version heading).

      Also in 4 projects that use this

    • GrinvSkill

      docs-consistency-check

      Check README/manifest.json/server.json/CHANGELOG.md/AGENTS.md and docs/*.md for drift against the actual registered tools and source. Use after adding, renaming, or removing a tool, or as part of a live-audit pass.

      Also in 4 projects that use this

    • MicrosoftSkill

      pr-report

      Review a pull request or contribution deeply, explain it tutorial-style for a maintainer, and produce a polished report artifact such as HTML or Markdown. Use when asked to analyze a PR, explain a contributor's design decisions, compare it with similar systems, or prepare a merge recommendation.

      Also in 5 projects that use this

    • Microsoft AzureSkill

      documentation-consistency

      Keeps GPT-RAG MCP service and umbrella documentation aligned with shipped behavior. Use for capabilities, configuration keys, deployment steps, endpoints, defaults, operations, or breaking changes.

      Also in 6 projects that use this

    • parcadeiSkill

      agent-context-isolation

      Agent Context Isolation

      Also in 3 projects that use this

    • +3 more from Grinv
  • In this repository4 other files it gives its agents.

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

Reviews can't be read right now.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.