diff --git a/CODEBASE_REVIEW_REPORT.md b/CODEBASE_REVIEW_REPORT.md new file mode 100644 index 0000000..a02c8f9 --- /dev/null +++ b/CODEBASE_REVIEW_REPORT.md @@ -0,0 +1,84 @@ +# πŸ“Š Multi-Agent Mux μ½”λ“œλ² μ΄μŠ€ λ―Έν•΄κ²° 결함 λ³΄κ³ μ„œ + +- **μž‘μ„±μΌ**: 2026-08-05 (μ΅œμ’… κ°±μ‹ : μˆ˜μ • μ™„λ£Œ ν•­λͺ© μ‚­μ œ 반영) +- **검증 방식**: `multi-agent-mux-loop --all-reviewer` μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜ 및 Planner(`claude`), Creator(`agy`), Reviewer(`cline`) 만μž₯일치 ꡐ차 리뷰 +- **λŒ€μƒ**: `.agents/skills/**` 전체 (HERDR_SERVER_NAME 바인딩 및 tmux μ‹œν”„νŠΈ 계측 μ œμ™Έ λ²”μœ„) +- **남은 λ―Έν•΄κ²° 결함 건수**: **16건** (μ•„ν‚€ν…μ²˜ 3건, μ—£μ§€μΌ€μ΄μŠ€ 8건, λ ˆκ±°μ‹œ μž”μž¬ 5건) + +> [!NOTE] +> λ³Έ λ³΄κ³ μ„œμ—μ„œ **A-4 (stop μ‹œ completed μ˜€λ°œν–‰ βž” cancelled ꡐ정)**, **B-2 (resolve_herdr_server 뢈일치 ꡐ정)**, **C-5 (TMUX_SERVER_NAME λ…ΈλΈŒ μ‚­μ œ)** λ“± 졜근 μˆ˜μ • μ™„λ£Œλœ ν•­λͺ©λ“€μ€ μ œμ™Έ/μ‚­μ œ μ²˜λ¦¬λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + +--- + +## 1. κ°œμš” 및 검증 μˆ˜λ‹¨ + +λ³Έ λ³΄κ³ μ„œλŠ” `HERDR_SERVER_NAME` ν™˜κ²½λ³€μˆ˜ 바인딩 λˆ„λ½ 및 `tmux` ν˜Έν™˜ 래퍼 shim μ˜μ‘΄μ„±μ„ λ„˜μ–΄, `multi-agent-mux` μ½”λ“œλ² μ΄μŠ€ μ „λ°˜μ˜ **μ•„ν‚€ν…μ²˜ ꡬ쑰적 μ•ˆμ •μ„±, MQTT λ°±ν”Œλ ˆμΈ λ³΄μ•ˆ, λŸ°νƒ€μž„ μ—£μ§€μΌ€μ΄μŠ€ 및 λ ˆκ±°μ‹œ μž”μž¬** 쀑 아직 μˆ˜μ •λ˜μ§€ μ•Šκ³  λ‚¨μ•„μžˆλŠ” λ¬Έμ œμ λ“€μ„ μ •λ¦¬ν•œ μž”μ—¬ 결함 λͺ©λ‘μž…λ‹ˆλ‹€. + +--- + +## 2. πŸ”΄ μ•„ν‚€ν…μ²˜ 결함 (Architecture Flaws β€” 3건) + +### **A-1 (herdr μ„œλ²„λͺ… μ „μ—­ κ³ μ • 및 타 μ›Œν¬μŠ€νŽ˜μ΄μŠ€ μ„Έμ…˜ μ˜€λ“±λ‘)** +- **ν˜„μƒ**: `HERDR_SERVER_NAME`이 μ›Œν¬μŠ€νŽ˜μ΄μŠ€λ³„ νŒŒμƒκ°’μ΄ μ•„λ‹Œ `multi-agent-mux`λΌλŠ” λ¨Έμ‹  μ „μ—­ μƒμˆ˜λ‘œ ν•˜λ“œμ½”λ”©λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. +- **νŒŒκΈ‰ 효과**: ν•œ λ¨Έμ‹ μ—μ„œ λ‹€μˆ˜μ˜ MAM μ›Œν¬μŠ€νŽ˜μ΄μŠ€ μ‚¬μš© μ‹œ, λ°±κ·ΈλΌμš΄λ“œ λͺ¨λ‹ˆν„°(`reconcile.sh` drift-B)κ°€ λ‹€λ₯Έ μ›Œν¬μŠ€νŽ˜μ΄μŠ€μ˜ μ„Έμ…˜μ„ λ‚΄ `.mam/agent-sessions.yaml` λ ˆμ§€μŠ€νŠΈλ¦¬μ— 무단 λ“±λ‘ν•˜μ—¬ μ„Έμ…˜ μ˜€μ—Όμ„ λ°œμƒμ‹œν‚΅λ‹ˆλ‹€. + +### **A-2 (곡개 브둜컀 + HMAC 인증 Off + μ™€μΌλ“œμΉ΄λ“œ μ „νŒŒ)** +- **ν˜„μƒ**: `mqtt_common.py`의 κΈ°λ³Έ λΈŒλ‘œμ»€κ°€ 곡개 μ„œλ²„(`broker.hivemq.com`), HMAC 무쑰건 True λ°˜ν™˜μœΌλ‘œ μ„€μ •λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. +- **νŒŒκΈ‰ 효과**: μ™ΈλΆ€μ—μ„œ μœ μž…λ˜λŠ” malicious `error` 이벀트 μˆ˜μ‹  μ‹œ `reconcile.sh`κ°€ 라이브 μ—μ΄μ „νŠΈ pane을 `kill-session`으둜 κ°•μ œ νŒŒκ΄΄ν•˜λŠ” 치λͺ…적 λ³΄μ•ˆ/μ•ˆμ •μ„± μœ„ν—˜μ΄ μ‘΄μž¬ν•©λ‹ˆλ‹€. + +### **A-3 (μ‹œν”„νŠΈ 버퍼 단일 파일 곡유 및 λ™μ‹œ μ£Όμž… μ˜€μ—Ό)** +- **ν˜„μƒ**: `send_keys_safe` μ‹œν”„νŠΈμ˜ `set/paste/delete-buffer`κ°€ `-b` μ„Έμ…˜ 버퍼 이름을 λ¬΄μ‹œν•˜κ³  단일 `.mam/shim/tmp_buffer` 파일 ν•˜λ‚˜λ§Œμ„ κ³΅μœ ν•©λ‹ˆλ‹€. +- **νŒŒκΈ‰ 효과**: 닀쀑 μ—μ΄μ „νŠΈ λ™μ‹œ μ£Όμž… μ‹œ λŒ€ν™” ν…μŠ€νŠΈ ꡐ차 μ˜€μ—Ό 및 무음 μœ μ‹€(t5 silent loss)이 λ°œμƒν•©λ‹ˆλ‹€. + +--- + +## 3. 🟠 μ—£μ§€ μΌ€μ΄μŠ€ 및 λŸ°νƒ€μž„ 버그 (Edge-case Bugs β€” 8건) + +### **B-1 (`find_workspace_uuid` tier-3 `NameError`둜 영ꡬ 사망)** +- `lib.sh` λ‚΄ agy λŒ€ν™” λ³΅μ›μš© tier-3 κ²½λ‘œκ°€ λ―Έμ •μ˜ λ³€μˆ˜(`db_path`, `yaml_path`) 및 `yaml` import λˆ„λ½μœΌλ‘œ 항상 `NameError` μ˜ˆμ™Έλ₯Ό λ‚΄κ³  μ‚ΌμΌœμ Έ agy λŒ€ν™” 볡원이 κ±°λΆ€λ©λ‹ˆλ‹€. + +### **B-3 (`command -v herdr` ν”„λ¦¬ν”ŒλΌμ΄νŠΈ 무λ ₯ν™”)** +- `create_session.sh`의 ν”„λ¦¬ν”ŒλΌμ΄νŠΈ 검사 μ‹œ `command -v herdr`κ°€ `lib.sh`에 μ •μ˜λœ bash ν•¨μˆ˜(`herdr()`)λ₯Ό 호λͺ…ν•˜μ—¬ μ‹€μ œ μ‹œμŠ€ν…œ `herdr` λ°”μ΄λ„ˆλ¦¬κ°€ 없어도 ν”„λ¦¬ν”ŒλΌμ΄νŠΈλ₯Ό 무쑰건 ν†΅κ³Όν•΄λ²„λ¦½λ‹ˆλ‹€. + +### **B-4 (μ‹œν”„νŠΈ `ls`의 `created=0` ν•˜λ“œμ½”λ”©μœΌλ‘œ 재개 κ°€λ“œ 무λ ₯ν™”)** +- `herdr ls` μ„œλΈŒμ»€λ§¨λ“œ λž˜νΌκ°€ μ„Έμ…˜ μƒμ„±μ‹œκ°μ„ μƒμˆ˜ `0`으둜 λ¦¬ν„΄ν•˜μ—¬ `reconcile.sh` drift-B 등둝 μ‹œ epoch 0이 λ˜μ–΄ 였래된 λŒ€ν™” jsonl 배제 κ°€λ“œκ°€ λΆ•κ΄΄λ©λ‹ˆλ‹€. + +### **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회 κ³ μ •λ©λ‹ˆλ‹€. + +--- + +## 4. 🟑 λ ˆκ±°μ‹œ μž”μž¬ 및 죽은 μ½”λ“œ (Legacy Remnants β€” 5건) + +### **C-1 (Kanban λ¬Έμ„œ 29회 μ–ΈκΈ‰ vs μ‹€μ œ κ΅¬ν˜„ 0건)** +- SKILL.md νŒŒμΌλ“€μ— Kanban 지원 및 μƒνƒœ 파일 μ„œμˆ μ΄ 29회 μ–ΈκΈ‰λ˜μ–΄ μžˆμœΌλ‚˜ 슀크립트 κ΅¬ν˜„μ€ 0κ±΄μž…λ‹ˆλ‹€. + +### **C-2 (λ―Έμ‚¬μš© `.cache/` μƒνƒœ 디렉터리 생성)** +- `reconcile.sh`κ°€ `.cache/multi-agent-mux-monitor` 디렉터리λ₯Ό `mkdir`만 ν•˜κ³  아무것도 μ½κ±°λ‚˜ μ“°μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. + +### **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. κ²°λ‘  및 ν–₯ν›„ 보완 λ°©ν–₯ + +ν–₯ν›„ μ½”λ“œλ² μ΄μŠ€ 개편 μ‹œ λ³Έ λ¬Έμ„œμ— μ„œμˆ λœ μž”μ—¬ 16κ°€μ§€ 결함 ν•­λͺ©μ„ 순차적으둜 μ‘°μΉ˜ν•˜μ—¬ Multi-Agent Mux ν”„λ ˆμž„μ›Œν¬μ˜ μ™„μ „ν•œ μ•ˆμ •μ„±κ³Ό 격리성을 보μž₯ν•΄μ•Ό ν•©λ‹ˆλ‹€.