---
task_id: task-2367
type: context
scope: task
created: 2026-05-02
updated: 2026-05-02
status: completed
---

# 맥락 노트: task-2367

**task**: task-2367 — Tiered Auto-Merge + Audit Log + Health Probe + Auto Revert

---

## 결정 근거

### 결정 1: Tier 분류 알고리즘 — 명료한 if/else, 추상화 금지
- **근거**: CLAUDE.md "Simplicity First" + 미팅 합의 다빈치/아누 모두 단순 분기 지지.
- **대안 기각**: ① 정책 엔진(과도한 추상화, 디버깅 비용↑) ② YAML rule DSL(러닝커브). → 명시적 if/else가 가독성/디버깅 압도.

### 결정 2: Audit Log 포맷 — JSONL append-only
- **근거**: 모코시(보안) 합의안. JSONL은 git diff 친화 + grep/jq 분석 용이. SQLite보다 락 충돌 ↓.
- **불변성**: 444 권한 + git 추적 + sequence number 포함하여 truncation 감지.

### 결정 3: Health Probe 트리거 — at(1) 또는 cron 5분 지연
- **근거**: 미팅 [HOUR 4-5] [OPEN] 항목. webhook은 외부 의존(취약), polling은 자원 낭비. `at` 명령 또는 finish-task.sh 안에서 `(sleep 300; probe) &` background.
- **결정**: 단순성 우선 → background subprocess + 별도 mark 파일로 멱등성 확보.

### 결정 4: Auto Revert — PR 생성만, 머지는 회장 승인
- **근거**: revert 자체가 변조 영역(머지 sha)이므로 자동 머지하면 self-bypass 위험. PR + 회장 알림이 안전 측면 우선.
- **다빈치/모코시 합의**: revert 생성은 자동, 적용은 인간 게이트.

### 결정 5: Circuit Breaker 임계값 — 봇별 누적 3회 / 24h cooldown
- **근거**: 다빈치 Netflix Hystrix 차용. 3회는 "운 + 실수 + 의도" 모두 흡수 가능 임계.
- **24h**: 회장 미응답 시 자동 해제(서비스 마비 방지). 사고 시 회장이 명시 차단 가능.

### 결정 6: 본 task 자체는 Tier 3 — 자기-바이패스 방지
- **근거**: 본 task가 `scripts/auto_merge.py`를 수정하므로 보호 경로 변경 → Tier 3 분류 강제.
- **적용**: capability snapshot의 `merge_policy: "tiered"` + Lv.3 → has_protected_path가 True 반환.
- **결과**: 본 PR 머지는 회장 명시 승인. P0와 동일한 패턴 유지.

## 참조 자료

- 미팅 기록: `memory/meetings/2026-05-02-bot-anu-automation-safety.md`
- P0 task 보고서: `memory/reports/task-2364.md`
- P0 PR: GitHub PR #5 (`05755351`)
- P0 산출물: `scripts/task-scope-guard.sh`, `memory/specs/bot-capability-model.md`
- 시스템 3문서: `memory/plans/bot-capability-system/{plan,context-notes,checklist}.md`

## 주의사항

- ⚠️ **scope-guard 회귀 0**: `scripts/task-scope-guard.sh`, `memory/capabilities/**` 절대 수정 금지.
- ⚠️ **본 task 자기 호출 회귀**: finish-task.sh 수정 시, 본 task 자체 finish-task.sh 호출 시 정상 동작해야 함.
- ⚠️ **Audit Log 일관성**: 모든 머지 경로(자동/수동/escalate/revert) 모두 audit에 기록되도록 분기마다 호출 보장.
- ⚠️ **Circuit Breaker 회피 금지**: dispatch.py에서 우회 경로 없이 단일 진입점에서 검사.
- ⚠️ **Sanitize 게이트**: 외부 AI(Codex/Gemini) 호출 전 PII 마스킹 필수.

## Codex G1 사전 검증 반영 (2026-05-02)

Codex가 지적한 3개 critical risk를 설계에 반영:

1. **`git reset --hard HEAD~1` 금지**
   - 기존 `auto_merge.py:revert_merge()`는 hard reset 사용 → 공유 히스토리 파괴 위험.
   - **결정**: `auto_revert.py`는 `git revert <merge_sha>` 기반 별도 PR 생성. hard reset 절대 사용 금지.
   - 기존 revert_merge()도 task-2367에서 `git revert` 방식으로 교체.

2. **Tier 3 머지 경로 진입 차단**
   - 기존 흐름: finish-task.sh → 머지 → G3 검증 (사후) — 위험.
   - **결정**: auto_merge.py `classify_tier()`가 Tier 3 반환 시 즉시 escalate(자동 머지 X). PR만 생성. finish-task.sh도 Tier 3 사전 감지하여 머지 단계 스킵.

3. **CANCELLED 가드 강화**
   - 기존: finish-task.sh 일부에만 가드 존재.
   - **결정**: auto_merge.py `run()` 진입 시점에서도 `.cancelled` 마커 검사. dispatch.py도 task 등록 시 검사.

Codex가 지적한 나머지 6개 risk(미구현 항목 4개 + capability 미연결 + post-probe 미동작)는 본 task의 직접적 구현 대상.

## 3 Step Why 자문 결과

(plan.md 참조)
- 1st: 정상 흐름 자동화 + 사고 회복 안전망 필요
- 2nd: 미팅 5명 합의 + 로키 DA 5개 반박 모두 설득력 있게 받음
- 3rd: auto-merge 폐기·24h reject·zero-trust PR-only 3개 대안의 강점 합성안

A→B→C 일관성: ✅
