ci: audit the signed tip of every default branch - #19
Conversation
|
Holding this open deliberately rather than merging. The workflow is correct — I ran its check by hand against all five default branches just now: 5 of 5 unsigned, so merging this today buys a cron job that is red on its first run and every run after until the merge mechanism itself is fixed. A permanently-failing daily audit stops being read within a week, and then it cannot do the job it was written for. Gate: merge once JDWLABS-230 is resolved and the tips actually verify, so the first run is green and any red afterwards is real news. |
Recommendation: close this, and file the replacement fresh rather than repurposing the branchNot merging or closing it here — this is the reasoning, the call is the maintainer's. The replacement control is open as #25 (plus four caller PRs), which enforces signatures on the pull request branch and lets Why auditing
|
The required_signatures rule has been active on main in three repositories the whole time nothing has landed verified. A signature that verifies on the pull request branch is gone from main because rebase merging re-creates each commit server-side without re-signing it, and no gate notices: the rule reports as enforced, no merge is rejected, and the only way the lapse surfaced was querying commit verification by hand sixteen days later. This job reads the tip of main in all five repositories daily and fails when any of them is unsigned, so the next lapse is a red run rather than an archaeology exercise. It will fail on its first run — 5 of 5 tips are unsigned today — which is the state it exists to report, not a defect in the check. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
6bc5de2 to
c520c21
Compare
|
Closing: the premise this workflow tests no longer holds. This job fails when the tip of Merging this as-is would buy a job that goes red every single day, forever, reporting a condition that is the intended state. That is the same 'control reports a problem that is not one' shape the ticket set out to remove. The detection gap this was reaching for is real but different: commits that reach Reopenable if the premise changes: if GitHub ever ships rebase-merge signing, the original conflict dissolves and this workflow becomes valid as written. |
Relates to JDWLABS-230.
What
Adds
.github/workflows/verify-main-signatures.yml— a daily (plus manual) job that reads the tip commit ofmaininapps,platform,infrastructure,deploymentsand.githubthrough the API and fails if any of them is unsigned. No checkout, no secret: all five repos are public, soGITHUB_TOKENcan read their commits. Documented in the workflows README.Why
required_signaturesis active onmainin three of the five repos and has been reporting as enforced for three weeks while nothing landed verified. This closes the detection half of that ticket only — it does not fix the mechanism.Root cause this makes visible
The signature is present before the merge and destroyed by it. Same change,
platformPR #167:All four code repos are
allow_rebase_merge=truewith merge-commit and squash disabled, so every merge takes the path that re-creates commits server-side without re-signing them. Local signing is not the problem —commit.gpgsign=trueand key949C342C7907CC24in every clone, and every commit that ever verified onmainarrived by direct push (6a02f89c,7d6f29e1,a33d1ae9,c903346d, allNOPR), not through a merge.Verification
actionlintclean:Script body dry-run against the live API from a workstation, unchanged from what the job runs:
Reviewer note — this lands red
5 of 5 tips are unsigned right now, so the first scheduled run fails. That is the finding, not a bug in the check: it stays red until the merge method changes (enabling squash merge, which GitHub signs, or dropping rebase-merge) or the org decides the unsigned range is acceptable. Merge it now and the red run tracks the open decision; hold it and the decision comes first. Either is defensible — but re-signing history without changing the mechanism will erode again within a day.
🤖 Generated with Claude Code