[
  {
    "prompt": "Refactor src/timmy/voice_loop.py (572 lines) by splitting it into modules. Create a PR for issue #1379.\n\nWORKSPACE: /tmp/timmy-agents/hermes/repo (already cloned, on main branch)\nBRANCH: refactor/split-voice-loop\nGITEA API: http://143.198.27.163:3000/api/v1/repos/rockachopa/Timmy-time-dashboard\nGITEA TOKEN: Read from ~/.hermes/gitea_token_vps\n\nREFACTOR PLAN:\n1. Create src/timmy/voice/__init__.py - re-export VoiceLoop, VoiceConfig for backward compat\n2. Create src/timmy/voice/audio_io.py - Extract: _record_utterance, _capture_audio_blocks, _finalize_utterance, _play_audio, _rms, DEFAULT_SAMPLE_RATE, DEFAULT_CHANNELS\n3. Create src/timmy/voice/speech_engines.py - Extract: _load_whisper, _transcribe, _speak, _speak_piper, _speak_say, _ensure_piper, DEFAULT_WHISPER_MODEL, DEFAULT_PIPER_VOICE\n4. Create src/timmy/voice/activation.py - Extract: _WHISPER_HALLUCINATIONS, _EXIT_COMMANDS, _is_hallucination, _is_exit_command, _strip_markdown, _VOICE_PREAMBLE\n5. Keep src/timmy/voice_loop.py as thin orchestrator importing from the new modules, containing VoiceConfig, VoiceLoop class (orchestration methods only: __init__, run, stop, _process_turn, _think, _chat, _cleanup_loop, _get_loop, _log_banner, _suppress_mcp_noise, _install_quiet_asyncgen_hooks)\n\nIMPORTANT CONSTRAINTS:\n- No module may exceed 200 lines\n- All existing imports must still work: `from timmy.voice_loop import VoiceConfig, VoiceLoop, _rms, _strip_markdown`\n- src/timmy/cli.py imports VoiceConfig, VoiceLoop from timmy.voice_loop - must still work\n- tests/timmy/test_voice_loop.py imports VoiceConfig, VoiceLoop, _rms, _strip_markdown - must still work\n- The voice_loop.py stays at its current path but becomes thin, importing from voice/ submodules\n- All tests must pass: run `tox -e unit` in the workspace\n\nGIT WORKFLOW:\n1. cd /tmp/timmy-agents/hermes/repo && git checkout main && git pull\n2. git checkout -b refactor/split-voice-loop\n3. Do the refactor\n4. Run tox -e format then tox -e unit\n5. git add -A && git commit -m \"re",
    "chosen": "",
    "session": "session_20260324_152043_520449.json"
  }
]