Issue #21 items 4, 5, 7 (worktree helpers, review identity, acceptance A1-A8), #20 test isolation, #27 .gitignore managed block, #28 host portability. VERSIONS.md carries the entry; the eight review reports of PR #29 (two rounds plus the codex re-review) are archived under .agents/reports/<session>/. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VCgu9Fa9iT7TbJUSzdq4Ff
64 lines
4.4 KiB
Markdown
64 lines
4.4 KiB
Markdown
# 🔍 Review Report — Job 5f1486ee (PR #29 @ `46ea4cc`)
|
||
|
||
- **Reviewer**: `reviewer-grok-01` · 2026-09-14
|
||
- **트리**: 워크트리 `/Users/godopu16/PuKi/laa/canary_projects/multi-agent-mux-wt/pr-29` detached `46ea4cc`
|
||
- **베이스**: main `1134d74` (본 체크아웃은 그대로 `main`)
|
||
- **범위**: `git log`/`git diff` **`1134d74...HEAD`** (워크트리)
|
||
- **안전**: 워크트리·본 체크아웃 미수정. `worktree_remove.sh` 미실행(샌드박스 테스트만). 실제 `.mam` 미조작.
|
||
|
||
`git diff --check 1134d74...HEAD` 클린. 20 커밋.
|
||
|
||
## (1) 워크트리 헬퍼 (항목 4)
|
||
|
||
**prepare `.venv`**: 실제 venv 가 아니라 **컨트롤 루트 `.venv` 의 심링크** (`worktree_prepare.sh:111-117`). 설계 문서의 `ln -s` 와 같음. 인터프리터는 컨트롤 루트 경로. 공유 `info/exclude` 에 `/.venv`, `.pytest_cache/` (`:120-129`) — 본 체크아웃 exclude 에도 들어가며, 비차단 권고(선반영)와 같음.
|
||
|
||
**서브모듈 opt-in** (`--submodules`). 실패 시 이번 시도만 deinit·modules 삭제·config 복원 (`:174-198`). 비어 있지 않은 미init 경로는 변경 전 거부 (`:163-172`).
|
||
|
||
**remove R1–R6**: 검사 전부 선행, 실패 시 무변경(exit 3). `--stop` 후 재검사(R1). 서브모듈 stash 거부. `git worktree remove --force` 는 submodule trace 가 있고 judge 가 통과한 뒤에만 (`:158-163`). 미커밋/미push 는 `UNPUSHED_REVS` (`worktree.py:27-30`: HEAD + `--all` − stash − remotes, 태그 포함 R6) 로 거부. **강제 제거가 보존된 커밋을 삼키는 경로는 검사 통과를 전제로 막혀 있다.** 잠긴 워크트리는 force 도 거부.
|
||
|
||
## (2) resume (2679ddf)
|
||
|
||
원래 `pane.cwd` 와 `--workspace` 불일치·경로 없음 → exit 2 (`resume_session.sh:61-69`). **단일 워크스페이스** 사용자는 cwd=체크아웃이라 기존과 같다. `ROW_CWD` 없는 레거시 행은 검사를 건너뜀. 컨트롤 평면 바인딩은 행 값이 이김; 계산 실패는 워크트리면 exit 2, 컨트롤 루트면 경고 (`:92-98`). 이미 실행 중 경로에도 영속화(주석 A13). 기존 resume 을 깨지 않음.
|
||
|
||
## (3) 리뷰 identity (항목 5)
|
||
|
||
`(loop_id, base_sha, head_sha)` 기록·stale (`runner.py:831-840`). `--review-isolation` 기본 `worktree` 이지만 **`--worktree`/`--base` 없을 때 `_worktree_context` 는 빈 문자열** (`:564-570`) — 프롬프트 바이트 동일. 옵션만 주면 경고 후 무시 (`:266-267`). detached 리뷰 워크트리 add/remove (`:775-786`). dirty 서브모듈 거부. `--remote-review` 기본 refuse. 승격 전 재확인 경로 존재. 기본(옵션 없음) 회귀 없음.
|
||
|
||
## (4) #20 격리
|
||
|
||
`pytest_configure` 가 ambient `MAM_JOBS_DIR`/`DELEGATE_JOB_LOGS_DIR`/`AGENT_SESSIONS_YAML` 을 수집 전에 pop (`conftest.py:139-147`). 매 테스트 autouse 가 tmp `.mam-test-state` 로 보냄 (`:161-172`). issue15 해석 테스트는 자체 `delenv` 로 옵트아웃. 세션 가드는 기록된 제어 평면 (`mam_state_leak_guard`).
|
||
|
||
**직접 확인**: 테스트 전후 본 체크아웃 `.mam/jobs/*.json` **53**, `delegate_job_logs` **547** — 증가 없음. 워크트리 `git status` 깨끗.
|
||
|
||
## (5) acceptance5
|
||
|
||
세션·secret 런마다 고유 (`test_issue18_liveness_contract.py:1194-1201`). skip 은 러너가 started 를 찍고 구독자가 그 job 을 전혀 못 받은 경우만 (`:1164-1186`). started `--heartbeat` 계약은 유지. 약화 없음.
|
||
|
||
## (6) A1–A8
|
||
|
||
`test_issue21_acceptance.py`: mock herdr / mam_sandbox. 실제 herdr pane 은 stage C. 결정적. 지정 스위트에 loop_b 전체는 없음(작성 측 별도).
|
||
|
||
## (7)–(8) 문서·버전
|
||
|
||
design doc·SKILL 정합. 비차단 4건(exclude 공유, prune, 서브모듈 거부 중복 출력 등)은 병합 비차단. 락스텝 4.7.0 은 오케스트레이터 예정 — **병합 차단 아님**. 브랜치는 4.6.0.
|
||
|
||
## 테스트
|
||
|
||
워크트리:
|
||
|
||
```
|
||
PYTHONDONTWRITEBYTECODE=1 .venv/bin/python -m pytest -p no:cacheprovider -q \
|
||
tests/test_issue21_acceptance.py tests/test_issue21_phase2_loop_a.py \
|
||
tests/test_issue21_worktree_prereqs.py tests/test_issue20_state_isolation.py \
|
||
tests/test_issue15_registry_isolation.py tests/test_issue6_turn_handshake.py \
|
||
tests/test_version_consistency.py
|
||
```
|
||
|
||
**100 passed, 1 skipped in 359.97s.** 본 체크아웃 `main` `1134d74` 유지.
|
||
|
||
## 종합
|
||
|
||
항목 4·5·7·#20·#27 이 코드·테스트와 맞다. `git worktree remove --force` 는 검사 통과 후에만. 설계 재작업 불필요.
|
||
|
||
[VERDICT: PASS]
|