# πŸ› οΈ Multi-Agent Mux μ’…ν•© κ°œμ„  및 λ―Έν•΄κ²° 과제 백둜그 (`IMPROVEMENTS.md`) - **μ΅œμ’… 갱신일**: 2026-08-09 (A-4 `BaseAgentAdapter` μ–΄λŒ‘ν„° 계측 섀계 μ œμ•ˆ λ“±μž¬) - **톡합 관리 λŒ€μƒ**: κΈ°μ‘΄ `CODEBASE_REVIEW_REPORT.md` + `OPTIMIZATION.md` - **총 좔적 λ―Έν•΄κ²° 과제**: **12건** (μ•„ν‚€ν…μ²˜ 2건, μ—£μ§€μΌ€μ΄μŠ€ 6건, μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜ 1건, λ ˆκ±°μ‹œ μž”μž¬ 3건) - **μ™„λ£Œλœ 과제**: **10건** (A-1, A-3, A-5, B-1, B-3, B-4, C-1, C-2, O-1, O-3) --- ## πŸ“Œ κ°œμš” λ³Έ λ¬Έμ„œλŠ” Multi-Agent Mux (MAM) ν”„λ ˆμž„μ›Œν¬μ˜ **μ½”λ“œλ² μ΄μŠ€ μ•„ν‚€ν…μ²˜ 결함, λŸ°νƒ€μž„ μ—£μ§€μΌ€μ΄μŠ€, λ ˆκ±°μ‹œ μž”μž¬** 및 **`/multi-agent-mux-loop` μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜ μ΅œμ ν™” 과제**λ₯Ό 단일 백둜그둜 톡합 μΆ”μ ν•˜κΈ° μœ„ν•œ μ’…ν•© 관리 λ¬Έμ„œμž…λ‹ˆλ‹€. --- ## 1. πŸ”΄ μ•„ν‚€ν…μ²˜ 결함 (Architecture Flaws β€” 2건) ### **A-2: 곡개 브둜컀 + HMAC 인증 Off + μ™€μΌλ“œμΉ΄λ“œ μ „νŒŒ** - **ν˜„μƒ**: `mqtt_common.py`의 κΈ°λ³Έ λΈŒλ‘œμ»€κ°€ 곡개 μ„œλ²„(`broker.hivemq.com`), HMAC 무쑰건 True λ°˜ν™˜μœΌλ‘œ μ„€μ •λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. - **νŒŒκΈ‰ 효과**: μ™ΈλΆ€μ—μ„œ μœ μž…λ˜λŠ” malicious `error` 이벀트 μˆ˜μ‹  μ‹œ `reconcile.sh`κ°€ 라이브 μ—μ΄μ „νŠΈ pane을 `kill-session`으둜 κ°•μ œ νŒŒκ΄΄ν•˜λŠ” 치λͺ…적 λ³΄μ•ˆ/μ•ˆμ •μ„± μœ„ν—˜μ΄ μ‘΄μž¬ν•©λ‹ˆλ‹€. ### **A-4 (섀계 μ œμ•ˆ): μ—μ΄μ „νŠΈ 지식 μ‚°μž¬ β€” `BaseAgentAdapter` μ–΄λŒ‘ν„° 계측 λ„μž… (Rev.2)** > 결함 μ‘°μΉ˜κ°€ μ•„λ‹ˆλΌ **ꡬ쑰 κ°œμ„  μ œμ•ˆ**μž…λ‹ˆλ‹€. 상세 섀계·싀츑 κ·Όκ±°λŠ” `.mam/jobs/44062a63/claude-reports/report-final.md` 및 `744ac67a` λ₯Ό μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€. - **ν˜„μƒ**: "claude 의 transcript λŠ” μ–΄λ”” μžˆλ‚˜", "cline 재개 argv λŠ” 무엇인가" 같은 **μ—μ΄μ „νŠΈμ— λŒ€ν•œ 사싀**이 슀크립트 8개 Β· **34개 νŒ¬μ•„μ›ƒ 지점**에 흩어져 μžˆμŠ΅λ‹ˆλ‹€. (8쀄 μœˆλ„ μ•ˆμ— 4개 μ—μ΄μ „νŠΈ 쀑 3개 이상이 λ“±μž₯ν•˜λŠ” 지점 κΈ°μ€€: `create_session.sh` 8, `reconcile.sh` 7, `stop_session.sh` 6, `lib.sh` 4, `resolve_session_id.sh` 3, `resume_session.sh`/`update_yaml_resumed.sh`/`run_loop.sh` 각 2) - **사본 ν˜„ν™©**: `agent β†’ *_id_own` ν‚€ λ§΅ **4벌**, `~/.claude/projects` 17μ°Έμ‘°, `antigravity-cli/conversations` 11μ°Έμ‘°, `.hermes/state.db` 6μ°Έμ‘°, `.cline/data/sessions` 5μ°Έμ‘°. - **νŒŒκΈ‰ 효과**: 같은 μ§ˆλ¬Έμ— **μ„œλ‘œ λ‹€λ₯Έ λ‹΅**이 κ³΅μ‘΄ν•©λ‹ˆλ‹€. μ„Έμ…˜λͺ…β†’μ—μ΄μ „νŠΈ 좔둠이 `reconcile.sh::row_agent`(pane.cmd β†’ cmd_full β†’ 이름 접미사)와 `run_loop.sh:236-243`(μ„Έκ·Έλ¨ΌνŠΈ λ§€μΉ­ + μ‹€νŒ¨ μ‹œ `claude` κΈ°λ³Έκ°’) 두 벌둜 μ‘΄μž¬ν•˜λ©° ν›„μžλŠ” 였판 κ°€λŠ₯ν•©λ‹ˆλ‹€. b4a1d094 μ—μ„œ λ“œλŸ¬λ‚œ "격리 λΆ„κΈ° inert" 결함도 μ•„ν‹°νŒ©νŠΈ 경둜 κ·œμΉ™μ΄ 두 λ²Œμ΄μ—ˆλ˜ λ°μ„œ λΉ„λ‘―λμŠ΅λ‹ˆλ‹€. #### 섀계 μš”μ§€ (Rev.2 κ°±μ‹ ) - **`.agents/skills/mam_agents/`** νŒ¨ν‚€μ§€(μ•½ 484쀄): `base.py`(ABC + `SpawnSpec` + `DiscoveryContext`), `registry.py`(정적 λ ˆμ§€μŠ€νŠΈλ¦¬), `__main__.py`(μ…Έ λΈŒλ¦¬μ§€), `adapters/{claude,agy,hermes,cline}.py`. - **μΈν„°νŽ˜μ΄μŠ€**: `own_key` / `supports_assigned_id` / `ready_tokens` 속성 + `auth_ok(run)` Β· `spawn_spec()` Β· `resume_spec(binary, uuid, materialized)` Β· `artifact_path(uuid, ctx)` Β· `verify_artifact(uuid, ctx)` Β· `discover(ctx)`. - **`DiscoveryContext` & `discover()` ν…œν”Œλ¦Ώ λ©”μ„œλ“œ**: `cwd`(물리 μ ˆλŒ€κ²½λ‘œ), `ws_key`, `home`, `claude_dir`, `iso_root`, `epoch`, `claimed` ν•„λ“œλ₯Ό 객체 ν•˜λ‚˜λ‘œ μΊ‘μŠν™”. `_raw_candidates(ctx)` 좔상 λ©”μ„œλ“œλ‘œ μ–΄λŒ‘ν„°λ³„ 물리 νƒμƒ‰λ§Œ μ„œμˆ ν•˜κ³  `claimed`/`epoch` ν•„ν„°λŠ” 기반 클래슀 ν…œν”Œλ¦Ώμ΄ 100% 보μž₯. - `auth_ok` λŠ” μ„œλΈŒν”„λ‘œμ„ΈμŠ€ μ‹€ν–‰μžλ₯Ό **μ£Όμž…**λ°›μ•„ CLI λ―Έμ„€μΉ˜ ν™˜κ²½μ—μ„œλ„ λ‹¨μœ„ ν…ŒμŠ€νŠΈκ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€(hermes λŠ” ν˜„μž¬ λ―Έμ„€μΉ˜). - `resume_spec` 의 `materialized` νŒŒλΌλ―Έν„°κ°€ b4a1d094 κ·œμΉ™(`claude -r <λ―Έμ‹€ν˜„ uuid>` μ‹€νŒ¨ β†’ `--session-id`)을 ν‘μˆ˜ν•©λ‹ˆλ‹€. - `ready_tokens` 속성을 μ–΄λŒ‘ν„°λ‘œ 내보내 `wait_for_tui_ready` 의 25쀄 inline shell `case` 블둝을 단 1μ€„μ˜ `grep -E -q "$MAM_READY_TOKENS"` 둜 μΆ•μ†Œ. - **λ ˆμ§€μŠ€νŠΈλ¦¬ νŒ¨ν„΄**: **정적 dict 채택.** `entry_points` λŠ” MAM 이 `pip install` λ˜μ§€ μ•Šκ³  `rsync`/`cp` 둜 λ°°ν¬λ˜λ―€λ‘œ 뢀적합, 디렉터리 μŠ€μΊ”μ€ "0개 발견"κ³Ό "μ—μ΄μ „νŠΈ λ―Έμ„€μΉ˜"κ°€ κ΅¬λΆ„λ˜μ§€ μ•Šμ•„ 뢀적합. - **bash↔python λΈŒλ¦¬μ§€**: `python -m mam_agents facts ` κ°€ `shlex.quote` 된 `KEY=value` λ₯Ό 좜λ ₯. **μŠ€ν¬λ¦½νŠΈλ‹Ή 1회 `eval`** 이 κ³„μ•½μž…λ‹ˆλ‹€(μ‹€μΈ‘ 22.8 ms/호좜 vs bash `case` 2.3 ms β€” λΆ„κΈ°λ§ˆλ‹€ ν˜ΈμΆœν•˜λ©΄ μ•ˆ 됨). #### μ‹€ν˜„ κ°€λŠ₯μ„± 및 λΆ€νŠΈμŠ€νŠΈλž© (Rev.2 μ‹€μΈ‘) - 파이썬 μ§„μž…μ  **3μ’… μ „λΆ€**μ—μ„œ import 확인: `env_python`, `atomic_dump_yaml`(flock μ“°κΈ° 경둜), venv μ—†λŠ” **맨 `/usr/bin/python3`**. - **`lib.sh` source μ‹œμ  1회 `export PYTHONPATH`**: `lib.sh` λ‘œλ“œ μ‹œ `_mam_export_pythonpath` κ°€ `mam_skills_dir` 을 `PYTHONPATH` 에 μžλ™ μ–Ήμ–΄ `run_loop.sh` λ“± μ…Έ μƒμ˜ λͺ¨λ“  `python3 -c` 호좜이 ν•œ λ²ˆμ— ν˜Έν™˜λ¨. - herdr shim λ‚΄λΆ€ `python3 -c` **9κ³³ μ „λΆ€ μ—μ΄μ „νŠΈ 지식 0** β†’ shim 경계가 이미 μ˜¬λ°”λ₯Έ μœ„μΉ˜μ— μžˆμŠ΅λ‹ˆλ‹€. - **μ œμ•½(κ·œμΉ™ν™” ν•„μš”)**: μ–΄λŒ‘ν„°λŠ” **ν‘œμ€€ 라이브러리만** μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ„œλ“œνŒŒν‹° μ˜μ‘΄μ„±μ΄ λ“€μ–΄μ˜€λ©΄ venv μ—†λŠ” κ²½λ‘œκ°€ κΉ¨μ§‘λ‹ˆλ‹€. #### μ„ ν–‰ ν•„μˆ˜ 체크리슀트 (λˆ„λ½ μ‹œ 쑰용히 μ—…κ·Έλ ˆμ΄λ“œκ°€ λ§‰νž˜) 1. **`deploy/remove.sh:83-91` `fallback_assets` 에 `".agents/skills/mam_agents"` 등둝.** 미등둝 μ‹œ `tests/test_deploy_freshness.py::test_d2` κ°€ μ‹€νŒ¨ν•˜λ©°(ν”„λ‘œν† νƒ€μž…μ—μ„œ μ‹€μ œ λ°œμƒ), μ–ΈμΈμŠ€ν†¨ ν›„ μž”μ‘΄ μžμ‚°μ΄ μ›Œν¬μŠ€νŽ˜μ΄μŠ€λ₯Ό **영ꡬ히 ꡬ버전에 κ³ μ •**μ‹œν‚΅λ‹ˆλ‹€(`install.sh` λŠ” λΉ„-μŠ€ν‚¬ μžμ‚°μ„ "없을 λ•Œλ§Œ" 볡사). 2. `deploy/install.sh` 무결성 μžμ‚° λͺ©λ‘ 등둝. 3. `deploy/gitea-ci.yml:69-77` 의 `flake8` / `py_compile` 경둜 μΆ”κ°€ β€” ν˜„μž¬ CI 파이썬 μž‘μ€ `multi-agent-mux-delegate-job/scripts/` 만 κ²€μ‚¬ν•˜λ―€λ‘œ μ‹ κ·œ νŒ¨ν‚€μ§€λŠ” 린트 μ‚¬κ°μ§€λŒ€μž…λ‹ˆλ‹€. #### 단계적 이행 (각 λ‹¨κ³„λŠ” μ…Έ 사본 제거λ₯Ό 같은 컀밋에 포함) | 단계 | λ‚΄μš© | |---|---| | M0 | νŒ¨ν‚€μ§€ 골격 + `lib.sh` source μ‹œμ  `PYTHONPATH` export + 배포/CI 등둝 | | M1 | `own_key` / `agent_of_row` 이관 β€” **ν”„λ‘œν† νƒ€μž… 검증 μ™„λ£Œ: νŒ¬μ•„μ›ƒ 34 β†’ 29** | | M2 | `artifact_path` + `verify_artifact` (`verify_session_uuid` 4λΆ„κΈ°, `DiscoveryContext` 적용, 격리 경둜 일원화) | | M3 | `spawn_spec` / `resume_spec` / `auth_ok` (createΒ·resume argv 및 ν”„λ¦¬ν”ŒλΌμ΄νŠΈ) | | M4 | `discover()` (raw candidates + base class template filter) β€” hermes DB μŠ€ν‚€λ§ˆ μ‹€μΈ‘ μ„ ν–‰ | | M5 | `stop_session.sh` purge 경둜 및 exit key | | M6 | `ready_tokens` μ–΄λŒ‘ν„° 이관 (`wait_for_tui_ready` 25쀄 case 제거) | | M7 | claude ready tokens μ—μ„œ `projects` 제거 및 자체 검증 뢄리 컀밋 | - **μ •μ§ν•œ μƒν•œ**: 34 β†’ **μ•½ 10**. λ‚¨λŠ” μ•½ 10곳은 μ…Έ 상주 TUIΒ·ν”„λ‘œμ„ΈμŠ€ μ œμ–΄(`send_keys_safe` 의 agy/claude/cline λΆ„κΈ°, `handle_startup_dialogs`, spawn 래퍼 λΆ„κΈ°, `pgrep -P` μžμ‹ pid 게이트)둜 이 μΆ”μƒν™”μ˜ λŒ€μƒμ΄ μ•„λ‹™λ‹ˆλ‹€. - **쀑단 κΈ°μ€€**: M2 이후에도 νŒ¬μ•„μ›ƒμ΄ 29 β†’ 20 μ΄ν•˜λ‘œ λ–¨μ–΄μ§€μ§€ μ•ŠμœΌλ©΄ μ€‘λ‹¨ν•˜κ³  μž”μ—¬ 단계λ₯Ό μž¬κ²€ν† ν•©λ‹ˆλ‹€. - **검증 μƒνƒœ**: Rev.2 ν”„λ‘œν† νƒ€μž… κΈ°μ€€ 전체 νšŒκ·€ **162 passed (νšŒκ·€ 0)**, 변이 6/6 κ²€μΆœ, 배포 μŠ€μœ„νŠΈ 25/25, `py_compile` 톡과. --- ## 2. 🟠 μ—£μ§€ μΌ€μ΄μŠ€ 및 λŸ°νƒ€μž„ 버그 (Edge-case Bugs β€” 6건) ### **B-5: `df --output` GNU μ „μš© ν”Œλž˜κ·Έ μ‚¬μš©μœΌλ‘œ macOS NFS 감지 μ‹€νŒ¨** - macOS/BSD ν™˜κ²½μ—μ„œ `df --output` ꡬ문 였λ₯˜λ‘œ NFS 감지가 μ‹€νŒ¨ν•˜κ³  "NFS μ•„λ‹˜"으둜 μ˜€νŒλ˜μ–΄ SQLite WAL 포맷을 κ°•ν–‰ν•©λ‹ˆλ‹€. ### **B-6: μŠ€ν‚¬ νŠΈλ¦¬μ— μž„μ‹œ 파일 볡사 및 유좜** - `run_loop.sh::delegate_job_safe`κ°€ 래퍼 슀크립트λ₯Ό `.agents/skills/...` 트리 내뢀에 `.tmp`둜 λ³΅μ‚¬ν•˜μ—¬ 버전 관리 트리λ₯Ό μ˜€μ—Όμ‹œν‚€κ³  rsync 배포 μ‹œ μ™ΈλΆ€λ‘œ μœ μΆœλ©λ‹ˆλ‹€. ### **B-7: `run_loop.sh` μƒλŒ€κ²½λ‘œ cwd 의쑴 및 미좔적 파일 λˆ„λ½** - μ €μž₯μ†Œ 루트 λ°–μ—μ„œ `run_loop.sh` ꡬ동 μ‹œ `wait_for_job`이 3900초 무음 νƒ€μž„μ•„μ›ƒμ„ λ°œμƒμ‹œν‚€λ©°, `git diff`κ°€ Creatorκ°€ μƒˆλ‘œ μΆ”κ°€ν•œ 미좔적 μ‹ κ·œ νŒŒμΌμ„ λ¦¬λ·°μ–΄μ—κ²Œ λˆ„λ½ν•©λ‹ˆλ‹€. ### **B-8: `send_keys_safe` agy 경둜 검증 μ΄νƒˆ** - agy μ„Έμ…˜ μ£Όμž… μ‹œ μ£Όμž… μ‹€νŒ¨ μ—¬λΆ€λ₯Ό κ²€μ¦ν•˜μ§€ μ•Šκ³  무쑰건 `return 0`을 남겨 μ‹€νŒ¨ μ‹œμ—λ„ μ„±κ³΅μœΌλ‘œ λ³΄κ³ λ©λ‹ˆλ‹€. ### **B-9: `LOGS_DIR` import μ‹œμ  cwd κ³ μ •** - `mqtt_common.py` λͺ¨λ“ˆ λ‘œλ“œ μ‹œμ μ˜ cwd둜 감사 둜그 κ²½λ‘œκ°€ 1회 κ³ μ •λ©λ‹ˆλ‹€. ### **B-10: `agent_identities` μ“°κΈ° 경둜 λΆ€μž¬ 및 PyYAML μ˜μ‘΄μ„±** - μ €μž₯μ†Œ 전체에 `agent_identities` λ₯Ό μƒμ„±Β·κ°±μ‹ ν•˜λŠ” μ½”λ“œκ°€ 0건이며, `lib.sh` 의 PyYAML ν•˜λ“œ μ˜μ‘΄μ„±μœΌλ‘œ 인해 `.db` 만으둜 μΆ©λΆ„ν•œ κ²½μš°μ—λ„ PyYAML λΆ€μž¬ μ‹œ μƒνƒœ μ‘°νšŒκ°€ 무λ ₯ν™”λ˜λŠ” λ¬Έμ œκ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€. --- ## 3. 🟑 μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜ μ΅œμ ν™” 과제 (Orchestration Optimizations β€” 2건) ### **O-2 (ꡬ ISSUE-7): 동일 μ›Œν¬μŠ€νŽ˜μ΄μŠ€ λ‚΄ 쀑볡 루프 기동 λ°©μ§€ 락 (Race-Free Lock)** - **ν˜„μƒ**: 동일 μž‘μ—… νŠΈλ¦¬μ—μ„œ λ‹€μˆ˜μ˜ `run_loop.sh` μŠ€ν¬λ¦½νŠΈκ°€ 병렬 기동될 경우 SQLite DB κ°±μ‹  κ²½ν•© 및 YAML 데이터 μ˜€μ—Όμ΄ 일어날 수 있음. - **문제점**: λ‹¨μˆœ PID 파일 쑴재 μ—¬λΆ€λ§Œ 체크할 경우, PID Rollover(ν”„λ‘œμ„ΈμŠ€ ID μž¬μ‚¬μš©) λ˜λŠ” `mkdir`κ³Ό PID 기둝 μ‚¬μ΄μ˜ 생성 μ°½(Grace Window)μ—μ„œ μ‚΄μ•„μžˆλŠ” 락을 타 ν”„λ‘œμ„ΈμŠ€κ°€ ν›”μ³κ°€λŠ” "락 λ„λ‚œ(Live-lock theft)" ν˜„μƒ λ°œμƒ. - **ν•΄κ²° λ°©μ•ˆ**: 1. 락 μ†Œμœ μž λ ˆμ½”λ“œλ₯Ό λ‹¨μˆœ `PID`μ—μ„œ **`PID + μ‹œμž‘μ‹œκ°(lstart) + μ›Œν¬μŠ€νŽ˜μ΄μŠ€`** 3쀑 ꡬ쑰둜 κ²°ν•©ν•˜μ—¬ PID μž¬μ‚¬μš©μ„ κ²°μ •μ μœΌλ‘œ 차단. 2. `mkdir` 직후 생성 μ°½ 유예 λŒ€κΈ°(Sleep Grace Period)λ₯Ό λΆ€μ—¬ν•˜μ—¬ 락 λ„λ‚œ λ°©μ§€. 3. `ps` CLI λΆ€μž¬ μ‹œ Fails-Open(락 λ¬΄μ‹œ) λŒ€μ‹  **Fails-Safe(락 쑴쀑 + κ²½κ³ )** 둜 μ „ν™˜ν•˜μ—¬ DB/YAML μ˜€μ—Ό μ›μ²œ λ°©μ§€. --- ## 4. βšͺ λ ˆκ±°μ‹œ μž”μž¬ 및 죽은 μ½”λ“œ (Legacy Remnants β€” 3건) ### **C-3: 격리 μŠ€ν… 4μ’… 및 `stop_session.sh` λ―Έμ‚¬μš© isolation μ½”λ“œ μž”μ‘΄** - `provision_isolation` λ“± 4개 μŠ€ν… ν•¨μˆ˜μ™€ `stop_session.sh` λ‚΄ `.mam/agent_homes` κ°€λ“œ μ½”λ“œκ°€ 호좜자 0건인 채 μž”μ‘΄ν•©λ‹ˆλ‹€. ### **C-4: μ°Έμ‘° 0회 λ―Έμ‚¬μš© 심볼 7μ’…** - `_HERDR_SHIM_DIR_PATTERN`, `_REAL_HERDR_PATH`, `TERMINAL_STATUSES`, `ISOLATE`, `local_herdr` λ“± 7개 λ―Έμ‚¬μš© 심볼이 μž”μ‘΄ν•©λ‹ˆλ‹€. ### **C-6: `stop_session.sh` 도움말 λ¬Έμ„œ ꡬ버전 ν‘œκΈ°** - 슀크립트 λ„μ›€λ§μ—λŠ” `--mode soft|hard` 등이 μ„œμˆ λ˜μ–΄ μžˆμœΌλ‚˜ μ‹€μ œ μ˜΅μ…˜ νŒŒμ„œλŠ” `exit 2`둜 κ±°λΆ€ν•©λ‹ˆλ‹€. --- ## 5. πŸŽ‰ μ™„λ£Œλœ 과제 (Completed Tasks β€” 10건) ### **Rev.2 (b4a1d094): 생성 μ‹œ μ„Έμ…˜ ID μžλ™ ν• λ‹Ή 및 Reconciler κ³ μ •/경둜 μ •κ·œν™” ν”„λ‘œν† μ½œ** β€” βœ… μ™„λ£Œ - μ‹ κ·œ `claude` μ„Έμ…˜ 생성 μ‹œ `mam_gen_uuid`둜 UUIDλ₯Ό μ¦‰μ‹œ μƒμ„±ν•˜μ—¬ `--session-id `둜 μ „λ‹¬ν•˜κ³ , `session_id_source: assigned`, `session_id_verified: false`둜 λ“±λ‘ν•˜λŠ” μ›μžμ  κ³ μ • ꡬ쑰λ₯Ό κ΅¬μΆ•ν–ˆμŠ΅λ‹ˆλ‹€. - 첫 μ‚¬μš©μž λ©”μ‹œμ§€ 전달 μ‹œ λ””μŠ€ν¬ 트랜슀크립트 `.jsonl` 생성을 λͺ¨λ‹ˆν„° 루프(`reconcile.sh` drift C0)κ°€ κ°μ§€ν•˜κ³  `session_id_verified: true`, `last_visible_status: pinned`둜 κ³ μ •μ‹œν‚΅λ‹ˆλ‹€. - λ―Έν• λ‹Ή λ‹€μˆ˜ 후보 발견 μ‹œ λ¬΄μž‘μœ„ 고정을 κΈˆμ§€ν•˜κ³  `C-ambiguous` μƒνƒœλ₯Ό λͺ…ν™•νžˆ λ³΄κ³ ν•˜λ„λ‘ κ°•ν™”ν–ˆμŠ΅λ‹ˆλ‹€. - 심볼릭 링크/트레일링 μŠ¬λž˜μ‹œ/μƒλŒ€κ²½λ‘œ 계산 μ‹œ `mam_abs_workspace` 및 `mam_workspace_key` (`cd -P && pwd -P` / `os.path.realpath`) 경둜 μ •κ·œν™”λ₯Ό μ „μˆ˜ μ μš©ν•˜μ—¬ 100% ν‚€ μΌμΉ˜μ„±μ„ ν™•λ¦½ν–ˆμŠ΅λ‹ˆλ‹€. - μ „μš© λ‹¨μœ„/톡합 ν…ŒμŠ€νŠΈ μŠ€μœ„νŠΈ `tests/test_uuid_target.py` (13/13 PASS) 및 전체 νšŒκ·€ ν…ŒμŠ€νŠΈ μŠ€μœ„νŠΈλ₯Ό 검증 μ™„λ£Œν–ˆμŠ΅λ‹ˆλ‹€. ### **B-4: μ‹œν”„νŠΈ `ls`의 `created` 동적 POSIX νƒ€μž„μŠ€νƒ¬ν”„ 볡원 및 재개 κ°€λ“œ 정상화** β€” βœ… μ™„λ£Œ - `.agents/skills/lib.sh` 554번 라인의 `999999` ν•˜λ“œμ½”λ”© 좜λ ₯을 μ œκ±°ν•˜κ³ , real herdr λ˜λŠ” `.mam/agent-sessions.yaml` 에 기둝된 μ„Έμ…˜ 생성 μ‹œκ°(`created`/`created_at`/`created_epoch`) 및 동적 POSIX νƒ€μž„μŠ€νƒ¬ν”„(`int(time.time())`)λ₯Ό λ¦¬ν„΄ν•˜λ„λ‘ μ •μ œν–ˆμŠ΅λ‹ˆλ‹€. - `reconcile.sh` drift-B 감지 μ‹œ epoch 0 및 `1970-01-01` 였기둝 결함을 μ°¨λ‹¨ν•˜μ—¬ `find_workspace_uuid` 재개 κ°€λ“œκ°€ 정상 μž‘λ™ν•˜λ„λ‘ ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€. - λ©€ν‹°μ—μ΄μ „νŠΈ 자율 μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜ 루프(`run_loop.sh --plan --all-reviewer`)λ₯Ό 톡해 Planner(`claude`), Creator(`agy`), Reviewer(`cline`) 3μžμ— μ˜ν•΄ κ΅¬ν˜„ 및 ꡐ차 검증 ν›„ **`[VERDICT: PASS]` (만μž₯일치 톡과)** λ˜μ—ˆμŠ΅λ‹ˆλ‹€. - μ „μš© νšŒκ·€ ν…ŒμŠ€νŠΈ μŠ€μœ„νŠΈ `tests/test_b4_session_created.py` (21/21 PASS)λ₯Ό μž‘μ„±ν•˜μ—¬ μž…μ¦ν–ˆμŠ΅λ‹ˆλ‹€. ### **O-3: 쑰건뢀 μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜ μœ„μž„ κ°€λ“œ (Invocation-Aware Scoped Guard)** β€” βœ… μ™„λ£Œ - Normal Mode(직접 μ†ŒμŠ€ μˆ˜μ •)와 Loop Active Mode(`/multi-agent-mux-loop` 인보크 μ‹œ `run_loop.sh` 자율 μœ„μž„)의 μ—­ν•  경계λ₯Ό λͺ…ν™•νžˆ κ΅¬λΆ„ν•˜λŠ” μŠ€ν‚¬ 인터셉터 κ°€λ“œλ ˆμΌ(`.agents/hooks.json` & `.agents/hooks/loop_delegation_guard.sh`)을 κ΅¬μΆ•ν–ˆμŠ΅λ‹ˆλ‹€. - step-type νŒŒμƒλͺ… 맀처(`file_change|edit_notebook|write_blob`)λ₯Ό μ μš©ν•˜μ—¬ κ°€λ“œ λ¬΄λ°œν™” 결함을 λ°©μ§€ν–ˆμŠ΅λ‹ˆλ‹€. - `pid` + `lstart`(ν”„λ‘œμ„ΈμŠ€ μ‹œμž‘μ‹œκ°) 신원 λŒ€μ‘° 검증을 톡해 PID Rollover 및 `PermissionError` μ‹œ λ°œμƒν•  수 μžˆλŠ” Livelock 영ꡬ 차단 μ˜€νŒμ„ μ™„λ²½νžˆ ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€. - `run_loop.sh` 마컀 기둝 및 `delegate_job_safe` 트랩 볡원(`_mam_release_guard`)을 μ™„λ£Œν–ˆμŠ΅λ‹ˆλ‹€. - `AGENTS.md`, `MULTI_AGENT_RULES.md` (.ko.md), `SKILL.md` λ¬Έμ„œλ₯Ό μ „μˆ˜ λŒ€μΉ­ κ°±μ‹ ν–ˆμŠ΅λ‹ˆλ‹€. - μ „μš© λ‹¨μœ„/νšŒκ·€ ν…ŒμŠ€νŠΈ μŠ€μœ„νŠΈ `tests/test_o3_scoped_guard.py` (22/22 PASS)λ₯Ό μˆ˜λ¦½ν•˜μ—¬ μž…μ¦ν–ˆμŠ΅λ‹ˆλ‹€. ### **A-1: μ›Œν¬μŠ€νŽ˜μ΄μŠ€ μ„Έμ…˜ 격리 & drift-B μ˜€λ“±λ‘ λ°©μ§€** β€” βœ… μ™„λ£Œ - `derive_workspace_slug` 헬퍼 ν•¨μˆ˜λ₯Ό μΆ”κ°€ν•˜μ—¬ μ›Œν¬μŠ€νŽ˜μ΄μŠ€ 경둜 기반 단일 μ†ŒμΌ“ 슬러그(`mam--`) λ„μΆœ 체계λ₯Ό κ΅¬μΆ•ν–ˆμŠ΅λ‹ˆλ‹€. - `reconcile.sh` drift-B μžλ™ 등둝 μ‹œ foreign cwd 차단 게이트λ₯Ό κ΅¬μΆ•ν•˜μ—¬ μ„Έμ…˜ μ˜€λ“±λ‘μ„ λ°©μ§€ν–ˆμŠ΅λ‹ˆλ‹€. ### **A-3: μ‹œν”„νŠΈ 버퍼 λ™μ‹œ μ£Όμž… μ˜€μ—Ό & μžλ™ GC 체계 ꡬ좕** β€” βœ… μ™„λ£Œ - `lib.sh` λ‚΄ `send_keys_safe` μ‹œν”„νŠΈ 버퍼 λͺ…λ Ήμ˜ μž„μ‹œ 파일λͺ…을 `sks_${sess}_${job_id}_$$_${RANDOM}_$(date +%s%N)` 식 호좜 λ‹¨μœ„ 독립 ν† ν°μœΌλ‘œ λ³€ν™˜ν•˜μ—¬ 닀쀑 μ—μ΄μ „νŠΈ λ™μ‹œ μ£Όμž… μ‹œ λŒ€ν™” ꡐ차 μ˜€μ—Ό 및 무음 μœ μ‹€(T5)을 μ›μ²œ μ°¨λ‹¨ν–ˆμŠ΅λ‹ˆλ‹€. - `set-buffer` μ‹œ μ›μžμ  μž„μ‹œ μ“°κΈ°(`.$buf.$$.tmp`) 및 rename(`mv -f`) ꡬ쑰λ₯Ό κ΅¬ν˜„ν•˜μ—¬ νŒŒν‹°μ…œ λ ˆμ½”λ“œ 관츑을 λ°©μ§€ν–ˆμŠ΅λ‹ˆλ‹€. - μΈν„°λŸ½νŠΈ/μ˜ˆμ™Έ μ’…λ£Œ μ‹œ λ‚¨λŠ” stale 버퍼 νŒŒμΌμ„ μžλ™μœΌλ‘œ μ •λ¦¬ν•˜λŠ” 60λΆ„ λ‚΄μž₯ GC(`find -mmin +60 -delete`)λ₯Ό λ‚΄μž₯ν–ˆμŠ΅λ‹ˆλ‹€. - μ „μš© νšŒκ·€ ν…ŒμŠ€νŠΈ μŠ€μœ„νŠΈ `tests/test_a3_buffer_isolation.py` (12/12 PASS)λ₯Ό μž‘μ„±ν•˜μ—¬ μž…μ¦ν–ˆμŠ΅λ‹ˆλ‹€. ### **C-2: λ―Έμ‚¬μš© `.cache/` μƒνƒœ 디렉터리 생성 및 λ°λ“œ μ½”λ“œ μ •λˆ** β€” βœ… μ™„λ£Œ - `reconcile.sh`μ—μ„œ 아무 데이터도 μ €μž₯ν•˜μ§€ μ•Šλ˜ λ―Έμ‚¬μš© `.cache/multi-agent-mux-monitor` 디렉터리 생성(`mkdir -p`) ꡬ문 및 `STATE_DIR` ν™˜κ²½λ³€μˆ˜λ₯Ό μ œκ±°ν–ˆμŠ΅λ‹ˆλ‹€. - λ ˆκ±°μ‹œ ν™˜κ²½λ³€μˆ˜ `AGENT_SESSIONS_STATE_DIR` μ„€μ • μ‹œ 무음 생성을 λ°©μ§€ν•˜κ³  stderr에 κ°€μ΄λ“œ 경고만 μ•ˆλ‚΄ν•˜λ„λ‘ μ •λˆν–ˆμŠ΅λ‹ˆλ‹€. - `deploy/remove.sh` μ–ΈμΈμŠ€ν†¨λŸ¬μ—μ„œ λ―Έμ‚¬μš© `.cache/` 디렉터리가 λΉ„μ–΄μžˆλŠ” 경우 μ•ˆμ „ν•˜κ²Œ 제거(`rmdir .cache`)ν•˜λ„λ‘ κ°œμ„ ν–ˆμŠ΅λ‹ˆλ‹€. - μ „μš© λ‹¨μœ„/νšŒκ·€ ν…ŒμŠ€νŠΈ μŠ€μœ„νŠΈ `tests/test_c2_no_stale_cache_dir.py` (5/5 PASS)λ₯Ό μž‘μ„±ν•˜μ—¬ μž…μ¦ν–ˆμŠ΅λ‹ˆλ‹€. ### **A-5: `HERDR_SESSION_NAME` λ„€μ΄ν‹°λΈŒ μ „ν™˜** β€” βœ… μ™„λ£Œ - κΈ°μ‘΄ `HERDR_SERVER_NAME` ν™˜κ²½λ³€μˆ˜λ₯Ό herdr μ‹œν”„νŠΈκ°€ 직접 μ½λŠ” λ„€μ΄ν‹°λΈŒ **`HERDR_SESSION_NAME`** 및 YAML λ ˆμ§€μŠ€νŠΈλ¦¬ ν‚€ **`herdr_session`**으둜 μ „μˆ˜ μ „ν™˜ λ‹¨μΌν™”ν–ˆμŠ΅λ‹ˆλ‹€. ### **B-1: `find_workspace_uuid` tier-3 신원 μΊμ‹œ 해석 였λ₯˜ ν•΄κ²°** β€” βœ… μ™„λ£Œ - `lib.sh` tier-3 신원 μΊμ‹œ 쑰회 μ‹œ λ―Έμ •μ˜ λ³€μˆ˜(`db_path`, `yaml_path`) 및 `yaml` import λˆ„λ½μœΌλ‘œ 무쑰건 `NameError` μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ˜ 결함을 ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€. - DBλ₯Ό 1μ°¨ κΆŒμœ„ 경둜둜, `$YAML_PATH`λ₯Ό 폴백으둜 μ •μ œν•˜κ³  μ „μš© νšŒκ·€ ν…ŒμŠ€νŠΈ `tests/test_b1_tier3_identity.py` (8/8 PASS)λ₯Ό μž‘μ„±ν•˜μ—¬ μž…μ¦ν–ˆμŠ΅λ‹ˆλ‹€. ### **B-3: `command -v herdr` ν”„λ¦¬ν”ŒλΌμ΄νŠΈ 무λ ₯ν™”** β€” βœ… μ™„λ£Œ - `lib.sh`에 `_canonical_file()`, `_is_shim_path()`, `_resolve_real_herdr_path()`, `has_real_herdr()` 헬퍼λ₯Ό μž‘μ„±ν•˜μ—¬ `herdr()` bash ν•¨μˆ˜ 였판과 `.mam/shim/herdr` 래퍼 λ§€μΉ­(파일 μˆ˜μ€€ 심링크 포함)을 μ™„μ „ μ°¨λ‹¨ν–ˆμŠ΅λ‹ˆλ‹€. - `create_session.sh`, `multi-agent-mux-delegate-job`, `create/SKILL.md`, `status/SKILL.md` ν”„λ¦¬ν”ŒλΌμ΄νŠΈλ₯Ό `has_real_herdr`둜 μ „μˆ˜ κ΅μ²΄ν–ˆμŠ΅λ‹ˆλ‹€. - νšŒκ·€ ν…ŒμŠ€νŠΈ `tests/test_b3_herdr_preflight.py` (11/11 PASS)λ₯Ό μž‘μ„±ν•˜μ—¬ μž…μ¦ν–ˆμŠ΅λ‹ˆλ‹€. ### **C-1: Kanban λ¬Έμ„œ 29회 μ–ΈκΈ‰ vs μ‹€μ œ κ΅¬ν˜„ 0건** β€” βœ… μ™„λ£Œ - SKILL.md 3μ’…(monitor 22 / status 5 / create 2)κ³Ό README 2μ’…μ˜ Kanban μ„œμˆ μ„ μ „λ©΄ μ œκ±°ν–ˆμŠ΅λ‹ˆλ‹€. - `multi-agent-mux-monitor` 의 μ‹€ν–‰ λ©”μ»€λ‹ˆμ¦˜ μ„œμˆ μ„ μ‹€μ œ κ΅¬ν˜„μΈ `reconcile.sh --subscribe` (MQTT push + 브둜컀 λ‹€μš΄ μ‹œ 폴링 폴백) κΈ°μ€€μœΌλ‘œ μž¬μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€. - μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μŠ€ν‚¬ μ°Έμ‘° 2건(`kanban-worker`, `kanban-orchestrator`)을 μ‹€μ‘΄ μŠ€ν‚¬λ‘œ κ΅μ²΄ν–ˆμŠ΅λ‹ˆλ‹€. - `hermes kanban create` CLI ν”Œλž˜κ·Έ μž”μž¬ 10μ’…(`--goal-max-turns`, `--assignee`, `--comment-card` λ“±)을 νŒŒμƒν˜• 검증 게이트(G-C)둜 μ°¨λ‹¨ν–ˆμŠ΅λ‹ˆλ‹€. - μ œν’ˆ ν‘œλ©΄(`.agents/skills/`, `README*.md`) Kanban μ°Έμ‘° **0건** 확인. ### **O-1: νƒ€λ‹Ήν•˜μ§€ μ•Šμ€ 리뷰 ν”Όλ“œλ°± κ±°λΆ€/반둠 ν”„λ‘œν† μ½œ 미지원 (Rebuttal Protocol)** β€” βœ… μ™„λ£Œ - `run_loop.sh`에 `--max-rebut N` (κΈ°λ³Έκ°’ 1) μ˜΅μ…˜ 및 Rebuttal/Re-adjudication/Arbitration 3단계 ν”„λ‘œν† μ½œμ„ κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€. - Creatorκ°€ 지적 ν•­λͺ© κ±°λΆ€ μ‹œ `[REBUT: ]` νƒœκ·Έλ₯Ό 남겨 ν•΄λ‹Ή 리뷰어 λŒ€μƒ μž¬μ‹¬(`[ADJUDICATION: SUSTAINED/OVERRULED]`)을 κ°€λ™ν•˜λ©°, ꡐ착 μ‹œ Planner μž¬μ •(`[ARBITRATION: CREATOR/REVIEWER]`) λ˜λŠ” Fail-Closed 결정을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. - bash 3.2 macOS 규격 빈 λ°°μ—΄ ν™•μž₯ μ•ˆμ „μ„±(`${ARR[@]+"${ARR[@]}"}`) 및 per-iteration budget reset / total budget cap 결함을 μ™„λ²½νžˆ λ³΄μ™„ν•˜κ³  νšŒκ·€ ν…ŒμŠ€νŠΈ `tests/test_o1_rebuttal.py` (10/10 PASS)둜 μž…μ¦ν–ˆμŠ΅λ‹ˆλ‹€. - `MULTI_AGENT_RULES.md`, `.ko.md`, `multi-agent-mux-loop/SKILL.md` λ¬Έμ„œ 연동을 μ™„λ£Œν–ˆμŠ΅λ‹ˆλ‹€. --- ## 6. κ²°λ‘  및 ν–₯ν›„ 보완 λ‘œλ“œλ§΅ `IMPROVEMENTS.md` λ¬Έμ„œμ— 따라 ν–₯ν›„ μ½”λ“œλ² μ΄μŠ€ 개편 μ‹œ 남은 백둜그 ν•­λͺ©(μ•„ν‚€ν…μ²˜ 2건, μ—£μ§€μΌ€μ΄μŠ€ 7건, μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜ 2건, λ ˆκ±°μ‹œ μž”μž¬ 4건)을 μΌμ›ν™”λœ 보완 λ‘œλ“œλ§΅μœΌλ‘œ κ΄€λ¦¬ν•©λ‹ˆλ‹€.