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

# 계획서: task-2367 — Tiered Auto-Merge + Audit Log + Health Probe + Auto Revert

**task**: task-2367
**목표**: 미팅 합의 2번(Tiered Auto-Merge) + 합의 3번(Post-Merge Safety Net) 구현으로 정상 흐름 자동화 + 사고 회복 체계 구축.
**승인**: 회장(2026-05-02 미팅) — Tier 분류·Audit Log·Health Probe·Auto Revert·Circuit Breaker 5개 컴포넌트 구현 합의
**근거**: `memory/meetings/2026-05-02-bot-anu-automation-safety.md` (Cycle 2 합의 2/3번)

---

## 목표

P0(task-2364: capability snapshot + scope-guard)이 "위반 차단"이라면, P1은 다음을 자동화:
1. **Tier 분류**: Lv.0-1 자동 / Lv.2 1-tap 큐 / Lv.3+ 회장 명시 승인 분기
2. **Audit Log**: append-only JSONL로 모든 머지/거부/회피 영구 기록 (불변성 + git 추적)
3. **Post-Merge Health Probe**: 머지 후 5분 빌드/테스트 재검증 → audit 기록
4. **Auto Revert PR**: probe FAIL 시 자동 revert PR 생성 + 회장 즉시 알림
5. **Circuit Breaker**: 봇별 violation 누적 3회 시 dispatch 차단 + 24h cooldown

## 범위

### 포함
- `scripts/auto_merge.py` 확장: tier 분류 + audit log 기록
- 신규 `scripts/post_merge_probe.py`: 5분 후 health probe
- 신규 `scripts/auto_revert.py`: probe FAIL 시 revert PR 생성
- `dispatch.py` 확장: Circuit Breaker 호출 (violation count → 차단 결정)
- `scripts/finish-task.sh` 확장: post-merge probe 트리거
- `memory/audit/` 디렉토리 (auto-merge.log, violation-count.json)
- 테스트: tier classifier / probe / revert (3개 모듈)
- 6 검증 시나리오 (Tier1/2/3, Health FAIL→Revert, Circuit Breaker, 회귀)

### 제외 (다음 페이즈 이후)
- Telegram inline button webhook 구현 (P2 = task-2368)
- Daily Digest 봇 구현 (P2 = task-2368)
- Dashboard 권한·사고 시각화 (P3 = task-2369)
- 별도 health endpoint 설계 (인프라 후속)
- 본 task 자체는 Tier 3 분류 (자기-바이패스 방지) → 머지는 회장 명시 승인

## 위임 계획

- Phase 1 (백엔드 코어): **쿠쿨칸** — auto_merge.py tier classifier + audit log
- Phase 2 (안전망): **쿠쿨칸** — post_merge_probe.py + auto_revert.py + dispatch.py circuit breaker
- Phase 3 (통합): **쿠쿨칸** — finish-task.sh probe 트리거 + 통합 테스트
- Phase 4 (테스트): **카마소츠** — 6 검증 시나리오 + 회귀 테스트
- Phase 5 (보고서): **이참나**(팀장) — SCQA 보고서 + 3문서 업데이트

> 프론트(이쉬첼) / UX(아쿠인) 비활성: 본 task는 100% 인프라 백엔드 작업.

## 검증 기준

- `pytest tests/dev7/test_tier_classifier.py -v` → 모든 PASS
- `pytest tests/dev7/test_post_merge_probe.py -v` → 모든 PASS
- `pytest tests/dev7/test_auto_revert.py -v` → 모든 PASS
- `python3 -m py_compile scripts/auto_merge.py scripts/post_merge_probe.py scripts/auto_revert.py dispatch.py` → 0
- 6 검증 시나리오 매트릭스 모두 PASS (보고서에 표 형식)
- **자기-바이패스 방어**: 본 task의 capability snapshot이 Tier 3로 분류되는지 확인
- 기존 task-2363/2364/2366 회귀 0 (기존 흐름 그대로 동작)

## 3 Step Why 자문

**1st Why — 왜 이 설계가 필요한가?**
A: P0이 위반을 차단하는 데 그치고, 정상 흐름까지 모두 인간 게이트로 막으면 처리량 0. Tier 분기로 안전한 영역(Lv.0-1)은 자동화하여 회장 인지 부담을 감소시키고, 위험 영역(Lv.3+)은 명시 승인을 강제하여 사고 가능성을 차단.

**2nd Why — 왜 A가 최선의 접근인가?**
B: 회장 미팅 기록상 합의된 5명(다빈치, 모코시, 마아트, 아누, 비너스) 모두 "Tier 분기 + 사고 회복 안전망"을 지지. 로키 DA 5개 반박을 모두 설득력 있게 받은 안. 단순한 if/else 분류로 구현 비용도 낮음.

**3rd Why — 왜 B가 다른 대안보다 나은가?**
C:
- 대안 1 (auto-merge 폐기, 모두 1클릭): 처리량 0이 되어 P0 자체가 무용지물.
- 대안 2 (24h reject window): 긴급 핫픽스 불가 + 회장 reject 행동을 강제.
- 대안 3 (zero-trust PR-only): 인프라 영역만 적용 → 본 안의 Tier 3과 동일.
→ Tier 분기 + Health Probe + Circuit Breaker는 위 3대 대안의 강점만 추출한 합성안.

A→B→C 일관성 검증: ✅ "정상 흐름 자동화 + 사고 회복" 단일 목표 일관 유지.

## 작업 원칙

- **Simplicity First**: tier 분류는 명료한 if/else. 추상화/추상 클래스 금지.
- **Surgical Changes**: 기존 auto_merge.py `run()` 흐름 보존, tier 분기만 삽입.
- **Self-Bypass 방지**: capability snapshot이 Tier 3로 분류되는지 자체 테스트.
- **scope-guard 회귀 0**: P0 산출물(scripts/task-scope-guard.sh, memory/capabilities/**) 절대 수정 금지.
