Skip to content

fix(release): sign the packaged macOS keyring addons before notarization - #6271

Merged
lidge-jun merged 2 commits into
devfrom
codex/sign-macos-keyring-addons
Sep 30, 2026
Merged

lidge-jun merged 2 commits into
devfrom
codex/sign-macos-keyring-addons

Conversation

@lidge-jun

Copy link
Copy Markdown
Owner

Summary

The 2.73.0 preview release failed before publishing: Apple notarization rejected OpenCodex.app because Contents/Resources/keyring/keyring.darwin-arm64.node and keyring.darwin-x64.node (bundled since #6161) were not signed with the Developer ID certificate and had no secure timestamp (release.yml run 36648529039, job package-desktop (macos-latest …), notary id e5216fb0). Tauri signs the app, sidecar and widget, but not files under Resources.

This adds a macOS step after the certificate import and before tauri build that signs each desktop/src-tauri/resources/keyring/*.darwin-*.node in place with codesign --force --timestamp --options runtime and the release identity, then verifies the TeamIdentifier, hardened-runtime flag and timestamp. A real release without signing material fails instead of shipping unsigned addons; a dry run keeps them as prepared. Nothing was published by the failed run (npm latest 2.72.0, preview 2.72.0-preview.20260930; the publish job was skipped).

Verification

  • tests/ci-workflows/release-desktop-scripts.test.ts gains a contract case for the step's platform, glob, codesign flags, verification, real-release refusal and order (after the keychain import and sidecar preparation, before Build desktop bundles); release workflow tests 68 pass, 0 fail.
  • actionlint .github/workflows/release.yml: the same 3 pre-existing findings with and without this change, none in the new step. bun run privacy:scan passes.
  • Real proof is the notarized preview release, which is retried from preview/main once this lands.

Checklist

  • Scope stays focused and avoids unrelated cleanup.
  • Docs or release notes were updated when needed.
  • Security-sensitive changes were reviewed for secrets, auth, and unsafe defaults.

Notarization rejected the 2.73.0 preview app: Resources/keyring/*.node, bundled
since #6161, were unsigned or ad-hoc and had no secure timestamp, and Tauri does
not sign files under Resources. Sign each darwin addon in place with the
Developer ID identity, hardened runtime and timestamp after the certificate
import and before tauri build, verify the result, and fail a real release that
lacks signing material.
@lidge-jun
lidge-jun requested a review from Ingwannu as a code owner September 30, 2026 00:24
@github-actions

Copy link
Copy Markdown
Contributor

✅ Deterministic PR hygiene checks passed.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 30, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-09-30T00:26:58.436730Z 70d0173 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@github-actions github-actions Bot added the bug Something isn't working label Sep 30, 2026
@coderabbitai

coderabbitai Bot commented Sep 30, 2026

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

Note

Currently processing new changes in this PR. This may take a few minutes, please wait...

⚙️ Run configuration

Configuration used: Repository: lidge-jun/opencodex/.coderabbit.yaml

Review profile: ASSERTIVE

Plan: Advanced

Run ID: 75f1cef0-66f4-4ae0-a86e-669fe0c31eb4

📥 Commits

Reviewing files that changed from the base of the PR and between a30e67f and 70d0173.

📒 Files selected for processing (2)
  • .github/workflows/release.yml
  • tests/ci-workflows/release-desktop-scripts.test.ts
 ______________________________________________________
< Review complete: I laughed, I cried, I filed issues. >
 ------------------------------------------------------
  \
   \   (\__/)
       (•ㅅ•)
       /   づ
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@lidge-jun

Copy link
Copy Markdown
Owner Author

Security review (read-only, independent reviewer) at 60bcf01431: PASS. Secrets reach the step only through env (no ${{ }} in run:); codesign -dvvv prints public signature fields and secret values stay masked; here-strings avoid the pipefail SIGPIPE; the addons get the same team as the hardened-runtime sidecar, so library validation holds and verify-macos-runtime.sh probes the load; a real release without signing material fails.

@lidge-jun

Copy link
Copy Markdown
Owner Author

리뷰 · 우선순위 73 / 80

2.73.0 미리보기 배포가 막혔어요. 앱 안의 keyring.darwin-*.node 파일이 개발자 인증서로 서명되지 않았고, 안전한 시간 도장도 없었어요. Tauri는 앱·사이드카·위젯만 서명하고, Resources 아래 파일은 안 건드려요. 그래서 공증(notarization)이 앱 전체를 거절했어요.

이 PR은 인증서를 키체인에 넣은 뒤, Tauri가 묶기 전에 desktop/src-tauri/resources/keyring/*.darwin-*.node를 하나씩 codesign으로 서명해요. 강제 서명, 하드닝 런타임, 시간 도장을 넣고, 팀 ID·런타임·시간 도장이 있는지 바로 확인해요. 진짜 배포인데 서명 재료가 없으면 실패해요. dry-run만 그대로 두고 넘어가요. base는 dev이고, 워크플로 계약 테스트도 같이 늘렸어요. 미리보기 배포 얘기는 여기서 더 안 해요.

.github/workflows/release.yml Sign the packaged keyring addons - 서명할지 말지는 DESKTOP_SIGNING_CONFIGURED만 봐요. 이 값은 인증서 시크릿이 있는지만 봐요. 서명 이름(APPLE_SIGNING_IDENTITY)이나 팀 ID가 비어 있어도 “서명해야 한다” 분기로 들어가요. 그때는 친절한 거절 문구 대신 codesign 원본 에러로 끝나요. 위젯 쪽도 같은 문을 쓰지만, 이번 스텝도 그대로 물려받았어요.

.github/workflows/release.yml Verify every Mach-O in the bundle carries the release identity - 묶은 뒤에는 팀 ID만 다시 봐요. 시간 도장과 하드닝 런타임은 묶기 전 원본에서만 확인해요. 복사·묶는 과정에서 서명이 약해져도, 그 스윕은 팀 ID만 맞으면 통과해요. 다음 방어선은 공증이에요.

메인테이너의 판단이 필요한 지점

서명 문을 인증서만 볼지, 서명 이름·팀 ID까지 “한 세트”로 볼지 정해 주세요. 묶은 뒤 스윕에 시간 도장·런타임 검사까지 넣을지도 정해 주세요. 위젯 확인 스텝은 아직 echo | grep 파이프라, 이번 키링 수정(here-string)과 결이 달라요. 같이 맞출지는 선택이에요.

너의 추천

합쳐도 됩니다. 원인·순서·실패 조건이 맞아요. 사이드카 준비 뒤·번들 빌드 앞이라는 순서도 테스트가 잠가요. 다만 머지 전에 서명 이름·팀 ID가 비었을 때도 지금처럼 원본 codesign 에러로 둘지, 아니면 “진짜 배포는 키링도 서명해야 한다”처럼 짧게 거절할지 한 줄만 정해 주세요. 묶은 뒤 스윕 강화는 이번 PR에 굳이 넣지 말고, 공증 재시도로 증명해도 충분해요.

이 댓글은 grok-bot이 작성했습니다

@lidge-jun

Copy link
Copy Markdown
Owner Author

Maintainer integration on the owner-authorized 2.73.0 release: merging at exact head 60bcf01431. Service lifecycle, React Doctor, enforce-target and labeler green; release workflow contract tests 37 pass locally; security review PASS above. Cross-platform CI gates the preview/main promotion SHAs before the release retry.

@lidge-jun
lidge-jun merged commit 11782ee into dev Sep 30, 2026
7 checks passed
@lidge-jun
lidge-jun deleted the codex/sign-macos-keyring-addons branch September 30, 2026 00:26
lidge-jun added a commit that referenced this pull request Oct 7, 2026
…6711)

* release: v2.33.0-preview.20260825

* release: v2.34.0-preview.20260827

* release: v2.36.0-preview.20260829

* fix(release): pass the bump job's permissions through the reusable-workflow call (#3262)

Both v2.40.0 release dispatches (33615174183 preview, 33615177849 main) died
at startup_failure: a workflow_call cannot grant its callee more than the
calling job holds, and dev-version-bump.yml's job declares contents+pull-
requests write. #3129 wired the call but never dispatched a release, so this
is its first live run. The caller job now declares exactly the callee's two
permissions; no other job in release.yml gains anything.

Co-authored-by: jun <jun@lidge.dev>
(cherry picked from commit 7ce0ba5)

* release: set preview channel version 2.48.0-preview.20260908

* release: set main channel version 2.48.0

* chore(release): promote 2.55.0-preview.20260914 to preview

Promotes the dev product snapshot 62f0222 to the preview train.

The 2.55.0 line carries the #4546 cost-guard work: one send budget per logical request with a
shared final-recovery reserve, zero-is-zero refusals with a typed error rather than a synthetic
502, compact and the Kiro inner retries admitted against that budget, a finite send ceiling per
root workflow with an interactive reserve a fan-out cannot take, and a healthy detour promoted on
transient-hold expiry instead of released cold.

The previous preview tip 2.54.0-preview.20260914 is already tagged and published and is outranked
by v2.54.0, so it could not be re-released; this is a new candidate rather than a re-cut.

* chore(release): promote the verified 2.55.0 product tree to main

Same product tree as preview 7bdd1b2 / 2.55.0-preview.20260914, which published successfully with its registry smoke green. Only package.json version differs.

* ci(release): expose Linux bundler diagnostics for stable artifacts

* fix(release): prepare stable platform bundles

* fix(desktop): carry native sidecar packaging repair to main (#5532)

* chore(ci): refresh main release verification (#5534)

* fix(release): carry lipo argument fix to main (#5537)

* fix(release): carry checksum and signature repair to main (#5546)

* fix(release): carry Windows checksum record support to main (#5552)

* fix(release): publish the GitHub release only after its verified assets attach (#5555) (#5558)

GitHub freezes a release when it is published, so the attach step's upload
came back HTTP 422 "Cannot upload assets to an immutable release". Every
release from v2.55.0 to v2.60.0 therefore shipped with zero assets and the
desktop updater had nothing to download.

Create the release as a draft and flip it to published in attach-release,
after the verified bundle is uploaded. Release notes still come from the
validated notes file written at creation.

* release: prepare 2.63.0 version metadata (#5612)

* release: prepare 2.69.0 version metadata

* fix(release): sign the packaged macOS keyring addons before notarization (#6271)

* fix(release): sign the packaged macOS keyring addons before notarization

Notarization rejected the 2.73.0 preview app: Resources/keyring/*.node, bundled
since #6161, were unsigned or ad-hoc and had no secure timestamp, and Tauri does
not sign files under Resources. Sign each darwin addon in place with the
Developer ID identity, hardened runtime and timestamp after the certificate
import and before tauri build, verify the result, and fail a real release that
lacks signing material.

* fix(release): match keyring signature fields without a pipe

(cherry picked from commit 11782ee)

* chore(release): 2.74.0

* fix: demote developer to user for OrcaSAQ-2 leading-system template

The OrcaSAQ-2-Cyber-27B GGUF pins the same chat-template contract as
Qwen3.8-27B — a non-leading `system` raises and `developer` is
unsupported — so translated requests carrying a mid-conversation
developer reminder failed upstream with a 500 template error. Widen
the leading-system matcher to the OrcaSAQ family (org prefix optional,
quant tag optional) so the reminder keeps its slot as `user`.

---------

Co-authored-by: JUN <bitkyc08@gmail.com>
Co-authored-by: jun <jun@junui-MacBookPro.local>
Co-authored-by: jun <jun@lidge.dev>
Co-authored-by: lidge-jun <243035832+lidge-jun@users.noreply.github.com>
Co-authored-by: t <a@b.com>
Co-authored-by: JUN <jun@lidgeai.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant