mirror of
https://github.com/d4rken-org/capod.git
synced 2026-09-14 18:26:11 -04:00
In AUTOMATIC mode with nothing connected the session is torn down 15 seconds after the state that said so, and only a new state emission cancels that. A start request arriving while a session is live is acknowledged and returns without touching the pending teardown, and the connection state that would abort it lags the Bluetooth event that caused the start by roughly 0.75s. A request landing in the tail of the window was therefore answered with "keeping current session" and the session went down anyway, taking every reaction with it — in one recording the popup reaction was down for 34 seconds spanning an entire lid cycle. The short-circuit now bumps a start signal that the mode pipeline combines in, so the bump cancels the pending inner flow through the existing cancellation topology and arms a fresh window. The countdown also re-reads the signal after its delay, which closes the case where the bump lands while an expired countdown is already unwinding. A re-armed window runs 15 seconds from the start request, so the total dwell can exceed 15 seconds: the request is fresh evidence of activity. The decision segment moves to a top-level internal function so it can be driven directly in tests, following MonitorModeState and buildMonitorModeState which are top-level for the same reason.