Files
hermes-agent/tests/hermes_cli/test_kanban_worker_terminal_cwd.py
T
Teknium 6b81590c55 test: prune low-value tests suite-wide (wave 1) — 46,820 → 28,106 test functions
Systematic prune per AGENTS.md test policy, one pass over every major
test tree (gateway, hermes_cli, tools, agent, run_agent, plugins, cli,
cron, tui_gateway, honcho/openviking, root-level):

- DELETE: source-reading tests (read_text/getsource on prod files),
  change-detector tests (exact catalog counts, model-name snapshots,
  config version literals), mock-echo tests (assert a mock returns what
  it was told), assertion-free/trivial tests, near-duplicate
  parametrizations (boundaries + one representative kept), async/sync
  twin duplicates, cosmetic within-file variations.
- KEEP (mandatory): security/redaction/approval guards, message-role
  alternation invariants, prompt-caching/deterministic-call-id
  invariants, issue-number regression tests (deduped), E2E tests.
- 6 test files deleted outright (script-style/no-assert or fully
  redundant); conftest.py, fakes/, fixtures/ untouched.
- tests/acp/conftest.py added: autouse fixture stubs the live
  models.dev/GitHub/Copilot/Anthropic inventory fetches that ACP server
  tests performed on every session create — test_server.py 147s → 3.4s,
  and the tests are now genuinely hermetic.
- Sleep-based slowness shrunk where safe (codex_ttfb_watchdog,
  compression_concurrent_fork, etc.); no wall-clock assertion tightened.

Verification: full hermetic suite via scripts/run_tests.sh —
2439 files, 31,130 tests passed, 0 failed, 0 flaky retries, 315s wall
(baseline: 583s wall, 13,564s subprocess CPU).
2026-07-29 13:10:23 -07:00

80 lines
2.6 KiB
Python

"""Tests: kanban worker spawn pins TERMINAL_CWD to the task workspace.
Regression coverage for #34619 and #41312 (same root cause): ``_default_spawn``
launched the worker subprocess with ``cwd=workspace`` and set
``HERMES_KANBAN_WORKSPACE``, but did NOT set ``TERMINAL_CWD``. Because
``TERMINAL_CWD`` takes precedence over the process cwd in both
``tools/file_tools.py::_resolve_base_dir`` (relative ``write_file`` paths) and
``agent_init``'s context-file loader (``AGENTS.md`` discovery), workers inherited
the dispatching gateway's cwd — relative writes landed in the gateway user's
home (#41312) and the wrong profile's ``AGENTS.md`` was loaded (#34619).
Pinning ``TERMINAL_CWD`` to the workspace fixes both.
"""
from __future__ import annotations
import subprocess
def _make_task(kb, *, assignee: str = "w"):
return kb.Task(
id="t_cwd",
title="cwd pin",
body=None,
assignee=assignee,
status="running",
priority=0,
created_by="test",
created_at=1,
started_at=None,
completed_at=None,
workspace_kind="dir",
workspace_path=None,
claim_lock="lock",
claim_expires=None,
tenant=None,
current_run_id=1,
)
def _capture_spawn_env(kb, monkeypatch, workspace: str) -> dict:
monkeypatch.setattr(kb, "_resolve_hermes_argv", lambda: ["hermes"])
captured: dict = {}
class FakeProc:
pid = 4242
def fake_popen(cmd, *args, **kwargs):
captured["cmd"] = list(cmd)
captured["env"] = dict(kwargs.get("env") or {})
captured["cwd"] = kwargs.get("cwd")
return FakeProc()
monkeypatch.setattr(subprocess, "Popen", fake_popen)
kb._default_spawn(_make_task(kb), workspace)
return captured
def test_terminal_cwd_pinned_to_workspace(monkeypatch, tmp_path):
"""A real, absolute workspace dir is pinned as TERMINAL_CWD."""
root = tmp_path / ".hermes"
(root / "profiles" / "w").mkdir(parents=True)
(root / "profiles" / "w" / "config.yaml").write_text("toolsets:\n - kanban\n", encoding="utf-8")
root.joinpath("config.yaml").write_text("toolsets:\n - kanban\n", encoding="utf-8")
monkeypatch.setenv("HERMES_HOME", str(root))
from hermes_cli import kanban_db as kb
workspace = tmp_path / "ws"
workspace.mkdir()
captured = _capture_spawn_env(kb, monkeypatch, str(workspace))
assert captured["env"]["TERMINAL_CWD"] == str(workspace)
# The subprocess cwd and TERMINAL_CWD must agree — both anchor the workspace.
assert captured["cwd"] == str(workspace)
assert captured["env"]["HERMES_KANBAN_WORKSPACE"] == str(workspace)