ci: publish X.Y.Z only from a signed annotated tag #6

Merged
chris merged 2 commits from ci-signed-release-tags into main 2026-11-05 03:45:20 +00:00
Owner

Final-review fix I3 for the realliance.net-on-the-forge plan.

Each new X.Y.Z tag now deploys to galaxy automatically (Renovate automerge), and CI published lightweight and unsigned tags (0.2.5 did). This makes ci.sh publish refuse them:

  • the tag must be annotated (git cat-file -t is tag), named correctly, and point at the built commit;
  • its signature must verify against the committed keyring release/signers.asc and a fingerprint in release/signers.fpr (today only Chris's key; add the other Owners and maintainers in a reviewed PR);
  • the check runs before any credential is used, and fetches the real tag object because actions/checkout flattens annotated tags;
  • sha-* publishes from main are unchanged.

scripts/test-release-tag.sh (run by ci.sh build) covers a signed tag passing, and a lightweight tag, an unsigned tag, a foreign-key tag and a tag on another commit refusing, both in the verifier and through ci.sh publish. Mutation-checked.

README now says each new tag deploys automatically; the workflow header no longer claims Renovate never automerges.

🤖 Generated with Claude Code

Final-review fix I3 for the realliance.net-on-the-forge plan. Each new `X.Y.Z` tag now deploys to galaxy automatically (Renovate automerge), and CI published lightweight and unsigned tags (`0.2.5` did). This makes `ci.sh publish` refuse them: - the tag must be annotated (`git cat-file -t` is `tag`), named correctly, and point at the built commit; - its signature must verify against the committed keyring `release/signers.asc` and a fingerprint in `release/signers.fpr` (today only Chris's key; add the other Owners and maintainers in a reviewed PR); - the check runs before any credential is used, and fetches the real tag object because `actions/checkout` flattens annotated tags; - `sha-*` publishes from `main` are unchanged. `scripts/test-release-tag.sh` (run by `ci.sh build`) covers a signed tag passing, and a lightweight tag, an unsigned tag, a foreign-key tag and a tag on another commit refusing, both in the verifier and through `ci.sh publish`. Mutation-checked. README now says each new tag deploys automatically; the workflow header no longer claims Renovate never automerges. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
ci: publish X.Y.Z only from an annotated tag signed by a release signer
Some checks failed
ci / build (pull_request) Failing after 7s
ab764201db
Each new X.Y.Z deploys to galaxy through Renovate automerge, so a stray
lightweight or unsigned tag must not publish (0.2.5 did). publish now
fetches the real tag object, then refuses a lightweight tag, an unsigned
one, a signer outside release/signers.fpr, or a tag on another commit,
before any credential is used. Tests cover each refusal and the pass.
README says each new tag deploys automatically.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014pyfmBr47fTDcLKRXsAvEE
ci: verify the release tag with Deno and openpgp.js, not gpg
All checks were successful
ci / build (pull_request) Successful in 10s
73634f8234
The runner image has no gpg, so the first version of the gate failed the
PR build. The signature is now checked by scripts/verify-release-tag.ts
(openpgp.js, locked in release/deno.lock), run from publish with a fresh,
sha256-checked Deno before the token is used. The test needs gpg to sign
test tags, so it moves out of `ci.sh build` to `just test-release-tag`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014pyfmBr47fTDcLKRXsAvEE
chris merged commit 64ecb50b09 into main 2026-11-05 03:45:20 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
realliance/realliance.net!6
No description provided.