# ๐Ÿ” 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 ` ์กฐ์ƒ์€ ์ด๋ฆ„ ๋งค์นญ์ด ์•ˆ ๋˜์–ด ํ—ฌํผ๋กœ ๋‚จ์„ ์ˆ˜ ์žˆ์Œ(๋ฐฐํฌ 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]