Repository navigation
Conversation
🔍 Cora AI Code ReviewReview powered by cora-code · BYOK · MIT |
Same filter and behaviour (all 69 reminder test checks pass). It also reads as the jq program it is, instead of a quoted string with an inline pipeline.
| # The jq program is kept in a variable (a quoted here-document) so it reads as the | ||
| # jq program it is; it only ever receives the issue list as JSON input. | ||
| STALE_FILTER="$(cat <<'JQ' | ||
| [.[] | select(.title | test("^Sign release v[0-9]+\\.[0-9]+\\.[0-9]+ \\(minisign\\)$")) |
…in (#1327) Found by a local Cora review: only the first argument was validated, and gh calls inside the while-read loop inherited the here-document as stdin. Reject any unknown argument (exit 2, nothing mutating) and give those calls </dev/null. Three new test checks.
Review evidence: why the Cora CI job cannot complete on this PRCI: Cause, reproduced locally with the same gateway and model (
Real verdicts obtained locally (per file):
Earlier blocker, resolved: the static scanner flagged the stale-pass What would make CI conclusive: raise |
What
Adds an automatic reminder for the manual signing step introduced in #1462.
.github/workflows/release-signature-reminder.yml: runs after theReleaseworkflow succeeds, every 6 hours, and on demand. Permissions arecontents: readandissues: writeonly.scripts/release-signature-reminder.sh: it looks at the latest published, non-prerelease release that carrieschecksums-sha256.txt.bundle.checksums-sha256.txt.minisig, the script opens the issueSign release vX.Y.Z (minisign)with the exact commands (git pull,scripts/sign-release.sh vX.Y.Z), assigned to the release signer (defaultajianaz). It re-pings at most once every 12 hours.uteke upgradeonly installs the latest release.scripts/tests/release-signature-reminder.test.sh: 69 checks using a stubgh.CI signs nothing and holds no signing secret. The minisign key stays offline by design: CI signing would only be as trustworthy as the workflow, which is what cosign keyless already covers.
Why
Since #1462,
uteke upgradefails closed for any release without a.minisig, and the owner signs offline after each release. A manual step that nothing reminds you of gets forgotten, and thenuteke upgraderefuses the newest release for everyone.Testing
bash scripts/tests/release-signature-reminder.test.sh: 69 checks pass.bash scripts/tests/sign-release.test.sh: passes.bash -non all scripts is clean. The workflow YAML parses;actionlintandshellcheckare not installed here.--search), and a test fails if a listing call uses--search.is_botis true (ghprints bots asapp/<name>).^v[0-9]+\.[0-9]+\.[0-9]+$before it reaches any command or issue titleREMINDER_AFTER_HOURS=08worksHTTP 404only; a 5xx or rate limit leaves an issue opengh issue close --commentcall${{ }}of event data insiderun:, andconcurrencyprevents overlapping runs.gh workflow run release-signature-reminder.yml, expecting an issue for v0.21.0 (it has a bundle and no.minisig), then check the issue author withgh issue view --json author(it should beapp/github-actions).Notes
Sign release v0.21.0 (minisign). That is correct: v0.21.0 is unsigned, souteke upgraderefuses it. When v0.21.1 is published the v0.21.0 reminder is closed as superseded.uteke upgradeinstalls.