Merge-workspace review loop (--all-reviewer): round 1 (@a93c9bf) 4/4
PASS. Full suite at a93c9bf on macOS / Python 3.9 / herdr 0.9.3 with
WORKSPACE_ROOT set to an empty sentinel: 1752 passed / 0 failed / 38
skipped; the sentinel stayed empty, the review worktree had no .mam, 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.0 KiB
6.0 KiB
리뷰 리포트 — Job 616578e7 (loop-lock: 테스트가 체크아웃의 루프 잠금을 잡지 않게, 97c2946..a93c9bf)
- 리뷰어: planner-reviewer-claude-01 (claude)
- 리뷰 identity: loop-20261008T234013Z-4f5d21 / base
97c2946/ heada93c9bf/ tree741c19b— 검증 경로에서git rev-parse HEAD 'HEAD^{tree}'일치, 미커밋 변경 없음 - 범위: 커밋 1개(+55줄), 테스트 3개 파일: test_o3_scoped_guard.py 의 b13 두 곳에
MAM_LOOP_MARKER=tmp_path/..., 새 tests/test_loop_marker_isolation.py(L1), test_issue17_workspace_root_isolation.py W1 에.mam부재 단언 1줄. 제품 코드(.agents/skills)·버전·VERSIONS 변경 없음(브리프대로).
결론 요약
할 일 1~4 가 요구대로이고, 내 독립 조사(grep + 사본 트리 실행)로도 누락된 실행 지점이 없다. 잠금 동작을 시험하는 테스트들의 marker 경로는 바뀌지 않았다. 차단 결함 없음.
1. 조사(1) — 직접 grep 한 결과 (run_loop.sh 실행 지점 전수)
run_loop.sh 는 :15 MAM_REAL_ROOT=${MAM_REAL_ROOT:-$REPO_ROOT}, :110 --help 와 :66-141 인자 오류는 :181 의 marker 결정·:248 mam_acquire_loop_lock 이전에 종료, loop_lock.sh:66 이 부모 디렉터리를 mkdir -p. Python LoopRunner 는 잠금을 잡지 않는다(runner.py:1224-1226 은 release 뿐, acquire 는 run_loop.sh:248 에만 있음).
| 실행 지점 | 분류 | 근거 |
|---|---|---|
| test_o3_scoped_guard.py:388, :472 (b13 두 테스트) | 대상 → 수정됨 | 체크아웃 run_loop.sh, --creator nonexistent-agent --task …, cwd=REPO_ROOT; 이제 MAM_LOOP_MARKER=tmp_path/loop-guard-active(:390, :470) |
| test_issue5_phase3_loop.py:166, :184 | 이미 지정 | :163 MAM_LOOP_MARKER=tmp_path/loop-marker |
test_loop_cli.py:52 (_run_loop) |
이미 지정 | env_extra 에 MAM_LOOP_MARKER=tmp_path/loop-guard |
| test_o2_race_free_lock.py:203 (o2_12) | 이미 지정(잠금 경합 자체를 시험) | :202 MAM_LOOP_MARKER=marker(tmp_path) — 의도 유지 |
| test_issue25_plan_reuse.py:367 (p7b) | 이미 지정 | MAM_LOOP_MARKER=tmp_path/loop.marker |
| test_issue21_loop_b.py:239, test_issue21_worktree_prereqs.py:405 | 이미 지정 | WORKSPACE_ROOT=tmp + MAM_LOOP_MARKER |
| test_issue21_acceptance.py:298, test_issue36_prompt_transport.py:540, test_b7_diff_untracked.py:189, test_tier4_e2e.py:285 | 복사본 트리의 run_loop.sh(main/ctl/base/tmp_path) |
체크아웃이 아님(acceptance 는 marker 도 지정) |
| test_issue5_phase4_runtime.py:132-146 (p4_03), test_issue25:355, test_issue5_phase3:151, test_o1_rebuttal.py:72 | --help → :110 에서 종료 |
잠금 전 |
test_o1_rebuttal.py:76 (--max-rebut abc) |
인자 오류 → 잠금 전 종료 | :66-98 |
| test_o3 Z-7/Z-14(:137, :155), test_deploy_freshness:473, test_issue5_phase0_contracts:481, test_o1:24/:166 | 소스 텍스트 읽기만 | 실행 없음 |
| LoopRunner in-process(issue18, issue21_loop_b, issue25, issue30, issue33, issue34, issue36, issue6, phase4 등) | 잠금 미획득 | 위 runner.py 근거; 해당 없음 |
경험적 확인(W1 방식): HEAD 트리 사본에서 WORKSPACE_ROOT=<사본> 으로 브리프 후보 15개 모듈을 파일 전체 단위로 실행하고 매번 .mam 확인 — 15개 모두 clean(b7 20, deploy_freshness 13+18 skip, issue21_acceptance 10, issue21_loop_b 34, worktree_prereqs 35, issue25 17, issue36 23+1 skip, phase0 41, phase3 12, phase4 5, loop_cli 9, o1 10, o2 22, o3 32, tier4_e2e 5 — 모두 passed). 놓친 실행 지점 없음.
2. 할 일 2·3 — 수정 방식과 회귀 테스트
- 대상이 한 모듈의 두 테스트뿐이라 conftest fixture 대신 각 호출에 env 지정 — 브리프의 "검토" 요건에 맞는 최소 변경. o2 의 잠금 경합·o3 의 marker 검사(mam_sandbox 아래 marker)는 손대지 않았다.
- L1(test_loop_marker_isolation.py:36-50)은 W1 과 같은 방법(체크아웃 복사 → 7개 노드 실행 →
.mam부재)이며 NODES 는 위 표의 "잠금까지 가는" 7개와 정확히 일치한다. W1 에도.mam디렉터리 자체의 부재 단언이 추가돼(:71) 잠금 디렉터리 생성이 두 테스트에서 잡힌다. - 수정 전 코드에서 실패 확인: L1 자체는
git ls-files가 필요해git archive사본에서는 못 돌리므로, L1 의 방법을 base 트리 사본 안에서 직접 재현했다 — 7개 노드를WORKSPACE_ROOT=<base 사본>으로 실행(7 passed) → 사본에.mam/생성(L1 의 마지막 단언이 실패하는 조건). 노드별로는 b13 두 테스트만 생성하고 나머지 5개는 clean — 테스트 머리말의 "The first two took the checkout's lock at 97c2946" 와 일치. HEAD 에서는 (a)(b) 모두에서 L1·W1 통과.
3. 할 일 4 — 실행 (검증 경로 워크트리, 워크트리 .venv Python 3.9.6, env -i 로 HERDR_·MAM_·MQTT_* 제거)
| 실행 | 결과 |
|---|---|
| (a) WORKSPACE_ROOT 없이: test_issue17_workspace_root_isolation, test_loop_marker_isolation, test_o3_scoped_guard, test_o2_race_free_lock | 57 passed / 0 failed (45 s); 실행 뒤 워크트리에 .mam/ 없음 |
| (b) WORKSPACE_ROOT=<워크트리 밖 센티널>: 같은 4개 파일 | 57 passed / 0 failed (45 s); 센티널 비어 있음; 워크트리에 .mam/ 없음 |
- 본 체크아웃의 실제 잠금
.mam/loop-guard-activemtime 전후 동일(1791502813) — 이 리뷰 중 본 체크아웃에서는 아무것도 실행하지 않았다. 실제 .mam/jobs 항목 수 불변. 브로커 bind 제약 없음. - 이식성: Python 테스트 코드만(3.9 문법). L1 은 nested pytest +
git ls-files, 이 Mac 에서 통과.
4. 비차단
- L1·W1 둘 다 노드 목록을 수동 유지한다(이전 리뷰의 같은 지적). run_loop.sh 를 잠금까지 실행하는 테스트를 새로 추가하면 L1 NODES 에도 넣어야 한다.
- L1 은
_copy_checkout을 W1 모듈에서 import 하므로 두 테스트 파일이 결합돼 있다 — 작동에는 문제없고, 공용 헬퍼를 conftest 로 옮길지는 취향 문제. - 새 관찰 없음.
[VERDICT: PASS]