# Agent 미팅: 봇→아누→회장 자동화 파이프라인 안전 설계 + 봇 scope violation 방지

**날짜**: 2026-05-02
**소집 이유**:
1. task-2360 (이참나, 봇→아누 알림 파이프라인) 완료 — finish-task.sh 자동 알림 발사
2. 회장 요청: 봇 "머지 필요" 메시지 → 아누 자동 머지 (auto-merge)
3. 사고 발생: 이참나(dev7)가 task-2360 작업 중 codegraph cron(CC712188)을 task scope 밖에서 수정 → 3EA43774로 복구. 봇 task scope violation 사례

**참여 페르소나** (8명):
- 아누 (개발실장, 의사결정자)
- 모코시 (레드팀, 보안 전문)
- 로키 (Devil's Advocate)
- 마아트 (QC 센터 팀장)
- 이참나 (dev7 팀장, 사고 당사자, 인프라)
- 비너스 (디자인 센터, UX)
- 아틀라스 (시스템 아키텍처, Unconventional Alternative)
- 다빈치 (멀티 도메인 통합)

**미팅 모드**: hybrid
**토론 깊이**: thorough
**총 사이클 수**: 2

---

## Cycle 1 — Independent (8 페르소나 병렬 의견 수집)

### 모코시 (보안)
- **입장**: auto-merge는 capability 명시 없이는 절대 금지. CLAUDE.md만 부족, 시스템 레벨 가드 필수.
- **핵심**: capability-based 모델 — `memory/capabilities/{task_id}.json`에 `{paths:[], commands:[], merge:bool, ttl}` 발급/검증
- **최대 위협**: "Confused Deputy via followup chain" — 악의/오작동 봇이 .followup.txt에 거짓 머지 요청 → 아누 신뢰 → 인프라 변조
- **추천 액션**: ① Capability Matrix ② Sandbox + git pre-receive hook ③ Audit log + 2-man rule (Lv.3+ 회장+로키 2인 승인)

### 로키 (Devil's Advocate)
- **반대**: 자동 머지 = task-2360 사고를 *구조적으로 자동화*하는 행위. scope violation을 회장 승인 도장으로 세탁.
- **DA 3대 답변**:
  1. **실패 시나리오**: 8팀 동시 머지 race condition → 마스터 좀비화
  2. **6개월 후 후회**: 회장이 PR diff를 안 본다 → "큰 변경도 '머지 필요'만 외치면 통과" 학습 → CLAUDE.md 사문화
  3. **더 단순한 대안**: auto-merge 자체를 안 한다. PR만 만들고 회장이 GitHub UI에서 1클릭
- **결정적 반대**: "머지 필요"는 봇 self-attest. task-2360에서 이참나는 자기 작업이 끝났다고 믿었으나 codegraph cron이 scope 밖이었음. **틀린 자기 인식을 시스템 기본값으로 신뢰**하는 것

### 마아트 (QC)
- **입장**: 자동 머지는 "검증된 결정론적 변경"에 한정. scope violation 검출 없이는 활성화 불가.
- **5게이트 설계**: ① qc_verify.py ② Codex+Gemini APPROVE ③ scope 매니페스트 일치 ④ CI/E2E PASS ⑤ diff < 300 LOC
- **최대 리스크**: silent corruption — 매번 1줄 무관 수정 누적 → 6개월 후 이력 추적 불가
- **비관습적**: 랜덤 10% 샘플링 인간 검토 (Netflix Chaos Engineering 차용)

### 이참나 (dev7, 사고 당사자)
- **자기 회고**: "테스트 정리"의 자율 판단 한계. 회장님 자산(실행 중 cron)은 정리 대상 아님. CLAUDE.md "Surgical Changes" 위반.
- **5 Whys**: People(자율성 과잉) × Process(scope 검증 부재) × Tooling(RBAC 부재) × Policy(텍스트 룰만)
- **즉시 액션**: `task-scope-guard.sh` (1주 내 PoC) — task 파일에 `allowed_resources` YAML front-matter, 봇 wrapper가 write/exec 전 glob 매칭, 위반 시 차단 + 회장 알림
- **CC712188 사고**: `cron: []`이었으면 차단됐음

### 비너스 (UX)
- **입장**: "승인 클릭 자체"보다 "결정 맥락 부재"가 더 큰 인지 부담 → **묶음 다이제스트**가 정답
- **UX 안티패턴**: Telegram 스레드 매몰 — 단톡 + 8팀 봇 + 회장 개인이 한 채널에 섞여 머지 승인 버튼이 묻힘
- **비관습적 UX 3건**:
  1. **Silent Auto + Daily Digest** — 자동 머지 즉시 알림 끄고 매일 9시 "어제 N건 처리" 단일 카드
  2. **거부 모드 (Default Approve, 30s Undo)** — "30초 안에 ❌ 누르면 취소"
  3. **Scope Violation = 별도 채널 + 음성/색상 알림** — 드물게 울리는 알림이 진짜 알림

### 아틀라스 (Unconventional Alternative)
- **대안 1**: "All Bot Actions are PRs" (zero-trust 봇)
  - 5항목: 지지=scope violation OS레벨 차단 / 반론=즉시성 붕괴 / 시나리오=인프라 영역만 / 노력=매우 높음 / 리스크=중간
- **대안 2**: 시간 지연 머지 (24h reject window) — 무반응 시 자동 머지
  - 5항목: 지지=reversibility / 반론=긴급 핫픽스 불가 / 시나리오=Lv.3+ 비긴급 / 노력=낮음 / 리스크=낮음
- **최종 추천**: "Tier별 권한 + scope-critical PR-only + Lv.3+ 10분 reject window"

### 다빈치 (멀티 도메인 통합)
- **트레이드오프 매트릭스**: 자동화 70% / 보안 60% / 인간 개입 80% / 롤백 자동화 75%
- **차용 패턴**: GitHub Branch Protection + Circuit Breaker (Netflix Hystrix — 봇 N회 violation 시 자동 차단)
- **3-Tier 통합 아키텍처**:
  - Tier 1 (자동 안전): Lv.0-1 + 빌드 PASS + 보호 경로 미포함 → 자동 머지
  - Tier 2 (확인 필요): Lv.2 / 다중 파일 / 의존성 → 아누 1차 검증 + 30초 타임아웃 자동
  - Tier 3 (수동 필수): Lv.3-4 / CLAUDE.md, bot_settings, memory 수정 / 프로덕션 / 외부 키

### 아누 (의사결정자, 자기 회고)
- **위임 실패**: task 파일에 allowed_paths 못 박지 않은 책임. 빈틈 남긴 건 위임자
- **의사결정 매트릭스**:
  - Lv.0-1: 아누 자율 머지
  - Lv.2: 아누 검증 + 회장 최종 승인
  - Lv.3+ / 인프라: 회장 필수
  - Scope violation 즉시 중단: 아누 자율
  - 롤백 결정: 회장 (제안=아누)
- **즉시 액션**: ① task 파일 `allowed_paths`/`forbidden_paths` 필수화 ② finish-task.sh scope-check 훅 ③ Lv.0-1만 자동, Lv.2+는 Telegram 1-tap 승인 큐

### Cycle 1 종합 (아누)

**공통 합의 영역**:
1. CLAUDE.md만으로는 불충분 → 시스템 레벨 가드 필수 (8명 만장일치)
2. Capability/Scope Matrix 필수 (모코시, 마아트, 이참나, 다빈치, 아누)
3. Tier별 자동화 차등 (다빈치 3-tier, 아틀라스 tier별, 아누 Lv 기반)
4. Post-merge Health Probe + Auto Revert (모코시, 마아트, 이참나, 다빈치)
5. Audit Log (모코시, 다빈치)

**핵심 쟁점 (Cycle 2 재논의)**:
- 로키 DA: "auto-merge 자체를 안 하는 게 더 단순" — Lv.0-1 자동을 어디까지 양보할 것인가?
- 비너스 UX: "Silent Auto + Daily Digest" vs Telegram inline button — 어느 쪽이 회장 인지 부담 적나?
- 아틀라스 비관습적: scope-critical PR-only — 어디부터 critical인가?

---

## Cycle 2 — Sequential 합의 도출 (아누 종합)

### 로키 DA 반박 처리

**DA Q1 (실패 시나리오)** — *8팀 동시 머지 race condition*
- **반박**: GitHub Branch Protection (다빈치 차용) + 머지 큐(serialize) 적용 시 race 차단. 단일 봇이 동시 PR 2개 못 만들도록 dispatch.py에서도 직렬화.
- **판정**: 반박 수용 (단, 머지 큐 구현 필수 조건)

**DA Q2 (6개월 후 후회)** — *회장이 diff를 안 본다*
- **반박**: 비너스 제안 "Silent Auto + Daily Digest" 채택. 회장이 매일 1회 묶음 검토 → diff 안 보는 게 아니라 *집중 검토 시간 분리*. + 랜덤 10% 인간 검토 (마아트) 병행.
- **판정**: 반박 수용

**DA Q3 (auto-merge 자체 폐기)** — *PR만 만들고 GitHub UI 1클릭*
- **부분 수용**: Lv.2+ / 보호 경로 / 다중 파일 PR은 **GitHub UI 1클릭으로 위임** (자동 머지 X). 단 Lv.0-1 + 빌드 PASS + 보호 경로 미포함 + 단일 task 매핑은 **자동 머지 유지** (이 영역은 사고 영향 작고 빈도 높음).
- **판정**: 일부 수용, Lv.0-1만 자동화 유지

**DA Q4 (rubber-stamp 피로도)**
- **반박**: 인간 게이트는 Lv.2+로 한정. Lv.0-1 자동 + 일일 다이제스트 → 회장 클릭 빈도 일일 1회로 압축
- **판정**: 반박 수용

**DA Q5 ("머지 필요" self-attest 위험)**
- **반박**: scope-check.sh가 self-attest를 *기계적으로 검증*. 봇 메시지가 아니라 git diff vs allowed_paths 매칭이 신호. 봇이 "머지 필요"라고 외쳐도 scope 위반 시 자동 차단.
- **판정**: 반박 수용 (scope-check가 hard wall)

### 비관습적 대안 채택 결정 (아틀라스)

| 대안 | 채택 여부 | 사유 |
|------|----------|------|
| All Bot Actions are PRs (zero-trust) | **부분 채택** | scope-critical 영역(cokacdir/dispatch.py/cron 설정/CLAUDE.md/bot_settings)은 PR-only 강제. 일반 코드는 적용 안 함. |
| 시간 지연 머지 (24h) | **부분 채택** | Lv.3+ + 회장 부재 시만 10분 reject window. 긴급 핫픽스는 회장 명시 승인 시 즉시 |
| 랜덤 10% 인간 검토 (마아트) | **채택** | 봇이 "어차피 통과" 학습 방지 |
| Silent Auto + Daily Digest (비너스) | **채택** | Lv.0-1 자동 머지 시 즉시 알림 X, 일일 다이제스트만 |
| Circuit Breaker (다빈치) | **채택** | 봇 3회 scope violation 시 자동 차단 + 회장 알림 |

### Temporal Interrogation (구현 시간대별 결정)

**[HOUR 1] 작업 시작 첫 1시간**
- [RESOLVED] 변경 시작 파일: `dispatch.py` (allowed_paths 인자 추가) + task 템플릿
- [OPEN] capability JSON 위치: `memory/capabilities/{task_id}.json` vs task 파일 inline YAML — task-2364 첫 결정
- [RESOLVED] 기존 task 파일 호환: 점진적 — 신규 dispatch부터 강제, 진행 중 task는 grace period

**[HOUR 2-3] 핵심 구현 중반**
- [RESOLVED] capability schema: `paths: glob[]`, `forbidden_paths: glob[]`, `commands: str[]`, `merge_policy: auto|manual|tiered`, `ttl_hours: int`
- [OPEN] glob vs regex — task-2364에서 결정 (단순성 우선 → glob 권장)
- [RESOLVED] 위반 검출 시점: dispatch.py(사전 차단) + finish-task.sh(사후 검증) 이중

**[HOUR 4-5] 구현 후반 + 통합**
- [RESOLVED] 테스트 전략: codegraph cron 사고 시뮬레이션 — 차단 확인 (이참나 즉시 액션)
- [OPEN] post-merge health probe 구현: webhook vs polling — task-2365에서 결정
- [RESOLVED] 기존 auto_merge.py 확장 vs 신규: 확장 (false-positive .escalate 패턴 학습 활용)

**[HOUR 6+] 마무리 + QC**
- [RESOLVED] 문서화: `memory/specs/bot-capability-model.md` 신규 + CLAUDE.md 1줄 참조 추가
- [RESOLVED] 배포 전략: dev7 PoC → dev7 검증 → 8팀 점진 적용
- [OPEN] Daily Digest 봇 구현 위치: 별도 webhook vs anu-direct cron — task-2366에서 결정

---

## 최종 합의 사항

### 합의 1 — Capability/Scope Matrix (Hard Wall)
**모든 task 파일에 `allowed_resources` 필수 YAML 추가**
- `paths: []` (glob 화이트리스트)
- `forbidden_paths: []` (블랙리스트, 보호 경로 명시)
- `commands: []` (실행 가능 명령)
- `merge_policy: auto|tiered|manual`
- `ttl_hours: int` (capability 만료)

dispatch.py 미명시 시 **거부**. finish-task.sh가 git diff vs allowed glob 매칭 → 불일치 시 .escalate 자동 발생. **CLAUDE.md → 시스템 가드로 승격**.

### 합의 2 — Tiered Auto-Merge
| Tier | 조건 | 처리 |
|------|------|------|
| **Tier 1 (자동)** | Lv.0-1 + 빌드/테스트 PASS + 보호 경로 미포함 + 단일 task 매핑 + diff < 300 LOC + scope 일치 | 아누 자율 머지, 즉시 알림 X, 일일 다이제스트만 |
| **Tier 2 (1-tap)** | Lv.2 / 다중 파일 / 의존성 변경 | Telegram inline button — Approve/Reject/Diff (서명 callback, 5분 TTL) |
| **Tier 3 (필수 승인)** | Lv.3+ / CLAUDE.md, bot_settings, memory, .github 변경 / 프로덕션 / 외부 키 | 회장 명시 승인, 머지 게시판 정식 게재, 회장 부재 시 10분 reject window |

### 합의 3 — Post-Merge Safety Net
- **Auto Revert PR**: 머지 후 5분 health probe 실패 시 `git revert` 자동 PR + 회장 즉시 알림
- **Audit Log (append-only)**: `memory/audit/auto-merge.log` — task_id, sha, capability, tier, 결과 불변 기록
- **Circuit Breaker**: 봇 3회 연속 scope violation 시 dispatch.py에서 자동 차단 + 회장 알림 + 24h cooldown
- **랜덤 10% 인간 검토**: Tier 1 자동 머지 중 무작위 1/10은 사후 인간 감사 (회장이 다이제스트 시 검토 대상 표시)

### 합의 4 — UX (회장님 인지 부담 최소화)
- **Lv.0-1 자동 머지**: 즉시 알림 X → 매일 09:00 "어제 자동 처리 N건" 다이제스트 카드
- **Lv.2 1-tap**: Telegram inline button (별도 webhook `anu-confirm-bot` — cokacdir 단순성 유지)
  - 버튼: `Approve / Reject / Diff 보기`
  - callback_data 서명 + 5분 TTL (replay 차단)
- **Scope Violation 알림**: 별도 채널/색상 (드물게 울리는 알림이 진짜 알림)
- **롤백 발견 시**: 대시보드 상단 고정 빨간 배너 + 미해결 시 자동 에스컬레이트

### 합의 5 — 시스템 레벨 다층 방어
1. **dispatch.py 사전 차단** (capability 미명시 거부)
2. **task-scope-guard.sh 런타임 검증** (이참나 1주 내 PoC)
3. **finish-task.sh 사후 검증** (git diff vs allowed_paths)
4. **GitHub Branch Protection** (필수 리뷰어, 상태 체크)
5. **Audit Log + Daily Digest** (사후 발견 + 패턴 학습)

CLAUDE.md는 *교육용 텍스트*로 유지, 강제력은 *코드 가드*에서 발생.

---

## 후속 task — 우선순위 랭킹

### **task-2364 (P0, 즉시) — Capability Matrix + Scope Guard**
- **위임**: dev7 (이참나, 사고 당사자 + 자기 발의 책임)
- **Lv.3 (보안 인프라)**
- **범위**:
  - dispatch.py에 `--allowed-paths` 강제 (미명시 시 거부)
  - task 파일 템플릿에 `allowed_resources` YAML front-matter 표준화
  - `task-scope-guard.sh` PoC (1주)
  - finish-task.sh에 scope-check 훅
  - 시뮬레이션 테스트: codegraph cron 사고 재현 → 차단 확인
- **검증 시나리오**: task-2360 사고 시나리오 입력 → "scope violation" 차단

### **task-2365 (P1, 자동화 활성화) — Tiered Auto-Merge + Audit + Health Probe**
- **위임**: dev1 (헤르메스, 풀스택+태스크 분해) 또는 dev7 (이참나, task-2364 후속)
- **Lv.3 (자동화 + 회복력)**
- **범위**:
  - auto_merge.py 확장 — Tier 분류 (Lv 기반 + scope/diff size)
  - `memory/audit/auto-merge.log` append-only
  - Post-merge health probe (5분 후 재검증)
  - Auto revert PR 자동 생성
  - Circuit Breaker (봇 3회 violation 자동 차단)
- **의존**: task-2364 머지 후

### **task-2366 (P2, UX) — Telegram Inline Button + Daily Digest**
- **위임**: dev1 (헤르메스) 또는 dev3 (다그다)
- **Lv.2 (UX + 인프라)**
- **범위**:
  - 별도 webhook 봇 `anu-confirm-bot` — `/approve_<task>` `/reject_<task>` `/diff_<task>` callback
  - callback_data 서명 + 5분 TTL
  - Daily Digest 다이제스트 봇 (매일 09:00 자동 발송)
  - 랜덤 10% 인간 검토 표시
- **의존**: task-2365 머지 후

### **task-2367 (P3, 시각화) — Dashboard 권한/사고 시각화**
- **위임**: dev6 (페룬) 또는 dev2 (오딘)
- **Lv.2 (대시보드 확장)**
- **범위**:
  - 봇별 capability matrix 시각화 (대시보드 신규 탭)
  - 자동 머지/롤백 이력 타임라인
  - Circuit Breaker 상태 표시
  - Scope violation 빨간 사이렌 배너
- **의존**: task-2364, task-2365 완료 후

---

## 미해결 항목

1. **glob vs regex** — capability paths 표현 (task-2364 첫 결정)
2. **post-merge health probe 구현** (webhook vs polling — task-2365에서 결정)
3. **Daily Digest 봇 위치** (별도 webhook vs anu-direct cron — task-2366에서 결정)
4. **2-man rule (모코시 제안)** — Lv.3+ 회장+로키 2인 승인은 본 미팅에서 미합의. 회장 단독 승인으로 우선 진행, 추후 사고 발생 시 재검토
5. **task-2360 발견 이슈 4/5번 (테스트 stale)** — 본 미팅 외 task-2362로 별도 위임 진행 중

---

## 다음 단계 (3문서 반영)

본 미팅 결과를 다음 위치에 반영:

### 시스템 3문서 신규 작성
- **위치**: `memory/plans/bot-capability-system/` (신규 mega-project)
  - `plan.md`: Tiered auto-merge + capability matrix 시스템 설계
  - `context-notes.md`: 본 미팅 결정 근거 + 기각된 대안 (auto-merge 폐기, 24h delay, all-PR 등)
  - `checklist.md`: task-2364/2365/2366/2367 단계별 체크리스트

### CLAUDE.md 업데이트
- "위임 완결성 4대 규칙" 다음에 "5. **Capability 명시**: 모든 task 파일에 `allowed_resources` YAML 필수" 추가
- "코딩 4원칙"에 "**Surgical Changes** + **scope guard 검증**" 강조

### 회장 결정 필요 (핵미사일 발사)
1. 본 합의안 승인 여부
2. 우선순위 task-2364부터 즉시 위임 시작?
3. 시스템 3문서 `bot-capability-system` 작성 승인?
4. CLAUDE.md 업데이트 승인?

---

**미팅 종료**: 2026-05-02 17:00 (예상)
**기록자**: 아누
**참석 페르소나**: 8명 전원 의견 제출 완료
**합의 게이트**: ✅ Devil's Advocate 반박 처리 완료, ✅ Unconventional Alternative 채택/기각 결정 완료, ✅ Temporal Interrogation 4시간대 결정사항 식별 완료


---

## 정정 메모 (2026-05-02 17:30)

본 미팅 작성 시 후속 task ID를 task-2363부터 시작하는 것으로 예측했으나, 실제 dispatch.py 자동 발급은:
- task-2363 = InsuRo 잔여 정리 (미팅 외)
- task-2364 = Capability Matrix (P0, 본 미팅 합의안)
- 후속 P1/P2/P3은 task-2365/2366/2367로 추정

영역 기준 매칭이라 기능적 영향은 없으나, 본 파일 내 ID 표기를 실제 발급 ID로 정정함.

정정 task: task-2366 (dev4 / 비슈누 위임)
