Skip to content

fix(signing): pin a team-based designated requirement for dev builds#70

Merged
alexkroman merged 1 commit into
mainfrom
fix/dev-build-tcc-stable-dr
Jul 7, 2026
Merged

fix(signing): pin a team-based designated requirement for dev builds#70
alexkroman merged 1 commit into
mainfrom
fix/dev-build-tcc-stable-dr

Conversation

@alexkroman

Copy link
Copy Markdown
Collaborator

Problem

On the dev build, Accessibility showed toggle on, still denied — the hotkey/keystroke-injection path was blocked even though Blurt appeared authorized in System Settings.

Root cause

Commit #65 switched dev-build signing from a pinned Developer ID cert to the generic "Apple Development" identity, on the reasoning "same team Y54ZB9JF63, so TCC stays stable."

That's true for Developer ID (its designated requirement is team-based: certificate leaf[subject.OU] = Y54ZB9JF63), but not for Apple Development. codesign's default DR for a development cert pins the specific leaf certificate's Common Name — "Apple Development: Alex Kroman (R3Z539L7XT)" — which changes whenever that cert rotates (they expire ~yearly and Xcode reissues them).

TCC keys the Accessibility grant to the app's designated requirement. It still had the csreq blob from the old Developer-ID grant (which requires the 6.2.6 Developer-ID marker); the new Apple Development signature can't satisfy it, so TCC denied at check time despite the toggle being on.

Fix

Pin an explicit team-based designated requirement on the /Applications re-sign step:

identifier "dev.alex.blurt" and anchor apple generic
  and certificate leaf[subject.OU] = "Y54ZB9JF63"
  • Built from the PRODUCT_BUNDLE_IDENTIFIER / DEVELOPMENT_TEAM build settings, so it tracks project config.
  • Satisfied by both Apple Development and Developer ID signatures (both carry OU = team), and stable across cert rotation — so this can't recur.

Verification

  • codesign -d --requirements - on the freshly installed /Applications/Blurt.app shows the team-based DR.
  • codesign --verify --strict passes.
  • After a one-time TCC re-grant (tccutil reset Accessibility dev.alex.blurt + re-toggle), the hotkey/injection path works.

Note

Existing dev installs need a one-time Accessibility re-grant, since the old grant was bound to the previous (Developer-ID) requirement. After that it stays stable.

🤖 Generated with Claude Code

Commit #65 switched dev-build signing from a pinned Developer ID cert to
the generic "Apple Development" identity on the reasoning "same team, so
TCC stays stable." That holds for Developer ID (team-based DR) but NOT for
Apple Development: codesign's default DR for a development cert pins the
specific leaf cert's Common Name ("Apple Development: … (ID)"), which
changes on cert rotation. So the designated requirement silently changed,
TCC's stored csreq (from the old Developer-ID grant) no longer matched the
new signature, and Accessibility read "toggle on, still denied."

Pin an explicit team-based DR on the /Applications re-sign step:

  identifier "dev.alex.blurt" and anchor apple generic
    and certificate leaf[subject.OU] = "Y54ZB9JF63"

It's satisfied by both Apple Development and Developer ID signatures and
survives cert rotation, so the grant stays stable. Built via the DEVELOPMENT_TEAM /
PRODUCT_BUNDLE_IDENTIFIER build settings so it tracks the project config.

Verified: clean Debug-Local build installs to /Applications with the
team-based DR; codesign --verify --strict passes; hotkey/injection works
after a one-time re-grant.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@alexkroman alexkroman enabled auto-merge July 7, 2026 22:32
@alexkroman alexkroman added this pull request to the merge queue Jul 7, 2026
Merged via the queue into main with commit e5e662e Jul 7, 2026
6 checks passed
@alexkroman alexkroman deleted the fix/dev-build-tcc-stable-dr branch July 7, 2026 22:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants