# ๐Ÿ“œ Multi-Agent Mux ๋ฒ„์ „ ์ด๋ ฅ (`VERSIONS.md`) ์ด ๋ฌธ์„œ๋Š” `multi-agent-mux` ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋ฒ„์ „๋ณ„ ์ฃผ์š” ๊ธฐ๋Šฅ ์ถ”๊ฐ€, ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์„ , ๋ฒ„๊ทธ ์ˆ˜์ • ๋ฐ ํ’ˆ์งˆ ๊ฒ€์ฆ ์ด๋ ฅ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. --- ## ๐Ÿ“Œ ํ˜„์žฌ ๋ฒ„์ „ ๊ฐœ์š” (Current Release) - **ํ”„๋ ˆ์ž„์›Œํฌ ๋ฒ„์ „**: `v2.2.0` - **์ตœ์‹  ๋ฆด๋ฆฌ์Šค ์ผ์‹œ**: 2026-08-24 (KST) - **๊ธฐ์ค€ ๋ธŒ๋žœ์น˜**: `main` - **ํ•ต์‹ฌ ์•„ํ‚คํ…์ฒ˜**: - **`--herdr-workspace` Option & Runtime Label Sync**: Herdr ์„ธ์…˜ ๋‚ด ์›Œํฌ์ŠคํŽ˜์ด์Šค ๋ผ๋ฒจ ๋…๋ฆฝ ์ง€์ • ๋ฐ ๋Ÿฐํƒ€์ž„/YAML ์‹ค์‹œ๊ฐ„ ๋™๊ธฐํ™” - **Legacy Fallback Chain Decoupling**: ๋ฐ๋ชฌ ์†Œ์ผ“(`herdr_session`)๊ณผ ์›Œํฌ์ŠคํŽ˜์ด์Šค ๋ผ๋ฒจ(`herdr_workspace`) ์กฐํšŒ ์ฒด์ธ ์›์ฒœ ๋ถ„๋ฆฌ - **Modern Agent Adapter & TUI Readiness**: ์ตœ์‹  Claude Code(`v2.1.241`) ๋ฐฐ๋„ˆ ๋ฐ 4๋Œ€ ์—์ด์ „ํŠธ TUI ์ดˆ๊ณ ์† ๊ฐ์ง€ - **2xK Right-Growth Grid Layout Engine (B-20)**: ๋™์  ํ„ฐ๋ฏธ๋„ ๊ฐ์ง€ ๋ฐ 2xK ์šฐ์ธก ํ™•์žฅ ํƒ€์ผ๋ง ์—”์ง„ - **Universal Herdr Session Isolation**: ๋‹จ์ผ Herdr ์„œ๋ฒ„ ์ปจํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ์„ธ์…˜ ๊ฒฉ๋ฆฌ - **Tier-1 Fast-Path Lifecycle**: 0ms ์ง€์—ฐ์˜ ๋Œ€ํ™” UUID ์บก์ฒ˜ ๋ฐ ์ดˆ๊ณ ์† ์žฌ๊ฐœ(Resume) --- ## ๐Ÿงญ ์Šคํ‚ฌ ํŒจํ‚ค์ง€ ๋ฒ„์ „ ๋งคํŠธ๋ฆญ์Šค (Skills Version Matrix) ๋ชจ๋“  8๊ฐœ ์Šคํ‚ฌ์€ YAML frontmatter ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(`author`, `version`, `platforms`, `environments`) ํ‘œ์ค€ํ™”๋ฅผ ํ†ตํ•ด `v2.2.0`์œผ๋กœ ๋™๊ธฐํ™”๋˜์–ด ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. | ์Šคํ‚ฌ๋ช… | ๋ฒ„์ „ | ์—ญํ•  ๋ฐ ์ฃผ์š” ์ฑ…์ž„ | ์ƒํƒœ | | :--- | :---: | :--- | :---: | | **`multi-agent-mux-create`** | `2.2.0` | ์—์ด์ „ํŠธ ์„ธ์…˜ ์‹ ๊ทœ ์ƒ์„ฑ ๋ฐ Herdr ์ปจํ…Œ์ด๋„ˆ ๊ฒฉ๋ฆฌ ์Šคํฐ | โœ… ๋ฐฐํฌ | | **`multi-agent-mux-stop`** | `2.2.0` | ๋Œ€ํ™” UUID ์›์ž์  ์บก์ฒ˜ ๋ฐ ์„ธ์…˜ ์•ˆ์ „ ์ข…๋ฃŒ (Graceful Stop) | โœ… ๋ฐฐํฌ | | **`multi-agent-mux-resume`** | `2.2.0` | ์˜จ๋””์Šคํฌ ๋Œ€ํ™” ์ปจํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ Tier-1 ์ดˆ๊ณ ์† ์„ธ์…˜ ๋ณต์› | โœ… ๋ฐฐํฌ | | **`multi-agent-mux-status`** | `2.2.0` | ์‹ค์‹œ๊ฐ„ Herdr ์„ธ์…˜ ๋ฐ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋“œ๋ฆฌํ”„ํŠธ ์Šค๋ƒ…์ƒท ์กฐํšŒ | โœ… ๋ฐฐํฌ | | **`multi-agent-mux-monitor`** | `2.2.0` | YAML โ†” ๋Ÿฐํƒ€์ž„ ์ƒํƒœ ๊ฐ„ ์ž์œจ ์กฐ์ •์ž (Reconciler Loop) | โœ… ๋ฐฐํฌ | | **`multi-agent-mux-delegate-job`** | `2.2.0` | MQTT ์ด๋ฒคํŠธ ์ฑ„๋„ ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐ ๋‹จ์œ„ ์ž‘์—… ์œ„์ž„ | โœ… ๋ฐฐํฌ | | **`multi-agent-mux-loop`** | `2.2.0` | Planner-Creator-Reviewer 3์ž ์ž์œจ ๊ณ„ํšยท์‹คํ–‰ยทํ”ผ์–ด๋ฆฌ๋ทฐ ๋ฃจํ”„ | โœ… ๋ฐฐํฌ | | **`multi-agent-mux-orc-onboard`** | `2.2.0` | ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ UUID ๊ฒฉ๋ฆฌ ๋“ฑ๋ก ๋ฐ ์„œ๋ธŒ ์„ธ์…˜ ์˜ค์—ผ ๋ฐฉ์ง€ | โœ… ๋ฐฐํฌ | --- ## ๐Ÿ“‹ ๋ฒ„์ „๋ณ„ ์ƒ์„ธ ๋ณ€๊ฒฝ ๋‚ด์—ญ (Changelog) ### ๐Ÿš€ `v2.2.0` โ€” Herdr Workspace Label Standardization, Runtime Sync & Legacy Fallback Decoupling (2026-08-24) > **์ฃผ์š” ๋งˆ์ผ์Šคํ†ค**: `--herdr-workspace` ์˜ต์…˜ ์ „ ์Šคํ‚ฌ ๋„์ž… ๋ฐ YAML ๋…๋ฆฝ ์ง๋ ฌํ™”, Herdr ๋Ÿฐํƒ€์ž„ ์›Œํฌ์ŠคํŽ˜์ด์Šค ๋ ˆ์ด๋ธ” ์‹ค์‹œ๊ฐ„ ๋™๊ธฐํ™”, ๋ ˆ๊ฑฐ์‹œ ์†Œ์ผ“ ํด๋ฐฑ ์ฒด์ธ ๋ถ„๋ฆฌ(Breaking Change ๋ฐฉ์–ด), ์ตœ์‹  Claude Code TUI ๊ฐ์ง€ ํ† ํฐ ๋ฐ˜์˜, 27๊ฐœ ์‹ ๊ทœ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ ๋ฐ ๋งŒ์žฅ์ผ์น˜ PASS ๋‹ฌ์„ฑ. #### 1. `--herdr-workspace` ์˜ต์…˜ ๋„์ž… ๋ฐ Herdr ๋Ÿฐํƒ€์ž„ ๋ ˆ์ด๋ธ” ๋™๊ธฐํ™” - **CLI ์˜ต์…˜ ๋ฐ YAML ์ง๋ ฌํ™” ํ‘œ์ค€ํ™”**: - `create_session.sh`, `resume_session.sh`, `update_yaml_resumed.sh`, `stop_session.sh`์— `--herdr-workspace ` ํŒŒ์„œ ๋ฐ ํ™˜๊ฒฝ๋ณ€์ˆ˜(`HERDR_WORKSPACE`) ์ง€์› ์ถ”๊ฐ€. - `agent-sessions.yaml`์— `herdr_session`(์†Œ์ผ“๋ช…)๊ณผ `herdr_workspace`(์›Œํฌ์ŠคํŽ˜์ด์Šค ๋ผ๋ฒจ)๋ฅผ ๊ฐ๊ฐ ๋…๋ฆฝ ํ•„๋“œ๋กœ ์˜๊ตฌ ์ง๋ ฌํ™”. - **Herdr ๋Ÿฐํƒ€์ž„ ์›Œํฌ์ŠคํŽ˜์ด์Šค ๋ ˆ์ด๋ธ” ์‹ค์‹œ๊ฐ„ ์—ฐ๋™ (`lib.sh`, `resume_session.sh`)**: - `herdr workspace create` ํ˜ธ์ถœ ์‹œ `--label "$MAM_WS_LABEL"` ์ „๋‹ฌ ๋ฐ ๊ธฐ์กด ์›Œํฌ์ŠคํŽ˜์ด์Šค ์‚ฌ์šฉ ์‹œ `herdr workspace rename` ์ž๋™ ํ˜ธ์ถœ. - `resume_session.sh` ์‹คํ–‰ ์‹œ ์ €์žฅ๋œ `herdr_workspace`๋ฅผ ์ฝ์–ด Herdr ๋Ÿฐํƒ€์ž„ ๋ ˆ์ด๋ธ” ๋ณต์› ๋ณด์žฅ. #### 2. ๋ ˆ๊ฑฐ์‹œ ์†Œ์ผ“ ํด๋ฐฑ ์ฒด์ธ ๋ถ„๋ฆฌ ๋ฐ Breaking Change ์›์ฒœ ์ฐจ๋‹จ - **์†Œ์ผ“ vs ์›Œํฌ์ŠคํŽ˜์ด์Šค ํ•จ์ˆ˜ ์™„์ „ ๋ถ„๋ฆฌ (`lib.sh`)**: - `resolve_herdr_session()`: ๋ฐ๋ชฌ/์†Œ์ผ“ ์„ธ์…˜๋ช…๋งŒ ๋ฐ˜ํ™˜ (row `herdr_session` -> row `herdr_server` -> env -> slug). - `resolve_herdr_workspace()`: ์›Œํฌ์ŠคํŽ˜์ด์Šค ๋ผ๋ฒจ๋งŒ ๋ฐ˜ํ™˜ (row `herdr_workspace` -> `pane.cwd` slug -> caller `ws` arg). - ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค 6๊ฐœ ์ง€์ (`lib.sh:1027`, `reconcile.sh:135, 399, 495`, `status.sh:145, 270`)์—์„œ ์†Œ์ผ“ ๊ฒ€์ƒ‰ ์‹œ `herdr_workspace`๋ฅผ ์˜ค์ธ ์ฐธ์กฐํ•˜๋˜ ๊ตฌ๋ฌธ์„ ์™„์ „ํžˆ ์ œ๊ฑฐ. - **์™ธ๋ถ€ ์„ธ์…˜ ์ž…์–‘(Drift-B) ๋ณด๊ฐ• (`reconcile.sh`)**: - ์™ธ๋ถ€ ์„ธ์…˜ ์ž…์–‘ ์‹œ `herdr_workspace`์™€ `herdr_server`๋ฅผ ์ž๋™ ์ฑ„๋ฒˆ ๋ฐ ์ง๋ ฌํ™”. #### 3. ์ตœ์‹  ์—์ด์ „ํŠธ TUI ์ค€๋น„ ๊ฐ์ง€ ๋ณด๊ฐ• (`claude.py`, `lib.sh`) - ์ตœ์‹  Claude Code(`v2.1.241`)์˜ ์‹œ์ž‘ ๋ฐฐ๋„ˆ(`Claude Code`, `Opus 5 with high effort` ๋“ฑ)๋ฅผ `ready_tokens`์— ์ถ”๊ฐ€ํ•˜์—ฌ ์„ธ์…˜ ์ƒ์„ฑ ํƒ€์ž„์•„์›ƒ ๋ฐฉ์ง€. --- ### ๐Ÿš€ `v2.1.0` โ€” 2xK Grid Layout Engine, Explicit Agent Standardization & Herdr Session Hardening (2026-08-24) > **์ฃผ์š” ๋งˆ์ผ์Šคํ†ค**: 2xK ์šฐ์ธก ์„ฑ์žฅ ๊ทธ๋ฆฌ๋“œ ๋ ˆ์ด์•„์›ƒ ์—”์ง„(`lib_py.layout`) ๊ตฌ์ถ•(B-20), ์ „ ์Šคํฌ๋ฆฝํŠธ `--agent` / `--herdr-session` ํ‘œ์ค€ํ™” ๋ฐ ์ „ํŒŒ ๊ฐ€๋“œ, ์ „์ฒด 346๊ฐœ ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ 100% PASS ๋‹ฌ์„ฑ. #### 1. 2xK ์šฐ์ธก ์„ฑ์žฅ ๊ทธ๋ฆฌ๋“œ ๋ ˆ์ด์•„์›ƒ ์—”์ง„ ๊ตฌ์ถ• (B-20 / I-2, I-3, C-1, J-1) - **์ˆœ์ˆ˜ ํŒŒ์ด์ฌ ๋ ˆ์ด์•„์›ƒ ์—”์ง„ ์‹ ์„ค (`lib_py/layout.py`)**: - `tput` ๊ธฐ๋ฐ˜ ํ„ฐ๋ฏธ๋„ ํฌ๊ธฐ ๋™์  ๊ฐ์ง€ ๋ฐ 2xK(2ํ–‰ ๊ณ ์ •, ์šฐ์ธก ์—ด ์ถ”๊ฐ€) ๊ทธ๋ฆฌ๋“œ ๊ธฐํ•˜ํ•™ ๊ณ„์‚ฐ ์—”์ง„ ๊ตฌํ˜„. - ํŒจ๋„ ๋ฒˆํ˜ธ ์ˆœ์„œ(0:์ขŒ์ƒ, 1:์ขŒํ•˜, 2:์ค‘์ƒ, 3:์ค‘ํ•˜...)์— ๋”ฐ๋ฅธ ์šฐ์ธก ํ™•์žฅ ํƒ€์ผ๋ง ๋ถ„ํ•  ๋ช…๋ น(`split-pane -h/-v`, `select-pane`) ๊ณ„์‚ฐ. - ํ—ค๋“œ๋ฆฌ์Šค/CI ์ตœ์†Œ ์ฐจ์›(์ตœ์†Œ ๋„ˆ๋น„ 60, ์ตœ์†Œ ๋†’์ด 20) ๊ฐ€๋“œ ๋ฐ `default=60` falsy-zero trap ํ•ด๊ฒฐ (`_env_int`). - **33๊ฐœ ์‹ ๊ทœ ๋ ˆ์ด์•„์›ƒ ๋‹จ์œ„/ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ๊ตฌ์ถ• (`tests/test_layout.py`)**: - 1~8๊ฐœ ํŒจ๋„ ์ˆ˜์‹ ๊ฒ€์ฆ, ๋น„์ •์ƒ ์ธ์ž/ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋ฐฉ์–ด, ๋ฌดํ•œ ๋ฃจํ”„ ๋ฐฉ์ง€ ๊ฐ€๋“œ ๊ฒ€์ฆ. #### 2. ์—์ด์ „ํŠธ ์ธ์ž ํ‘œ์ค€ํ™” ๋ฐ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ž๋™ ์ถ”๋ก  - `stop_session.sh`, `create_session.sh`, `resume_session.sh`, `update_yaml_resumed.sh`, `resolve_session_id.sh` ์ „๋ฐ˜์— ๊ฑธ์ณ `--agent ` ๋ช…์‹œ์  ํ‘œ์ค€ํ™”. - ๋ฏธ์ง€์ • ์‹œ YAML ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ(`agent-sessions.yaml`) ๊ธฐ๋ฐ˜ ์—์ด์ „ํŠธ ํƒ€์ž… ์ž๋™ ์ถ”๋ก (`resolve_agent_type_from_registry`) ์—ฐ๋™. #### 3. `--herdr-session` ๊ฒฉ๋ฆฌ ์„ธ์…˜ ์˜ต์…˜ ํ‘œ์ค€ํ™” ๋ฐ ์ „ํŒŒ ๊ฐ€๋“œ - `create_session.sh`, `resume_session.sh`, `stop_session.sh`, `update_yaml_resumed.sh` ์ „๋ฐ˜์— `--herdr-session ` ํ‘œ์ค€ ์˜ต์…˜ํ™” (๋ ˆ๊ฑฐ์‹œ `--herdr-server` ์™„์ „ ํ˜ธํ™˜). - `create_session.sh`์—์„œ ๋ช…์‹œ์  ์„ธ์…˜๋ช…์ด ์›Œํฌ์ŠคํŽ˜์ด์Šค ์Šฌ๋Ÿฌ๊ทธ์— ์˜ํ•ด ๋ฎ์–ด์”Œ์›Œ์ง€์ง€ ์•Š๋„๋ก ๊ฐ€๋“œ ๋ณด๊ฐ•. - `resume_session.sh`์˜ post-spawn ์žฌ๊ฐœ ์‹œ ์‹ ๊ทœ Herdr ์„ธ์…˜๋ช…์ด YAML ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์ •ํ™•ํžˆ ์ „ํŒŒ๋˜๋„๋ก ๊ฐฑ์‹  ๋กœ์ง ๋ฐ ์‹ ๊ทœ Tier 2 ํ…Œ์ŠคํŠธ 5๊ฑด ์ถ”๊ฐ€. #### 4. ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ ํ™•์žฅ ๋ฐ ํ”ผ์–ด ๋ฆฌ๋ทฐ ์ „์› ๋งŒ์žฅ์ผ์น˜ PASS - ์ „์ฒด ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ ์ˆ˜ **276๊ฑด โ†’ 346๊ฑด (100% PASS)** ํ™•์žฅ. - Multi-Agent Loop๋ฅผ ํ†ตํ•œ Reviewer(`claude`, `cline`) ์ „์› `[VERDICT: PASS]` ๊ฒ€์ฆ ์™„๋ฃŒ. --- ### ๐Ÿš€ `v2.0.0` โ€” Unified Agent Adapter Architecture & Herdr Standardization (2026-08-17) > **์ฃผ์š” ๋งˆ์ผ์Šคํ†ค**: ์—์ด์ „ํŠธ ์ง€์‹ ๊ณ„์ธต ๋‹จ์ผ ์†Œ์Šคํ™”(A-4), ๋ ˆ๊ฑฐ์‹œ ๊ฒฉ๋ฆฌ ์™„์ „ ํ๊ธฐ(Option B), ์…ธ ๋ธŒ๋ฆฌ์ง€ ํ•˜๋“œ๋‹ ๋ฐ ์Šคํ‚ฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ทœ๊ฒฉํ™” ์™„๋ฃŒ. #### 1. ์—์ด์ „ํŠธ ์ง€์‹ ๊ณ„์ธต ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ (A-4 Phase 2 / P3-1) - **`BaseAgentAdapter` ์ถ”์ƒ ํด๋ž˜์Šค ๋ฐ 4๋Œ€ ์–ด๋Œ‘ํ„ฐ ๊ตฌ์ถ•**: - [`.agents/skills/lib_py/agents/base.py`](.agents/skills/lib_py/agents/base.py): `DiscoveryContext` ๋ฐ ์ถ”์ƒ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜ (`ready_tokens`, `exit_key`, `delegate_agent_key`, `identity_cache_fields`, `artifact_path`, `verify_artifact`, `purge_artifacts`, `spawn_spec`, `resume_spec`, `auth_ok`, `discover`). - [`.agents/skills/lib_py/agents/adapters/`](.agents/skills/lib_py/agents/adapters/): `ClaudeAgentAdapter`, `AgyAgentAdapter`, `HermesAgentAdapter`, `ClineAgentAdapter` 4๊ฐœ ๊ตฌ์ฒด ํด๋ž˜์Šค ๊ตฌํ˜„. - **`facts` ๋ธŒ๋ฆฌ์ง€ ์…ธ ์ธํ„ฐํŽ˜์ด์Šค ํ•˜๋“œ๋‹**: - `lib_py.agents` CLI ๋ชจ๋“ˆ์„ ํ†ตํ•ด 8๊ฐœ `MAM_*` ๋ณ€์ˆ˜๋ฅผ `shlex.quote` ์•ˆ์ „ ์ธ์šฉ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ฐฉ์ถœ. - `wait_for_tui_ready` ๋นˆ ํ† ํฐ ์‹œ ์ „๋Ÿ‰ ๋งค์นญ ์˜คํƒ ๋ฐฉ์ง€ ๋ฐ ๋ฏธ์ง€ ์—์ด์ „ํŠธ fail-closed ๊ฐ€๋“œ ๋‚ด์žฅ. - **์…ธ ์Šคํฌ๋ฆฝํŠธ ์ „๋ฐ˜ ์–ด๋Œ‘ํ„ฐ ์ด๊ด€**: - `create_session.sh`, `resume_session.sh`, `stop_session.sh`, `reconcile.sh`์— ์‚ฐ์žฌ๋˜์–ด ์žˆ๋˜ 40์—ฌ ๊ฐœ ํ•˜๋“œ์ฝ”๋”ฉ ๋ถ„๊ธฐ๋ฅผ ์–ด๋Œ‘ํ„ฐ ํ˜ธ์ถœ๋กœ ์ผ์›ํ™”. #### 2. ๋ ˆ๊ฑฐ์‹œ `isolation.root` ๋ฐ C-3b ์†Œ๋น„์ž ์™„์ „ ํ๊ธฐ (Option B) - Universal Global Config ์ „ํ™˜ ์ดํ›„ ๋‚จ์•„์žˆ๋˜ 4๊ฐœ ๋ ˆ๊ฑฐ์‹œ ๊ฒฉ๋ฆฌ ์†Œ๋น„์ž ์ฝ”๋“œ(`lib.sh::mam_session_iso_root`, `workspace_uuid.py::iso_root_of`, `verify_session.py`, `stop_session.sh`) ๋ฐ `atomic_yaml.py`์˜ ๋ ˆ๊ฑฐ์‹œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์ ˆ 100% ์‚ญ์ œ. - ์ €์žฅ์†Œ ๋‚ด ๊ฒฉ๋ฆฌ ์ž”์žฌ ์ฐธ์กฐ 0๊ฑด ๋‹ฌ์„ฑ. #### 3. ์…ธ ๋ธŒ๋ฆฌ์ง€ ๋ณด์•ˆ ๋ฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ฐ•ํ™” (R1, R2, N1 ๊ต์ •) - **R1 (์œ„์ž„ ์—์ด์ „ํŠธ ํ‚ค ํด๋ฐฑ ๋ณด๊ฐ•)**: ๋ธŒ๋ฆฌ์ง€ ๋ฏธ์ž‘๋™ ์‹œ `delegate_agent`๊ฐ€ `antigravity-cli`๋กœ ์ผ๊ด„ ํ‡ดํ™”ํ•˜์ง€ ์•Š๊ณ  `claude-code`, `hermes-agent`, `cline-agent`๋กœ ๋ช…์‹œ์  `case` ํด๋ฐฑํ•˜๋„๋ก ๊ฐœ์„ . - **R2 (`argv` ์„œ๋ธŒ์ปค๋งจ๋“œ ์ „ํ™˜)**: `python -c` ์…ธ ๋ณ€์ˆ˜ ๋ฌธ์ž์—ด ๋ณด๊ฐ„์„ `spawn-spec`, `resume-spec`, `exit-key` ์„œ๋ธŒ์ปค๋งจ๋“œ๋กœ ์ „๋ฉด ์ „ํ™˜ํ•˜์—ฌ ๊ณต๋ฐฑ/์ž‘์€๋”ฐ์˜ดํ‘œ ๊ฒฝ๋กœ ์—๋Ÿฌ ๋ฐ ์ฝ”๋“œ ์ฃผ์ž… ์œ„ํ˜‘ ์›์ฒœ ์ฐจ๋‹จ. - **N1 (ํด๋ฆฐ ํ™˜๊ฒฝ ๊ฒฉ๋ฆฌ ๊ฐ€๋“œ)**: `test_a4_adapter_contract.py` ๋‚ด CLI ํ…Œ์ŠคํŠธ๊ฐ€ ์•ฐ๋น„์–ธํŠธ `PYTHONPATH` ์—†์ด๋„ ๋…๋ฆฝ ํ†ต๊ณผํ•˜๋„๋ก ํ™˜๊ฒฝ ๊ฒฉ๋ฆฌ ๋ณด๊ฐ•. #### 4. ์Šคํ‚ฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ทœ๊ฒฉํ™” ๋ฐ ํ”ผ์–ด ๋ฆฌ๋ทฐ 100% PASS - 8๊ฐœ `SKILL.md` frontmatter `version: 2.0.0` ํ†ต์ผ ๋ฐ ๋ฐฐํฌ ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ. - Reviewer `cline` (Job `e7b9812b`) ๋ฐ Planner/Senior Reviewer `claude` (Job `31730364`) ์ „์› `[VERDICT: PASS]` ํš๋“. #### 5. ๋ ˆ๊ฑฐ์‹œ ์ฃผ์„ ๋ฐ ์‚ฌ์šฉ๋ฒ• ์ •ํ•ฉ์„ฑ ์ตœ์‹ ํ™” (C-6) - `stop_session.sh` ์ƒ๋‹จ ์ฃผ์„ ๋ฐ `usage()` ๋‚ด ํ๊ธฐ๋œ ํ”Œ๋ž˜๊ทธ(`--mode soft|hard`, `--capture-id`, `--graceful`) ์•ˆ๋‚ด ๋ฌธ๊ตฌ๋ฅผ ์™„์ „ ์ œ๊ฑฐํ•˜๊ณ  ํ˜„ํ–‰ 4๋Œ€ ์—์ด์ „ํŠธ(`claude`, `agy`, `hermes`, `cline`) ๋ฐ ํ”Œ๋ž˜๊ทธ ์ฒด๊ณ„๋กœ ๋™๊ธฐํ™”. - ํšŒ๊ท€ ๋ฐฉ์ง€ ์ปดํฌ๋„ŒํŠธ ํ…Œ์ŠคํŠธ(`test_comp_stop_usage_matches_parser`) ์‹ ์„ค. - ํšŒ๊ท€ ๋ฐ ๊ณ„์•ฝ ํ…Œ์ŠคํŠธ: **263/263 PASS (100%)** ๋‹ฌ์„ฑ. #### 6. macOS NFS ๊ฐ์ง€ `df -P` ํด๋ฐฑ ๊ฒ€์ฆ ๋ฐ ์ข…๊ฒฐ (B-5) - `_check_is_nfs`(`lib.sh`)์˜ macOS/BSD ํ™˜๊ฒฝ ๋‚ด GNU ์ „์šฉ `df --output` ๊ตฌ๋ฌธ ์˜ค๋ฅ˜ ์‹œ POSIX `df -P` ํด๋ฐฑ ๋™์ž‘์„ ์‹ค์ธก ๋ฐ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ(`test_stop_check_is_nfs_local`)๋กœ ๊ฒ€์ฆ ์™„๋ฃŒํ•˜์—ฌ B-5 ์ด์Šˆ๋ฅผ ์ •์‹ ์ข…๊ฒฐ. #### 7. `agent_identities` tier-3 ์‹ ์› ์บ์‹œ ์™„์ „ ์ œ๊ฑฐ ๋ฐ UUID ํ•ด๊ฒฐ ๊ฒฝ๋กœ PyYAML ํƒˆ์˜์กด (B-10 / Option A) - ์“ฐ๊ธฐ ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„ ๊ตฌ์กฐ์ ์œผ๋กœ ํžˆํŠธ ๋ถˆ๊ฐ€์˜€๋˜ tier-3 ํด๋ฐฑ๊ณผ ๋ถ€์† ์†Œ๋น„์ž(`workspace_uuid.py`, `reconcile.sh` drift D, `stop_session.sh` ์บ์‹œ ์†Œ๊ฑฐ)๋ฅผ ์ „๋ฉด ์‚ญ์ œ. - UUID ํ•ด๊ฒฐ ๊ฒฝ๋กœ๋ฅผ **tier-1(per-row own id) โ†’ tier-2(์–ด๋Œ‘ํ„ฐ `discover()`)** 2๋‹จ๊ณ„๋กœ ๋‹จ์ˆœํ™”. - `verify_session.py::mam_orchestrator_uuids` ์˜ ์ฆ‰์‹œ `yaml` import ๋ฅผ YAML ํด๋ฐฑ ๋ถ„๊ธฐ๋กœ ์ด๋™, UUID ํ•ด๊ฒฐ ๊ฒฝ๋กœ๊ฐ€ PyYAML ์—†์ด ์™„์ฃผํ•จ์„ ์‹คํ–‰ ๊ฐ€๋“œ๋กœ ๊ณ ์ •(`atomic_yaml.py` ์˜ ์‹œ์Šคํ…œ PyYAML ์š”๊ตฌ๋Š” ์„ค๊ณ„์ƒ ์œ ์ง€). - ํšŒ๊ท€ ๊ฐ€๋“œ 3์ข… ์‹ ์„ค โ€” ์ฝ๊ธฐ ๊ฒฝ๋กœ ๋ถ€ํ™œ ์ฐจ๋‹จ, `import yaml` AST ๊ฒ€์‚ฌ(์ง€์—ฐ import ํฌํ•จ), ์‹คํ–‰ ๊ฒฝ๋กœ ๊ฒ€์ฆ. - ํšŒ๊ท€ ๋ฐ ๊ณ„์•ฝ ํ…Œ์ŠคํŠธ: **266/266 PASS (100%)** ๋‹ฌ์„ฑ. #### 8. ์…€ํ”„ ํ˜ธ์ŠคํŒ… ๋ฃจํ”„ ๋Ÿฐํƒ€์ž„ ํ”„๋ฆฌ์ฆˆ ์Šค๋ƒ…์ƒท (B-13 / Stage 2) - ๋ฃจํ”„ ๊ธฐ๋™ ์‹œ `.agents/skills/` ๋ฅผ `$TMPDIR` ์— 1ํšŒ ๋™๊ฒฐํ•˜๊ณ  ์Šค๋ƒ…์ƒท์—์„œ ์žฌ์‹คํ–‰ํ•˜์—ฌ, ํ„ด ๋„์ค‘ ํ”„๋ ˆ์ž„์›Œํฌ ์Šคํ‚ฌ ํŽธ์ง‘์ด ์ง„ํ–‰ ์ค‘์ธ ๋ฃจํ”„๋ฅผ ๊นจ๋œจ๋ฆฌ์ง€ ๋ชปํ•˜๋„๋ก ์ฐจ๋‹จ. - ์ฝ”๋“œ ๋ฃจํŠธ(์Šค๋ƒ…์ƒท)์™€ ์ƒํƒœ ๋ฃจํŠธ(`MAM_REAL_ROOT`)๋ฅผ ๋ถ„๋ฆฌํ•ด ๋ ˆ์ง€์ŠคํŠธ๋ฆฌยท๋ฃจํ”„ ๋ฝยทdiff ์ˆ˜์ง‘์€ ์‹ค์ œ ์ €์žฅ์†Œ๋ฅผ ๊ณ„์† ์‚ฌ์šฉ. - ์žฌ์‹คํ–‰ ์‹œ ์›๋ณธ argv ๋ฅผ ๋ฐฐ์—ด๋กœ ๋ณด์กดํ•ด ์ธ์ž ์œ ์‹ค์„ ๋ฐฉ์ง€(ํŒŒ์„œ๊ฐ€ `$@` ๋ฅผ ์†Œ๋น„ํ•˜๋ฏ€๋กœ ํ•„์ˆ˜). - ์Šค๋ƒ…์ƒท ์ƒ์„ฑ ์‹คํŒจ ์‹œ `log_*` ์ •์˜ ์ด์ „ ๊ตฌ๊ฐ„์ž„์„ ๊ณ ๋ คํ•ด `echo` ๋กœ ๊ฒฝ๊ณ ํ•˜๊ณ  ๋ฏธ๋™๊ฒฐ ์ง„ํ–‰. - `MAM_LOOP_NO_FREEZE=1` ๋กœ ๋น„ํ™œ์„ฑํ™” ๊ฐ€๋Šฅ. ์Šค๋ƒ…์ƒท ์ƒ์„ฑ ์‹คํŒจ๋Š” ๊ฒฝ๊ณ  ํ›„ ๊ธฐ์กด ๋™์ž‘์œผ๋กœ ํด๋ฐฑ. - ํšŒ๊ท€ ๊ฐ€๋“œ 5์ข… ์‹ ์„ค โ€” argv ๋ณด์กด, ํŒŒ์† ๋ž˜ํผ ๋ฉด์—ญ, ์Šคํ‚ฌ ํŠธ๋ฆฌ ๋ฌด์˜ค์—ผ(B-6 ๊ฒฝ๊ณ„), ๋ฝ ํ•ด์ œ ๋ฐ ์Šค๋ƒ…์ƒท ์ •๋ฆฌ(B-12 ๊ฒฝ๊ณ„), ๋น„ํ™œ์„ฑํ™” ์Šค์œ„์น˜. - ํšŒ๊ท€ ๋ฐ ๊ณ„์•ฝ ํ…Œ์ŠคํŠธ: **271/271 PASS (100%)** ๋‹ฌ์„ฑ. #### 9. ๊ฐ์‚ฌ ๋กœ๊ทธ ๋ฃจํŠธ ์ง€์—ฐ ํ‰๊ฐ€ (B-9 / P4-1) - `mqtt_common.LOGS_DIR` ์˜ import ์‹œ์  cwd ๊ณ ์ •์„ ์ œ๊ฑฐํ•˜๊ณ  ํ˜ธ์ถœ ์‹œ์ ์— ํ•ด์„ํ•˜๋Š” `get_logs_dir()` ๋ฅผ ๋„์ž…. `chdir` ์ดํ›„์—๋„ ๊ฐ์‚ฌ ๋กœ๊ทธ๊ฐ€ ํ˜„์žฌ ์›Œํฌ์ŠคํŽ˜์ด์Šค์— ์ •ํ™•ํžˆ ๊ธฐ๋ก๋จ. - PEP 562 ๋ชจ๋“ˆ `__getattr__` ๋กœ `LOGS_DIR` ์†์„ฑ ์ ‘๊ทผ ํ•˜์œ„ ํ˜ธํ™˜ ์œ ์ง€(๋™์  ํ‰๊ฐ€). - PEP 562 `__dir__` ๋ณ‘ํ–‰ ์ •์˜๋กœ `dir()`ยทํƒญ ์™„์„ฑ ๊ฐ€์‹œ์„ฑ ์œ ์ง€. - `DELEGATE_JOB_LOGS_DIR` ํ™˜๊ฒฝ๋ณ€์ˆ˜๊ฐ€ ์‹คํ–‰ ์ค‘ ๋ณ€๊ฒฝ๊นŒ์ง€ ๋ฐ˜์˜. - ํšŒ๊ท€ ๊ฐ€๋“œ 5์ข… ์‹ ์„ค โ€” cwd ์ถ”์ข…, ์‹ค์ œ ํŒŒ์ผ ์ƒ์„ฑ, ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋™์  ๋ฐ˜์˜, ์ „์—ญ ์žฌ๋„์ž… ์ฐจ๋‹จ, dir() ํƒ์ƒ‰์„ฑ. - ํšŒ๊ท€ ๋ฐ ๊ณ„์•ฝ ํ…Œ์ŠคํŠธ: **276/276 PASS (100%)** ๋‹ฌ์„ฑ. --- ### ๐Ÿ› ๏ธ `v1.4.0` โ€” Stability, Cleanup & Safe Job Delegation (2026-08-16) > **์ฃผ์š” ๋งˆ์ผ์Šคํ†ค**: ๊ฒฉ๋ฆฌ ์ž”์žฌ ์ •๋ฆฌ, ์„œ๋ธŒ์…ธ ๋ฃจํ”„ ๋ฝ ์กฐ๊ธฐ ํ•ด์ œ ๋ฒ„๊ทธ ํ”ฝ์Šค, ์‹ ๊ทœ ํŒŒ์ผ ์บก์ฒ˜ ๋ฐ ๊ฒฝ๋Ÿ‰ํ™”. - **P2-2 (C-3a / C-4 ๋ ˆ๊ฑฐ์‹œ ๊ฒฉ๋ฆฌ ์Šคํ… ๋ฐ ๋ฏธ์‚ฌ์šฉ ์‹ฌ๋ณผ ์ œ๊ฑฐ)**: - `lib.sh` ๋‚ด ๋นˆ ์Šคํ… 4์ข…(`provision_isolation`, `isolation_lever`, `isolation_env_prefix`, `isolation_cmd_args`) ๋ฐ `_REAL_HERDR_PATH` ์™„์ „ ์‚ญ์ œ. - `registry.py::TERMINAL_STATUSES` ๋ฐ `create_session.sh::ISOLATE` ์ œ๊ฑฐ. - **P2-1 (B-6 / B-12 `delegate_job_safe` ์•ˆ์ •ํ™”)**: - `.agents/skills/...` ๋‚ด ๋ถˆํ•„์š”ํ•œ `.tmp` ๋ณต์‚ฌ๋ณธ ์ƒ์„ฑ ์ œ๊ฑฐ ๋ฐ ์ธํ”Œ๋ ˆ์ด์Šค ์ง์ ‘ ์‹คํ–‰(`bash "$orig_script"`) ์ „ํ™˜. - ์„œ๋ธŒ์…ธ ๋‚ด `trap`์œผ๋กœ ์ธํ•œ ๋ฃจํ”„ ๋ฝ ๋งˆ์ปค(`.mam/loop-guard-active`) ์กฐ๊ธฐ ์‚ญ์ œ ๊ฒฐํ•จ(D1) ์›์ฒœ ์ฐจ๋‹จ. - **P0-2 (O-2 ์ค‘๋ณต ๋ฃจํ”„ ๊ธฐ๋™ ๋ฐฉ์ง€ ์›์ž์  ๋ฝ)**: - `loop_lock.sh` ์‹ ์„ค: `set -C` ๊ธฐ๋ฐ˜ ์›์ž์  ๋ฝ ํš๋“ ๋ฐ PID + lstart ์†Œ์œ ๊ถŒ ๊ฒ€์ฆ์œผ๋กœ ๋™์‹œ ์‹คํ–‰ ๋ฐฉ์ง€. - **P0-1 (B-7 ์™ธ๊ณฝ diff ์ˆ˜์ง‘ ๋ฐ ๋ฏธ์ถ”์  ํŒŒ์ผ ์บก์ฒ˜)**: - `diff_collect.sh` ๋„์ž…: CWD ๋…๋ฆฝ `$REPO_ROOT` ๊ธฐ์ค€ diff ์ˆ˜์ง‘ ๋ฐ `git ls-files -o` ๋ฏธ์ถ”์  ํŒŒ์ผ ๋ณ‘ํ•ฉ. - **B-4 (์‹œํ”„ํŠธ `ls` ๋™์  ํฌ์‹œ์Šค ํƒ€์ž„์Šคํƒฌํ”„ ๋ณต์›)**: - `lib.sh` 554ํ–‰์˜ `created=999999` ํ•˜๋“œ์ฝ”๋”ฉ์„ ์‹ค์‹œ๊ฐ„ ํƒ€์ž„์Šคํƒฌํ”„(`int(time.time())`)๋กœ ๋ณต์›. - **ํ…Œ์ŠคํŠธ ์ŠˆํŠธ ๊ฒฝ๋Ÿ‰ํ™”**: - ๋…ธํ›„ํ™”๋œ ์ค‘๋ณต ๋ ˆ๊ฑฐ์‹œ ํ…Œ์ŠคํŠธ 7๊ฐœ ํŒŒ์ผ(1,559์ค„) ์‚ญ์ œ (`cf51b2c`). --- ### ๐Ÿ›ก๏ธ `v1.3.0` โ€” Orchestrator Onboarding & Scoped Guarding (2026-08-15) > **์ฃผ์š” ๋งˆ์ผ์Šคํ†ค**: ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ ์‹ ์› ๊ฒฉ๋ฆฌ ๋ฐ ๋‹ค์ค‘ ์—์ด์ „ํŠธ ํ˜‘์—… ๊ฐ€๋“œ๋ ˆ์ผ ํ™•๋ฆฝ. - **`multi-agent-mux-orc-onboard` ์Šคํ‚ฌ ์‹ ์„ค**: - ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ(`agy`)์˜ ๋Œ€ํ™” UUID๋ฅผ `.mam/agent-sessions.yaml` ๋‚ด `orchestrator_uuids` ๋ฆฌ์ŠคํŠธ๋กœ ๋“ฑ๋ก. - `find_workspace_uuid` ๋ฐ `verify_session_uuid`์—์„œ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ UUID๋ฅผ ์Šคํ‚ตํ•˜์—ฌ ์„œ๋ธŒ์—์ด์ „ํŠธ ์„ธ์…˜ ์˜ค์—ผ ๋ฐฉ์ง€. - **O-3 (์กฐ๊ฑด๋ถ€ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์œ„์ž„ ๊ฐ€๋“œ โ€” Scoped Guard)**: - ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ๊ฐ€ `/multi-agent-mux-loop` ํ™œ์„ฑํ™” ์ƒํƒœ์—์„œ ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์Šคํฌ๋ฆฝํŠธ๋กœ ์œ„์ž„ํ•˜๋„๋ก ํ†ต์ œ. - `AGENTS.md` ยง5 ๋ฐ `MULTI_AGENT_RULES.md` ๋‚ด ๊ฐ€๋“œ๋ ˆ์ผ ๋ช…์‹œ. - **๋ฐฐํฌ ๋ฐ ํŒจํ‚ค์ง• ํŒŒ์ดํ”„๋ผ์ธ ํ˜„๋Œ€ํ™”**: - `deploy/lib_ownership.sh` ์‹ ์„ค ๋ฐ `hooks.json` 3-way ๋ณ‘ํ•ฉ(`MERGE_REGISTRY`) ์ง€์›. - Gitea CI/CD ํŒŒ์ดํ”„๋ผ์ธ (`deploy/gitea-ci.yml`) ์—ฐ๋™. --- ### ๐Ÿ”Œ `v1.2.0` โ€” Universal Herdr Server Isolation & Cline Integration (2026-08-14) > **์ฃผ์š” ๋งˆ์ผ์Šคํ†ค**: Herdr ๋‹จ์ผ ์„œ๋ฒ„ ๊ฒฉ๋ฆฌ ๋ฐ ๋‹ค์ค‘ AI ์—์ด์ „ํŠธ ํ™•์žฅ. - **Universal Herdr Session Isolation**: - `HERDR_SESSION_NAME` ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒฉ๋ฆฌ ์„œ๋ฒ„๋ฅผ ํ†ต์ผํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค ์ถฉ๋Œ ๋ฐฉ์ง€. - **Cline ์—์ด์ „ํŠธ ํ†ตํ•ฉ**: - `cline` CLI ๊ธฐ๋ฐ˜ ๋Œ€ํ™” ์„ธ์…˜ ์ƒ์„ฑ, ์ •์ง€, ๋ณต์› ๋ฐ TUI ๋ ˆ๋”” ํ† ํฐ ํ•ธ๋“ค๋ง ์ง€์›. - **SQLite WAL ํŠธ๋žœ์žญ์…˜ ๋™์‹œ์„ฑ**: - ์„ธ์…˜ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋™์‹œ ์“ฐ๊ธฐ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋ฝ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด SQLite WAL ๋ชจ๋“œ ์ „๋ฉด ์ ์šฉ. --- ### ๐Ÿงฑ `v1.0.0` ~ `v1.1.0` โ€” Initial Multi-Agent Mux Framework (2026-08-10 ~ 2026-08-13) > **์ฃผ์š” ๋งˆ์ผ์Šคํ†ค**: ํ„ฐ๋ฏธ๋„ ๋‹ค์ค‘ ์—์ด์ „ํŠธ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๊ธฐ์ดˆ ์„ค๊ณ„ ๋ฐ ๋น„๋™๊ธฐ ๋ฃจํ”„ ์™„์„ฑ. - **ํ•ต์‹ฌ ์ˆ˜๋ช…์ฃผ๊ธฐ ์Šคํ‚ฌ๊ตฐ ๊ตฌ์ถ•**: `create`, `stop`, `resume`, `status`, `monitor` ์Šคํ‚ฌ ๊ธฐ๋ณธ ๊ตฌํ˜„. - **MQTT ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐ ์žก ์œ„์ž„**: `multi-agent-mux-delegate-job`์„ ํ†ตํ•œ ์—์ด์ „ํŠธ ๊ฐ„ ์ด๋ฒคํŠธ ํ†ต์‹  ๋ฐ ๊ฒฐ๊ณผ ๊ตฌ๋…. - **์ž์œจ ํ˜‘์—… ๋ฃจํ”„**: `multi-agent-mux-loop` ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ†ตํ•œ Planner-Creator-Reviewer ์—ญํ•  ๋ถ„๋‹ด ์ฒด๊ณ„ ์ •๋ฆฝ. --- ## ๐Ÿงช ํ’ˆ์งˆ ๋ณด์ฆ ๋ฐ ๊ฒ€์ฆ ๊ธฐ์ค€ (Verification Standards) ๋ชจ๋“  ๋ฆด๋ฆฌ์Šค๋Š” ๋‹ค์Œ 4๋‹จ๊ณ„ ์—„๊ฒฉํ•œ ๊ฒ€์ฆ์„ ํ†ต๊ณผํ•ด์•ผ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค: 1. **์ •์  ๋ฌธ๋ฒ• ๊ฒ€์‚ฌ**: `bash -n` (๋ชจ๋“  ์…ธ ์Šคํฌ๋ฆฝํŠธ) ๋ฐ AST ๋ฏธ์‚ฌ์šฉ ์ฝ”๋“œ ๋ถ„์„. 2. **๋‹จ์œ„ ๋ฐ ์ปดํฌ๋„ŒํŠธ ํ…Œ์ŠคํŠธ (Tier 1~2)**: ์ธํ”Œ๋ ˆ์ด์Šค ๋ฐ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ ๊ฒ€์ฆ. 3. **ํ†ตํ•ฉ ๋ฐ ๊ณ„์•ฝ ํ…Œ์ŠคํŠธ (Tier 3~4 / Contract)**: clean environment (`env -u PYTHONPATH`) ํ•˜์—์„œ์˜ ์–ด๋Œ‘ํ„ฐ ๊ณ„์•ฝ ๋ฐ CLI ๋ธŒ๋ฆฌ์ง€ ๊ฒ€์ฆ. 4. **๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ ๊ต์ฐจ ํ”ผ์–ด ๋ฆฌ๋ทฐ**: Planner(`claude`) ๋ฐ Reviewer(`cline`) ๊ฐ„ ๊ต์ฐจ ๊ฒ€์ฆ ๋ฐ `[VERDICT: PASS]` 100% ํ•ฉ์˜.