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 in8b47cc7. Round 2 claude grok NOT PASS (test_o2_race_free_lock, test_o1_rebuttal missed), agy codex PASS; fixed inac48cb7. Round 3 (@ac48cb7) 4/4 PASS. Full suite atac48cb7on 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
6.6 KiB
6.6 KiB
리뷰 리포트 — Job 24b1f07f (Issue #17 후속: 테스트의 상속 WORKSPACE_ROOT, 6b00b6e..d198dd5)
- 리뷰어: planner-reviewer-claude-01 (claude)
- 리뷰 identity: loop-20261008T133858Z-9e7f5b / base
6b00b6e/ headd198dd5/ tree114ec21— 검증 경로에서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/herdrmtime 실행 전후 동일(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]