release
Cut a software release and maintain a tiered compatibility policy. Use when the user wants to release, ship a version, bump the version, tag a release, write a changelog, or update COMPATIBILITY. Config-driven via release.config.json; bumps version files, runs a readiness gate, updates COMPATIBILITY.md tiers and deprecations, tags (→ release workflow), and reports closed issues. Teaches the underlying standards as it runs.
What this skill does
# release — tiered compatibility & release workflow
A config-driven release orchestrator. Mechanics live in `scripts/release.py`
(unit-tested, stdlib-only); this file is the workflow you (or an agent) follow.
Read `reference/config-schema.md` for `release.config.json` and
`reference/standards.md` for *why* each step exists.
> **Scope honesty:** reference-tested on a Tauri + Rust + SvelteKit repo (Cull).
> Other stacks are supported *by config*, not yet validated. Treat first runs on
> a new stack as a dry run (see "Dry run" below) until you trust it.
## When to use
The user says "release", "ship it", "cut a version", "bump version", "tag a
release", "update the changelog/COMPATIBILITY". Requires a `release.config.json`
at the repo root (scaffold from `templates/release.config.json.tmpl`).
## Mental model — your public API is your declared surfaces
A version only means something once you declare *what you promise to keep
working*. `release.config.json → surfaces[]` is that declaration; each surface
has a **tier** (`experimental → preview → stable`) and a compatibility **mode**.
Only `stable` surfaces carry the promise. Breaking a `stable` surface forces a
**major** bump — the engine enforces this. (Standards: see `reference/standards.md`.)
## Command
`/release <patch|minor|major>` — run the steps below. On an unfamiliar repo, do a
**dry run first** (see below). When the user asks to "explain", expand each step's
*why* into a short lesson from `reference/standards.md`.
## Steps
1. **Preconditions.** The configured `releaseBranch` (default `main`, in
`worktree` if set) is checked out, clean, and synced with `origin`. Abort
clearly otherwise. — *why: a release tag must point at a known-good, pushed tree.*
2. **Version.** `python3 scripts/release.py --config <cfg> plan <kind>` prints the
new version + tag. It asserts the version files currently agree. Show `old → new`.
— *why: SemVer math; 0.x lets minors break (pre-1.0).* [[Semantic Versioning (SemVer)]]
3. **Readiness gate.** Run `cfg.gate` then each `cfg.extraGate[]`. All must exit 0
(fmt, clippy, tests, license audit, prod build, golden contract tests). Block on
failure. — *why: this is a Production-Readiness Review.* [[Production Readiness Review]]
- TODO (deferred): cargo-deny / cargo-audit / SBOM. List, don't enforce yet.
4. **Changelog.** Collect commit subjects since the last tag
(`git log <lastTag>..HEAD --format=%s`) and draft a section — the engine's
`draft_changelog` buckets them into Added/Changed/Fixed (Keep a Changelog).
Insert under the top of `CHANGELOG.md`; **hand-curate** the user-facing lines.
— *why: humans read changelogs; conventional commits seed them.* [[Keep a Changelog]]
5. **Compatibility review.** Open `cfg.compatibility.path` (COMPATIBILITY.md). Ask:
- Did any surface change tier? (update the Surfaces table)
- New deprecations? (add a row: item / deprecated-in / removable-in / replacement)
- **Does this change break a `stable` surface?** If yes, the required bump is
`major` — re-run with `major` or the release is invalid. (Enforced by
`enforce_bump`.) Stamp "Last updated: <new version> (<date>)".
— *why: tiers + deprecation windows are how you evolve without lying.* [[Kubernetes API Deprecation Policy]]
6. **Bump & commit.** `python3 scripts/release.py --config <cfg> bump <kind>` writes
every version file; refresh `cfg.lockfiles` (e.g. `cargo update -p <crate>` or a
build). Commit `chore(release): v<new>` including CHANGELOG + COMPATIBILITY.
7. **Tag & push.** `git tag v<new>` and push the tag (→ the repo's release
workflow) and the branch. Confirm the tag trigger exists *before the first
release* (`grep -A3 '^on:' .github/workflows/*.yml`).
8. **Report.** Print the tag, the release-workflow URL, and issues closed since the
last tag (if `cfg.issueTracker` is set, e.g. bd) — those are the release notes.
## Dry run
There is no `--dry-run` flag — a dry run is steps 1–5 done *without mutating*:
run `python3 scripts/release.py --config <cfg> plan <kind>` (pure: prints the
version/tag, writes nothing) and optionally run `cfg.gate` to check readiness.
Do NOT run `bump`, commit, or tag. The `bump` subcommand is the only engine
command that writes (version files only); commit/tag/push are git steps you take
in step 6–7, never the engine.
## Manual fallback (no skill)
`plan` → run gate → edit CHANGELOG + COMPATIBILITY → `bump` → commit → tag → push.
The engine is just `scripts/release.py`; everything else is git.
## Growing into Contracts & Modes
The readiness gate runs *golden/contract tests* (`cfg.extraGate`). Start with one
(a DB round-trip), then add export and API contract tests. See the consuming
repo's `docs/CONTRACTS.md` and `reference/standards.md`. [[Pact — Consumer-Driven Contract Testing]]
Related in General
modeling-omnistudio-epc-catalog
IncludedSalesforce Industries CME EPC product-modeling skill for Product2-based catalog creation. Use when creating EPC products, configuring product attributes, building offer bundles with Product Child Items, or reviewing EPC DataPack JSON metadata for product catalog changes. TRIGGER when: user creates or updates Product2 EPC records, AttributeAssignment payloads, AttributeMetadata/AttributeDefaultValues, Offer bundles, or ProductChildItem relationships. DO NOT TRIGGER when: designing OmniScripts/FlexCards/Integration Procedures (use building-omnistudio-omniscript, building-omnistudio-flexcard, or building-omnistudio-integration-procedure), implementing Apex business logic (use generating-apex), or troubleshooting deployment pipelines (use deploying-metadata).
relationship-science-coach
IncludedUse this skill for direct, practical adult relationship coaching: couples conflict, repair, trust, marriage, dating, flirting, attachment patterns, emotional connection, sex, desire differences, eroticism, kink negotiation, affection, love languages, breakups, and long-term passion. Draw on Gottman, EFT and Hold Me Tight, attachment science, modern sex research, Perel, Nagoski, Kerner, Schnarch, Love and Stosny, and flexible love-language tools. Be concrete and low-hedge. Redirect only for imminent danger, abuse, coercive control, minors, non-consent, self-harm, stalking, or medical/legal/psychiatric decisions.
building-sf-integrations
IncludedSalesforce integration architecture and runtime plumbing with 120-point scoring. Use this skill to set up Named Credentials, External Credentials, External Services, REST/SOAP callout patterns, Platform Events, and Change Data Capture. TRIGGER when: user sets up Named Credentials, External Services, REST/SOAP callouts, Platform Events, CDC, or touches .namedCredential-meta.xml files. DO NOT TRIGGER when: Connected App/OAuth config (use configuring-connected-apps), Apex-only logic (use generating-apex), or data import/export (use handling-sf-data).
venue-templates
IncludedAccess comprehensive LaTeX templates, formatting requirements, and submission guidelines for major scientific publication venues (Nature, Science, PLOS, IEEE, ACM), academic conferences (NeurIPS, ICML, CVPR, CHI), research posters, and grant proposals (NSF, NIH, DOE, DARPA). This skill should be used when preparing manuscripts for journal submission, conference papers, research posters, or grant proposals and need venue-specific formatting requirements and templates.
let-fate-decide
IncludedDraws the 12 Houses of the Zodiac Tarot spread to inject entropy into planning when prompts are vague, ambiguous, or casually delegated. Interprets the spread to guide next steps. Use when the user says 'let fate decide', 'YOLO', 'whatever', 'idk', or other nonchalant phrases, makes Yu-Gi-Oh references, or when you are about to arbitrarily pick between multiple reasonable approaches. Prefer over ask-questions-if-underspecified when the user's tone is casual or playful rather than precision-seeking.
net-ops
IncludedCross-platform network troubleshooting (Windows, macOS, Linux) via local or remote shell. Use for: DNS broken, can't resolve hostnames, nslookup/dig works but apps fail, NRPT, WFP, scutil, /etc/resolver, systemd-resolved, /etc/resolv.conf, NetworkManager, VPN DNS leak residue (ProtonVPN/Mullvad/WireGuard/AnyConnect), AV/firewall blocking DNS or DoH, Tailscale DNS interaction, intermittent connectivity, remote diagnostics over SSH.