Files
multi-agent-mux/.agents/reports/reviewer-grok-01/report-db786989.md
T
GodopuandClaude Opus 5.5 121eab71d4 release(v4.9.3): u1e no longer writes the checkout's .mam/shim/herdr - archive the review reports and bump the lockstep version
Review loop (--review-only, --all-reviewer): round 1 (@3a30d7d) 4/4 PASS;
each reviewer reproduced W1 failing on the pre-fix tree. Seven #50/#55 and
leak modules (112 tests) from a clean worktree left no .mam in the
checkout.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VCgu9Fa9iT7TbJUSzdq4Ff
2026-10-13 12:33:02 +09:00

33 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Review db786989 — u1e workspace root
Head `3a30d7da894cdac26b7ec054b4e66fe9fa3dc8db` (tree `bd43e4642f0109091f5f497b2703dcbaf8e2616b`) is the one commit `3a30d7d fix(tests): u1e gives the wrapper its own WORKSPACE_ROOT - it wrote the checkout's .mam/shim/herdr` on base `42e2a7ea9bd3e2770ed8626d789193428ca3aa8b`. Two test files, +5/−1. `git diff --check` is clean. Snapshot porcelain empty, and the snapshot has no `.mam` directory. Control-plane main is still `42e2a7ea9bd3e2770ed8626d789193428ca3aa8b`, porcelain empty.
## The cause and the pin
The wrapper sources `lib.sh` at startup (`.agents/skills/multi-agent-mux-delegate-job/multi-agent-mux-delegate-job:53`). `lib.sh:26` sets `WORKSPACE_ROOT` to the checkout that contains the sourced file when the variable is unset, and the end of the file calls `_init_herdr_isolation` (`lib.sh:3168`). That function creates `$WORKSPACE_ROOT/.mam/shim` and writes `herdr` there (`lib.sh:149-156`). `pytest_configure` drops `WORKSPACE_ROOT` only when its real path is some other directory (`tests/conftest.py:153-155`), so an unset value stays unset and a value that names the checkout is kept.
`test_u1e_a_dry_run_record_is_not_an_open_job` now puts `WORKSPACE_ROOT` on the wrapper environment, set to that test's `tmp_path` (`tests/test_issue50_dispatch.py:167-173`). The shim is written under the test directory. The dry-run assertions in the same function are unchanged.
## W1 runs this node
`tests/test_issue17_workspace_root_isolation.py:43` adds the node to `NODES`. W1 copies the checkout, sets `WORKSPACE_ROOT` to that copy, runs the nodes, and fails if the copy grows a `.mam` directory (`:57-72`). On the fixed tree the node's own pin replaces the copy path, so the copy stays empty.
On an archive of base `42e2a7e` (outside the snapshot, deleted afterward) the old function does not mention `WORKSPACE_ROOT`. With the control-plane interpreter selected via `AGENT_PYTHON_BIN` (the same variable W1 exports at `:62`):
- `WORKSPACE_ROOT` unset: the node passed in 1.05s and the archive gained `.mam/shim/herdr`.
- `WORKSPACE_ROOT` set to the archive, which is what W1 would pass in: the node passed in 0.97s and the archive again had `.mam/shim/herdr`.
That directory is what W1's assertion at `:70-72` rejects. A passing node is still a W1 failure on the pre-fix tree.
On the snapshot, the fixed node passed in 1.05s. The shim was `test_u1e_a_dry_run_record_is_n0/.mam/shim/herdr` under a basetemp outside the snapshot. The snapshot had no `.mam`. W1 itself passed in 30.80s, which includes the inner count of at least `len(NODES)` and the empty-copy assertion. The snapshot still had no `.mam` after that run.
The wrapper's interpreter check runs after `source lib.sh` (`multi-agent-mux-delegate-job:69`). A first run that left `python3` without paho-mqtt exited 1 at that check on both trees, and the shim had already been written: on the archive in the unset and inherited-copy cases, and under the fixed test's basetemp. The snapshot stayed clean in that run too.
## Other wrapper callers
The same shape — a checkout wrapper or `lib.sh`, with the inherited root left unset — is already closed on the other callers checked here. Their child environments pin `WORKSPACE_ROOT` to the test directory (`tests/test_issue17_item4_decisions.py:229-231` and `:693-694`, `tests/test_issue26_ints.py:129`, `tests/test_issue36_prompt_transport.py:61`, `tests/test_issue30_stall_watch_stop.py:32`, `tests/test_issue6_fail_closed.py:38` and `:198`, `tests/test_issue50_dispatch_herdr.py:78`). The modules W1 already listed opt into `own_workspace_root` or that pin. `tests/test_issue30_stall_watch.py` builds its wrapper environment from `mam_sandbox` / `box`, which set `WORKSPACE_ROOT` before the copy (`tests/conftest.py:263`). No second unpinned checkout-wrapper call turned up.
No herdr server was started. `install.sh` was not run. User herdr config mtime stayed `1791858154`.
[VERDICT: PASS]