# ๐Ÿ“‘ Implementation Plan Rev.2 โ€” Workspace Root Markdown ์ •๋ฆฌ ๋ฐ ์ตœ์‹ ํ™” (Job baea3f7e, ์›๋ณธ 45bd8635) - **์—ญํ• **: Planner (`planner-reviewer-claude-01`) - **๊ธฐ์ค€ ์ปค๋ฐ‹**: `07cae71` (`main`, v4.4.0, ์ „์ฒด ์Šค์œ„ํŠธ 750 passed / ๋ฌธ์„œ ๋ฐ”์ธ๋”ฉ 4๋ชจ๋“ˆ 49 passed) - **๊ฐœ์ • ์‚ฌ์œ **: Creator(`creator-agy-01`, Job `87aa5b5a`) ์ด์˜์ œ๊ธฐ 3๊ฑด. **3๊ฑด ๋ชจ๋‘ ์‹ค์ธก์œผ๋กœ ์‚ฌ์‹ค ํ™•์ธ๋˜์–ด ์ „๋ถ€ ์ˆ˜์šฉ**ํ•˜๊ณ , ๊ฒ€์ฆ ๊ณผ์ •์—์„œ Planner ์ž์‹ ์˜ Rev.1 ์˜ค๋ฅ˜ 1๊ฑด(D-1/Phase B-1 "์ž”์žฌ์— ๊ณ ์œ  ๋‚ด์šฉ ์—†์Œ")์„ ์ถ”๊ฐ€๋กœ ๋ฐœ๊ฒฌํ•˜์—ฌ ํ•จ๊ป˜ ์ •์ •ํ•œ๋‹ค. - **Rev.1 ๋Œ€๋น„ ๋ณ€๊ฒฝ ๋ฒ”์œ„**: ยง1 D-1, Phase A-2, Phase B ์ „๋ฉด, Phase D-1, ๊ฒŒ์ดํŠธ 4. ๋‚˜๋จธ์ง€ Phase C/E/F/G์™€ ๊ฒŒ์ดํŠธ 1ยท2ยท3ยท5ยท6์€ Rev.1 ๊ทธ๋Œ€๋กœ ์œ ํšจ(๋ณธ๋ฌธ ํ•˜๋‹จ์— ์›๋ฌธ ์œ ์ง€). --- ## 0. ์ด์˜์ œ๊ธฐ ํŒ์ • (Adjudication of Challenge) | # | Creator ์ฃผ์žฅ | Planner ์‹ค์ธก | ํŒ์ • | |---|---|---|---| | C-1 | ์™„๋ฃŒ ๊ณผ์ œ๋Š” ยง5 ๋‹จ์ผ ์„น์…˜์ด ์•„๋‹ˆ๋ผ ยง2(5๊ฑด)ยทยง3(2๊ฑด)ยทยง5(24๋ธ”๋ก)์— ๋ถ„์‚ฐ๋˜์–ด ์žˆ๊ณ , ํ—ค๋” "30๊ฑด"์€ ์ „์—ญ ํ•ฉ๊ณ„์ด๋ฉฐ Rev.1 Phase B-2 ์ง€์‹œ("ยง5์˜ `###` ์ˆ˜๋กœ ์žฌ๊ณ„์‚ฐํ•ด ํ—ค๋”์™€ ์ผ์น˜")๋Š” ์‹คํ–‰ ๋ถˆ๊ฐ€ | `awk`๋กœ ์ „ `###` ๋ธ”๋ก์„ ์„น์…˜๋ณ„๋กœ ์—ด๊ฑฐ: ยง2 ์™„๋ฃŒ 5(B-21,B-20,B-19,B-14,B-15), ยง3 ์™„๋ฃŒ 2(O-6,A-4), ยง5 24๋ธ”๋ก(O-2 ์ค‘๋ณต 2ํšŒ), ํ—ค๋” ID ์ •ํ™•ํžˆ 30๊ฐœ. **์ฃผ์žฅ ์‚ฌ์‹ค.** ๋‹จ Creator์˜ ์‚ฐ์‹ "5+2+23=30"์€ ์šฐ์—ฐํ•œ ์ผ์น˜๋‹ค. IDโ†”๋ธ”๋ก์ด 1:1์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค(์•„๋ž˜ ยง1-A) | **์ˆ˜์šฉ** โ€” ๋ฐฉ์•ˆ A ์ฑ„ํƒ, ๋‹จ ๊ณ„์ˆ˜ ๊ทœ์น™์„ ๋ธ”๋ก ๊ธฐ์ค€์œผ๋กœ ๋ช…๋ฌธํ™” | | C-2 | ์ด๊ด€๋˜๋Š” `implementation_plan.md` ยง7 ํ‘œ์˜ `[.mam.env](.mam.env)` ๋งํฌ๋Š” gitignored ํŒŒ์ผ(`test_d29`๊ฐ€ ์ถ”์  ๊ธˆ์ง€)์ด๋ผ ํด๋ฆฐ ์ฒดํฌ์•„์›ƒ์—์„œ ๊ฒŒ์ดํŠธ 4 `test -e`๊ฐ€ ์‹คํŒจ | `.gitignore:24` `.mam.env`, `git ls-files`์— `.mam.env.example`๋งŒ ์ถ”์ , `tests/test_deploy_freshness.py:687 test_d29_env_secrets_never_tracked` ์กด์žฌ, ์›๋ฌธ 151ํ–‰ ๋งํฌ ํ™•์ธ. **์ฃผ์žฅ ์‚ฌ์‹ค.** | **์ˆ˜์šฉ** โ€” ๋งํฌ ๋Œ€์ƒ์„ `.mam.env.example`๋กœ, ๊ฒŒ์ดํŠธ 4์— ignore ์˜ˆ์™ธ ๊ทœ์น™ ์ถ”๊ฐ€ | | C-3 | Phase D-1 ํŠธ๋ฆฌ ์ถ”๊ฐ€ ๋ชฉ๋ก์— `IMPROVEMENTS.md` ๋ˆ„๋ฝ, ์˜๋ฌธ README ํŠธ๋ฆฌ์— `README.ko.md`/`BOOTSTRAP.ko.md` ๋ถ€์žฌ, ํ•œ๊ตญ์–ด README์—๋Š” `BOOTSTRAP.ko.md`๋งŒ ์กด์žฌ โ†’ "์ค„์ˆ˜ ์ผ์น˜" ๊ฒŒ์ดํŠธ ๊ธฐ์ค€ ๋ถˆ๋ช…ํ™• | `README.md:188-190` 3๊ฐœ ๋ฃจํŠธ md, `README.ko.md:170-173` 4๊ฐœ ๋ฃจํŠธ md. **์ฃผ์žฅ ์‚ฌ์‹ค.** | **์ˆ˜์šฉ** โ€” ๋ฃจํŠธ md 8๊ฐœ ์ „๋ถ€๋ฅผ ์–‘ README ํŠธ๋ฆฌ์— ๋™์ผ ์ˆœ์„œ๋กœ ๋ช…์‹œ | ๋ถ€์ˆ˜ ์ •์ •: Creator ๋ณด๊ณ ์„œ์˜ "450์ค„"์€ `wc -l` ๊ธฐ์ค€ 449์ค„(๋งˆ์ง€๋ง‰ ์ค„ ๊ฐœํ–‰ ์žˆ์Œ)์ด๋‚˜ ํŒ๋‹จ์— ์˜ํ–ฅ ์—†์Œ. --- ## 1. ์ •์ •๋œ ๊ฒฐํ•จ ์ง„๋‹จ ### 1-A. `IMPROVEMENTS.md` ์™„๋ฃŒ ๊ณผ์ œ ์›์žฅ (Planner ์‹ค์ธก, ์ •๋ณธ) ํ—ค๋” ID 30๊ฐœ์™€ ์™„๋ฃŒ `###` ๋ธ”๋ก 31๊ฐœ(์ž”์žฌ ์ œ์™ธ)์˜ ๋Œ€์‘์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์ด ํ‘œ๊ฐ€ Phase B์˜ ์œ ์ผํ•œ ๊ธฐ์ค€์ด๋‹ค. | ํ—ค๋” ID | ํ˜„์žฌ ๋ธ”๋ก ์œ„์น˜ | ๋น„๊ณ  | |---|---|---| | B-21, B-20, B-19, B-14, B-15 | ยง2 (30/44/54/64/68ํ–‰) | ๋ฏธํ•ด๊ฒฐ ์„น์…˜์— ์™„๋ฃŒ ํ•ญ๋ชฉ ํ˜ผ์žฌ | | O-6, A-4 | ยง3 (99/106ํ–‰) | A-4 ๋ธ”๋ก์€ Rev.2 ์–ด๋Œ‘ํ„ฐ ๊ณ„์ธต 45ํ–‰ ๋ถ„๋Ÿ‰ | | B-9, B-13, B-10, B-5, C-6, P2-2, P2-1, B-4, O-3, A-1, A-3, C-2, A-5, B-1, B-3, C-1, O-1, Herdr-0.8.0-Compat-SanitizeHash | ยง5 | 1:1 ๋Œ€์‘ | | B-7 | ยง5 `P0-1 (B-7)` (253ํ–‰) | ํ‚ค ํ‘œ๊ธฐ ์ƒ์ด | | O-4-OrcOnboard | ยง5 `multi-agent-mux-orc-onboard` (242ํ–‰) | ํ‚ค ํ‘œ๊ธฐ ์ƒ์ด | | **O-2** | ยง5 **2๋ธ”๋ก**: `P0-2 (O-2)` 247ํ–‰(Rev.1: pid+lstart ๋งˆ์ปค, 46/46) + `O-2` 273ํ–‰(Rev.2: ํ•˜๋“œ๋งํฌ ์›์ž ์“ฐ๊ธฐ, steal_lock, 204/204) | **๋™์ผ ๊ณผ์ œ์˜ ์—ฐ์† ๊ฐœ์ •** โ†’ ๋ณ‘ํ•ฉ ๋Œ€์ƒ | | **C-3b** | ๋…๋ฆฝ ๋ธ”๋ก ์—†์Œ. ยง5 `P3-1 (A-4 Phase 2 / Option B / C-3b / M2~M7)` 224ํ–‰ ์ œ๋ชฉ์— ํฌํ•จ | P3-1 ๋ธ”๋ก์ด A-4(2์ฐจ)์™€ C-3b๋ฅผ ๋™์‹œ์— ๋‹ด์Œ | | **B-8** | **๋…๋ฆฝ ๋ธ”๋ก ์—†์Œ.** ยง6.2 ํ‘œ 367ํ–‰ `P1-2(๊ณผ๊ฑฐ) B-8 โ€ฆ (โœ… ์™„๋ฃŒ โ€” tests/test_b8_send_keys_verification.py 1/1 PASS)`์—๋งŒ ์กด์žฌ | `tests/test_b8_send_keys_verification.py` ์‹ค์žฌ ํ™•์ธ | | (ํ—ค๋”์— ์—†์Œ) | ยง5 `Rev.2 (b4a1d094)` 260ํ–‰ ์„ธ์…˜ ID ์ž๋™ ํ• ๋‹น | ํ—ค๋” ID ๋ชฉ๋ก์—์„œ ๋ˆ„๋ฝ๋œ ๋ธ”๋ก | ๊ฒฐ๋ก : "ํ—ค๋” 30 = ยง2 5 + ยง3 2 + ยง5 23"์€ (O-2 ์ค‘๋ณต โˆ’1, C-3b ๋ธ”๋ก ์—†์Œ โˆ’1, B-8 ๋ธ”๋ก ์—†์Œ โˆ’1, Rev.2 ๋ธ”๋ก ID ์—†์Œ +1, P3-1 ๋ณ„๋„ ๋ธ”๋ก +1)์ด ์ƒ์‡„๋œ ์šฐ์—ฐ์ด๋‹ค. Rev.2๋Š” **"ยง5์˜ `###` ๋ธ”๋ก 1๊ฐœ = ํ—ค๋” ID 1๊ฐœ"**๋ฅผ ๊ฐ•์ œํ•˜์—ฌ ์ด ์šฐ์—ฐ์„ ์ œ๊ฑฐํ•œ๋‹ค. ### 1-B. Rev.1 ์˜ค๋ฅ˜ ์ •์ • โ€” 154~186ํ–‰ ์ž”์žฌ๋Š” ๋‹จ์ˆœ ์‚ญ์ œ ๋ถˆ๊ฐ€ Rev.1 Phase B-1์€ "์•ž์ชฝ ์‚ฌ๋ณธ์ด ์ตœ์‹  ์„œ์ˆ ์„ ๋ชจ๋‘ ํฌํ•จ(ํ™•์ธ๋จ)"์ด๋ผ ํ–ˆ์œผ๋‚˜ **ํ‹€๋ ธ๋‹ค**. ์ž”์žฌ ์ „์šฉ ํ† ํฐ 20์ข…์„ ์‹ค์ธกํ–ˆ๋‹ค: B-14 ์› ์ง„๋‹จ(`publish_event.py:195-199`, `wait_for_job()`, `max_wait=3900s`, `status=running`), B-15 ์› ์ง„๋‹จ(`job_subscriber.py:172-251`, `queue.Empty`, `idle_timeout`, `multi-agent-mux-delegate-job:331-341`, `wait "$sub_pid"`, `sub_rc`, `job_status="error"`, `job_status="broker_unavailable"`, `load_job`/`read_logged_status`, `source: disk-fallback`), O-5 ๋ฐฐ๊ฒฝ(`nats-py` Option B ๊ธฐ๊ฐ ์‚ฌ์œ ). ์•ž์ชฝ B-14/B-15 ๋ธ”๋ก(64~70ํ–‰)์€ ๊ฐ 2์ค„ ์š”์•ฝ๋ฟ์ด๋‹ค. B-16 ๋ธ”๋ก์€ ์–‘์ชฝ ๋™์ผ(์ž”์žฌ ๊ณ ์œ  ๋‚ด์šฉ ์—†์Œ). ๋”ฐ๋ผ์„œ ์ž”์žฌ๋Š” **๋ณ‘ํ•ฉ ํ›„ ์‚ญ์ œ**ํ•œ๋‹ค(Phase B-1). --- ## 2. ๊ฐœ์ •๋œ ์ž‘์—… ๊ณ„ํš (๋ณ€๊ฒฝ๋œ Phase๋งŒ ๊ธฐ์ˆ ; ๋ฏธ๊ธฐ์žฌ Phase๋Š” Rev.1 ์›๋ฌธ ์ ์šฉ) ### Phase A-2 (๊ฐœ์ •) โ€” ์ด๊ด€ ํŒŒ์ผ ๋งํฌ ๊ทœ์น™ - `git mv implementation_plan.md docs/contracts/nats-backplane/implementation_plan.md` ํ›„ ์ƒ๋Œ€ ๋งํฌ๋ฅผ `../../../` ์ ‘๋‘๋กœ ์Šน๊ฒฉํ•˜๋˜, **ยง7 ํ‘œ์˜ `[.mam.env](.mam.env)`๋Š” `[.mam.env (ํ…œํ”Œ๋ฆฟ: .mam.env.example)](../../../.mam.env.example)`๋กœ ๋ณ€๊ฒฝ**ํ•œ๋‹ค. ์ด์œ : `.mam.env`๋Š” gitignored(`.gitignore:24`)์ด๋ฉฐ `test_d29`๊ฐ€ ์ถ”์ ์„ ๊ธˆ์ง€ํ•˜๋ฏ€๋กœ ํด๋ฆฐ ์ฒดํฌ์•„์›ƒ์— ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. - ๊ฐ™์€ ์ด์œ ๋กœ ๋ฌธ์„œ ๋‚ด `.mam.env`๋ฅผ **ํŒŒ์ผ ๋งํฌ ์—†์ด ์ฝ”๋“œ ์ŠคํŒฌ์œผ๋กœ๋งŒ** ์–ธ๊ธ‰ํ•˜๋Š” ๊ฒƒ์€ ํ—ˆ์šฉํ•œ๋‹ค(23ํ–‰ยท122ํ–‰์€ ๋งํฌ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๋ณ€๊ฒฝ ๋ถˆํ•„์š”). ### Phase B (์ „๋ฉด ๊ฐœ์ •) โ€” `IMPROVEMENTS.md` ๋‹จ์ผ ์›์žฅํ™” (๋ฐฉ์•ˆ A ์ฑ„ํƒ) ์ž‘์—… ์ˆœ์„œ๋ฅผ ์—„์ˆ˜ํ•œ๋‹ค. ํ–‰ ๋ฒˆํ˜ธ๋Š” ์ฐฉ์ˆ˜ ์‹œ์  ๊ธฐ์ค€์ด๋ฉฐ ์ดํ›„ ๋‹จ๊ณ„๋Š” **ํ—ค๋” ๋ฌธ์ž์—ด๋กœ ์•ต์ปค๋ง**ํ•œ๋‹ค. 1. **์ž”์žฌ ๋ณ‘ํ•ฉ ํ›„ ์‚ญ์ œ** (1-B ๋ฐ˜์˜) - ์ž”์žฌ `### **B-14 (F-1 / P1)โ€ฆ`(156ํ–‰)์˜ `ํ˜„์ƒ`ยท`ํŒŒ๊ธ‰ ํšจ๊ณผ` ๋ถˆ๋ฆฟ์„ ์•ž์ชฝ `### **B-14 (โœ… ์™„๋ฃŒ โ€” F-1 / P1)โ€ฆ` ๋ธ”๋ก์˜ `ํ˜„์ƒ` ๋ถˆ๋ฆฟ **์•„๋ž˜์— "์› ์ง„๋‹จ" ๋ถˆ๋ฆฟ์œผ๋กœ ์ถ”๊ฐ€**(๋‚ด์šฉ ์›๋ฌธ ์œ ์ง€, ์‹œ์ œ๋งŒ ๊ณผ๊ฑฐํ˜• ํ—ˆ์šฉ). - ์ž”์žฌ B-15(161ํ–‰)์˜ `ํ˜„์ƒ` 1ยท2ํ•ญ๊ณผ `ํŒŒ๊ธ‰ ํšจ๊ณผ`๋ฅผ ์•ž์ชฝ B-15 ๋ธ”๋ก์— ๋™์ผ ๋ฐฉ์‹์œผ๋กœ ์ถ”๊ฐ€. - ์ž”์žฌ O-5(179ํ–‰)์˜ `ํ˜„์ƒ` ๋ฌธ์žฅ ์ค‘ "`nats-py` ํด๋ผ์ด์–ธํŠธ ์žฌ์ž‘์„ฑ(Option B)์„ ๋ฐฐ์ œํ•˜๊ณ " ๊ตฌ์ ˆ์„ ์•ž์ชฝ O-5 `ํ˜„์ƒ`์— ์‚ฝ์ž…. - ์ž”์žฌ B-16(170ํ–‰)์€ ์•ž์ชฝ๊ณผ ๋™์ผํ•˜๋ฏ€๋กœ ์ถ”๊ฐ€ ์—†์Œ. - ๊ทธ ๋‹ค์Œ ๋‘ ๋ฒˆ์งธ `## 2. ๐ŸŸ  โ€ฆ(Edge-case Bugs โ€” 3๊ฑด)`๋ถ€ํ„ฐ ๋‘ ๋ฒˆ์งธ `## 3.` ๋ธ”๋ก ๋(`## 4. โšช ๋ ˆ๊ฑฐ์‹œ ์ž”์žฌ` ์ง์ „ ๊ตฌ๋ถ„์„ )๊นŒ์ง€ ์‚ญ์ œ. - **๊ฒ€์ฆ**: ์œ„ 20์ข… ํ† ํฐ ์ „๋ถ€๊ฐ€ ์‚ญ์ œ ํ›„ ํŒŒ์ผ์— ์—ฌ์ „ํžˆ ์กด์žฌ(`grep -cF`๋กœ ๊ฐ 1 ์ด์ƒ), `grep -c '^## 2\.'`=1, `grep -c '^## 3\.'`=1. 2. **์™„๋ฃŒ ๋ธ”๋ก ยง5 ์ด๊ด€** (๋ฐฉ์•ˆ A) - ยง2์˜ B-21, B-20, B-19, B-14, B-15 ๋ธ”๋ก๊ณผ ยง3์˜ O-6, A-4 ๋ธ”๋ก์„ **ํ˜„์žฌ ๋“ฑ์žฅ ์ˆœ์„œ ๊ทธ๋Œ€๋กœ** `## 5. ๐ŸŽ‰ ์™„๋ฃŒ๋œ ๊ณผ์ œ` ์ œ๋ชฉ ๋ฐ”๋กœ ์•„๋ž˜(๊ธฐ์กด B-9 ์•ž)์— ์‚ฝ์ž…. ๋ธ”๋ก ๋ณธ๋ฌธ์€ ํ•œ ๊ธ€์ž๋„ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค(์ œ๋ชฉ์˜ `(โœ… ์™„๋ฃŒ โ€” โ€ฆ)` ํ‘œ๊ธฐ ํฌํ•จ). - ์ด๊ด€ ํ›„ ยง2์—๋Š” B-16, B-17, B-18๋งŒ, ยง3์—๋Š” O-5๋งŒ ๋‚จ๋Š”๋‹ค. 3. **O-2 ์ค‘๋ณต ๋ณ‘ํ•ฉ** - `### **O-2: ๋™์ผ ์›Œํฌ์ŠคํŽ˜์ด์Šค โ€ฆ (Race-Free Mutex & Ownership)**`(Rev.2, ์ตœ์ข…๋ณธ)์„ ์œ ์ง€ํ•˜๊ณ , `### **P0-2 (O-2): โ€ฆ**` ๋ธ”๋ก์€ ์ œ๋ชฉ์„ ์ œ๊ฑฐํ•œ ๋’ค ๊ทธ ๋ถˆ๋ฆฟ 4๊ฐœ๋ฅผ O-2 ๋ธ”๋ก **๋์— `- **Rev.1 (P0-2) ์„ ํ–‰ ์กฐ์น˜**:` ํ•˜์œ„ ๋ถˆ๋ฆฟ์œผ๋กœ** ํŽธ์ž…ํ•œ๋‹ค. ์ œ๋ชฉ์€ `### **O-2 (P0-2): โ€ฆ**`๋กœ ๊ฐฑ์‹ ํ•˜์—ฌ ํ‚ค ๋Œ€์‘์„ ์œ ์ง€. 4. **B-8 ๋ธ”๋ก ์‹ ์„ค** (์›์žฅ ์™„๊ฒฐ์„ฑ) - `## 5` ๋ง๋ฏธ(Herdr-0.8.0 ๋ธ”๋ก ๋’ค)์— `### **B-8 (P1-2): agy ์ฃผ์ž… ์‹œ \`return 0\` ์šฐํšŒ ์ œ๊ฑฐ ๋ฐ ์ œ์ถœ ๊ฒ€์ฆ ๋ฃจํ”„ ์ด๊ด€** โ€” โœ… ์™„๋ฃŒ` ๋ธ”๋ก์„ ์ถ”๊ฐ€ํ•˜๊ณ , ๋ถˆ๋ฆฟ 1๊ฐœ๋งŒ ๋‘”๋‹ค: ยง6.2 ํ‘œ 367ํ–‰์˜ ์„œ์ˆ ์„ ๊ทธ๋Œ€๋กœ ์˜ฎ๊ธฐ๊ณ  ๊ทผ๊ฑฐ๋กœ `tests/test_b8_send_keys_verification.py` (1/1 PASS)๋ฅผ ๋ช…๊ธฐํ•œ๋‹ค. **์ƒˆ ์‚ฌ์‹ค์„ ์ง€์–ด๋‚ด์ง€ ์•Š๋Š”๋‹ค** โ€” ํ‘œ 367ํ–‰ ๋ฐ–์˜ ๋‚ด์šฉ์€ ์“ฐ์ง€ ์•Š๋Š”๋‹ค. 5. **์„น์…˜ ํ—ค๋” ์นด์šดํŠธ ํ™•์ •** (๊ณ„์ˆ˜ ๊ทœ์น™: ํ•ด๋‹น ์„น์…˜ ํ•˜์œ„ `###` ๋ธ”๋ก ์ˆ˜) - `## 1. ๐Ÿ”ด ์•„ํ‚คํ…์ฒ˜ ๊ฒฐํ•จ (Architecture Flaws โ€” 1๊ฑด)` (A-2) - `## 2. ๐ŸŸ  ์—ฃ์ง€ ์ผ€์ด์Šค ๋ฐ ๋Ÿฐํƒ€์ž„ ๋ฒ„๊ทธ (Edge-case Bugs โ€” 3๊ฑด)` (B-16, B-17, B-18) - `## 3. ๐ŸŸก ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์ตœ์ ํ™” ๊ณผ์ œ (Orchestration Optimizations โ€” 1๊ฑด)` (O-5) - `## 4. โšช ๋ ˆ๊ฑฐ์‹œ ์ž”์žฌ ๋ฐ ์ฃฝ์€ ์ฝ”๋“œ (Legacy Remnants โ€” 0๊ฑด โ€” ์ „์› ์™„๋ฃŒ)` (๋ณ€๊ฒฝ ์—†์Œ) - `## 5. ๐ŸŽ‰ ์™„๋ฃŒ๋œ ๊ณผ์ œ (Completed Tasks โ€” 31๊ฑด)` = ๊ธฐ์กด 24 โˆ’ 1(O-2 ๋ณ‘ํ•ฉ) + 7(์ด๊ด€) + 1(B-8) = **31** 6. **ํ—ค๋” ์š”์•ฝ(3~6ํ–‰) ๋™๊ธฐํ™”** - `์ตœ์ข… ๊ฐฑ์‹ ์ผ`: `2026-09-07 (IMPROVEMENTS.md ๋‹จ์ผ ์›์žฅํ™”: ยง2/ยง3 ์™„๋ฃŒ ํ•ญ๋ชฉ ยง5 ์ด๊ด€, ๋จธ์ง€ ์ž”์žฌ ๋ณ‘ํ•ฉ ์ œ๊ฑฐ, v4.1.x~v4.4.0 ์™„๋ฃŒ ์‚ฌํ•ญ ๋ฐ˜์˜)`. - `์ด ์ถ”์  ๋ฏธํ•ด๊ฒฐ ๊ณผ์ œ`: **5๊ฑด** ๋ฌธ๊ตฌ ์œ ์ง€(A-2 / B-16, B-17, B-18 / O-5). - `์™„๋ฃŒ๋œ ๊ณผ์ œ`: **31๊ฑด**์œผ๋กœ ๊ฐฑ์‹ ํ•˜๊ณ  ๊ด„ํ˜ธ ๋ชฉ๋ก์„ **ยง5 ๋ธ”๋ก ํ‚ค๋ฅผ ๋“ฑ์žฅ ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์—ดํ•œ 31๊ฐœ**๋กœ ๊ต์ฒด: `B-21, B-20, B-19, B-14, B-15, O-6, A-4, B-9, B-13, B-10, B-5, C-6, P3-1-A4Phase2-C3b, P2-2-C3a-C4-LegacyCleanup, P2-1-DelegateJobSafe-TrapFix, O-4-OrcOnboard, O-2-P0-2, P0-1-B-7, Rev.2-b4a1d094-SessionIdPinning, B-4, O-3, A-1, A-3, C-2, A-5, B-1, B-3, C-1, O-1, Herdr-0.8.0-Compat-SanitizeHash, B-8`. (๊ธฐ์กด `B-7`, `C-3b`, `O-2`, `A-4`๋Š” ์œ„ ํ‚ค ์•ˆ์— ํฌํ•จ๋˜์–ด ์œ ์‹ค๋˜์ง€ ์•Š๋Š”๋‹ค.) 7. **v4.1.x~v4.4.0 ๋ฐ˜์˜** (Rev.1 B-3 ์œ ์ง€, ์œ„์น˜๋งŒ ๋ช…ํ™•ํ™”) - ๊ธฐ์กด `### **B-13 (Stage 2)โ€ฆ` ๋ธ”๋ก ๋์— 1๋ถˆ๋ฆฟ: "v4.4.0(Issue #5 Phase 4)์—์„œ freeze ์Šค๋ƒ…์ƒท์„ ๊ธฐ๋ณธ ๊ฒฝ๋กœ์—์„œ ์ฒ ๊ฑฐ, `MAM_LOOP_FREEZE=1` ๋กค๋ฐฑ ์Šค์œ„์น˜๋งŒ ์ž”์กด (`docs/contracts/issue-5/phase4-freeze-removal.md`)". - ์‹ ๊ทœ ๋ธ”๋ก์€ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š”๋‹ค(codex/grok/opencode ํ†ตํ•ฉ, Python ์ฝ”์–ด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ `VERSIONS.md`๊ฐ€ ์ •๋ณธ์ด๋ฉฐ, ๋ฐฑ๋กœ๊ทธ ID๊ฐ€ ๋ถ€์—ฌ๋œ ๊ณผ์ œ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ยง5์— ๋“ฑ์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค). ๋Œ€์‹  `๐Ÿ“Œ ๊ฐœ์š”` ์ ˆ ๋์— 1๋ฌธ์žฅ: "v4.1.0 ์ดํ›„ ๋ฆด๋ฆฌ์Šค ๋‹จ์œ„ ๋ณ€๊ฒฝ ์ด๋ ฅ์€ `VERSIONS.md`๋ฅผ ์ •๋ณธ์œผ๋กœ ํ•˜๋ฉฐ ๋ณธ ๋ฐฑ๋กœ๊ทธ๋Š” ID๊ฐ€ ๋ถ€์—ฌ๋œ ๊ณผ์ œ๋งŒ ์ถ”์ ํ•œ๋‹ค." 8. **๋ณด์กด ํ•„์ˆ˜ ๋ฌธ์ž์—ด**: `### **O-1: ํƒ€๋‹นํ•˜์ง€ ์•Š์€ ๋ฆฌ๋ทฐ ํ”ผ๋“œ๋ฐฑ ๊ฑฐ๋ถ€/๋ฐ˜๋ก  ํ”„๋กœํ† ์ฝœ ๋ฏธ์ง€์› (Rebuttal Protocol)**` ์ œ๋ชฉ๊ณผ ๋ณธ๋ฌธ์€ ๋ณ€๊ฒฝ ๊ธˆ์ง€ (`test_o1_rebuttal.py::test_v10`). - **Phase B ๊ฒ€์ฆ ์Šคํฌ๋ฆฝํŠธ (Creator ์‹คํ–‰ ํ•„์ˆ˜)**: ```bash f=IMPROVEMENTS.md test "$(grep -c '^## 2\.' $f)" = 1 && test "$(grep -c '^## 3\.' $f)" = 1 # ยง5 ๋ธ”๋ก ์ˆ˜ = 31, ํ—ค๋” ๊ด„ํ˜ธ ID ์ˆ˜ = 31 awk '/^## 5\./{s=1;next} /^## 6\./{s=0} s&&/^### /{n++} END{print n}' $f # โ†’ 31 sed -n '6p' $f | grep -o -E '\(B-21.*\)' | tr ',' '\n' | grep -c . # โ†’ 31 # ๊ฐ ์™„๋ฃŒ ID์˜ ### ์ œ๋ชฉ์ด ์ •ํ™•ํžˆ 1ํšŒ for id in B-21 B-20 B-19 B-14 B-15 O-6 O-2 B-8 A-4; do test "$(grep -c "^### \*\*$id[ :(]" $f)" = 1 || echo "DUP/MISSING $id"; done # ยง2ยทยง3์— โœ… ์™„๋ฃŒ ๋ธ”๋ก ์ž”์กด ๊ธˆ์ง€ awk '/^## 2\./{s=1} /^## 4\./{s=0} s&&/^### .*โœ…/{print "LEAK: "$0}' $f .venv/bin/python -m pytest -q tests/test_o1_rebuttal.py ``` ### Phase D-1 (๊ฐœ์ •) โ€” README ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ ๋งˆํฌ๋‹ค์šด ํ‘œ๊ธฐ ๊ธฐ์ค€ - ์–‘ README์˜ `text` ํŠธ๋ฆฌ **๋ฃจํŠธ ๋ ˆ๋ฒจ ๋งˆํฌ๋‹ค์šด ํ•ญ๋ชฉ์€ ๋‹ค์Œ 8๊ฐœ๋ฅผ ์•ŒํŒŒ๋ฒณ ์ˆœ์œผ๋กœ ์ „๋ถ€** ๊ธฐ์žฌํ•œ๋‹ค(์–ธ์–ด๋ณ„ ๋ฏธ๋Ÿฌ ํฌํ•จ, ๊ธฐ์กด 3~4๊ฐœ โ†’ 8๊ฐœ): `AGENTS.md`, `BOOTSTRAP.ko.md`, `BOOTSTRAP.md`, `IMPROVEMENTS.md`, `MESSAGING.md`, `README.ko.md`, `README.md`, `VERSIONS.md`. ์„ค๋ช… ๋ฌธ๊ตฌ๋งŒ ์–ธ์–ด๋ณ„๋กœ ๋‹ค๋ฅด๋‹ค. - ๋””๋ ‰ํ„ฐ๋ฆฌ ํ•ญ๋ชฉ ์ถ”๊ฐ€ ๋ชฉ๋ก์€ Rev.1 D-1 ๊ทธ๋Œ€๋กœ(`lib_py/` 3ํŒจํ‚ค์ง€, `scripts/` shim ์žฌํ‘œ๊ธฐ, `docs/` 4ํ•ญ๋ชฉ, `nats-docker/`, `tests/`). - **๊ฒ€์ฆ**: ๋‘ ํŒŒ์ผ์˜ ํŠธ๋ฆฌ ๋ธ”๋ก์—์„œ `โ”œโ”€โ”€|โ””โ”€โ”€`๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ค„ ์ˆ˜๊ฐ€ ๋™์ผํ•˜๊ณ , ๋ฃจํŠธ md 8๊ฐœ ๋ฌธ์ž์—ด์ด ์–‘์ชฝ์— ๊ฐ 1ํšŒ ์กด์žฌ. ### ๊ฒŒ์ดํŠธ 4 (๊ฐœ์ •) โ€” ๊นจ์ง„ ์ƒ๋Œ€ ๋งํฌ 0๊ฑด - ๊ฒ€์‚ฌ ๋Œ€์ƒ: ๋ฃจํŠธ 8๊ฐœ + ์ด๊ด€ ๋ฌธ์„œ. ๋งํฌ ๊ฒฝ๋กœ ์ถ”์ถœ ํ›„ `test -e`; **๋‹จ `git check-ignore -q `๊ฐ€ ์ฐธ์ธ ๊ฒฝ๋กœ๋Š” ๊ฒ€์‚ฌ์—์„œ ์ œ์™ธ**ํ•˜์ง€ ์•Š๊ณ  **์˜ค๋ฅ˜๋กœ ์ฒ˜๋ฆฌ**ํ•œ๋‹ค(์ถ”์ ๋˜์ง€ ์•Š๋Š” ํŒŒ์ผ๋กœ์˜ ๋งํฌ๋Š” ๋ฌธ์„œ ๊ฒฐํ•จ์ด๋ฏ€๋กœ Phase A-2 ๊ทœ์น™์— ๋”ฐ๋ผ ๋งํฌ ์ž์ฒด๋ฅผ ์ œ๊ฑฐ/๋Œ€์ฒดํ•ด์•ผ ํ•œ๋‹ค). ์ฆ‰ ๊ฒŒ์ดํŠธ 4 = "๋ชจ๋“  ๋งํฌ ๋Œ€์ƒ์ด ์กด์žฌํ•˜๊ณ  git ์ถ”์  ๋Œ€์ƒ์ด๋‹ค". ```bash for f in README.md README.ko.md BOOTSTRAP.md BOOTSTRAP.ko.md MESSAGING.md IMPROVEMENTS.md AGENTS.md VERSIONS.md docs/contracts/nats-backplane/implementation_plan.md; do d=$(dirname "$f") grep -o -E '\]\(([^)#]+)(#[^)]*)?\)' "$f" | sed -E 's/^\]\(//; s/#.*//; s/\)$//' | grep -v -E '^(https?:|mailto:|file:)' | while read -r p; do t="$d/$p"; { test -e "$t" && git ls-files --error-unmatch "$t" >/dev/null 2>&1; } || echo "BROKEN/UNTRACKED: $f -> $p" done done ``` - ์ฃผ์˜: `IMPROVEMENTS.md` 248ํ–‰ ๋“ฑ์— `file:///Users/...` ์ ˆ๋Œ€ ๋งํฌ๊ฐ€ ์กด์žฌํ•œ๋‹ค. ๋ณธ ๊ฒŒ์ดํŠธ์—์„œ๋Š” ์ œ์™ธ(`file:` ํ•„ํ„ฐ)ํ•˜๋˜, Phase B-3 O-2 ๋ณ‘ํ•ฉ ์‹œ ํ•ด๋‹น ๋ถˆ๋ฆฟ์˜ `file://` ๋งํฌ๋Š” ์ƒ๋Œ€ ๊ฒฝ๋กœ `.agents/skills/multi-agent-mux-loop/scripts/loop_lock.sh`๋กœ ๊ต์ฒดํ•œ๋‹ค(๊ฐ™์€ ๋ถˆ๋ฆฟ์„ ๋งŒ์ง€๋Š” ๊น€์— ์ตœ์†Œ ์ˆ˜์ •). --- ## 3. ์ตœ์ข… ๊ฒ€์ฆ ๊ฒŒ์ดํŠธ (Rev.2 ํ™•์ •๋ณธ) 1. ๋ฃจํŠธ ๋งˆํฌ๋‹ค์šด 8๊ฐœ, `implementation_plan.md`๋Š” `docs/contracts/nats-backplane/`. 2. `pytest -q tests/test_deploy_layout.py tests/test_o1_rebuttal.py tests/test_deploy_freshness.py tests/test_version_consistency.py` โ†’ 49 passed. 3. `pytest -q tests/` โ†’ 750 passed. 4. ์œ„ ๊ฐœ์ • ๊ฒŒ์ดํŠธ 4 ์Šคํฌ๋ฆฝํŠธ ์ถœ๋ ฅ 0์ค„. 5. `git diff --stat`์— `.agents/skills/**`, `tests/**`, `deploy/**` ๋ณ€๊ฒฝ ์—†์Œ. 6. `MAM_INSTALL_DOCS=minimal|full` ์„ค์น˜ ์‹œ ๋ฃจํŠธ ๋ฌธ์„œ 1๊ฐœ/4๊ฐœ. 7. **(์‹ ์„ค)** Phase B ๊ฒ€์ฆ ์Šคํฌ๋ฆฝํŠธ ์ „ ํ•ญ๋ชฉ ํ†ต๊ณผ: ยง5 ๋ธ”๋ก 31 = ํ—ค๋” ID 31, ยง2/ยง3 ์™„๋ฃŒ ๋ธ”๋ก ๋ˆ„์ถœ 0, ์ž”์žฌ ํ† ํฐ 20์ข… ๋ณด์กด. ## 4. ๋ฒ”์œ„ ์™ธ (Rev.1 ยง4 ์œ ์ง€) + ์ถ”๊ฐ€ - `nats-docker/PRIVATE_SERVER.md:5` ๊นจ์ง„ ๋งํฌ โ€” ์„œ๋ธŒ๋ชจ๋“ˆ ๋ณ„๋„ ์ปค๋ฐ‹. - ๋ฏธํ•ด๊ฒฐ 5๊ฑด(A-2, B-16, B-17, B-18, O-5)์˜ ์ฝ”๋“œ ๋Œ€์กฐ ์žฌํŒ์ • โ€” ๋ณ„๋„ ๋ฆฌ๋ทฐ ์žก. ํŠนํžˆ B-17์€ `MESSAGING.md:310`์ด "๊ตฌํ˜„๋จ"์œผ๋กœ ์„œ์ˆ ํ•˜๊ณ  ์žˆ์–ด ์ƒํƒœ ๋ถˆ์ผ์น˜ ์˜์‹ฌ์ด ์žˆ์œผ๋‚˜ **๋ณธ ์ž‘์—…์—์„œ๋Š” ์†๋Œ€์ง€ ์•Š๋Š”๋‹ค**(์ฝ”๋“œ ํ™•์ธ ์—†์ด ์™„๋ฃŒ๋กœ ์˜ฎ๊ธฐ๋ฉด ์›์žฅ ์˜ค์—ผ). - README ๋ฐฐ์ง€ 5๋ฒˆ์งธ lockstep ๋ ˆ๊ทธ โ€” ๋ณ„๋„ ์žก. ## 5. ๋ฆฌ์Šคํฌ - Phase B๋Š” ์ด๋™ยท๋ณ‘ํ•ฉ์ด ๋งŽ์•„ ์œ ์‹ค ์œ„ํ—˜์ด ๊ฐ€์žฅ ํฌ๋‹ค. ๋ฐ˜๋“œ์‹œ **B-1 โ†’ B-2 โ†’ B-3 โ†’ B-4 ์ˆœ์„œ**๋กœ ๊ฐ ๋‹จ๊ณ„ ํ›„ ๊ฒ€์ฆ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ์ตœ์ข…์ ์œผ๋กœ `git diff --stat IMPROVEMENTS.md`์˜ ์‚ญ์ œ ์ค„ ์ˆ˜๊ฐ€ (์ž”์žฌ 33์ค„ + P0-2 ์ œ๋ชฉ 1์ค„ + ์ด๊ด€์— ๋”ฐ๋ฅธ ์ด๋™๋ถ„) ๋ฒ”์œ„ ์•ˆ์ธ์ง€ ํ™•์ธํ•œ๋‹ค. ์ด๊ด€์€ `git diff`์—์„œ ์‚ญ์ œ+์ถ”๊ฐ€๋กœ ๋ณด์ด๋ฏ€๋กœ `git diff --color-moved=plain`์œผ๋กœ ์ด๋™์ž„์„ ํ™•์ธํ•œ๋‹ค. --- ## ๋ถ€๋ก. Rev.1 ์›๋ฌธ ์ค‘ ์œ ํšจ ์œ ์ง€ ํ•ญ๋ชฉ (๋ณ€๊ฒฝ ์—†์Œ) - ยง0 ์‹ค์ธก ์ธ๋ฒคํ† ๋ฆฌ ํ‘œ ๋ฐ KEEP/์ด๊ด€ ํŒ์ • 9๊ฑด. - ยง1 D-2(MESSAGING lib_py ๋ฏธ๋ฐ˜์˜), D-3(README ํŠธ๋ฆฌ), D-4(BOOTSTRAP ยง1), D-5(implementation_plan ์ด๊ด€), D-6(AGENTS ยง5). - Phase A-1/A-3/A-4, Phase C ์ „์ฒด, Phase D-2~D-4, Phase E, Phase F, Phase G.