# ๐Ÿ“œ Multi-Agent Mux ๋ฒ„์ „ ์ด๋ ฅ (`VERSIONS.md`) ์ด ๋ฌธ์„œ๋Š” `multi-agent-mux` ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋ฒ„์ „๋ณ„ ์ฃผ์š” ๊ธฐ๋Šฅ ์ถ”๊ฐ€, ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์„ , ๋ฒ„๊ทธ ์ˆ˜์ • ๋ฐ ํ’ˆ์งˆ ๊ฒ€์ฆ ์ด๋ ฅ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. --- ## ๐Ÿ“Œ ํ˜„์žฌ ๋ฒ„์ „ ๊ฐœ์š” (Current Release) - **ํ”„๋ ˆ์ž„์›Œํฌ ๋ฒ„์ „**: `v3.0.1` - **์ตœ์‹  ๋ฆด๋ฆฌ์Šค ์ผ์‹œ**: 2026-08-27 (KST) - **๊ธฐ์ค€ ๋ธŒ๋žœ์น˜**: `main` - **ํ•ต์‹ฌ ์•„ํ‚คํ…์ฒ˜**: - **Herdr Shim Routing & Multi-Workspace Isolation Engine**: `HERDR_WORKSPACE_ID` ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์Šค์ฝ”ํ•‘ ๋ฐ `$WORKSPACE_ROOT/.mam/herdr_workspace_id` ์˜์†ํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ๋‹ค์ค‘ ์›Œํฌ์ŠคํŽ˜์ด์Šค ๋™์‹œ ์‹คํ–‰ ์‹œ ํŽ˜์ธ ๊ต์ฐจ ์˜ค์—ผ ์›์ฒœ ์ฐจ๋‹จ - **Atomic Safe Paste Insertion (`pane send-text`)**: ๋ฏธ์ง€์› ์„œ๋ธŒ์ปค๋งจ๋“œ(`agent send`) ์ œ๊ฑฐ ๋ฐ `pane send-text` ๋‹จ์ผ ์‚ฝ์ž… ๊ณ„์•ฝ ๋„์ž…, `send_keys_safe` ์‹คํŒจ ์ „ํŒŒ(`rc 3`) ๋ฐ ์ค‘๋ณต ์ œ์ถœ(Double Submit) ๋ฐฉ์ง€ - **Strict Exact-Match Single Pane Resolver**: ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ๋งค์นญ(`in tn`) ์™„์ „ ์ œ๊ฑฐ, ๋‹จ์ผ ์ค‘์•™ `_resolve_herdr_pane_id` ํ—ฌํผ ๊ธฐ๋ฐ˜ 5๋Œ€ ์„œ๋ธŒ์ปค๋งจ๋“œ(`has-session`, `kill-session`, `capture-pane`, `send-keys`, `paste-buffer`) ๋ฌด๊ฒฐ์„ฑ ์ •๋ฆฝ - **TUI Readiness & Dialog Token Precision**: `_MAM_DIALOG_TOKENS` ์ผ๋ฐ˜ ํŒ(`Yes, try it`) ์˜คํƒ ์ œ๊ฑฐ ๋ฐ ํ’€์Šคํฌ๋ฆฐ ๋ชจ๋‹ฌ Escape ๊ฑฐ์ ˆ ๋ธŒ๋žœ์น˜ ๋ถ„๋ฆฌ - **Comprehensive Test Suite Milestone**: 412๊ฐœ ์ „์ฒด ํ…Œ์ŠคํŠธ 100% PASS (412 passed / 0 failed). --- ## ๐Ÿงญ ์Šคํ‚ฌ ํŒจํ‚ค์ง€ ๋ฒ„์ „ ๋งคํŠธ๋ฆญ์Šค (Skills Version Matrix) ๋ชจ๋“  8๊ฐœ ์Šคํ‚ฌ์€ YAML frontmatter ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(`author`, `version`, `platforms`, `environments`) ํ‘œ์ค€ํ™”๋ฅผ ํ†ตํ•ด `v3.0.1`์œผ๋กœ ๋™๊ธฐํ™”๋˜์–ด ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. | ์Šคํ‚ฌ๋ช… | ๋ฒ„์ „ | ์—ญํ•  ๋ฐ ์ฃผ์š” ์ฑ…์ž„ | ์ƒํƒœ | | :--- | :---: | :--- | :---: | | **`multi-agent-mux-create`** | `3.0.1` | ์—์ด์ „ํŠธ ์„ธ์…˜ ์‹ ๊ทœ ์ƒ์„ฑ ๋ฐ Herdr ์ปจํ…Œ์ด๋„ˆ ๊ฒฉ๋ฆฌ ์Šคํฐ | โœ… ๋ฐฐํฌ | | **`multi-agent-mux-stop`** | `3.0.1` | ๋Œ€ํ™” UUID ์›์ž์  ์บก์ฒ˜ ๋ฐ ์„ธ์…˜ ์•ˆ์ „ ์ข…๋ฃŒ (Graceful Stop) | โœ… ๋ฐฐํฌ | | **`multi-agent-mux-resume`** | `3.0.1` | ์˜จ๋””์Šคํฌ ๋Œ€ํ™” ์ปจํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ Tier-1 ์ดˆ๊ณ ์† ์„ธ์…˜ ๋ณต์› | โœ… ๋ฐฐํฌ | | **`multi-agent-mux-status`** | `3.0.1` | ์‹ค์‹œ๊ฐ„ Herdr ์„ธ์…˜ ๋ฐ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋“œ๋ฆฌํ”„ํŠธ ์Šค๋ƒ…์ƒท ์กฐํšŒ | โœ… ๋ฐฐํฌ | | **`multi-agent-mux-monitor`** | `3.0.1` | YAML โ†” ๋Ÿฐํƒ€์ž„ ์ƒํƒœ ๊ฐ„ ์ž์œจ ์กฐ์ •์ž (Reconciler Loop) | โœ… ๋ฐฐํฌ | | **`multi-agent-mux-delegate-job`** | `3.0.1` | MQTT ์ด๋ฒคํŠธ ์ฑ„๋„ ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐ ๋‹จ์œ„ ์ž‘์—… ์œ„์ž„ | โœ… ๋ฐฐํฌ | | **`multi-agent-mux-loop`** | `3.0.1` | Planner-Creator-Reviewer 3์ž ์ž์œจ ๊ณ„ํšยท์‹คํ–‰ยทํ”ผ์–ด๋ฆฌ๋ทฐ ๋ฃจํ”„ | โœ… ๋ฐฐํฌ | | **`multi-agent-mux-orc-onboard`** | `3.0.1` | ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ UUID ๊ฒฉ๋ฆฌ ๋“ฑ๋ก ๋ฐ ์„œ๋ธŒ ์„ธ์…˜ ์˜ค์—ผ ๋ฐฉ์ง€ | โœ… ๋ฐฐํฌ | --- ## ๐Ÿ“‹ ๋ฒ„์ „๋ณ„ ์ƒ์„ธ ๋ณ€๊ฒฝ ๋‚ด์—ญ (Changelog) ### ๐Ÿš€ `v3.0.1` โ€” Herdr Shim Routing Contract Refactor, Multi-Workspace Isolation & 412-Test Milestone (2026-08-27) > **์ฃผ์š” ๋งˆ์ผ์Šคํ†ค**: Herdr ์‹ฌ ๋ผ์šฐํŒ… 5๋Œ€ ๊ฒฐํ•จ(ISSUE-1~5) ๋ฐ F-1~F-4 ๋ณด์™„ ์™„๊ฒฐ, `HERDR_WORKSPACE_ID` ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์Šค์ฝ”ํ•‘ ๋ฐ ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๊ฒฉ๋ฆฌ ์˜์†ํ™” ์—”์ง„ ํƒ‘์žฌ, `pane send-text` ๊ธฐ๋ฐ˜ ๋‹จ์ผ ์•ˆ์ „ ์‚ฝ์ž… ๊ณ„์•ฝ ์ •๋ฆฝ, ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ๋งค์นญ(`in tn`) ์™„์ „ ์ œ๊ฑฐ, 412๊ฐœ ์ „์ฒด ํ…Œ์ŠคํŠธ 100% PASS ๋‹ฌ์„ฑ. #### 1. Herdr ์‹ฌ ๋ผ์šฐํŒ… ๋ฐ ๋‹ค์ค‘ ์›Œํฌ์ŠคํŽ˜์ด์Šค ๊ฒฉ๋ฆฌ ๊ฐ•ํ™” (`.agents/skills/lib.sh`) * **`HERDR_WORKSPACE_ID` ๋ช…์‹œ์  ์Šค์ฝ”ํ”„ & ์˜์†ํ™” (`ISSUE-3`, `F-2b`)**: - `_herdr_ws_id_file()`, `_herdr_persist_ws_id()`, `_herdr_ws_scope()` ํ—ฌํผ ๋„์ž…. - `new-session` ์‹œ ์ƒ์„ฑ๋œ ์›Œํฌ์ŠคํŽ˜์ด์Šค ID๋ฅผ `$WORKSPACE_ROOT/.mam/herdr_workspace_id`์— ์˜์†ํ™”. - `_herdr_agent_get_scoped`๋Š” ํ˜ธ์ถœ์ž์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜(`HERDR_WORKSPACE_ID`)๋งŒ์„ ์šฐ์„  ํ‰๊ฐ€ํ•˜์—ฌ ๋‹จ์ถ• ๊ฒฝ๋กœ์—์„œ์˜ ๊ต์ฐจ ์›Œํฌ์ŠคํŽ˜์ด์Šค ๋ผ์šฐํŒ… ์˜ค์—ผ ์ฐจ๋‹จ. * **์—„๊ฒฉ ์ผ์น˜(Exact-Match) ๋‹จ์ผ ํŽ˜์ธ ๋ฆฌ์กธ๋ฒ„ ์ •๋ฆฝ (`ISSUE-2`, `ISSUE-5`, `F-3`)**: - ๊ธฐ์กด์˜ ์—์ด์ „ํŠธ CLI ๋ช…์นญ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ๋งค์นญ(`in tn`, `agent in tn`) ์™„์ „ ์ œ๊ฑฐ. - ๋‹จ์ผ ์ค‘์•™ ํ—ฌํผ `_resolve_herdr_pane_id`๋กœ `has-session`, `kill-session`, `capture-pane`, `send-keys`, `paste-buffer`์˜ ํŽ˜์ธ ํ•ด์„ ํ†ตํ•ฉ. - ์˜์ˆซ์ž ์›Œํฌ์ŠคํŽ˜์ด์Šค ์‹๋ณ„์ž ํŒจํ„ด(`^w[A-Za-z0-9]+:p[A-Za-z0-9]+$`) ์ง€์› (`H-20`). #### 2. ์›์ž์  ํ…์ŠคํŠธ ์‚ฝ์ž… ๋ฐ ์•ˆ์ „ ์ „์†ก ๊ณ„์•ฝ ๊ต์ • (`ISSUE-1`, `F-4`) * **`paste-buffer`์˜ `pane send-text` ์ „์šฉํ™”**: - Herdr CLI์— ๋ฏธ์กด์žฌํ•˜๋˜ `agent send` ์ œ๊ฑฐ ๋ฐ `pane send-text`๋กœ ๊ต์ฒด. - ์‚ฝ์ž…๊ณผ ์ œ์ถœ(Enter) ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์˜๋„์น˜ ์•Š์€ ์ž๋™ ์ œ์ถœ ๋ฐ ์ด์ค‘ ์ œ์ถœ(Double Submit) ๋ฐฉ์ง€. - ํŽ˜์ธ ๋ฏธํ•ด์„ ๋˜๋Š” ์‚ฝ์ž… ์‹คํŒจ ์‹œ `send_keys_safe`๋กœ ์—๋Ÿฌ ์ฝ”๋“œ(`rc 3`) ๋ช…์‹œ์  ์ „ํŒŒ. * **`capture-pane` ํด๋ฐฑ ์ฒด์ธ ๋ณต์› (`F-4`)**: - `pane read` ์‹คํŒจ ์‹œ `agent read`๋กœ์˜ ํด๋ฐฑ ์ฒด์ธ์„ ์•ˆ์ •์ ์œผ๋กœ ๋ณต์›ํ•˜์—ฌ TUI ์บก์ฒ˜ ์‹ ๋ขฐ์„ฑ ๋ณด์žฅ. #### 3. TUI ์ค€๋น„ ์ƒํƒœ ๊ฐ์ง€ ๋ฐ ๋‹ค์ด์–ผ๋กœ๊ทธ ํ† ํฐ ์ •๋ฐ€ํ™” (`N-1`, `F-1`) * **`_MAM_DIALOG_TOKENS` ์ผ๋ฐ˜ ํŒ ํ† ํฐ ๋ถ„๋ฆฌ**: - ์ผ๋ฐ˜ ๋Œ€ํ™”ํ˜•/TUI ํŒ์— ๋“ฑ์žฅํ•˜๋Š” `Yes, try it`์„ ๋ธ”๋กœํ‚น ๋‹ค์ด์–ผ๋กœ๊ทธ ํ† ํฐ ๋ชฉ๋ก์—์„œ ์ œ์™ธํ•˜์—ฌ ์„ธ์…˜ ์‹œ์ž‘ ์‹œ์˜ ์˜คํƒ ๋ฐฉ์ง€. - ํ’€์Šคํฌ๋ฆฐ ์—…์…€ ๋ชจ๋‹ฌ์— ๋Œ€ํ•ด์„œ๋Š” ์ „์šฉ Escape ๊ฑฐ์ ˆ ๋ธŒ๋žœ์น˜๋กœ ๊ฒฉ๋ฆฌ ์ฒ˜๋ฆฌ. #### 4. ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ ๋ฐ Mock Herdr ๊ณ„์•ฝ ์ •๊ธฐ ๋™๊ธฐํ™” (`tests/`) * **Mock Herdr (`tests/conftest.py`)**: ์‹ค์ œ Herdr 0.8.2 CLI ๊ณ„์•ฝ๊ณผ ์™„๋ฒฝ ๋™๊ธฐํ™” (`pane send-text`, `pane read`, `pane rename` ๋ฐ˜์˜, ๋ฏธ์ง€์› `agent send` ์‹คํŒจ ์ฒ˜๋ฆฌ). * **์‹ ๊ทœ ๊ณ„์•ฝ & ํšŒ๊ท€ ํ…Œ์ŠคํŠธ 19๊ฑด ์ถ”๊ฐ€**: - `test_herdr_shim_contract.py`: H-15 ~ H-23 (๋‹จ์ผ ๋ฆฌ์กธ๋ฒ„ ๋ถˆ๋ณ€์‹, ์›Œํฌ์ŠคํŽ˜์ด์Šค ๊ฒฉ๋ฆฌ, ๋‹จ์ถ•๊ฒฝ๋กœ ์Šค์ฝ”ํ•‘). - `test_b19_headless_reconcile_fixes.py`: D-4 ~ D-7 (set -e ์•ˆ์ „์„ฑ, send_keys_safe ์‹คํŒจ ์ „ํŒŒ, ๋‹ค์ด์–ผ๋กœ๊ทธ ํ† ํฐ ์ œ์™ธ ํšŒ๊ท€ ๋ฐฉ์ง€). * **์ „์ฒด ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ**: 412 passed in 681.20s (100% PASS). --- ### ๐Ÿš€ `v3.0.0` โ€” 5th Agent (Grok) Ecosystem Expansion, Mux Loop CLI Redesign & Deterministic 2xK Layout Engine 2.0 (2026-08-26) > **์ฃผ์š” ๋งˆ์ผ์Šคํ†ค**: 5๋ฒˆ์งธ ๊ณต์‹ ์—์ด์ „ํŠธ `grok`(Grok Build) ์ „๋ฉด ํ†ตํ•ฉ, `/multi-agent-mux-loop`์˜ `--target-agent` ํ์ง€ ๋ฐ `--creator`/`--planner` ์—ญํ•  ๋ถ„๋ฆฌ(Breaking Change), 2ร—2 ๋Œ€์นญ ๊ทธ๋ฆฌ๋“œ๋ฅผ ๋ณด์žฅํ•˜๋Š” ๊ฒฐ์ •๋ก ์  ๋ ˆ์ด์•„์›ƒ ์—”์ง„ 2.0 ํƒ‘์žฌ, 393๊ฐœ ์ „์ฒด ํ…Œ์ŠคํŠธ 100% PASS ๋‹ฌ์„ฑ. #### โš ๏ธ Breaking Changes & Migration Guide * **`multi-agent-mux-loop` CLI ํ”Œ๋ž˜๊ทธ ๊ฐœํŽธ**: - ๊ธฐ์กด์˜ ๋‹จ์ผ ๋Œ€์ƒ ์ง€์ • ํ”Œ๋ž˜๊ทธ `--target-agent `๊ฐ€ **๊ณต์‹ ์ œ๊ฑฐ(Drop)** ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. - ๊ธฐ์กด ๋ช…๋ น์€ ์ด์ œ `ERROR: --target-agent was removed. Use --creator instead.`์™€ ํ•จ๊ป˜ ์ข…๋ฃŒ(`exit 1`)๋ฉ๋‹ˆ๋‹ค. - **๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ฐฉ๋ฒ•**: - ๊ธฐ์กด: `bash run_loop.sh --target-agent --task "..."` - ๋ณ€๊ฒฝ: `bash run_loop.sh --creator --task "..."` - ํ”Œ๋ž˜๋„ˆ ์ง€์ • ์‹œ: `bash run_loop.sh --plan --planner --creator --task "..."` #### 1. 5๋ฒˆ์งธ ๊ณต์‹ AI ์—์ด์ „ํŠธ Grok Build (`grok`) ์ „๋ฉด ํ†ตํ•ฉ * **์–ด๋Œ‘ํ„ฐ ๋ฐ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๊ด€๋ฆฌ (`lib_py/agents/`, `lib.sh`)**: - `GrokAgentAdapter` ๊ตฌํ˜„ ๋ฐ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๊ณต์‹ ๋“ฑ๋ก (`claude, agy, hermes, cline, grok`). - `create_session.sh`, `resume_session.sh`, `stop_session.sh`, `resolve_session_id.sh`์˜ ์—์ด์ „ํŠธ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ๋ฐ ๋””์ŠคํŒจ์น˜ ์ง€์› ์™„๋น„. - ์˜จ๋””์Šคํฌ ์„ธ์…˜ UUID ํ•ด์„ ๋ฐ TUI ๋ Œ๋”๋ง ์ค€๋น„ ๊ฐ์ง€ ํ† ํฐ ๋ฐ˜์˜. #### 2. ๊ฒฐ์ •๋ก ์  2ร—K ๊ทธ๋ฆฌ๋“œ ๋ ˆ์ด์•„์›ƒ ์—”์ง„ 2.0 (`lib_py/layout.py`, `lib.sh`) * **$N=1\to 2$ `right` ๋ถ„ํ•  ์šฐ์„  ์ •์ฑ… (R-1 ๊ฒฐํ•จ ํ•ด์†Œ)**: - 1๊ฐœ ํŽ˜์ธ์—์„œ 2๋ฒˆ์งธ ์—์ด์ „ํŠธ ์ถ”๊ฐ€ ์‹œ `down` ๋Œ€์‹  `right`๋กœ ๋ถ„ํ• (`single_pane_split_right`)ํ•˜์—ฌ ์ขŒ/์šฐ 2๊ฐœ์˜ ์ „๊ณ (Full-height) ์—ด ํ™•๋ณด. - ์ดํ›„ $N=3$(์ขŒ์ธก down), $N=4$(์šฐ์ธก down)๋กœ ์ด์–ด์ ธ ์™„๋ฒฝํ•œ 2ร—2 ๊ท ๋“ฑ ๋Œ€์นญ ๊ฒฉ์ž ๊ธฐํ•˜ํ•™(`widths=[138,139], heights=[39]`) ์™„์„ฑ. * **GUI โ†” ํ—ค๋“œ๋ฆฌ์Šค ๋‹จ์ผ ๊ฒฐ์ •ํ‘œ ํ†ตํ•ฉ (`_decide_from_cols`)**: - ๊ธฐ์กด์˜ ๋ถˆ์™„์ „ํ•œ `n % 2` ํ™€์ง ํŒจ๋ฆฌํ‹ฐ ๋กœ์ง์„ ํ๊ธฐํ•˜๊ณ , ์—ด ์ ์œ  ์ƒํƒœ(`cols=(a, b)`) ๊ธฐ๋ฐ˜์˜ ํ†ตํ•ฉ 3๋‹จ๊ณ„ ๊ฒฐ์ • ๋งคํŠธ๋ฆญ์Šค๋กœ ์ผ์›ํ™”. * **์•ˆ์ „ ๊ฐ€๋“œ ๋ฐ 4์ค‘ ์šฉ๋Ÿ‰ ๋ฐฐ์„ **: - `_full_height_pane` ๊ฐ€๋“œ๋กœ ๋ฐ˜์ชฝ ์—ด ๋ถ„ํ•  ์›์ฒœ ์ฐจ๋‹จ. - `layout.py` ๊ธฐ๋ณธ๊ฐ’(`default=2`), `lib.sh:435` CLI ์ธ์ž(`--max-cols`, `--max-rows`), `.mam.env.example` ๋™๊ธฐํ™” ์™„๋ฃŒ. #### 3. ์‚ฌ์ „ ๊ฒ€์ฆ ๋ฐ ์ธํ”„๋ผ ๋™๊ธฐํ™” * `create_session.sh`์˜ `--workspace` ํ•„์ˆ˜ ์ธ์ž ์‚ฌ์ „ ๊ฒ€์ฆ(preflight) ๊ฐ•ํ™”. * ์‚ฌ์„ค NATS ๋ธŒ๋กœ์ปค(`nats-docker`) 2.14-alpine ์ตœ์‹  ํƒœ๊ทธ ๋™๊ธฐํ™”. --- ### ๐Ÿš€ `v2.2.1` โ€” Single-Workspace 2xK Multi-Pane Tiling Optimization & Premature Overflow Fix (2026-08-24) > **์ฃผ์š” ๋งˆ์ผ์Šคํ†ค**: `MAM_MIN_PANE_COLS` ๊ธฐ๋ณธ๊ฐ’ 60โ†’40 ์™„ํ™”, ํ‘œ์ค€ 80~100์ปฌ๋Ÿผ ํ„ฐ๋ฏธ๋„ ๋ทฐํฌํŠธ์—์„œ ์กฐ๊ธฐ ์›Œํฌ์ŠคํŽ˜์ด์Šค ์˜ค๋ฒ„ํ”Œ๋กœ(๊ฐ€์ƒ ๋ฐ์Šคํฌํ†ฑ ๋ถ„๋ฆฌ) ๋ฐฉ์ง€ ๋ฐ ๋‹จ์ผ ์›Œํฌ์ŠคํŽ˜์ด์Šค 2x2 ํ†ตํ•ฉ ํƒ€์ผ๋ง ์™„์„ฑ, ์‹ ๊ทœ 80/79 ๊ฒฝ๊ณ„ ๋ฐ 90/100 col ํƒ€์ผ๋ง ํ…Œ์ŠคํŠธ 6์ข… ์ถ”๊ฐ€, ๋‹ค์ค‘ ์—์ด์ „ํŠธ ํ”ผ์–ด ๋ฆฌ๋ทฐ 100% PASS ๋‹ฌ์„ฑ. #### 1. 2xK ๋ ˆ์ด์•„์›ƒ ์—”์ง„ ์ตœ์†Œ ํญ ์™„ํ™” (`lib_py/layout.py`, `lib.sh`) - `compute_2xk_layout` ๊ธฐ๋ณธ `min_cols` ๋ฐ CLI `--min-cols`, `lib.sh:432`์˜ `${MAM_MIN_PANE_COLS:-40}`, `.mam.env.example` ๋ฌธ์„œ๋ฅผ `40`์œผ๋กœ 4์ค‘ ์ผ์น˜ํ™”. - 90~100์ปฌ๋Ÿผ ๋„ˆ๋น„ ํ„ฐ๋ฏธ๋„์—์„œ 3๋ฒˆ์งธ, 4๋ฒˆ์งธ ์—์ด์ „ํŠธ ์ƒ์„ฑ ์‹œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๊ฐ€์ƒ ๋ฐ์Šคํฌํ†ฑ(Workspace)์ด ๋ถ„๋ฆฌ๋˜๋˜ ํ˜„์ƒ ์™„์ „ ํ•ด์†Œ. #### 2. ๊ฒฝ๊ณ„๊ฐ’ ๋ฐ ํƒ€์ผ๋ง ์ž๋™ํ™” ํ…Œ์ŠคํŠธ ํ™•์ถฉ (`tests/test_layout.py`, `tests/test_tier1_unit.py`) - `80` ์ปฌ๋Ÿผ(๋ถ„ํ•  ์„ฑ๊ณต) vs `79` ์ปฌ๋Ÿผ(์˜ค๋ฒ„ํ”Œ๋กœ) ํ•˜ํ•œ ๊ฒฝ๊ณ„๊ฐ’ ๊ฒ€์ฆ. - `90` ๋ฐ `100` ์ปฌ๋Ÿผ ๋‹จ์ผ ์›Œํฌ์ŠคํŽ˜์ด์Šค 1โ†’2โ†’3โ†’4 ๋‹จ๊ณ„ 2x2 ํƒ€์ผ๋ง ๋ฐ 5๋ฒˆ์งธ ์—์ด์ „ํŠธ ์˜ค๋ฒ„ํ”Œ๋กœ ์ „ ๊ณผ์ • ์ˆ˜๋ช… ์ฃผ๊ธฐ ๊ฒ€์ฆ. --- ### ๐Ÿš€ `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% ํ•ฉ์˜.