OverviewFilesCommitsIssuesDocsReleasesPeers

P2P-Hiverelay commits / 33c99c5

docs(release): use scripts/release.sh, and fix the signer-principal mismatch
The runbook told you to run `git tag -s` by hand. That was wrong twice over: git defaults to GPG while the fleet verifies SSH signatures, and the repo already ships scripts/release.sh — a keyvault-integrated cutter that signs with SSH, self-verifies against fleet/allowed-signers before pushing, then pushes and creates the GitHub prerelease. More consequential: release.sh derives SIGNER_EMAIL from git config user.email, which is 33146784+bigdestiny2@users.noreply.github.com, while the principal in fleet/allowed-signers — and in the copy installed on every enforcing box — is bigdestiny2@users.noreply.github.com with no numeric prefix. Signing with the default would tag under a principal absent from the file, and verify_tag on miami, sydney and amsterdam would refuse the checkout. Documented the HIVERELAY_RELEASE_SIGNER_EMAIL override. Also notes that `signing key: NOT in vault` is what a LOCKED vault reports and is not evidence the key is missing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
33c99c5a49cfd13a40234198723d187f211f3466
by bigdestiny2 <33146784+bigdestiny2@users.noreply.github.com> · 2026-07-28T01:58:10.000Z

Changed files (1) +49 -26

docs/RELEASE-RUNBOOK-0.25.0-rc.5.md +49 -26
……@@ -40,29 +40,55 @@ At prep time this was **124 commits**. Open a PR from `feat/service-http-wiring`
4040rather than fast-forwarding — `rc.3` was previously cut from `main` by mistake
4141without the feature tree, and that is exactly the failure this gap invites.
4242
43### 1b. The release signing key is not on this machine
43### 1b. Do NOT sign by hand — use `scripts/release.sh`
4444
45The fleet trusts exactly one signer, in both `fleet/allowed-signers` and the copy
46installed on the provisioned boxes (verified identical on miami):
45`git tag -s` defaults to **GPG**, but the fleet verifies **SSH** signatures
46(`ssh-ed25519` in `allowed-signers`). A hand-cut GPG tag produces a signature
47every enforcing box rejects, and `gpg` will simply fail with "No secret key"
48because no GPG key exists here.
4749
50The repo ships a keyvault-integrated cutter that does the right thing: sign with
51SSH from the vault, **self-verify against `fleet/allowed-signers` before pushing**,
52push, and create the GitHub prerelease.
53
54```bash
55scripts/release.sh status # what is configured
56scripts/release.sh cut v0.25.0-rc.5 # sign + verify + push + prerelease
57```
58
59Two prerequisites, both currently unmet:
60
61**The vault is locked.** `status` reports
62`locked: no agent running for ~/.keyvault/secrets.vault`, and consequently cannot
63see the key (`signing key: NOT in vault` is what a locked vault looks like — it is
64not proof the key is absent). Unlock first:
65
66```bash
67keyvault agent --daemonize
68# or run the cut under: keyvault exec --scope hiverelay-release -- scripts/release.sh cut v0.25.0-rc.5
4869```
49bigdestiny2@users.noreply.github.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGxvfmV3/yKO0C5HMCGRiOMiqfEwkzr6/aMlz4TUfojO hiverelay-release
70
71**The signer principal does not match `allowed-signers`.** `release.sh` derives
72`SIGNER_EMAIL` from `git config user.email`, which is
73`33146784+bigdestiny2@users.noreply.github.com`, but the principal in
74`fleet/allowed-signers` — and in the copy installed on every enforcing box — is
75`bigdestiny2@users.noreply.github.com`, with no numeric prefix. Signing with the
76default tags under a principal that is not in the file, so `verify_tag` on miami,
77sydney, and amsterdam would refuse the checkout. Override it:
78
79```bash
80HIVERELAY_RELEASE_SIGNER_EMAIL=bigdestiny2@users.noreply.github.com \
81 scripts/release.sh cut v0.25.0-rc.5
5082```
5183
52None of the local keys match it (`cloudzy_hiverelay`, `id_ed25519`,
53`peerit_vps_deploy`), the ssh-agent is empty, and git has no signing config
54(`user.signingkey`, `gpg.format`, `tag.gpgsign` all unset). **Sign on whichever
55machine or token holds `hiverelay-release`**, or rotate the release key and
56redistribute `/etc/hiverelay/allowed-signers` fleet-wide.
84`release.sh` self-verifies against `fleet/allowed-signers` before it pushes, so a
85principal mismatch fails locally rather than shipping a tag the fleet rejects.
5786
5887Prior tags *are* signed — `git tag -v v0.24.3` errors only because local
59verification is unconfigured, not because the signature is missing. To verify
60locally:
88verification is unconfigured, not because a signature is missing:
6189
6290```bash
63git config gpg.ssh.allowedSignersFile "$PWD/fleet/allowed-signers"
64git config gpg.format ssh
65git tag -v v0.24.3
91git -c gpg.format=ssh -c gpg.ssh.allowedSignersFile="$PWD/fleet/allowed-signers" tag -v v0.24.3
6692```
6793
6894### 1c. `main`'s canary channel is parked at v0.24.3
……@@ -113,23 +139,20 @@ scp fleet/allowed-signers root@<box>:/etc/hiverelay/allowed-signers
113139
114140## 2. Cut the release
115141
116Run from the repo, not `~`:
117
118```bash
119cd /Users/localllm/Projects/pear-ecosystem/00-core/hiverelay && git tag -s v0.25.0-rc.5 -m "v0.25.0-rc.5 — restore orphaned lifecycle/gateway features"
120```
121
122Verify before pushing — this is the exact check each box performs:
142From the repo root, with the vault unlocked (§1b). `release.sh` signs, self-verifies
143against `fleet/allowed-signers`, pushes the tag, and creates the GitHub prerelease:
123144
124145```bash
125git tag -v v0.25.0-rc.5
146cd /Users/localllm/Projects/pear-ecosystem/00-core/hiverelay && HIVERELAY_RELEASE_SIGNER_EMAIL=bigdestiny2@users.noreply.github.com scripts/release.sh cut v0.25.0-rc.5
126147```
127148
128Then:
149The tag must be **exactly** `v0.25.0-rc.5` — `release.sh status` cross-checks it
150against `package.json`, and the updater's health gate compares the running
151version against the tag.
129152
130```bash
131git push origin v0.25.0-rc.5
132```
153`--promote-canary` also bumps `channels.json`. Do **not** use it here: §1d shows
154the canary box is not actually self-updating, so promote deliberately (§4) after
155provisioning.
133156
134157---
135158