build(release): notarize macOS binaries#118
Conversation
|
Codex review: needs changes before merge. Reviewed July 17, 2026, 5:23 PM ET / 21:23 UTC. Summary Reproducibility: not applicable. as a bug report: this is a proposed release-hardening change, and the PR supplies a concrete after-fix macOS snapshot proving the intended release path on both Darwin architectures. Review metrics: 2 noteworthy metrics.
Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Risk before merge
Maintainer options:
Next step before merge
Security Review findings
Review detailsBest possible solution: Land the fail-closed notarization flow after removing the release-owned changelog edit and confirming the authorized release Mac has the documented private keychain profile; keep the release summary in the PR body rather than Do we have a high-confidence way to reproduce the issue? Not applicable as a bug report: this is a proposed release-hardening change, and the PR supplies a concrete after-fix macOS snapshot proving the intended release path on both Darwin architectures. Is this the best way to solve the issue? Yes, with one release-process correction: candidate-first signing and notarization prevents failed submissions from replacing artifacts, while the release-owned changelog entry should be removed from the branch. Full review comments:
Overall correctness: patch is correct AGENTS.md: unclear because the file could not be read completely. Codex review notes: model internal, reasoning high; reviewed against 2c26a60d6ac6. Label changesLabel changes:
Label justifications:
Evidence reviewedAcceptance criteria:
What I checked:
Likely related people:
What the crustacean ranks mean
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics. How this review workflow works
|
Summary
NOTARYTOOL_KEYCHAIN_PROFILEand keep failed candidates out of release outputRelease invariants
The hook signs a temporary candidate with the existing Foundation identity, hardened runtime, timestamp, and stable identifier-based requirement. It submits an ephemeral ZIP with
notarytool --no-s3-acceleration --wait, requires anAcceptedJSON response with a valid submission ID, runscodesign --verify --strict --check-notarization -R=notarized, and only then replaces the GoReleaser output. No profile value is stored in Git or GitHub Actions.Proof
Real macOS scratch snapshot using the approved login-Keychain signing identity and runtime notary profile:
The scratch config was the repository config with only
distredirected outside the checkout. Both Apple submissions were accepted. Independent checks on the archived executables:Full local gate:
go mod tidyplus clean module diff;gofmt;go vet ./...govulncheck: no vulnerabilitiesdeadcode: cleango test ./... -covermode=atomic: 85.1% total coverage./scripts/test-release.sh: pass