# Task List ## In Progress (none) ## Pending (none) ## Completed ### Phase 4 -- Robustness - [x] Audio device hot-swap (DeviceMonitor polling + pipeline rebuild) - [x] Widget tests (41 tests: StatusBar breakpoints, ChannelTree navigation, volume/truncate helpers) ### Phase E -- Polish - [x] Deduplicate `_detect_config_changes` with `dataclasses.asdict()` - [x] Suppress PTT chatlog spam for hold-mode - [x] Add `-> None` return annotations throughout - [x] Cache `users`/`channels` in `MumbleClient` with dirty flag ### Phase D -- Test Coverage - [x] Add `ReconnectManager` unit tests (8 tests) - [x] Add `InputHistory` unit tests (11 tests) - [x] Add `_strip_html` edge case tests (13 tests) - [x] Add config `_load_section` / `load_config` tests (5 tests) - [x] Refactor `test_audio.py` to use public interfaces - [x] Add `stop()` queue drain test ### Phase C -- Architecture - [x] Cache `_find_root()` result in `ChannelTree.set_state()` - [x] Extract `InputHistory` class - [x] Extract `_make_client()` factory (4 duplicate sites) - [x] Extract `ReconnectManager` to `reconnect.py` (`threading.Event`) ### Phase A -- Safety - [x] Replace `_strip_html` regex with `html.parser` stripper - [x] Add defensive config loading (filter unknown TOML keys) - [x] Guard `join_channel`/`send_text` against `KeyError` ### Phase B -- Performance - [x] Replace `_apply_gain` struct with `array` module (numpy unavailable) - [x] Replace `time.sleep(0.005)` polling with `queue.get(timeout=)` - [x] Drain audio queues on `stop()` ### Earlier Work - [x] Wire TUI to MumbleClient (connect on startup, display state) - [x] Implement text message send/receive in chat log - [x] Channel tree population from server data - [x] Audio pipeline integration with MumbleClient - [x] PTT wiring (key events -> audio.capturing toggle) - [x] Chat input history navigation (up/down arrows) - [x] Channel navigation and join from sidebar - [x] User status indicators (mute/deaf) - [x] Volume control (F2/F3, gain 0.0-2.0, status bar display) - [x] Server certificate handling (certfile/keyfile config) - [x] Config file hot-reload (F5, safe/restart change detection) - [x] Reconnection handling with auto-retry and backoff