v0.9.10
v0.9.10: broaden stop-popup trigger (HIGH → MEDIUM debounce)
v0.9.9's per-process audio listener fix relied on kAudioProcessProperty* populating the mic-owners list so we could subtract our own recorder PID. In production on macOS Tahoe 26 some users observe owners=[] while mic_in_use=true, which puts the detector in degraded mode — raw mic_in_use is held true for the duration of the recording, so the HIGH → NONE edge the stop popup logic depended on never commits.
v0.9.10 broadens the trigger. While recording, the stop banner now fires on:
- any edge to
NONE(unchanged) — clean mic release in non-degraded mode HIGH → MEDIUMafter a 30 s grace window — covers the degraded-owners case where the mic side can't be the trigger (closing a Meet tab in Comet while we still hold the mic dropsbrowser_urlmatch, committing the HIGH → MEDIUM edge)
The grace window absorbs brief tab/app switches during a real meeting; recovery to HIGH inside the window cancels. The banner defaults to keep on dismiss / timeout, so false positives are recoverable. The pending timer is cancelled on manual stop, popup-driven save, and daemon shutdown.
Test coverage
- HIGH → MEDIUM with active recording fires the popup after the grace window
- HIGH → MEDIUM → HIGH inside the window cancels (no popup)
- HIGH → MEDIUM with no active recording is a no-op
- HIGH → MEDIUM → NONE: the NONE edge supersedes the timer (single popup, no double-fire)
record_stopcancels a pending timer
419 tests pass / 0 fail. Typecheck clean. Build clean.
Full Changelog: v0.9.9...v0.9.10