From 4a81d15d95632d54c47b15297549ab28c41006f3 Mon Sep 17 00:00:00 2001 From: Godopu Date: Mon, 14 Sep 2026 08:09:29 +0000 Subject: [PATCH] test(issue-21): review N2 - T2-8 runs in mam_sandbox, so lib.sh's herdr shim never lands in the caller's control root run_loop.sh sources lib.sh before it refuses --worktree/--base/--review-only under MAM_LOOP_PY=0, and sourcing lib.sh runs _init_herdr_isolation, which rewrites $WORKSPACE_ROOT/.mam/shim/herdr. T2-8 copied the caller's environment as is, so that root was the caller's control root (normally the real checkout). The test now requests mam_sandbox, pins WORKSPACE_ROOT to it explicitly, runs from it, and asserts the shim was written there; the four parametrized refusal cases and their three assertions are unchanged. No product code changes. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_017R3Eg7MEpSWnm1oB9ZPP6G --- tests/test_issue21_worktree_prereqs.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tests/test_issue21_worktree_prereqs.py b/tests/test_issue21_worktree_prereqs.py index 03e4f45..92b9a5e 100644 --- a/tests/test_issue21_worktree_prereqs.py +++ b/tests/test_issue21_worktree_prereqs.py @@ -399,15 +399,19 @@ def test_t2_7_runner_reads_mam_jobs_dir(wt_repo, tmp_path, monkeypatch): (["--review-only"], {}), ([], {"MAM_LOOP_WORKTREE": "/nowhere"}), ]) -def test_t2_8_legacy_shell_loop_refuses_the_new_options(tmp_path, opts, env): - marker = tmp_path / "loop-marker" - run_env = {**os.environ, "MAM_LOOP_PY": "0", "MAM_LOOP_NO_FREEZE": "1", +def test_t2_8_legacy_shell_loop_refuses_the_new_options(mam_sandbox, opts, env): + """run_loop.sh sources lib.sh before the refusal, and lib.sh writes its herdr + shim under $WORKSPACE_ROOT/.mam/shim: that root is the sandbox, never the + caller's control root (#20, review N2).""" + marker = mam_sandbox / "loop-marker" + run_env = {**os.environ, "WORKSPACE_ROOT": str(mam_sandbox), "MAM_LOOP_PY": "0", "MAM_LOOP_NO_FREEZE": "1", "MAM_LOOP_MARKER": str(marker), **env} res = subprocess.run(["bash", str(RUN_LOOP_SH), "--creator", "c", "--task", "t", *opts], - capture_output=True, text=True, env=run_env, cwd=str(tmp_path), timeout=60) + capture_output=True, text=True, env=run_env, cwd=str(mam_sandbox), timeout=60) assert res.returncode == 1 assert "require the Python loop (MAM_LOOP_PY=1)" in res.stderr assert not marker.exists(), "refused before the loop lock" + assert (mam_sandbox / ".mam" / "shim" / "herdr").is_file(), "lib.sh's shim belongs in the sandbox" def _commit_impl(wt: Path) -> str: