The v1.18.0 cut ran in a non-login shell without COSIGN_KEY/COSIGN_PASSWORD, and release.sh warned "Release signing OFF (#376 is opt-in)" and published anyway. Because release assets are immutable, the missing pithead.tar.gz.sig could not be attached afterwards; signed installs fail closed on the unsigned bundle, so v1.18.0 had to be withdrawn and re-cut as v1.18.1.
release-server.md already promises the stricter behaviour: "The release preflight refuses to run without cosign, COSIGN_KEY, and cosign.pub all in place" — the code just doesn't implement it.
Fix, per the doc's own contract:
- Preflight (stage 1) aborts when
cosign.pub exists at the repo root and any of {cosign binary, COSIGN_KEY, COSIGN_PASSWORD} is missing. An explicit --unsigned flag can keep the old escape hatch for experiments.
- Preflight should also sanity-check the cosign version against the pinned install: the box had drifted to cosign v3.1.2, which rejects the
--tlog-upload=false flags release.sh uses — a cut with signing correctly configured would still have died at stage 7 (the pinned v2.6.3 has been restored on bench-host).
Two failures, one shape: the pipeline trusts its environment instead of proving it before the irreversible stages.
🤖 Generated with Claude Code
The v1.18.0 cut ran in a non-login shell without
COSIGN_KEY/COSIGN_PASSWORD, and release.sh warned "Release signing OFF (#376 is opt-in)" and published anyway. Because release assets are immutable, the missingpithead.tar.gz.sigcould not be attached afterwards; signed installs fail closed on the unsigned bundle, so v1.18.0 had to be withdrawn and re-cut as v1.18.1.release-server.md already promises the stricter behaviour: "The release preflight refuses to run without cosign,
COSIGN_KEY, andcosign.puball in place" — the code just doesn't implement it.Fix, per the doc's own contract:
cosign.pubexists at the repo root and any of {cosign binary,COSIGN_KEY,COSIGN_PASSWORD} is missing. An explicit--unsignedflag can keep the old escape hatch for experiments.--tlog-upload=falseflags release.sh uses — a cut with signing correctly configured would still have died at stage 7 (the pinned v2.6.3 has been restored on bench-host).Two failures, one shape: the pipeline trusts its environment instead of proving it before the irreversible stages.
🤖 Generated with Claude Code