---
project: bot-capability-system
type: context
scope: system
created: 2026-05-02
updated: 2026-05-02
status: in-progress
---

# 맥락 노트: 봇 Capability 시스템

## 결정 근거 (2026-05-02 8 페르소나 미팅)

### 채택된 핵심 합의

1. **CLAUDE.md만으로 불충분 → 시스템 가드 필수** (만장일치)
   - 근거: task-2360 사고에서 이참나는 자기 작업이 끝났다고 *믿었으나* codegraph cron이 scope 밖이었음. 자기 인식 오류를 시스템 기본값으로 신뢰하면 안 됨 (로키 DA Q5).
2. **Capability/Scope Matrix** (모코시 + 마아트 + 이참나 + 다빈치 + 아누 합의)
   - 근거: capability-based 접근은 Linux 보안 모델에서 검증된 패턴. 자율 판단 한계를 명시적 권한으로 대체.
3. **Tiered Auto-Merge** (다빈치 3-tier + 아틀라스 tier별 + 아누 Lv 기반 종합)
   - 근거: 모든 작업을 인간 승인하면 회장 클릭 피로 → 자동/1-tap/필수 3단 분류로 인지 부담 압축.
4. **Post-Merge Health Probe + Auto Revert** (모코시 + 마아트 + 이참나 + 다빈치)
   - 근거: 머지 즉시 검증으로 silent corruption 방지. Netflix Hystrix + Chaos Engineering 차용.
5. **다층 방어** (모두): 단일 게이트 우회 가능성 차단.

### 기각된 대안

#### 대안 A — Auto-merge 자체 폐기 (로키 DA Q3)
- **로키 주장**: PR만 만들고 회장이 GitHub UI에서 1클릭. self-attest 위험 제거.
- **부분 수용**: Lv.2+ / 보호 경로 / 다중 파일 PR은 1클릭 위임. 단 Lv.0-1 + scope 일치 + diff < 300 LOC는 자동 유지.
- **기각 사유**: Lv.0-1까지 인간 승인 강제 시 회장 피로도 증가 + 빈도 높음 + 사고 영향 작음.

#### 대안 B — 24h Reject Window (아틀라스)
- **주장**: 모든 머지를 24h 지연. 무반응 시 자동 머지.
- **기각 사유**: 긴급 핫픽스 불가. 단, Lv.3+ + 회장 부재 시 10분 reject window는 부분 채택.

#### 대안 C — All Bot Actions are PRs (아틀라스)
- **주장**: 모든 봇 액션을 PR로 강제 (zero-trust).
- **기각 사유**: 즉시성 붕괴 + 노력 매우 높음. 단, scope-critical 영역(cokacdir/dispatch.py/cron 설정/CLAUDE.md/bot_settings)은 PR-only 강제 — 부분 채택.

#### 대안 D — 2-man Rule (모코시)
- **주장**: Lv.3+는 회장 + 로키 2인 승인.
- **미합의 → 기각**: 회장 단독 승인 우선. 추후 사고 발생 시 재검토.

#### 대안 E — capability를 별도 JSON 파일로 **task 작성자가 직접 관리**
- **주장**: 모코시 초안. task 파일과 별개로 작성자가 JSON 작성/유지.
- **기각 사유**: 동기화 비용 + 작성자가 두 곳을 관리해야 함.

#### 채택: 계층 분리 — "작성=inline YAML, enforcement=dispatch snapshot"
- **task 작성 시점 (작성자 책임)**: task 파일에 inline YAML로 `allowed_resources` 작성. 단일 작성 source.
- **dispatch 시점 (시스템 책임)**: dispatch.py가 inline YAML을 파싱해서 `memory/capabilities/{task_id}.json`에 immutable snapshot으로 자동 저장. 작성자는 snapshot 직접 작성하지 않음.
- **enforcement 시점 (scope-guard)**: snapshot JSON만 읽음 (mutable task 파일 미사용). 봇이 작업 중 task 파일을 수정해도 snapshot은 변하지 않음.
- **이유**: 작성 단순성 (대안 E의 기각 사유 해결) + enforcement immutability (Codex critical 해결) 동시 만족. 두 계층은 모순이 아니라 **분리된 책임**.

#### 대안 F — paths 표현을 regex로
- **주장**: 표현력 강함.
- **기각 사유**: 오작성 위험 + 가독성 저하. glob (pathlib + fnmatch) 채택.

## 미해결 항목 (후속 task 결정 사항)

1. **glob 표현 한계**: `**/*.py` 같은 광범위 paths 허용 시 사실상 무효화. 스펙 문서에 가이드 추가, P1+에서 lint 도입 검토.
2. **post-merge health probe 구현**: webhook vs polling — task-XXX(P1)에서 결정.
3. **Daily Digest 봇 위치**: 별도 webhook vs anu-direct cron — task-XXX(P2)에서 결정.

## 참조

- 미팅 본문: `memory/meetings/2026-05-02-bot-anu-automation-safety.md`
- task-2360 사고 보고서: `memory/reports/task-2360.md`
- 위임 완결성 4대 규칙: `memory/specs/anu-guide.md` 3.9
