Final-round reports of the fix/issue-10-11-13-15 review loop: planner-reviewer-claude-01
(aa16fa5c), reviewer-agy-01 (0f41ea47), reviewer-grok-01 (3ea06fb6) and
planner-reviewer-codex-01 (79204d61), all [VERDICT: PASS] on fae70c1.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VCgu9Fa9iT7TbJUSzdq4Ff
60 lines
3.7 KiB
Markdown
60 lines
3.7 KiB
Markdown
# 🔍 Review Report — Job 3ea06fb6 (`fix/issue-10-11-13-15` 2회차, HEAD `fae70c1`)
|
||
|
||
- **Reviewer**: `reviewer-grok-01` (role: reviewer) · 2026-09-13
|
||
- **범위**: `git log`/`git diff` **`bd3df89...HEAD`**
|
||
- **HEAD**: `fae70c1` `fix(issue-10,13): check every agy artifact for holders and purge orphaned leftovers`
|
||
- **선행**: `ba3e3ab5` PASS(`0282312`) → `4b113d10` NOT PASS(N2) → `1752c893` PASS(`f5a6575`). 이번 초점: `7610258` 재확인 + **`fae70c1` Codex R1/R2**.
|
||
- **안전**: 실제 홈 purge 없음. 테스트는 uuid4 픽스처만. 다른 worktree 미접촉. 소스 무변경.
|
||
|
||
커밋: `c82ea75` → `0282312` → `7610258` → `f5a6575` → **`fae70c1`**.
|
||
|
||
## (1) `7610258` `conversation_in_use`
|
||
|
||
- `AGENT_SESSION_ENV` 5종이 uuid 와 같으면 즉시 in-use.
|
||
- cmdline 헬퍼 사슬은 **자기부터 가장 가까운 `_is_agent_cli` 조상 직전**만 제외. 그 조상이 uuid 를 들고 있으면 holder.
|
||
- `_is_agent_cli`: 첫 `-` 옵션 이전 토큰의 basename ∈ `{claude,agy,hermes,grok,opencode,codex}`.
|
||
|
||
오탐/미탐: `python -m <agent>` 조상은 이름 매칭이 안 되어 헬퍼로 남을 수 있음(배포 claude/agy 바이너리 경로에서는 env+basename 으로 잡힘). uuid 를 **언급만** 하는 프로세스도 holder — SKILL.md 가 그렇게 문서화. 자기 세션 purge 거부는 유지.
|
||
|
||
## (2) `fae70c1` R1/R2
|
||
|
||
**R1** `AgyAgentAdapter.conversation_in_use` (`agy.py:92-96`): `_artifact_paths` 의 DB·wal/shm/journal·brain·annotation·**lock** 전부를 `conversation_in_use(..., paths)` 에 넘김. cmdline/env 없이 lock 만 `flock` 한 보유자도 `lsof` 에 잡힘. `test_purge_cli_refuses_when_only_the_presence_lock_is_held_open` 통과. CLI 는 그 결과로 exit 4, **아무것도 안 지움**.
|
||
|
||
**R2** `has_artifacts`:
|
||
- 기본 (`base.py:194-200`): `uuid in artifact_path and exists`. 공유 DB(`opencode` → `opencode.db`, 경로에 uuid 없음)는 모든 uuid 에 매치되지 않음.
|
||
- agy 오버라이드 (`agy.py:86-90`): `_artifact_paths` 중 하나라도 있으면 참 (DB 없는 WAL/annotation/lock).
|
||
- `_resolve_purge_target` 2단계: `verify_artifact` 후 `has_artifacts` (옛 `uuid in path and exists` 대체). claude/hermes/grok/codex 경로는 uuid 를 포함하므로 기존 폴백과 동등. `test_purge_cli_resolves_agy_from_orphaned_leftovers` 통과.
|
||
|
||
다른 어댑터는 `has_artifacts` 를 오버라이드하지 않음. verify 가 먼저이므로 정상 jsonl/session 파일은 1단계에서 해결.
|
||
|
||
## (3) `orc_onboard.sh` / 문서
|
||
|
||
흐름 불변: `--yes` 없으면 exit 4, Python in-use 4 → 셸 5(등록 유지), 미해결 5 → WARN 후 등록 제거, dry-run 무변경, purge 가 YAML 앞. SKILL.md·VERSIONS.md v4.4.3 항목 1–2 가 lock 전 경로 `lsof` 와 고아 부속을 반영.
|
||
|
||
## (4) #15
|
||
|
||
`MAM_JOBS_DIR` → `WORKSPACE_ROOT/.mam/…` → cwd. `job_subscriber --registry-dir` 기본값 `default_registry_dir()` (`7610258` R-d). conftest 격리 유지.
|
||
|
||
## (5) 락스텝
|
||
|
||
`lib.sh`/`eager.py`/8 SKILL.md/`VERSIONS.md` = **4.4.3**. `verify_framework_version` 통과. 릴리스 커밋 `0282312` 제목 유지. `fae70c1` 은 changelog 항목 1–2 만.
|
||
|
||
## (6) 테스트
|
||
|
||
```
|
||
.venv/bin/python -m pytest -q \
|
||
tests/test_issue10_13_purge.py tests/test_issue15_registry_isolation.py \
|
||
tests/test_orc_onboard.py tests/test_a4_adapter_contract.py \
|
||
tests/test_issue5_phase1_delegation.py tests/test_tier1_unit.py \
|
||
tests/test_loop_cli.py tests/test_issue5_phase4_runtime.py \
|
||
tests/test_version_consistency.py
|
||
```
|
||
|
||
**250 passed in 162.54s** (직전 248 + R1/R2 2건). uuid4 픽스처. `git diff --check` 클린. 전체 스위트 미실행.
|
||
|
||
## 종합
|
||
|
||
Codex R1(lock-only holder)과 R2(고아 부속)가 어댑터 단위로 닫혔고, 1회차 PASS 항목은 회귀 없음. 설계 재작업 불필요.
|
||
|
||
[VERDICT: PASS]
|