# Task List ## In Progress (none) ## Pending ### Phase D -- Test Coverage - [ ] Add `ReconnectManager` unit tests - [ ] Add `InputHistory` unit tests - [ ] Add `StatusBar` breakpoint tests (Textual `App.run_test()`) - [ ] Add `ChannelTree` keyboard navigation tests - [ ] Add config reload state machine tests - [ ] Refactor existing tests to use public interfaces ### Phase E -- Polish - [ ] Deduplicate `_detect_config_changes` with `dataclasses.asdict()` - [ ] Suppress PTT chatlog spam for hold-mode - [ ] Add `-> None` return annotations throughout - [ ] Cache `users`/`channels` in `MumbleClient` with dirty flag ### Backlog - [ ] Audio device hot-swap ## Completed ### 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