release-publication
Skill10 starsChanged 28 days agoApache-2.0View on GitHub
Use when preparing, qualifying, publishing or closing an AIP release (a 0.x.0 capability release or a 0.x.y patch/demo release) - version bump and release docs, exact-candidate readiness, the owner's publication decision, tagging and GitHub Release publication, GHCR digest capture, post-release verification and the closure PR. Not for spec or feature work.
- Commits and pushes
In this repository9 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- address-reviewSkill
- post-merge-syncSkill
- release-publicationSkill
- specification-driven-implementationSkill
- address-reviewSkill
- post-merge-syncSkill
- specification-driven-implementationSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
13 rules. About 0 are common, 6 are distinctive, and 7 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈6
Distinctive · estimate
This author's own choices. Worth a look.
7
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 21
Never infer it from an earlier approval, a merged PR or a green readiness check.
- Very specific: line 28
Never move, delete or re-create a published tag or release: If publication happens but no verifiable digest results, the outcome is …
- Very specific: line 31
Verify by digest, not by tag: After publication, every image check uses …
- Distinctive: line 45
Ask the owner which path applies if the release spec doesn't say.
- Distinctive: line 56
Follow the most recent prep PR as the template (#264 for v0.5.0, #274 for v0.5.1).
- Very specific: line 63
Pins: if a file listed in examples/release-golden-path/SHA256SUMS changes, re-pin exactly those entries.
- Very specific: line 72
Run the full local gate from AGENTS.md (format, lint, pyright, both suites) and the evaluation twice, and report totals exactly as run.
- Very specific: line 78
After the owner merges the prep PR, read CANDIDATE_SHA from git and check it alone:
- Very specific: line 80
CI:: every check-run succeeded on that SHA, read from gh api repos/<owner>/<repo>/commits/<sha>/check-runs, not from gh pr checks.
- Distinctive: line 90
Evaluation: run twice from clean state.
- Distinctive: line 122
Workflow: every step succeeded (build and push, digest record, Trivy SARIF, full report, SBOM, retained security artifacts).
- Distinctive: line 130
Release body: every link returns 200.
- Very specific: line 131
MCP Registry: after the GitHub Release exists, the owner runs mcp-publisher validate server.json, then mcp-publisher login github and …
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Release publication
This skill is procedural, not normative. The release's own specification (for a capability
release, its iN-release-*.md increment spec, e.g. v0.5.0's
I6)
and the owner's decisions govern. Where they disagree with this skill, they win: stop and flag the
conflict. AGENTS.md rules still apply, including never merging a PR.
It encodes what v0.5.0 (full I6 path) and v0.5.1 (lightweight path) actually did. The records are
v0.5.0-post-release-verification.md
and v0.5.1-release-record.md.
Hard rules
- Publication needs the owner's explicit "go" for this exact candidate, given in the moment. Never infer it from an earlier approval, a merged PR or a green readiness check. Confirm right before tagging.
- One exact candidate.
CANDIDATE_SHAis the merge commit of the release-prep PR. Every check names that SHA. An earlier checkout, a PR head, a rebuilt image or an older tag is not a substitute. Any later commit to candidate content means a new candidate and new readiness. - SHAs come from git, never from memory. Capture them in the same command that uses them
(
gh pr view <n> --json mergeCommit -q .mergeCommit.oid,git rev-list -n1 <tag>). - Never move, delete or re-create a published tag or release. If publication happens but no
verifiable digest results, the outcome is
POST_RELEASE_FAILED, and a re-publication needs a new owner authorization. - Verify by digest, not by tag. After publication, every image check uses
ghcr.io/michaelegner/architecture-intelligence-platform@<FINAL_IMAGE_DIGEST>. - Release docs are candidate content. CHANGELOG, release notes and README claims ship inside the tag. Check every "all tools" or "every answer" claim against each request/response model individually. A wording fix after the candidate is frozen means a new candidate.
Choose the path
Capability path (0.x.0) | Lightweight path (patch or demo release, owner's choice) | |
| Governing text | The release's I6-style increment spec | The release spec's publication clause plus this skill |
| Candidate attempts | rc.N labels; a failed gate is recorded in vX-rc.N-no-go.md | One candidate; a failure is fixed in a new prep PR |
| Records | Readiness record, publication-decision record, post-release verification, completion record (one PR each) | Readiness posted as a comment on the prep PR; one release record in the closure PR |
Ask the owner which path applies if the release spec doesn't say.
1. Entry audit
- Fetch and merge
origin/main. Confirm fromROADMAP.mdand the release spec that all increments are complete, with no open release blockers. - Confirm the tag and the GitHub Release don't exist yet:
git ls-remote --tags origin vX.Y.Zandgh release view vX.Y.Z(the latter must fail).
2. Release-prep PR (candidate content)
Follow the most recent prep PR as the template (#264 for v0.5.0, #274 for v0.5.1). It contains:
- Version bump:
pyproject.toml,server.json(the MCP Registry entry'sversion), the root project version inuv.lock(the lock diff should be that one line),_RELEASE_VERSIONintests/unit/test_release_version_consistency.py, andproducer.versionin everyevaluation/architecture_answers/scenarios/*/expected_answer.json(one line each). Frozen tests that pin a released version (such as the I5 freeze test'sRELEASED_PRODUCER_VERSION) change only where the release spec allows it. - Pins: if a file listed in
examples/release-golden-path/SHA256SUMSchanges, re-pin exactly those entries. - Release notes:
docs/release-validation/vX.Y.Z-release-notes.md, plus a row indocs/release-validation/README.md. - CHANGELOG: move
[Unreleased]to[X.Y.Z] - <date>, and leave an empty[Unreleased]above it. - Not in this PR: README "Latest release", ROADMAP "shipped" and the spec's status. They change in the closure PR, after publication.
Run the full local gate from AGENTS.md (format, lint, pyright, both suites) and the evaluation
twice, and report totals exactly as run. Stop any running demo stack before demo_e2e, because a
running stack makes those tests skip or fail on ports.
3. Readiness on the exact candidate
After the owner merges the prep PR, read CANDIDATE_SHA from git and check it alone:
- CI: every check-run succeeded on that SHA, read from
gh api repos/<owner>/<repo>/commits/<sha>/check-runs, not fromgh pr checks. Theintegration-qualification (heavy|oracle|other)check-runs must be present and green on that SHA: they run on pushes tomain, so a skipped or missing tier means the candidate is not qualified (re-run viaworkflow_dispatchon that SHA if needed). - Clean build: in a clean detached worktree at the SHA, build the image with
--no-cacheand--build-arg AIP_BUILD_REVISION=<sha>, and record the image id and base-image digests. - Golden path: run
RELEASE_CANDIDATE_SHA=<sha> examples/release-golden-path/run.sh <image> <out>. All phases must pass, with the newpackage_versionandbuild_revision = <sha>on every answer. - Evaluation: run twice from clean state; the outputs must be byte-identical.
- Security: compare Trivy findings with the previous release. A new HIGH or CRITICAL finding needs an owner disposition before publication.
- Demos named in the release spec come up and tear down cleanly.
Record the results: as a readiness record (capability path) or as a comment on the prep PR (lightweight path). Then ask the owner for the publication decision, naming the candidate SHA.
4. Publish (only after the owner's explicit go)
Re-check first: the candidate is unchanged, readiness still applies, and no tag or release exists. Then:
SHA=$(gh pr view <prep-pr> --json mergeCommit -q .mergeCommit.oid)
git tag -a vX.Y.Z "$SHA" -m "AIP vX.Y.Z"
git push origin vX.Y.Z
gh release create vX.Y.Z --verify-tag --title "AIP vX.Y.Z" --notes-file <rendered notes>
test "$(git rev-list -n1 vX.Y.Z)" = "$SHA"The rendered notes are the release-notes file without its title and candidate-status line, with
every relative link rewritten to blob/vX.Y.Z/.... Check that each target exists at the tag. The
v0.5.0 precedent is an annotated tag at the exact SHA. v0.5.1 let gh release create --target
create a lightweight tag instead; either way, verify the tag's commit.
Publishing triggers exactly one docker.yml run (release: published; there is no
workflow_dispatch). Record its run id and every attempt, with each attempt's conclusion and
pushed digest. Take FINAL_IMAGE_DIGEST from the job summary.
5. Post-release verification (by digest)
- Workflow: every step succeeded (build and push, digest record, Trivy SARIF, full report, SBOM, retained security artifacts).
- Anonymous pull:
docker pull <image>@<digest>works with an empty Docker config. The image'sAIP_BUILD_REVISIONequals the candidate, and thevX.Y.Zandlatesttags resolve to the digest. - Golden path passes against the published digest.
- Code scanning on
refs/tags/vX.Y.Zis compared with the previous tag, and any new finding is dispositioned. - Release body: every link returns 200.
- MCP Registry: after the GitHub Release exists, the owner runs
mcp-publisher validate server.json, thenmcp-publisher login githubandmcp-publisher publish, and the search in the registry API returns the new version. Never run by the agent without the owner's explicit go.
6. Closure PR
It contains:
- the release record (lightweight path), or the post-release verification plus the completion record (capability path);
- README "Latest release";
- ROADMAP marked shipped;
- the release spec's status;
- the release-validation index row.
Two-step link closure. Release-body links pinned to the tag cannot reach the closure commit.
Either accept and document this in the record (v0.5.1), or, after the closure PR merges, fetch the
closed-state files, verify every new URL, and run gh release edit on the body only, never the
tag. Treat this as a planned step, not something a reviewer has to catch.
Terminal outcomes
RELEASE_READY_NOT_PUBLISHED qualified; owner did not authorize publication; no release claim
SHIPPED_VERIFIED published; exact tag, digest and golden path verified
NO_GO / POST_RELEASE_FAILED blocking failure before or after publication, with its dispositionDoes 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.

