Files
multi-agent-mux/.agents/reports/planner-reviewer-claude-01/report-24b1f07f.md
T
GodopuandClaude Opus 5.5 e0181ea9be release(v4.8.8): Issue #17 follow-up - archive the review reports and bump the lockstep version
Merge-workspace review loop (--all-reviewer): round 1 (@d198dd5) claude
agy PASS, grok codex NOT PASS (the same inherited WORKSPACE_ROOT in eleven
more modules; test_orc_onboard's import-time env); fixed in 8b47cc7.
Round 2 claude grok NOT PASS (test_o2_race_free_lock, test_o1_rebuttal
missed), agy codex PASS; fixed in ac48cb7. Round 3 (@ac48cb7) 4/4 PASS.
Full suite at ac48cb7 on macOS / Python 3.9 / herdr 0.9.3 with
WORKSPACE_ROOT set to an empty sentinel: 1751 passed / 0 failed / 38
skipped; the sentinel stayed empty and the main checkout's shim was not
touched.

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

6.6 KiB
Raw Blame History

리뷰 리포트 — Job 24b1f07f (Issue #17 후속: 테스트의 상속 WORKSPACE_ROOT, 6b00b6e..d198dd5)

  • 리뷰어: planner-reviewer-claude-01 (claude)
  • 리뷰 identity: loop-20261008T133858Z-9e7f5b / base 6b00b6e / head d198dd5 / tree 114ec21 — 검증 경로에서 git rev-parse HEAD 'HEAD^{tree}' 일치, 미커밋 변경 없음
  • 범위: 커밋 1개(d198dd5), tests/test_issue17_item4_decisions.py 만(+36/−2). 제품 코드(.agents/skills)·버전·VERSIONS 변경 없음(브리프대로).

결론 요약

할 일 1·3·4 가 요구대로 반영됐고, 새 회귀 테스트는 수정 전 _env 에서 실제로 실패한다(센티널에 .mam/shim/herdr 생성). 할 일 2(다른 테스트 조사)는 이 PR 에 코드 변경이 없는데, 내가 직접 grep 한 결과로도 같은 결함(다른 워크스페이스에 쓰기)은 conftest 가 이미 프로세스 수준에서 막고 있어 추가 수정 대상이 없다 — 다만 남는 두 파일(§3)은 creator 리포트의 표에 있어야 한다. 차단 결함 없음.

1. 할 일 1 — _env (tests/test_issue17_item4_decisions.py:224-233)

  • 상속 제외 목록에 WORKSPACE_ROOT 추가(:229), env.update(... WORKSPACE_ROOT=str(tmp_path) ...)(:231) 로 테스트별 임시 경로를 명시. "제거"가 아니라 "지정"을 고른 이유는 주석(:225-227)에 있고 맞다: lib.sh:26 은 WORKSPACE_ROOT 가 비어 있으면 $SKILL_DIR/../.. = 체크아웃 자신을 쓰므로, 제거만 하면 래퍼를 source 하는 헬퍼 4곳(_run_both :246/:372/:561/:586 등)이 체크아웃의 .mam/shim/herdr 를 다시 쓴다. 지정하면 shim 이 tmp_path 아래에 생긴다(회귀 테스트가 (work/.mam/shim/herdr).is_file() 로 고정, :498).
  • extra 로 넘기는 명시 WORKSPACE_ROOT(:692 의 wait-rc 테스트)는 env.update(extra) 가 뒤에 오므로 그대로 이긴다 — 의도적 지정 테스트가 깨지지 않는다.

2. 할 일 3 — 회귀 테스트 test_c_helpers_write_nothing_to_an_inherited_workspace (:477-498)

  • 센티널 디렉터리를 WORKSPACE_ROOT 로 monkeypatch 한 뒤 _run_both(옛·새 양쪽)와 래퍼 직접 source 를 돌리고, 센티널 아래 파일 없음·체크아웃 shim mtime 불변·셸이 보는 $WORKSPACE_ROOT 가 테스트 tmp 임·shim 이 tmp 에 생김을 단언한다.
  • 수정 전 코드에서 실패 확인: HEAD 의 테스트 파일에서 _env 두 줄만 base(6b00b6e) 판으로 되돌린 스크래치 사본 → AssertionError: written into the sentinel, ['.mam', '.mam/shim', '.mam/shim/herdr'] == [] (1 failed). 현재 코드에서 통과.
  • conftest 의 pytest_configure 는 다른 체크아웃을 가리키는 WORKSPACE_ROOT 를 수집 전에 지우므로(tests/conftest.py:139-148), 이 테스트가 monkeypatch 로 다시 설정하는 것이 맞는 설계다(지우지 않으면 센티널이 보이지 않는다).

3. 할 일 2 — 같은 결함이 다른 테스트에 있는가 (직접 grep)

  • conftest 가 막는 범위: pytest_configure(conftest.py:139-148)가 AGENT_SESSIONS_YAML·MAM_JOBS_DIR·DELEGATE_JOB_LOGS_DIR 을 항상, WORKSPACE_ROOT 는 realpath 가 이 체크아웃이 아닐 때만 os.environ 에서 지운다(주석 :122-124: 이 체크아웃을 가리키면 "lib.sh 가 어차피 유도하는 값"). 따라서 어떤 테스트든 os.environ 을 복사해 lib.sh 를 돌려도 다른 워크스페이스에는 쓸 수 없다. 남는 경우는 (i) 체크아웃 자신의 shim 재작성, (ii) 테스트가 monkeypatch 로 다시 설정한 값, (iii) pytest 밖에서 헬퍼를 직접 돌리는 경우(PR #51 리뷰 때의 사고는 리뷰어의 수동 탐침, 즉 (iii)).
  • 이 파일이 "빠진" 이유: 빠진 것이 아니라 (i)(iii) 에 노출돼 있었다 — _env 가 WORKSPACE_ROOT 를 남겨 둔 채 래퍼→lib.sh 를 source 했으므로, 스위트 실행 중에는 체크아웃 자신의 shim 을 매번 다시 썼고, 수동 실행에서는 상속값 그대로 썼다. 이번 수정이 둘 다 막는다.
  • os.environ 을 복사하고 lib.sh/래퍼를 돌리는 테스트 파일 36개를 grep 했다. mam_sandbox 를 쓰는 파일은 fixture 가 WORKSPACE_ROOT=tmp_path 를 설정하므로(conftest.py:215) 복사본이 sandbox 를 물려받아 안전하다. fixture 없이 lib.sh 를 실제로 source 하는 파일은 둘뿐이며, 둘 다 (i) 에만 해당한다:
파일:라인 동작 판단
tests/test_b19_headless_reconcile_fixes.py:326-329, :366-369, :401-402 source "$SKILL_DIR/lib.sh" 하는 스크립트를 SKS_* 만 뺀 os.environ 으로 실행 다른 체크아웃은 conftest 가 지움; 이 체크아웃이면 자신의 shim 재작성(conftest 가 명시적으로 허용하는 경우). 고치지 않아도 되나 표에 있어야 함
tests/test_version_consistency.py:30 bash -c 'source lib.sh …' 를 env 지정 없이 cwd=REPO_ROOT 로 실행 위와 같음
tests/test_deploy_freshness.py, test_deploy_layout.py lib.sh 를 복사·읽기만, source 안 함 해당 없음
  • 제품 코드 변경 필요 여부: 없음. conftest 한 곳에서 "이 체크아웃" 경우까지 지우는 방법은 lib.sh 가 어차피 같은 값을 유도하므로 효과가 없고(주석 :122-124 의 근거), 체크아웃 shim 재작성을 피하려면 각 헬퍼가 tmp 를 지정해야 한다 — 이 PR 의 방식이 맞다.

4. 할 일 4 — 실행 (검증 경로, 워크트리 .venv Python 3.9.6, env -i 로 HERDR_·MAM_·MQTT_* 제거)

실행 결과
(a) WORKSPACE_ROOT 없이: test_issue17_item4_decisions, test_issue33_budget, test_issue5_phase1_delegation, test_tier1_unit 443 passed / 0 failed (478 s)
(b) WORKSPACE_ROOT=<워크트리 밖 센티널>: test_issue17_item4_decisions 290 passed / 0 failed (319 s); 실행 뒤 센티널 비어 있음(find 출력 없음)
회귀 테스트, 수정 전 _env 사본 1 failed(센티널에 .mam/shim/herdr)
  • 본 체크아웃 .mam/shim/herdr mtime 실행 전후 동일(1791469013). 실제 .mam/jobs 항목 수 불변. 브로커 bind 제약 없음.
  • (b) 에서 센티널은 realpath 가 체크아웃이 아니라 conftest 가 지우므로, 대부분의 테스트는 conftest 로, 회귀 테스트는 _env 로 보호되는 셈이다 — 둘 다 통과했으니 브리프 (b) 의 목적(어느 층이든 센티널에 쓰지 않음)은 충족된다.

5. 이식성·비차단

  • 변경은 Python 테스트 코드뿐(3.9 문법, stat().st_mtime_ns, Path.rglob). bash 3.2·macOS 영향 없음.
  • 비차단: §3 표의 두 파일이 creator 리포트의 "고치지 않은 후보" 표에 없다면 추가를 권한다. 새 관찰 없음.

[VERDICT: PASS]