Files
multi-agent-mux/.agents/reports/planner-reviewer-codex-01/report-65396b40.md
T

3.4 KiB

Reviewer report — PR #70 / Issue #66

Reviewed the required snapshot at /var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261025T023502Z-d6f876/1, head bb496fde785133ad1dbec288aa7431766efb6eb5, against base 0461a632eb667c7988fd33be92e9a4b36151f22a. The snapshot matches expected tree 15a72c9a1933c64018a2f2d9aa9707348905bb4d and is clean. I read Issue #66 and PR #70; the implementation matches the requested scope.

Findings

No blocking findings.

HerdrSource derives self.name from sanitize_herdr_agent_name(target) while resolving the adapter from the original name (.agents/skills/lib_py/stall_watch.py:140-164). Its agent get, read, and prompt calls use the sanitized name (182-212); the pane operations use pane IDs, so they do not need the session name. StallWatch separately derives the sanitized value for watcher.wait_once at line 229 and calls it at line 331, while notices/logs continue to use args.target (for example lines 391-398). args.herdr_session remains the herdr server selector passed as session=, separate from the sanitized agent name.

The transformation in lib_py/agents/sanitize.py follows the same lowercase, allowed-character replacement, leading-letter prefix, 32-character cap and SHA-1 suffix rules as the active _sanitize_herdr_agent_name in lib.sh:293-318. Agent kind detection uses the original target, which is necessary for long names whose sanitized suffix is a hash. The codex long-name test verifies this using a name whose original -codex suffix is absent from the sanitized form (tests/test_issue66_stall_watch_sanitized_name.py:113-128).

The mock's strict_agent_names check is opt-in (tests/conftest.py:470-477), so its default path retains the prior matching behavior. In strict mode, the tests verify that unconverted names receive agent_not_found for get/read/wait/prompt and sanitized names resolve (test_issue66_stall_watch_sanitized_name.py:52-67). Tests also verify transformed get/read/prompt/wait calls, idle and blocked notifications, preservation of the original name in log output, and unchanged plain-name behavior (69-110).

Verification

  • On the head snapshot, PYTHONDONTWRITEBYTECODE=1 .../python -m pytest -p no:cacheprovider --basetemp=/tmp/mam-review-65396b40-head-pytest tests/test_issue66_stall_watch_sanitized_name.py tests/test_issue30_stall_watch.py tests/test_issue30_stall_watch_stop.py — 66 passed, 1 skipped on macOS, Python 3.9.6 (357.58 s). The skip is the existing Linux-only /proc test.
  • For the base comparison, I checked out base into /tmp/mam-review-65396b40-base, copied in the new regression test and its strict-mock fixture change, and ran the same test file — 5 failed, 2 passed (82.04 s). The failures are the expected unconverted-name calls for long and uppercase targets; the plain-name and strict-mock contract tests pass.
  • git diff --check — passed. No Bash files changed; the integration tests execute the watcher and mock herdr through the host Bash/Python environment.
  • The reported test_issue17_item4_decisions.py::test_c_finalize_ends_with_an_unreaped_wrapper[broker_unavailable-3-0] cleanup race is unrelated to this diff: the changed paths are stall_watch.py, the test-only mock in tests/conftest.py, and the new Issue #66 regression file; no delegation or process-cleanup implementation changed.
  • No real agent-home databases, actual .mam state, or real herdr servers were accessed.

[VERDICT: PASS]