cut-release
Skill308 starsChanged 38 days agoApache-2.0View on GitHub
Cut a tagged release of mecatl — dispatch the Create Release PR workflow, review and merge the release PR, then verify the tag and the artifacts it publishes (images + Helm charts to GHCR, plus a GitHub Release with signed archives and a Homebrew cask bump). Use when asked to cut/ship/tag/publish a release or bump the version. NOT for general git tagging unrelated to a mecatl release.
- Reads credentials
- Installs packages
- Commits and pushes
36 other projects use a version of this.
Adopted by
Most recently taken up by
- GLinnik21/plx-nativetheir own version, first seen Nov 8, 2026
- mediajunkie/piper-morgan-producttheir own version, first seen Nov 8, 2026
- delexw/motion-graphics-agenttheir own version, first seen Nov 8, 2026
- V-Songbird/foundrytheir own version, first seen Nov 4, 2026
- tansu-io/tansutheir own version, first seen Nov 1, 2026
- rpraharaj/ai-sdlctheir own version, first seen Nov 1, 2026
Used with
Projects with it also use quota-axi, iterate-pr and 6 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.
layer5ioSkillquota-axi
Report local Claude, Codex, Cursor, GitHub Copilot, and Grok quota windows via the quota-axi CLI - remaining percentages, reset times, and provider status read from local auth sources, with no routing, recommendation, or provider mutation. Use before deciding whether it is safe to keep spending a provider's quota, when the user asks about usage, rate limits, or remaining quota, or when comparing local provider headroom.
Also in 4 projects that use this
SentrySkilliterate-pr
Iterate on a PR until actionable CI passes and high/medium review feedback is addressed. Use for PR CI failures, review feedback, or green-check loops; do not wait for human approval, draft status, or merge gates.
Also in 4 projects that use this
layer5ioSkillgh-axi
Operate GitHub through the gh-axi CLI - issues, pull requests, workflow runs, workflows, releases, repositories, labels, Projects (v2), Actions secrets and variables, search, and raw API access. Use whenever a task touches GitHub: listing or filing issues, reviewing or merging PRs, checking CI runs, triggering workflows, cutting releases, managing Projects boards, or managing Actions secrets/variables.
Also in 4 projects that use this
kunchenguidSkillchrome-devtools-axi
Control a Chrome browser session through the chrome-devtools-axi CLI - navigate, snapshot, click, fill forms, run JavaScript, inspect console and network, take screenshots, audit performance. Use whenever a task needs a real browser: opening or testing a web page, clicking through a flow, extracting page content, or debugging a website.
Also in 4 projects that use this
kunchenguidSkilllavish
Turn complex or visual agent responses into rich, reviewable HTML artifacts (HTML files) the user can annotate and send feedback on, using the lavish-axi CLI. Use when about to give a plan, comparison, diagram, table, code diff, report, or anything easier to grasp visually than as prose.
Also in 4 projects that use this
ThisIsSadeghiSkillverify-ui
Verify UI implementation against Stitch design via a token audit (HTML ↔ Code, with X-component default-render checks) and an X-components compliance check.
Also in 3 projects that use this
Other versions36 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 36
- ToolJet/ToolJet★ 41ksame name
- meshery/meshery★ 12ksame name
- danielmeppiel/apm★ 4.2ksame name
- microsoft/apm★ 4.2ksame name
- Screenly/Anthias★ 3.7ksame name
- Netflix/bpftop★ 2.7ksame name
- tansu-io/tansu★ 1.9ksame name
- fim-ai/fim-agent★ 1.6ksame name
- fim-ai/fim-one★ 1.6ksame name
- libredb/libredb-studio★ 1.3ksame name
26 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.
In this repository12 other files it gives its agents.
- AGENTS.mdAGENTS.md
- engine/AGENTS.mdAGENTS.md
- internal/AGENTS.mdAGENTS.md
- user-docs/AGENTS.mdAGENTS.md
- website/AGENTS.mdAGENTS.md
- mecak8s-kind-manual-verifySkill
- mecatl-learning-configSkill
- mecatl-model-router-configSkill
- panel-reviewSkill
- perf-mcp-interpretationSkill
- perf-optimizationSkill
- tech-writerSkill
The file
We split this skill into the rules it gives an agent
4 rules. 0 are common, 3 are distinctive, and 1 is very specific to this project.
0
Common
Most of the 36 edited versions we read keep these.
3
Distinctive
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 56
Run from the repo root.
- Distinctive: line 82
If validation fails, fix the tracked pins through review (or retry a transient registry failure).
- Distinctive: line 96
Wait for CI to go green. The PR is opened by the release GitHub App, so it triggers checks normally.
- Very specific: line 268
One release at a time: If any release/v* PR is open, the next dispatch refuses and names it — merge or close it first.
“Common” is measured: kept by at least 6 in 10 of the 36 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.
Files
Cut a mecatl release
A release is a vX.Y.Z git tag. Pushing that tag triggers .github/workflows/release.yml,
which publishes signed images (mecated, mecatui, mecak8s, execution provider/workload,
Studio, and the Slack-bot example), Helm charts, and versioned microVM and Brood Box
artifacts. It also publishes a GitHub Release carrying darwin/linux x
amd64/arm64 CLI archives, a checksums.txt, cosign bundles, SBOMs, and build
provenance, and pushes a mecatl cask bump to the public stacklok/homebrew-tap
repository. There is no version baked into the Go code — the tag IS the release.
Two consequences of the Homebrew half, before you start:
- A published tag is immutable in practice. The cask records the release archives'
SHA256 checksums for a specific tag. Deleting and re-pushing a
vX.Y.Zthat already produced a release and a tap commit leaves the tap pointing at checksums that no longer match, which breaksbrew installfor everyone. If a release goes wrong after the tap commit lands, fix forward with the next patch version. Re-tagging is only an option when the run failed before publishing anything. - Validate release-only inputs BEFORE tagging, not by pushing a throwaway tag.
The release-PR workflow checks execution-image digest pins before it opens the PR;
CI checks the Brood Box build and microVM defaults handoff. A local
task release:snapshot && task release:verifyonly checks CLI archives and Homebrew packaging; it does not prove the container publishing jobs work.
Nothing pushes a commit to main. The release runs through an ordinary pull request:
you dispatch a workflow, a bot opens the PR, a human merges it, and a bot tags the merge
commit. You never run git push origin main, and you never create the tag by hand.
VERSION (repo root, bare semver — 0.0.34, not v0.0.34) is the source of truth
for the release version. The release PR propagates it to the mecak8s and
mecatl-studio chart versions and appVersions, and to the mecak8s default image
tag. The workflows verify those values directly rather than maintaining a fixed list of
files that a release PR may change.
It did not used to be. mecatequi-reusable.yml referenced its three sibling composite actions
by a hardcoded @vX.Y.Z literal, so every release had to bump those pins in the same tagged
commit or ship version skew. That self-reference — a file naming a tag that does not exist yet —
is why a release needed a commit on main at all. The pins are now $/ self-repository refs,
which resolve to this repo at the exact ref the workflow is running from, so there is nothing
left to bump and skew is impossible rather than merely policed.
Steps
Run from the repo root.
- Confirm what you're shipping. The release tags whatever is on
mainwhen the release PR merges. Review what has landed since the last tag:
Confirm the bump type with the operator before dispatch;git tag --sort=-v:refname --list 'v*' | head -1 # e.g. v0.0.33 git log <last-tag>..origin/main --onelinepatchis the established release cadence even when the range includes additive changes. Do not infer aminorbump from commit subjects alone. - Dispatch the release-PR workflow. This is the only step that starts a release:
The workflow validates the trackedgh workflow run create-release-pr.yml -f bump_type=patch gh run watch "$(gh run list --workflow=create-release-pr.yml --limit 1 --json databaseId --jq '.[0].databaseId')"ARGdefaults inbuild/execution-provider/Dockerfileandbuild/execution-workload/Dockerfileonmain: the Go builder, static provider runtime, and Brood Box workload runtime must have tagged digest pins available for Linux amd64 and arm64. It does not build the images:execution-images.ymlbuilds both for amd64 and arm64, without publishing, on every push tomain. The tag workflow repeats the pin and availability validation on the merged commit before tagging. Renovate updates the pins through its native Dockerfile manager; no image repository variables are required. If validation fails, fix the tracked pins through review (or retry a transient registry failure); do not bypass the check. The publishing job validates the tagged checkout again. The workflow bumpsVERSION, themecak8sandmecatl-studiochart versions and app versions, and themecak8schart's default image tag. It opensRelease vX.Y.Zfrom branchrelease/vX.Y.Z, then asserts that the required values are synchronized. If that verification step fails, do not merge the PR; close it, delete the branch, and read the job log. - Review the release PR like any other PR and confirm that all changes belong to the
release update:
Wait for CI to go green. The PR is opened by the release GitHub App, so it triggers checks normally.gh pr list --head "release/vX.Y.Z" --json number,url,files gh pr diff <number> - Squash-merge it. A human does this — it is the approval gate, and it is the only way
VERSIONchanges onmain:
The tagging workflow does not read the commit subject — it asks GitHub which PR produced the commit and requires a merged, bot-opened PR from branchgh pr merge <number> --squashrelease/vX.Y.Zwith matching version values. The squash title and the number of updated files do not affect the tag gate. - Watch the tag get created. Merging fires
create-release-tag.yml, which re-verifies the commit and pushes the annotated tag. That push firesrelease.ymlon its own — the tag is pushed by a GitHub App installation token precisely so the cascade happens, where aGITHUB_TOKEN-pushed tag would trigger nothing:gh run watch "$(gh run list --workflow=create-release-tag.yml --limit 1 --json databaseId --jq '.[0].databaseId')" git fetch --tags && git tag --sort=-v:refname --list 'v*' | head -1 - Confirm the release run started, then wait for every publishing job. A
successful CLI archive or one green image is not a complete release. In
particular, check the
mecated, execution provider/workload, Brood Box resolution, microVM, mecak8s/execution/Studio chart, and CLI/Homebrew jobs before reporting success:
The Studio chart job skips with a notice when the tag has no chart, so confirm the charts actually landed in GHCR (baregh run list --workflow=release.yml --limit 3 gh run watch "$(gh run list --workflow=release.yml --limit 1 --json databaseId --jq '.[0].databaseId')"X.Y.Z, nov):helm show chart oci://ghcr.io/stacklok/mecatl/charts/mecak8s --version X.Y.Z helm show chart oci://ghcr.io/stacklok/mecatl/charts/mecatl-studio --version X.Y.Z Verify the GitHub Release carries every artifact. It must not be a draft, and it must have four archives plus a checksum file, with a cosign bundle and an SBOM alongside each. Also require
brood-base-index.json,brood-platforms.json, and themicrovm-default-*.jsoncompletion assets for each platform. Missing assets mean the release is incomplete even if the CLI archives are available:gh release view vX.Y.Z --json isDraft,assets --jq '{draft: .isDraft, assets: [.assets[].name]}'Then prove one archive is actually usable rather than trusting the asset list. Use the repo-local
.scratch/dir, never/tmp(AGENTS.md):mkdir -p .scratch/release-vX.Y.Z gh release download vX.Y.Z -p 'checksums.txt' -p '*darwin_arm64*' -D .scratch/release-vX.Y.Z (cd .scratch/release-vX.Y.Z \ && shasum -a 256 -c checksums.txt --ignore-missing \ && tar -xzf mecatl_*_darwin_arm64.tar.gz \ && ./mecatui --version && ./mecated --version)Both
--versionlines must print the tag you just cut. Adev+<revision>output means the release build lost itsBUILD_IDlinker stamp — a release bug, not a cosmetic one, because the public install docs claim a released binary reports its tag.If the run died between "release created" and "assets uploaded" it leaves a DRAFT, which a lookup by tag does not return, so a naive re-run fails trying to create the release again. Recover with
gh release delete vX.Y.Z --cleanup-tag=false --yes, then re-dispatch.Verify the Homebrew tap got the cask bump:
gh api repos/stacklok/homebrew-tap/commits --jq '.[0].commit.message' gh api repos/stacklok/homebrew-tap/contents/Casks/mecatl.rb --jq '.content' \ | base64 -d | grep -E 'version|url|sha256' | headThe top commit must name the version you just cut, and the cask's
urlandsha256values must match the release assets from step 7.While
stacklok/mecatlis private,brew install stacklok/tap/mecatlfails even after a correct tap commit: Homebrew's downloader does not authenticate, so it cannot fetch a release archive from a private repository. The tap commit landing is the whole verification until the repository goes public; this is known and accepted. Once it is public, run the real end-to-end check once:brew update && brew install stacklok/tap/mecatl && mecatui --version
The engine module is tagged separately
The vX.Y.Z release above is the root repo / mecated image release. The importable
core, github.com/stacklok/mecatl/engine, is its own Go module with its own
tag grammar engine/vX.Y.Z (distinct from the root tags). It carries a public-API
compatibility contract (engine/COMPATIBILITY.md).
- Engine tags are cut on their own schedule. Cutting one is a deliberate maintainer
decision — do NOT cut it as part of a routine root release unless asked. The
engine/vX.Y.Zand rootvX.Y.Zversion lines are independent. Bumps followengine/COMPATIBILITY.md(pre-v1: minor = additive or breaking, patch = fixes only).
Cutting an engine tag (mirrors the root flow)
Run from the repo root.
- Pick the engine version. Increment the latest engine tag per
engine/COMPATIBILITY.md(pre-v1: Added = minor, Changed/Removed = minor too; patch = fixes). The latest engine tag:git tag --sort=-v:refname --list 'engine/v*' | head -1 - Pre-flight. Confirm
engine/CHANGELOG.mdhas an[Unreleased]entry covering everything since the last engine tag. Then run the advisorygoreleasecheck:
It never fails: it previews the SemVer classification against the previous engine tag, so compare its verdict with the version you picked. The authoritative guard is thetask api:release-checkapi-compatgate (task api:check), which already guarantees the committedengine/api/*.txtsnapshots match the surface being tagged. - Create the annotated tag with a concise summary:
git tag -a engine/vX.Y.Z -m "engine/vX.Y.Z — <one-line summary>" - Push the tag:
git push origin engine/vX.Y.Z
This line is deliberately still manual. An engine tag adds no commit to main and carries
no pin bump, so it never needed the release-PR flow the root vX.Y.Z line uses — pushing the
tag is the whole release.
IMPORTANT — an engine tag fires NO image build, NO GitHub Release, and NO Homebrew cask bump. release.yml triggers on v* (the root tag
glob), which does not match engine/v*, so cutting an engine tag runs none of the ko build /
cosign / SBOM / SLSA pipeline. It only publishes the module version, making it resolvable for
go get github.com/stacklok/mecatl/engine@engine/vX.Y.Z consumers. There is no pin
bump and no release.yml run to confirm — the push of the tag is the whole release.
Notes
- Two publishing destinations, one tag. A run can succeed on the GHCR images and still fail
on the release or the tap (or vice versa). GoReleaser's cask pipe continues on error and the
Release is created before the cask is pushed, so a bad tap token loses the cask but NOT
the Release. Steps 7 and 8 are not optional: a green
gh run listline is not proof thatbrew installworks. - Never hand-edit
stacklok/homebrew-tap. The cask is generated from the tag by the release workflow and carries aDO NOT EDITheader. A manual edit is overwritten by the next release and desynchronizes the checksums in the meantime. - Never push to
main, and never create a rootvX.Y.Ztag by hand. Both are the workflows' job. A hand-pushed version bump skips code review, and a hand-created tag can point at a commit whose release metadata the gate rejects. IfVERSIONis edited onmainoutside a release PR,create-release-tag.ymlrefuses to tag it rather than cutting a release from it.release.yml'sguardjob additionally refuses to publish anything from a tag that is not an ancestor ofmain, so a tag cut on a branch builds nothing. (This applies to the ROOTv*line only — theengine/v*tags below are still cut by hand, deliberately: they carry no pin bump and add no commit tomain.) - Annotated tags only (
git tag -a), matching prior releases — they carry a tagger + message.create-release-tag.ymldoes this; the tagger isgithub-actions[bot]. - Don't bump illustrative documentation refs unless asked — the
@vX.Y.Zexamples inuser-docs/building/deployment/mecatequi.mdare illustrative and do NOT gate the release. The release flow deliberately leaves them alone. - If the release run fails on the version gate, the tagged commit has inconsistent release
metadata. That should be impossible through the normal flow:
create-release-pr.ymlverifies the bump before the PR can merge, andcreate-release-tag.ymltags only the merge commit. It means someone tagged by hand or the chart metadata drifted fromVERSION. Fix forward with a patch. - Rerunning is safe.
create-release-tag.ymlmakes one decision from the tag's state and the commit's provenance, so it is quiet when there is nothing to do (the tag already points here, orVERSIONnames an already-released tag this commit did not produce) and loud only when a tag should have been created and something is wrong.release.ymlre-signs idempotently via itsworkflow_dispatchtaginput. - Setup, once. Both workflows read the release GitHub App from a
releaseGitHub Environment (vars.RELEASE_APP_CLIENT_ID,secrets.RELEASE_APP_PRIVATE_KEY), whose deployment-branch policy must be restricted tomain. The App needs exactly two repository permissions — Contents: write and Pull requests: write. It does NOT need Workflows: write, because a release no longer edits anything under.github/workflows/. Repo-level secrets would let anyone with push access dispatch a modified workflow from a branch and mint the App credential. - One release at a time. If any
release/v*PR is open, the next dispatch refuses and names it — merge or close it first. Once none is open, leftoverrelease/v*branches from failed runs are deleted automatically before the new PR is cut. - The release gate checks synchronized values, not a fixed file list. This lets the release automation add another version projection or generated file without requiring a second gate update. There is nothing to dry-run locally.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
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.

