From 89d8916d7dd39ae0e655552cdbc7783ba759b29c Mon Sep 17 00:00:00 2001 From: OmikronApex Date: Wed, 15 Jul 2026 01:56:17 +0200 Subject: [PATCH] docs(audio): revise plan 8.3 - user stop is momentary, not a latch (field decision 2026-07-15) Co-Authored-By: Claude Fable 5 --- docs/audio-ownership-plan.md | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/docs/audio-ownership-plan.md b/docs/audio-ownership-plan.md index 84a18cd..c043dc5 100644 --- a/docs/audio-ownership-plan.md +++ b/docs/audio-ownership-plan.md @@ -507,11 +507,22 @@ policy decisions. holder's leases ~5–10 s keyed on manifest identity; the same identity re-requesting restores them; timeout or destroy releases for real and notifies waiters. Destroy stays immediate. F5 never changes ownership. -3. **User stop suspends demands.** Raw stop (device screen) always wins: - engine stops, `capture` demands enter *suspended* (not cleared), holders - get `capture-suspended` / `capture-resumed` events. Only user start - resumes. Same ride-through for `device-config` changes that restart the - engine. +3. **User stop suspends demands.** Raw stop (device screen) wins at the + moment it happens: engine stops, `capture` demands enter *suspended* (not + cleared), holders get `capture-suspended` / `capture-resumed` events; raw + user start resumes them. Same ride-through for `device-config` changes + that restart the engine. + **REVISED 2026-07-15 (field testing)**: user stop is NOT a persistent + latch. A latch was implemented and reverted — this is an audio-first + game (note detection + hearing songs are core features), the app's + timebase assumes a running engine (highway jitters without it), and + there is no realistic use case for willfully keeping the engine off. + Stop is a momentary action; legitimate consumers (plugin keep-alives, + `startAudio: true` chain plans, new capture demands) may start the + engine again afterwards. If a true "keep audio off" need ever appears, + the right shape is a native `userWantsAudio` gate in the engine plus a + "stop = capture/monitoring off, engine idles as clock" semantics — not + a JS-side allowlist of start paths. 4. **Well-known internal holders.** Main-process / engine-internal callers use a fixed enum of synthetic ids (`engine:backing-player`, `main:startup-restore`, `main:executor`), registered at boot, lifecycle =