Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VCgu9Fa9iT7TbJUSzdq4Ff
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/proctest. - 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 arestall_watch.py, the test-only mock intests/conftest.py, and the new Issue #66 regression file; no delegation or process-cleanup implementation changed. - No real agent-home databases, actual
.mamstate, or real herdr servers were accessed.
[VERDICT: PASS]