release-evidence-finalize
Skill4 starsChanged 3 months agoApache-2.0View on GitHub
Generate and commit the immutable release-evidence artifact for a version once both the QA and security sign-offs are final. Use after /release-qa-gate and /release-security-gate have both produced a sign-off for the exact candidate you want evidenced, and before /release-tag-cut. Each run mints a fresh, permanently-preserved evidence file (AAASM-6001) — it never overwrites a prior attempt's evidence, including a prior BLOCK. Does not tag, does not push, does not invent sign-offs it can't find.
In this repository21 other files it gives its agents.
- .claude/CLAUDE.mdCLAUDE.md
- adr-governanceSkill
- credential-operationsSkill
- documentation-experienceSkill
- engineering-loopSkill
- governance-doctorSkill
- homebrew-tap-mergeSkill
- jira-deliverySkill
- product-validationSkill
- public-release-reconcileSkill
- release-assuranceSkill
- release-docs-syncSkill
- release-qa-gateSkill
- release-security-gateSkill
- release-tag-cutSkill
- release-validate-channelsSkill
- repo-bootstrapSkill
- repo-scaffoldSkill
- rust-developmentSkill
- shell-developmentSkill
- terraform-developmentSkill
The file
We split this skill into the rules it gives an agent
4 rules. About 0 are common, 0 are distinctive, and 4 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈0
Distinctive · estimate
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
- Very specific: line 44
Only one sign-off exists: Wait for the other — evidence must reconcile both inputs together (build_evidence's own signature requires both …
- Very specific: line 71
Every attempt after that → docs/release/qa-signoff/v<X>.attempt-<N>.evidence.json, <N> auto-incremented from whatever attempts already …
- Very specific: line 134
Every prior evidence file for <X> (if any) is untouched — verify with git log --oneline -- docs/release/qa-signoff/v<X>*.evidence.json …
- Very specific: line 139
If the committed v<X>.publication-obligations.json exists (AAASM-6419, Core ADR 0042), it was committed before this run (it must already …
≈ “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-evidence-finalize
Thin finalization stage between the sign-off gates and the tag cut:
release-security-gate ─┐
├─> release-evidence-finalize ─> release-tag-cut
release-qa-gate ────────┘ (this skill) (verify/read/tag only)Why this exists as its own step (AAASM-6001). docs/release/qa-signoff/v<X>.evidence.json
is documented (docs/release/qa-verification-manifest-schema.md) and
scripts/qa/build-release-evidence.py exists, but no skill in the real
operator flow ever invoked it — /release-qa-gate and /release-security-gate
produce the .md sign-offs; release-tag-cut reads the evidence file (via
release-readiness.sh check 14 / release-tag-guard.sh) without generating
it. release-tag-cut stays a verifier: it must fail closed if evidence is
missing, not opportunistically generate it. This skill is the one place
that generates it, so evidence generation (this skill) and evidence
verification (release-tag-cut) stay conceptually separate — a
re-verification loop after a BLOCK belongs here, not inside the tag-cut
skill.
When to use
Both are true:
docs/release/security-signoff/v<X>.mdexists (stage 0,/release-security-gate <X>).docs/release/qa-signoff/v<X>.mdexists (stage 0,/release-qa-gate <X>inreleasedepth).
Either sign-off may itself be Verdict: BLOCK — evidencing a BLOCK
candidate (so the BLOCK becomes a permanent, auditable record) is exactly as
valid a reason to run this skill as evidencing a PASS one.
When NOT to use
- Only one sign-off exists. Wait for the other — evidence must reconcile
both inputs together (
build_evidence's own signature requires both paths); do not run this against a stand-in or a stale sign-off from a different candidate. - You want to re-evidence the exact same commit that already has
evidence. There is nothing to re-verify —
build-release-evidence.pyrefuses (a second attempt for an unchanged candidate is bookkeeping noise, not a real re-verification). Re-run the sign-off gate(s) first if something needs to change, then run this skill against the new commit. - You are trying to fix a BLOCK by editing its evidence file. Not possible by design (R1b) and not the intended recovery — remediate, re-run the sign-off gate(s) on the fixed commit, then run this skill again; it mints a new attempt automatically.
How to use
python3 scripts/qa/build-release-evidence.py --repo-root . --version <X>No --out/--candidate-sha needed for a normal run — --candidate-sha
defaults to git rev-parse HEAD, and --out auto-selects the next unused
evidence-attempt path for <X>:
- First attempt for
<X>→docs/release/qa-signoff/v<X>.evidence.json(same path the schema doc already documents — a version's first attempt is unchanged). - Every attempt after that →
docs/release/qa-signoff/v<X>.attempt-<N>.evidence.json,<N>auto-incremented from whatever attempts already exist on disk.
The attempt number is a QA-evidence bookkeeping suffix only. It is never a
product version, never appears in a git tag, and never touches
Cargo.toml/CHANGELOG.md — per AAASM-6001's owner decision, ordinary
product patch versions are not consumed as retry counters.
Do not pass --out in a normal run. The default path is always a fresh,
never-yet-used attempt path for <X> — that is what makes a prior attempt's
evidence immutable in practice. --out exists as an override for tests and
one-off tooling; using it to point at an existing file will silently
overwrite it (the emitter does not protect an explicit --out the way the
default path is protected by construction) — never do that against a real
evidence file.
Commit the result:
git add docs/release/qa-signoff/v<X>.evidence.json # or v<X>.attempt-<N>.evidence.json
git commit -m "📝 (release): Evidence for v<X> (verdict: <PASS|BLOCK>)"Committing the evidence file, as instructed above, advances
HEADone commit past thecandidate_shathe evidence names. This is expected and sanctioned:release-tag-guard.sh's strict candidate/tag binding check (--strict-tag-binding) acceptsHEADdescending fromcandidate_shathrough commits that touch only this version's own sign-off/evidence artifacts — exactlydocs/release/qa-signoff/v<X>.md,docs/release/qa-signoff/v<X>.evidence.json(or.attempt-<N>.evidence.json), anddocs/release/security-signoff/v<X>.md(Core ADR 0037, AAASM-6001 Option 4) — the exact shape a normalgit add+git commitof the evidence file this skill just wrote produces. It does not accept any other change riding along in that commit (a source/config/build/workflow file, another version's evidence, a malformed attempt filename) — keep the evidence commit to exactly the evidence file, nothing else.The evidence commit reaching
mainthrough this repo's normal PR + review + "Create a merge commit" flow is also accepted (Core ADR 0037 revision 4, 2026-09-13) —--strict-tag-bindingverifies a single merge commit structurally (parent count, tree-hash equality against the reviewed branch, ancestry back tocandidate_sha) rather than refusing any merge outright. Do not work around a guard refusal by minting another attempt against the merge commit itself and hoping for a linear range — that produces an unbounded regress on a repo whose branch protection disallows squash/rebase merges. If the guard still refuses after a normal merge-commit PR landed the evidence, that's a real defect in the guard, not something to route around from this skill.
Report the verdict printed by the emitter (wrote <path> (verdict: <V>)).
- PASS — evidence is ready;
/release-tag-cut <X>can now bind to it (viascripts/qa/check-release-evidence.py's default resolution, which always picks the highest-numbered attempt that exists). - BLOCK — this attempt's evidence is now permanently on record. Do not touch it. Remediate, get the sign-off(s) re-run against the fixed commit, then run this skill again — it mints attempt N+1 without you naming a number.
Post-conditions
- Exactly one new evidence file exists, committed, at a path that has never existed before this run.
- Every prior evidence file for
<X>(if any) is untouched — verify withgit log --oneline -- docs/release/qa-signoff/v<X>*.evidence.jsonbefore and after; each prior path's history should gain zero new commits. scripts/qa/check-release-evidence.py --version <X> --tag-target HEAD(no--evidenceoverride) resolves to the file this run just wrote.- If the committed
v<X>.publication-obligations.jsonexists (AAASM-6419, Core ADR 0042), it was committed before this run (it must already exist atcandidate_sha; it cannot be added afterwards) and the evidence verdict isPASSorCANDIDATE_VERIFIED. The checker exits 3 forCANDIDATE_VERIFIED; report that as "candidate verified, N publication checks pending — not PASS", never as green.
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.

