Skip to content
Back to skills

Release Train

BSecurity

Cadenced release process — weekly cut on Friday, staging Monday, canary Wednesday, 100% Friday next. Different from release-on-demand. Use when shipping multiple PRs together with predictable timing.

  • 2 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 9, 2026
ai-agentsgobashgitapi

Works with

  • api

Security analysis

B88/100
  • criticalSends environment variables or credentials to an external URL

Pro shows the line behind each finding and how to fix it

Scanned October 9, 2026

npx -y skills add qyndex/claude-init --skill release-train --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Release Train?

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

Security grade badge for Release Train
[![Security: B — Skills Directory](https://www.skillsdirectory.com/api/skills/qyndex-release-train/badge)](https://www.skillsdirectory.com/skills/qyndex-release-train)

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: release-train
description: Cadenced release process — weekly cut on Friday, staging Monday, canary Wednesday, 100% Friday next. Different from release-on-demand. Use when shipping multiple PRs together with predictable timing.
when_to_use: Project is on weekly/bi-weekly release cadence. User says "cut a release", "release train", "RC build", "promote to prod".
allowed-tools: Read, Glob, Grep, Edit, Write, Bash, TodoWrite
model: sonnet
disable-model-invocation: true
---

# Release Train

Cadenced releases instead of release-on-demand. Predictable timing → easier coordination across teams.

## Schedule template

```
Week N:
  Friday 17:00 → cut release/X.Y branch from main
                  (everything merged to main before this goes; everything after waits for X.Y+1)

Week N+1:
  Monday    → deploy release/X.Y to staging
  Tuesday   → soak in staging; smoke tests; manual QA
  Wednesday → canary deploy to prod (1% via slo.yml progressive_deploy)
  Thursday  → ramp 10% → 50%
  Friday    → 100%; close release/X.Y; tag v X.Y.0

Hotfixes mid-cycle:
  - Cherry-pick to release/X.Y branch only (not main)
  - Patch bump (X.Y.1); deploy out-of-band
```

## Process

### Cutting a release (Friday 17:00)

```bash
# 1. Verify main is green
gh run list --branch=main --limit=5

# 2. Determine version (semver based on Conventional Commits since last release)
next=$(npx release-please --token=$GITHUB_TOKEN --release-as=auto --dry-run | jq -r .nextVersion)
# OR for monorepo: process release-please-manifest.json

# 3. Cut branch
git checkout main
git pull
git checkout -b "release/$next"
git push -u origin "release/$next"

# 4. Open release PR (CHANGELOG generated by release-please)
gh pr create --base "release/$next" --head main --title "release: $next" --body "@release-please:auto"
```

### Promoting through environments

```bash
# Monday: deploy to staging — via YOUR BYO deploy workflow (the harness ships no
# deploy.yml; wire your platform per docs/DEPLOY-INTEGRATION.md, then substitute it here)
gh workflow run <your-deploy-workflow>.yml --ref "release/$next" -F environment=staging

# Wednesday: canary in prod (after staging soak) — requires DEPLOY_WIRED=true,
# otherwise canary-deploy.yml refuses to run (fail-closed stub)
gh workflow run canary-deploy.yml -F service=<svc> -F sha=$(git rev-parse "release/$next")

# Friday: 100% — again via your BYO workflow
gh workflow run <your-deploy-workflow>.yml --ref "release/$next" -F environment=production
git tag "v$next"
git push --tags
```

### Hotfix cycle

```bash
# Hotfix branch off the release branch
git checkout "release/$current"
git checkout -b "hotfix/$ticket"
# ... make the fix, write tests
gh pr create --base "release/$current" --head "hotfix/$ticket"
# Merge → patch bump → deploy

# Also cherry-pick to main
git checkout main
git cherry-pick <hotfix-sha>
gh pr create --base main
```

## Branch ruleset (.github/rulesets/release-branches.json)

`release/*` and `hotfix/*` branches require:
- 1 approval (relaxed; engineers can self-approve hotfixes if necessary in emergencies)
- All required status checks
- Linear history
- Signed commits
- Block force-push EXCEPT for release-please's auto-commits

## Hard rules

- **Cut at a predictable time.** Friday 17:00 every week. Don't slip without announcement.
- **Hotfixes go to the release branch first, then main.** Not the reverse.
- **No new features on release/*.** Only fixes. Features wait for the next cut.
- **The CHANGELOG is the source of truth** for what's in a release. release-please owns it.
- **Tag immediately at 100%.** `v X.Y.0` immutable; never re-tag.

## References

- release-please: https://github.com/googleapis/release-please
- Conventional Commits: https://www.conventionalcommits.org/
- Trunk-based development with release branches: https://trunkbaseddevelopment.com/release-from-trunk/

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.