docs(messaging): add NATS vs MQTT feasibility report, private broker guide, and update IMPROVEMENTS backlog

- Synthesize collaborative multi-agent architectural analysis in NATS_REPORT.md
- Establish Option C: retain MQTT client protocol while adopting nats-server as dedicated broker
- Add private server deployment and configuration guide in PRIVATE_SERVER.md
- Update IMPROVEMENTS.md with latent defect findings (B-14, B-15, B-16, O-5) and 4-track priority roadmap
- Archive durable loop planning and review reports in .agents/reports/
This commit is contained in:
2026-08-20 10:58:02 +09:00
parent ac82f9b993
commit a9934ad104
5 changed files with 928 additions and 37 deletions
+76 -37
View File
@@ -1,8 +1,8 @@
# 🛠️ Multi-Agent Mux 종합 개선 및 미해결 과제 백로그 (`IMPROVEMENTS.md`)
- **최종 갱신일**: 2026-08-17 (B-9 감사 로그 루트 지연 평가 완료, B-13/Stage 2 완료, B-10 완료, B-5 종결, C-6 완료, 전체 276/276 회귀 통과 반영)
- **통합 관리 대상**: 기존 `CODEBASE_REVIEW_REPORT.md` + `OPTIMIZATION.md`
- **총 추적 미해결 과제**: **1** (아키텍처 1건, 엣지케이스 0건, 오케스트레이션 0건, 레거시 잔재 0건)
- **최종 갱신일**: 2026-08-20 (`NATS_REPORT.md` 실측 분석 및 메시징 잠복 결함 B-14/B-15/B-16/O-5 발굴 반영, 276/276 통과 유지)
- **통합 관리 대상**: 기존 `CODEBASE_REVIEW_REPORT.md` + `OPTIMIZATION.md` + `NATS_REPORT.md`
- **총 추적 미해결 과제**: **5** (아키텍처 1건: `A-2`, 엣지케이스 및 가용성 3건: `B-14`, `B-15`, `B-16`, 오케스트레이션 1건: `O-5`)
- **완료된 과제**: **24건** (A-1, A-3, A-4, A-5, B-1, B-3, B-4, B-5, B-7, B-8, B-9, B-10, B-13, C-1, C-2, C-3b, C-6, O-1, O-2, O-3, O-4-OrcOnboard, Herdr-0.8.0-Compat-SanitizeHash, P2-1-DelegateJobSafe-TrapFix, P2-2-C3a-C4-LegacyCleanup)
---
@@ -15,9 +15,13 @@
## 1. 🔴 아키텍처 결함 (Architecture Flaws — 1건)
### **A-2: 공개 브로커 + HMAC 인증 Off + 와일드카드 전파**
- **현상**: `mqtt_common.py`의 기본 브로커가 공개 서버(`broker.hivemq.com`)이고, 잡 생성 시 `auth_token` **한 번도 발급되지 않아**(실측 26/26 잡이 `auth_token=None`) `verify_hmac` `if not auth_token: return True` 경로가 항상 타집니다. 발행자는 워크스페이스 지문 토픽을 채택하지 않고 전역 `python/mqtt/jobs/<job_id>/events` 로 발행하며, `reconcile.sh:237` 이 같은 전역 토픽을 구독합니다. (HMAC 구현 자체는 정상입니다 — 토큰이 없어 검증이 공허해지는 것이 원인입니다.)
### **A-2 (P5-1): 공개 브로커 + HMAC 인증 Off + 와일드카드 전파 (해결책: `nats-server` 전용 브로커 채택)**
- **현상**: `mqtt_common.py`의 기본 브로커가 공개 서버(`broker.hivemq.com`)이고, 잡 생성 시 `auth_token`발급되지 않는 조건 분기(평문/공개 브로커)로 인해 `verify_hmac``if not auth_token: return True` 경로가 타집니다. 발행자는 워크스페이스 지문 토픽을 채택하지 않고 전역 `python/mqtt/jobs/<job_id>/events`로 발행하며, `reconcile.sh:237`이 같은 전역 토픽을 구독합니다.
- **파급 효과**: 외부에서 유입되는 malicious `error` 이벤트 수신 시 `reconcile.sh`가 라이브 에이전트 pane을 `kill-session`으로 강제 파괴하는 치명적 보안/안정성 위험이 존재합니다.
- **최신 실측 및 해결 방침 (`NATS_REPORT.md` 확정)**:
- 클라이언트 프로토콜(`paho-mqtt`)을 비동기 `nats-py`로 전면 재작성하는 방안(Option B)은 46개 테스트 파괴 및 단명 동기 CLI 마찰 위험으로 **만장일치 기각**되었습니다.
- 대신 **`nats-server`의 내장 MQTT 3.1.1 리스너를 전용 사설 브로커로 채택(Option C)**하여 클라이언트 코드 0줄 변경으로 NKey/JWT 계정·Subject별 ACL 격리 및 JetStream 영속성을 100% 확보하기로 확정했습니다.
- 단, 브로커 제품과 무관하게 존재하는 **가용성 선행 결함(Track 0: B-14, B-15)**을 먼저 교정한 후 Track 1(스파이크) 및 Track 2(A-2 워크스페이스 지문 토픽 + 무조건 토큰 발급)를 순차 전개합니다.
### **A-4 (✅ 완료 — P3-1): 에이전트 지식 산재 — `BaseAgentAdapter` 어댑터 계층 도입 (Rev.2)**
@@ -67,11 +71,37 @@
---
## 2. 🟠 엣지 케이스 및 런타임 버그 (Edge-case Bugs — 0건 — 전원 완료)
## 2. 🟠 엣지 케이스 및 런타임 버그 (Edge-case Bugs — 3건)
### **B-14 (F-1 / P1): `publish_event.py` 브로커 장애 시 `return 2` 조기 탈출로 인한 65분 루프 정지**
- **현상**: `publish_event.py:195-199`에서 브로커 네트워크 장애 발생 시 `return 2`로 조기 종료되어, 뒤따르는 로컬 레지스트리 상태(`update_job_status(status=completed)`) 및 감사 로그(`append_event`, `registry.append_event`) 갱신이 누락됩니다 (`NATS_REPORT.md` §3.1 실측 재현).
- **파급 효과**: `run_loop.sh``wait_for_job()`은 로컬 디스크 파일의 상태가 `status=running`으로 멈춰있어 `max_wait=3900s`를 소진할 때까지 **65분간 루프가 완전 정지(Hang)**합니다.
- **조치 방향 (Track 0 Step 1)**: 네트워크 발행 실패 시에도 `append_event``update_job_status`를 온전히 완수한 후 `published=False`를 기록하고 `return 2`를 반환하도록 실행 순서를 재배치합니다 (G-1 ~ G-4 회귀 가드 신설).
### **B-15 (C1 & F-4 / P1): `job_subscriber.py` 디스크 폴백 부재 및 위임 경로 인프라 에러 오판정**
- **현상**:
1. `job_subscriber.py:172-251``queue.Empty` 시 네트워크 큐만 대기하며 로컬 디스크 상태를 확인하지 않아, 브로커 다운 시 120초 `idle_timeout` 동안 불필요하게 블로킹됩니다 (`NATS_REPORT.md` §4.1 C1 챌린지 검증).
2. `multi-agent-mux-delegate-job:331-341`에서 `wait "$sub_pid"``sub_rc`를 직접 `job_status`로 매핑(`rc=1` -> `job_status="error"`)하여, 브로커 연결 실패로 인한 미포착 예외(`rc=1`) 발생 시 작업자의 정상 산출물이 존재하더라도 작업을 강제로 `"error"`로 오판정합니다 (`NATS_REPORT.md` §3.4 F-4).
- **파급 효과**: 브로커 장애 시 작업자가 작업을 정상 완수했음에도 루프가 2분 이상 지연되거나 거짓 실패(False Failure)가 발생합니다.
- **조치 방향 (Track 0 Step 2 & 3)**:
1. `job_subscriber.py` 대기 루프에 로컬 디스크(`load_job`/`read_logged_status`) 상태 폴백을 도입하여 디스크 완료 감지 시 `source: disk-fallback` 합성 이벤트를 출력하고 3초 내 `rc=0`으로 조기 정상 종료합니다.
2. 브로커 인프라 연결 실패에 전용 `rc=3`을 부여하고 `job_status="broker_unavailable"` 분기로 분리하여 작업 결과와 인프라 에러를 엄격히 격리합니다 (G-5 ~ G-10 회귀 가드 신설).
### **B-16 (F-5 / P3): `make_client()` 매 실행 랜덤 `client_id` 발급으로 인한 영속 세션(Durable Session) 구성 불가**
- **현상**: `mqtt_common.py:258`에서 `client_id`를 매번 `uuid.uuid4().hex[:8]`로 생성하여, 브로커가 클라이언트 재연결을 식별할 수 없습니다 (`NATS_REPORT.md` §3.5 F-5).
- **파급 효과**: 네트워크 재연결 시 미수신 이벤트 유실 가능성이 발생합니다.
- **조치 방향**: B-15의 로컬 디스크 폴백을 표준 복원 경로로 확립하여 네트워크 세션 의존도를 제거하고, 필요 시 결정론적 식별자 규칙을 적용합니다.
---
## 3. 🟡 오케스트레이션 최적화 과제 (Orchestration Optimizations — 0건 — 전원 완료)
## 3. 🟡 오케스트레이션 최적화 과제 (Orchestration Optimizations — 1건)
### **O-5 (P2): NATS/MQTT 메시징 백플레인 고도화 및 `nats-server` 스파이크 검증 (Track 1 ~ Track 2)**
- **현상**: `NATS_REPORT.md` 아키텍처 실측 분석에 따라, `nats-py` 클라이언트 재작성(Option B)을 배제하고 `nats-server` 내장 MQTT 3.1.1 어댑터를 사설 전용 브로커로 채택하는 전략(Option C)이 확정되었습니다.
- **조치 방향**:
1. **Track 1 (스파이크 검증)**: 격리 환경에서 `nats-server -js`의 MQTT 3.1.1 호환성(Retained 터미널 이벤트 전달 S-3, QoS 1 ACK S-4, Subject 라우팅 S-5 등 9종 매트릭스 S-1 ~ S-9) 실측 검증.
2. **Track 2 (보안/격리)**: 워크스페이스 지문 기반 토픽(`mam/<sha256[:12]>/jobs/...`) 및 무조건 `auth_token` 발급(G-11)을 적용하여 A-2 보안 결함 완전 종결.
3. **Track 3 (문서/설정)**: `MESSAGING.md`, `VERSIONS.md`, `.mam.env``nats-server` 서빙 가이드 및 설정 동기화.
---
@@ -236,61 +266,70 @@
**조용한 실패에 가중치를 둡니다.** 시끄러운 실패는 사람이 보지만, 조용한 실패는 "통과"로 기록되고 그 위에 다음 작업이 쌓입니다.
### 6.2 실행 순서
### 6.2 실행 순서 (4-Track Priority Alignment)
> **사용자 지침 반영**: **A-2 (공개 브로커 & HMAC)** 과제는 차후 자체 전용 MQTT 브로커 서버를 구축할 예정이므로 사용자 지침에 따라 **우선순위를 최하위(P5)로 조정**하였습니다.
> **우선순위 원칙 및 NATS 분석 합의 반영 (`NATS_REPORT.md`)**:
> 1. **Track 0 (최우선 P1 — 가용성 및 내결함성 교정)**: 브로커 장애 시 65분 루프 정지(`B-14`) 및 120초 지연/오판정(`B-15`)을 방지하는 **로컬 디스크 내결함성 확보 (G-1 ~ G-10 회귀 가드 신설, 브로커 제품 무관 선행 필수)**.
> 2. **Track 1 (차순위 P2 — 브로커 스파이크 검증)**: 격리 환경에서 `nats-server -js`의 MQTT 3.1.1 호환성(Retained 터미널 이벤트 S-3, QoS 1 ACK S-4 등 9종 매트릭스 S-1 ~ S-9) 실측 스파이크 검증 (`O-5`).
> 3. **Track 2 (보안/격리 완결 P3)**: 워크스페이스 지문 기반 토픽(`mam/<sha256[:12]>/jobs/...`) 및 무조건 `auth_token` 발급(G-11)으로 `A-2` 보안 결함 완전 종결 및 `B-16` 완결.
> 4. **Track 3 (문서/설정 동기화 P4)**: `MESSAGING.md`, `VERSIONS.md`, `.mam.env` 템플릿 동기화.
| 순위 | 항목 | 근거 | 비용 | 선행 |
|---|---|---|---|---|
| **P1-1** | **B-14 (F-1)** | 브로커 다운 시 `publish_event.py` 조기 탈출로 인한 **65분 루프 정지(Hang)** 원천 차단 (`append_event`/`update_job_status` 선행 보장, G-1 ~ G-4 회귀 가드) | 소 (1파일) | — |
| **P1-2** | **B-15 (C1/F-4)** | 브로커 다운 시 `job_subscriber.py` **120초 지연 제거** 및 정상 완료 작업의 **`job_status="error"` 오판정 차단** (디스크 폴백 및 `rc=3` 분리, G-5 ~ G-10 회귀 가드) | 소~중 (2파일) | B-14 |
| **P2-1** | **O-5 (Track 1)** | `nats-server -js` MQTT 3.1.1 호환성 스파이크(S-1 ~ S-9 매트릭스 실측, S-3 Retained 터미널 이벤트 관문) 및 환경변수 템플릿 연동 | 소 (격리 스파이크) | B-15 |
| **P3-1** | **A-2 (Track 2)** | 워크스페이스 지문 토픽(`mam/<fp>/jobs/...`) 및 무조건 `auth_token` 발급(G-11)으로 A-2 보안 결함 완전 종결 | 중 (3파일) | O-5 (S-3 통과) |
| **P3-2** | **B-16 (F-5)** | 매 실행 랜덤 `client_id` 발급으로 인한 영속 세션 불가 이슈를 B-15 디스크 폴백 표준화로 완결 | 극소 | B-15 |
| **P0-1** | **B-7** | 저장소 밖 기동 시 리뷰어가 문자열 `"No git diff available"``[VERDICT: PASS]` 를 냄. 신규(미추적) 파일은 리뷰 대상 밖. **(✅ 완료 — tests/test_b7_diff_untracked.py 20/20 PASS)** | 소 (1파일) | — |
| **P0-2** | **O-2** | 마커를 조건 없이 덮어쓰고 종료 트랩이 **타 인스턴스의 마커까지 삭제** → 완료 처리된 **O-3 가드가 조용히 무력화**됨 **(✅ 완료 — tests/test_o2_race_free_lock.py 22/22 PASS)** | 소~중 (1파일) | — |
| **P1-1** | **A-4 M0~M1** | `PYTHONPATH` 부트스트랩·배포/CI 등록·`own_key` 이관. B-8/B-10/C-3b 로직을 싸게 만듦 **(✅ 완료 — tests/test_a4_adapter_contract.py 3/3 PASS)** | 중 | B-7 |
| **P1-2** | **B-8** | agy 주입 시 `return 0` 우회 제거 및 제출 검증 루프 이관 **(✅ 완료 — tests/test_b8_send_keys_verification.py 1/1 PASS)** | 소 | A-4 M0 |
| **P2-1** | **B-6 / B-12** | 스킬 트리 내 임시 사본 및 서브셸 EXIT 트랩으로 인한 루프 락 조기 해제 차단 **(✅ 완료 — tests/test_o3_scoped_guard.py 27/27 PASS, commit b490713)** | 소 | — |
| **P2-2** | **C-3a + C-4** | 빈 스텁 4종 + 공허한 테스트 4건 + 죽은 심볼 3종 제거 및 `--isolate` no-op 회귀 가드 신설 **(✅ 완료 — tests/test_tier1_unit.py + test_tier2_component.py 256/256 PASS)** | 소 | — |
| **P2-3** | **C-6** | `stop_session.sh` 헤더/도움말/주석/MESSAGING.md 정리 및 회귀 가드 신설 **(✅ 완료 — tests/test_tier2_component.py 가드 신설, 전체 263/263 PASS)** | 극소 | — |
| **P3-1** | **A-4 M2~M7** | 어댑터 본이관 및 CLI facts 브리지/서브커맨드 구축 **(✅ 완료 — tests/test_a4_adapter_contract.py 9/9 PASS, 전체 259/259 PASS)** | 대 | P1-1 |
| **P3-2** | **B-10** | tier-3 신원 캐시 완전 제거 및 UUID 경로 PyYAML 탈의존 (Option A) **(✅ 완료 — tests/test_tier1_unit.py 가드 3건 신설, 전체 266/266 PASS)** | 중 | A-4 M2 |
| **P3-3** | **C-3b** | `isolation.root` 4개 소비자 완전 폐기 (Option B 채택) **(✅ 완료 — 전체 259/259 PASS)** | 소 | A-4 M2 |
| **P1-1(과거)** | **A-4 M0~M1** | `PYTHONPATH` 부트스트랩·배포/CI 등록·`own_key` 이관. B-8/B-10/C-3b 로직을 싸게 만듦 **(✅ 완료 — tests/test_a4_adapter_contract.py 3/3 PASS)** | 중 | B-7 |
| **P1-2(과거)** | **B-8** | agy 주입 시 `return 0` 우회 제거 및 제출 검증 루프 이관 **(✅ 완료 — tests/test_b8_send_keys_verification.py 1/1 PASS)** | 소 | A-4 M0 |
| **P2-1(과거)** | **B-6 / B-12** | 스킬 트리 내 임시 사본 및 서브셸 EXIT 트랩으로 인한 루프 락 조기 해제 차단 **(✅ 완료 — tests/test_o3_scoped_guard.py 27/27 PASS, commit b490713)** | 소 | — |
| **P2-2(과거)** | **C-3a + C-4** | 빈 스텁 4종 + 공허한 테스트 4건 + 죽은 심볼 3종 제거 및 `--isolate` no-op 회귀 가드 신설 **(✅ 완료 — tests/test_tier1_unit.py + test_tier2_component.py 256/256 PASS)** | 소 | — |
| **P2-3(과거)** | **C-6** | `stop_session.sh` 헤더/도움말/주석/MESSAGING.md 정리 및 회귀 가드 신설 **(✅ 완료 — tests/test_tier2_component.py 가드 신설, 전체 263/263 PASS)** | 극소 | — |
| **P3-1(과거)** | **A-4 M2~M7** | 어댑터 본이관 및 CLI facts 브리지/서브커맨드 구축 **(✅ 완료 — tests/test_a4_adapter_contract.py 9/9 PASS, 전체 259/259 PASS)** | 대 | P1-1 |
| **P3-2(과거)** | **B-10** | tier-3 신원 캐시 완전 제거 및 UUID 경로 PyYAML 탈의존 (Option A) **(✅ 완료 — tests/test_tier1_unit.py 가드 3건 신설, 전체 266/266 PASS)** | 중 | A-4 M2 |
| **P3-3(과거)** | **C-3b** | `isolation.root` 4개 소비자 완전 폐기 (Option B 채택) **(✅ 완료 — 전체 259/259 PASS)** | 소 | A-4 M2 |
| **B-13** | **Stage 2** | 셀프 호스팅 루프 런타임 프리즈 스냅샷 및 이중 루트 격리 **(✅ 완료 — tests/test_o3_scoped_guard.py 5건 가드 신설, 전체 271/271 PASS)** | 중 | — |
| **P4-1** | **B-9** | 감사 로그 루트 지연 평가 및 `__getattr__`/`__dir__` 동적 별칭 **(✅ 완료 — tests/test_tier1_unit.py 5건 가드 신설, 전체 276/276 PASS)** | 극소 | — |
| **P5-1** | **A-2** | 공개 브로커 및 HMAC 검증 보완 (📌 *사용자 지침: 차후 전용 MQTT 브로커 서빙 환경 구축 시점에 진행*) | 중 (3파일) | 전용 브로커 |
| **P4-1(과거)** | **B-9** | 감사 로그 루트 지연 평가 및 `__getattr__`/`__dir__` 동적 별칭 **(✅ 완료 — tests/test_tier1_unit.py 5건 가드 신설, 전체 276/276 PASS)** | 극소 | — |
| **종결** | **B-5** | `df -P` 폴백 정상 동작 실측 및 단위 테스트 검증 완료 **(✅ 완료/종결 — tests/test_tier1_unit.py test_stop_check_is_nfs_local)** | — | — |
**A-2 과제의 후순위 배치 사유**: 사용자 지침에 따라 차후 자체 전용 MQTT 브로커 서빙 환경 구축 시점에 맞춰 진행하기 위해 **최하위(P5-1)**로 배치하였습니다.
**정리(C 계열)를 과거 P2 에 두었던 이유**: (a) C-3a 는 죽은 코드를 고정하던 테스트를 함께 제거해 C-3a 를 실행 가능하게 만들고, (b) C-4 는 **잘못 실행하면 버그를 만듭니다**. 방치할수록 누군가 "쉬운 정리"로 집어 들 확률이 올라갑니다.
**정리(C 계열)를 P2 에 두는 이유**: (a) C-3a 는 죽은 코드를 고정하던 테스트를 함께 제거해 C-3a 를 실행 가능하게 만들고, (b) C-4 는 **잘못 실행하면 버그를 만듭니다**. 방치할수록 누군가 "쉬운 정리"로 집어 들 확률이 올라갑니다.
### 6.3 병렬 실행 — 파일 소유권 슬롯 (Rev.3 갱신)
### 6.3 병렬 실행 — 파일 소유권 슬롯 (Rev.2 교체)
> Rev.1 은 "주제별 트랙"으로 병렬화를 서술했고 **그 분해는 4곳에서 틀렸습니다**(챌린지 `7d604ee7` 계기로 파일 단위 재대조). 병렬 단위는 **주제가 아니라 파일**입니다.
> 병렬 단위는 **주제가 아니라 파일**입니다.
**항목별 처방이 건드리는 파일**
| 파일 | 건드리는 항목 |
|---|---|
| `publish_event.py` | **B-14** |
| `job_subscriber.py` | **B-15** |
| `multi-agent-mux-delegate-job` | **B-15** |
| `mqtt_common.py` | **A-2, B-9, B-16** |
| `registry.py` | **A-2, B-14, C-4** |
| `reconcile.sh` | **A-2, A-4, B-10** |
| `.mam.env` / `MESSAGING.md` | **O-5, A-2** |
| `run_loop.sh` | **B-6, B-7, O-2** |
| `lib.sh` | **A-4, B-8, B-10, C-3a, C-4** |
| `reconcile.sh` | **A-2, A-4, B-10** |
| `mqtt_common.py` | **A-2, B-9** |
| `stop_session.sh` | **B-10, C-6** |
| `registry.py` | **A-2, C-4** |
| `create_session.sh` | **A-4, C-4** |
**슬롯 배치 — 슬롯 안은 직렬, 슬롯 간은 병렬**
| 슬롯 | 순서 |
|---|---|
| **`run_loop.sh`** | `B-7``O-2``B-6` |
| **`lib.sh`** | `C-3a`+`C-4``B-8` |
| **MQTT 계열** (`mqtt_common.py`·`registry.py`·`publish_event.py`·`job_subscriber.py`·`reconcile.sh`) | `A-2``B-9` |
| **`stop_session.sh`** | `C-6` |
| **단독 실행** (슬롯 경계를 넘음) | `A-4`, `B-10` |
| **Track 0 발행자/구독자 슬롯** (`publish_event.py`·`job_subscriber.py`·`delegate-job`) | `B-14``B-15` |
| **Track 1 브로커 스파이크 슬롯** (격리 환경 `$SCRATCH/nats-spike`) | `O-5` (S-1 ~ S-9) |
| **Track 2 보안/레지스트리 슬롯** (`mqtt_common.py`·`registry.py`·`reconcile.sh`) | `A-2``B-16` |
| **`run_loop.sh` 슬롯** | `B-7``O-2``B-6` (완료) |
| **`lib.sh` 슬롯** | `C-3a`+`C-4` `B-8` (완료) |
| **`stop_session.sh` 슬롯** | `C-6` (완료) |
| **단독 실행** (슬롯 경계를 넘음) | `A-4`, `B-10` (완료) |
- `A-4`(`lib.sh`+`reconcile.sh`+`create_session.sh`+`resume_session.sh`)와 `B-10`(`lib.sh`+`reconcile.sh`+`stop_session.sh`)은 **어떤 슬롯 조합과도 겹치므로 단독 실행**합니다.
- `A-4` 는 신규 파일을 대량 추가하므로 **B-7 이 먼저 닫혀 있어야 리뷰가 성립**합니다.
- **Rev.1 오류 정정 4건**: `B-6`(트랙 C→`run_loop.sh` 슬롯), `C-3a`·`C-4`(트랙 C→`lib.sh` 슬롯), `B-9`(독립→MQTT 슬롯), `C-6`(독립→`stop_session.sh` 슬롯).
- 참고: `reconcile.sh``MAM_LOOP_MARKER`·`send_keys_safe` 를 **참조 0건**이므로 `O-2`·`B-8` 과는 경합하지 않습니다(자체 `.mam/monitor.lock` 보유).
---
### 6.4 B-7 처방 (Rev.2 신설 — 진단만 있고 처방이 없었음)
@@ -327,4 +366,4 @@ CHANGES_DIFF=$(
### 6.6 결론
`IMPROVEMENTS.md` 는 남은 백로그 항목(아키텍처 2건, 엣지케이스 6건, 오케스트레이션 1건, 레거시 잔재 3건 — 총 12건)을 위 우선순위에 따라 일원화된 보완 로드맵으로 관리합니다.
`IMPROVEMENTS.md` 는 남은 백로그 항목(아키텍처 1건: `A-2`, 엣지케이스 및 가용성 3건: `B-14`·`B-15`·`B-16`, 오케스트레이션 1건: `O-5` — 총 5건)을 위 우선순위(Track 0 → Track 1 → Track 2)에 따라 일원화된 보완 로드맵으로 관리합니다.