ECC Signed Patch Release Checklist
Use this when releasing affaan-m/ECC, especially for ECC-031 or any follow-up
where the Git tag identity, npm provenance, GitHub Release, and announcement
evidence all need to align.
Milestone And Contract
- Milestone:
M0in the ECC 2.2 release train. - Contract: ship one exact, verified artifact, keep ECC authority over release evidence and canonical state, and do not blur current shipped behavior with future plans.
- Current gate: close the unsigned
v2.2.0exception by releasing a new signed2.2.xpatch from exact greenmain.
Non-Negotiable Invariants
- Never move, recreate, or reuse
v2.2.0. - The new patch tag must be a signed annotated tag on exact green
origin/main. - Publish only the archive packed and verified by the release workflow.
- Treat any non-
E404npm lookup failure as blocking. - Do not manually promote
latest, replace release assets, or publish different bytes under the same version. - Keep Itô and Nasiko wording bounded to shipped behavior only.
ECC-031 State To Refresh Before Mutating
As of 2026-08-31:
v2.2.0is live and latest, butgit tag -v v2.2.0returnserror: no signature found.maincurrently points ata104765bf20fd1480a3dd30f514f18f73ca80b8a.- Exact-main CI run
33429642769is green. - Exact-main CodeQL run
33429641766is green. - No remote tag, GitHub Release, or npm publication exists for
2.2.1. package.jsononmainstill declares2.2.0, so a reviewed version-prep change must land before the signed tag can be pushed.
Refresh those facts before mutating:
git fetch origin main --tags
git rev-parse origin/main
gh run view 33429642769 --repo affaan-m/ECC --json status,conclusion,url
gh run view 33429641766 --repo affaan-m/ECC --json status,conclusion,url
gh release view v2.2.0 --repo affaan-m/ECC --json tagName,targetCommitish,publishedAt,url
git ls-remote --tags origin 'refs/tags/v2.2.0*'
git tag -v v2.2.0
npm view ecc-universal dist-tags --json
Checklist
1. Reconfirm The Release Surface
- Verify the release commit you intend to tag is exact
origin/main. - Verify required hosted checks on that exact
maincommit are green. - Verify no overlapping release-surface PR or hotfix needs to land first.
- Record the exact
mainSHA you are about to build from.
gh pr list --repo affaan-m/ECC --state open --limit 20
gh run list --repo affaan-m/ECC --branch main --limit 10
git fetch origin main --tags
git switch main
git pull --ff-only origin main
git status --short
git rev-parse HEAD
git rev-parse origin/main
Stop if:
HEADdiffers fromorigin/main;- any required
mainrun is red or still pending; - a new release-surface merge materially changes the patch contents.
2. Choose The Patch Version And Confirm It Is Unused
Expected next version is 2.2.1 unless it already exists.
VERSION=2.2.1
git ls-remote --tags origin "refs/tags/v${VERSION}*"
gh release view "v${VERSION}" --repo affaan-m/ECC
npm view "ecc-universal@${VERSION}" version
Expected:
- no remote tag;
- no GitHub Release;
- npm returns
E404.
3. Prepare The Patch-Release PR
- Branch from exact current
main. - Update release metadata to the new patch version.
- Add reviewed release notes under
docs/releases/<version>/release-notes.md. - Add a patch runbook under
docs/releases/<version>/launch-runbook.md. - Open and merge that prep PR.
- Wait for fresh
mainCI and CodeQL on the merged prep commit.
Important:
- Do not use
scripts/release.shas-is forECC-031. - That script still commits, tags, and pushes in one shot, which bypasses the
required
merge -> exact main CI green -> signed tag pushboundary. - PAT-backed GitHub access is not enough. The release operator also needs a locally available signing identity before creating the tag.
Minimum prep checks:
node tests/plugin-manifest.test.js
node tests/scripts/build-opencode.test.js
node tests/ci/release-packed-artifact-workflow.test.js
4. Wait For Exact Main To Turn Green Again
After the prep PR merges, the new main commit becomes the only commit you may
tag.
gh run list --repo affaan-m/ECC --branch main --limit 10
gh run view RUN_ID --repo affaan-m/ECC --json status,conclusion,url
git fetch origin main --tags
git switch main
git pull --ff-only origin main
git rev-parse HEAD
git rev-parse origin/main
5. Create And Push The Signed Tag
From a clean main checkout on the exact green commit:
VERSION=2.2.1
git fetch origin main --tags
git switch main
git pull --ff-only origin main
git status --short
git rev-parse HEAD
git rev-parse origin/main
git tag -s "v${VERSION}" -m "ECC ${VERSION}" HEAD
git tag -v "v${VERSION}"
git push origin "refs/tags/v${VERSION}"
Required proof:
- clean worktree;
HEAD == origin/main;git tag -vsucceeds locally before push.
6. Watch The Release Workflow
The tag push should trigger .github/workflows/release.yml, which must:
- prove the tag commit equals
origin/main; - validate version and manifests;
- run IOC and payload checks;
- pack one archive and record its SHA-256;
- verify that exact archive on Linux, macOS, and Windows;
- publish to npm under
stagedwith provenance; - read back
dist.integrityand compare it to the tested archive; - promote the verified version to
latest; - create the GitHub Release from reviewed notes.
7. Perform Mandatory Public Readback And Canaries
After the workflow succeeds:
VERSION=2.2.1
npm view ecc-universal dist-tags --json
npm view "ecc-universal@${VERSION}" name version dist.integrity --json
gh release view "v${VERSION}" --repo affaan-m/ECC \
--json tagName,name,isDraft,isPrerelease,publishedAt,url
gh api repos/affaan-m/ECC/releases/latest --jq .tag_name
npx --yes "ecc-universal@${VERSION}" setup --help
npx --yes ecc-universal@latest setup --help
Also run the clean install, doctor, repair, uninstall, and rollback canaries required by the checked-in runbook, and verify the native Claude marketplace path remains installable:
/plugin marketplace add https://github.com/affaan-m/ECC
/plugin install ecc@ecc
8. Verify Announcement Delivery
- One
AnnouncementsDiscussion exists for the new tag. - It uses the GitHub Release body and URL.
- Discord delivery is evidenced by the workflow receipt.
- No duplicate Discussion or Discord message was created.
9. Record Evidence And Close Out ECC-031
- Complete the release evidence record with actual SHAs, workflow URLs, release URLs, npm integrity, and announcement state.
- Update the dashboard ticket and release docs with the final patch tag and proof URLs.
- Keep
v2.2.0documented as the historical unsigned exception. - Mark
ECC-031resolved only after the signed patch release is public and every required gate above is backed by evidence.