Skip to content

Fix Meet detection picking a lobby tab over the live call; auto-clear stale Accessibility grants on upgrade - #4

Merged
joncode merged 1 commit into
mainfrom
fix/mic-priority-and-stale-tcc
Sep 8, 2026
Merged

Fix Meet detection picking a lobby tab over the live call; auto-clear stale Accessibility grants on upgrade#4
joncode merged 1 commit into
mainfrom
fix/mic-priority-and-stale-tcc

Conversation

@joncode

@joncode joncode commented Sep 8, 2026

Copy link
Copy Markdown
Owner

Bugs (from a field report, macOS Tahoe 26)

1. Jump went to a Safari green-room tab instead of the live call. A Meet link opened in Safari (default browser) parks on the join page; its URL is indistinguishable from an in-call tab, and the mic tiebreaker that should resolve this never fires for Safari: mic processes are matched by browser bundle-ID prefix, but Safari captures audio in com.apple.WebKit.GPU. With the tiebreaker inert, Safari wins on config order (it's first by default) and stays "live" as long as the tab is open. A URL hit in any browser also short-circuited the AX window scan that could have found the real call in a hidden Chrome profile.

2. Hotkey dead through repeated Accessibility grants. Builds are ad-hoc signed (designated requirement = cdhash of the exact binary), so every upgrade invalidates the grant. macOS keeps showing the stale System Settings row and re-toggling it re-approves the dead record — tccutil reset + fresh approval is the only fix. The reporter's machine had three stale TCC rows stacked up.

Fixes

  • Browser now declares micBundlePrefixes; Safari includes com.apple.WebKit. so its GPU process counts. (WebKit.GPU can serve other WKWebView apps too — accepted over-match; it only influences scan order and the last-resort fallback, both gated on the browser running.)
  • detect() exhausts mic-holding browsers completely — tab probe, then profile-agnostic AX window scan — before trusting URL-only hits from mic-less browsers.
  • jumpcall install compares the old and new binaries; on change (with the hotkey enabled) it runs tccutil reset Accessibility io.github.joncode.jumpcall and says so, making the fresh prompt meaningful.
  • jumpcall status now prints the stale-grant recovery when the hotkey is stuck on "waiting for Accessibility permission".

Tests: holdsMic/ordering coverage for the WebKit.GPU mapping. 87 passed, 0 failed.

Known residual: if the green-room tab itself holds the mic (preview) in one browser while the real call runs in another, both are mic holders and config order still decides. Distinguishing lobby from call needs a signal we don't have yet (tab audio output?).

🤖 Generated with Claude Code

…first; clear stale Accessibility grants on upgrade

Field report: jump kept going to a stale Safari green-room tab instead of
the live call, and the hotkey stayed dead through repeated Accessibility
re-grants.

Detection: mic-priority matched processes by browser bundle-ID prefix,
but Safari captures audio in com.apple.WebKit.GPU — no com.apple.Safari
prefix — so Safari never won (or lost) the mic tiebreak and fell back to
config order, where it sits first by default. Browsers now declare
micBundlePrefixes. And a URL-only tab hit in a mic-less browser no
longer short-circuits the AX window scan of the browser actually
transmitting audio: mic holders are exhausted (tab probe + AX scan)
before anything else is trusted.

Hotkey: ad-hoc signing pins TCC grants to the exact binary, so every
upgrade silently kills the Accessibility grant, and re-toggling the
stale System Settings row never revalidates it. `jumpcall install` now
detects a changed binary and clears the dead grant (tccutil reset) so
the fresh prompt works; `jumpcall status` explains the recovery when the
hotkey is stuck waiting.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@joncode
joncode merged commit 885f85a into main Sep 8, 2026
@joncode
joncode deleted the fix/mic-priority-and-stale-tcc branch September 8, 2026 14:56
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.

1 participant