fix(windows): stop spamming cwd-missing + tirith-spawn warnings on every terminal call#26618
Merged
Conversation
…ery terminal call
Two log-spam fixes surfaced by a Windows user (Git Bash + Python 3.11.9):
1. LocalEnvironment cwd warn spam
============================
Git Bash's `pwd -P` emits paths like `/c/Users/x`. The base-class
`_extract_cwd_from_output` was assigning this verbatim to `self.cwd`
without validation, then `_resolve_safe_cwd`'s `os.path.isdir(/c/...)`
returned False on Windows, triggering:
LocalEnvironment cwd '/c/Users/NVIDIA' is missing on disk;
falling back to '/' so terminal commands keep working.
...on every terminal call. The pre-existing Windows-path translation
inside `_run_bash` ran AFTER the safe-cwd check, so it could never
prevent the warning.
Fix:
- New `_msys_to_windows_path` helper (idempotent, no-op off Windows).
- `_resolve_safe_cwd` normalizes before `isdir`, so a valid MSYS path
is recognized as the real directory it points at.
- `LocalEnvironment._update_cwd` and a new override of
`_extract_cwd_from_output` translate + validate before mutating
`self.cwd`. Stale / non-existent marker paths roll back to the
previous cwd instead of clobbering it.
- The fallback warning still fires when the directory really is gone
(deletion-recovery scenario from #17558 still covered).
2. tirith spawn-failed warn spam
=============================
When tirith isn't installed (background install in flight, or marked
failed for the day) and the configured path stays as the bare string
`tirith`, every `subprocess.run([tirith_path, ...])` raises OSError
and logged:
tirith spawn failed: [WinError 2] The system cannot find the file specified
...on every command. fail_open=True means behaviour is correct, but
the log noise is severe.
Fix:
- `_warn_once(key, ...)` thread-safe dedupe helper.
- Three hot-path warnings (`tirith path resolved to None`,
`tirith spawn failed: ...`, `tirith timed out after Ns`) now log
once per (exception class, errno) / timeout-value / path-none key.
- Dedupe set is cleared on `_clear_install_failed` so a successful
install lets a subsequent failure surface again.
Tests
=====
- `tests/tools/test_local_env_windows_msys.py`: 12 tests covering the
MSYS→Windows translator, the resolve fast-path, update_cwd validation,
and extract_cwd_from_output rollback.
- `tests/tools/test_tirith_security.py`: 4 new dedupe tests (15 spawn
failures → 1 log line; distinct exc types → 2 lines; timeout dedupe;
path-None dedupe).
Targeted runs:
test_local_env_windows_msys.py 12 passed
test_local_env_cwd_recovery.py 7 passed (pre-existing, no regressions)
test_tirith_security.py 67 passed (63 pre-existing + 4 new)
test_base_environment + local_* 37 passed (no regressions)
test_local_env_blocklist + neighbours 114 passed
Reported via Hermes log capture: 19× cwd warnings + 15× tirith warnings
in a single short session.
Contributor
🔎 Lint report:
|
| Rule | Count |
|---|---|
unresolved-import |
1 |
First entries
tests/tools/test_local_env_windows_msys.py:24: [unresolved-import] unresolved-import: Cannot resolve imported module `pytest`
✅ Fixed issues: none
Unchanged: 4334 pre-existing issues carried over.
Diagnostics are surfaced as warnings — this check never fails the build.
Collaborator
1 task
This was referenced Jun 11, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Two Windows / Git Bash log-spam fixes surfaced by a user-captured Hermes log: 19× identical
LocalEnvironment cwd '/c/Users/x' is missing on diskwarnings and 15× identicaltirith spawn failed: [WinError 2]warnings in a single short session. Behavior is unchanged in both cases — only log volume drops.Changes
tools/environments/local.py— Git Bash'spwd -Pemits/c/Users/x. The base-class_extract_cwd_from_outputwas assigning this verbatim toself.cwd, then_resolve_safe_cwd'sos.path.isdir('/c/...')returned False on Windows, triggering the warning on every terminal call. The pre-existing Windows-path translation inside_run_bashran after the safe-cwd check, so it could never prevent the warning._msys_to_windows_pathhelper (idempotent, no-op off Windows)._resolve_safe_cwdnormalizes beforeisdirso a valid MSYS path is recognized.LocalEnvironment._update_cwdand a new override of_extract_cwd_from_outputtranslate + validate before mutatingself.cwd. Stale / non-existent marker paths roll back to the previous cwd instead of clobbering it.tools/tirith_security.py— When tirith isn't installed yet (background install in flight, or marked failed for the day) and the configured path stays as the bare string"tirith", everysubprocess.run([tirith_path, ...])raisesOSErrorand logstirith spawn failed: [WinError 2]...on every command.fail_open=Truemeans behavior is correct, but the log noise is severe._warn_once(key, ...)thread-safe dedupe helper.tirith path resolved to None,tirith spawn failed: ...,tirith timed out after Ns) now log once per(exception class, errno)/ timeout-value / path-none key._clear_install_failedso a successful install lets a subsequent failure surface again.Validation
LocalEnvironment cwd '/c/Users/x' is missing on diskwarnings per session on Windowstirith spawn failed: [WinError 2]warnings per session when binary not installedtest_local_env_windows_msys.pytest_local_env_cwd_recovery.pytest_tirith_security.pytest_base_environment.py+ neighbourstests/tools/`tirithTest plan
scripts/run_tests.sh tests/tools/test_local_env_windows_msys.py \ tests/tools/test_local_env_cwd_recovery.py \ tests/tools/test_tirith_security.pyLinux CI fakes the Windows code path by patching
tools.environments.local._IS_WINDOWS = Trueplus_msys_to_windows_pathto return a realtmp_path; the cwd validation path is identical.Out of scope (also found in the same log capture but not fixed here)
desktop.log) — the desktop wrapper is a separate Electron app, not in this repo.whatsapp connect timed out → gateway aborts— already fixed on main; gateway now stays alive in degraded mode for cron jobs (the captured log was on an older build).hermes update:[WinError 32] hermes.exe in use— the warning is misleading but the existing.exe.old.<ts>quarantine + ZIP-fallback path completes successfully.llama-3-70b/gemma4:latest404 / connection errors — user-side Ollama config, not Hermes.No allowlists / no platforms enabled— actionable user warnings, working as designed.