# 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]