fix(voice_mode): restore audio-env detection across clean/WSL/Termux scenarios (partial close hermes-agent#9) #12

Merged
claude-ceo-assistant merged 1 commits from fix/voice-mode-detect-audio-env-container-stub into main 2026-05-08 20:48:49 +00:00

1 Commits

Author SHA1 Message Date
dev-lead
a4fc156c8d fix(voice_mode): restore audio-env detection across clean/WSL/Termux scenarios
Some checks failed
Nix / nix (macos-latest) (pull_request) Waiting to run
Contributor Attribution Check / check-attribution (pull_request) Failing after 26s
Supply Chain Audit / Scan PR for critical supply chain risks (pull_request) Successful in 30s
Tests / e2e (pull_request) Successful in 1m48s
Nix / nix (ubuntu-latest) (pull_request) Failing after 9m42s
Tests / test (pull_request) Failing after 13m59s
Commit 5e1197a4 swapped the inline `os.path.exists('/.dockerenv')` check in
`detect_audio_environment()` for the more thorough `is_container()` helper
in `hermes_constants` (also matches /run/.containerenv and /proc/1/cgroup
markers, with module-level caching). That helper correctly returns True on
CI runners that themselves run inside Docker, which silently appended a
"Running inside Docker container" warning to every detection scenario and
broke four tests whose contract is "should be available":

  - test_clean_environment_is_available
  - test_wsl_with_pulse_allows_voice
  - test_wsl_device_query_fails_with_pulse_continues
  - test_termux_api_microphone_allows_voice_without_sounddevice

The five "should be blocked" sibling tests passed only by coincidence —
the extra container warning still left `available=False`.

Fix:
  - Hoist `is_container` to a module-level import in tools/voice_mode.py
    so it's reachable as `tools.voice_mode.is_container` (matches the
    monkeypatch convention used elsewhere in the test file for `shutil`,
    `_import_audio`, `_termux_api_app_installed`, etc).
  - Add an autouse fixture in `TestDetectAudioEnvironment` defaulting
    `is_container` to False, so tests don't inherit the host runner's
    container state. Per `feedback_no_such_thing_as_flakes`: the failures
    were a real environmental coupling bug, not a flake.
  - Add `test_docker_container_blocks_voice` to preserve and pin the
    container-blocks-voice intent that the original inline check encoded.

Partial close hermes-agent#9.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 13:47:38 -07:00