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

# 계획서: task-2370

**task**: task-2370 (P2 — Telegram Inline Button + Daily Digest + 랜덤 10% 인간 검토)
**목표**: 회장 인지 부담 최소화 — Lv.0-1은 일일 다이제스트, Lv.2는 5분 TTL inline button, scope violation은 별도 채널 분리.
**승인**: 회장 [2026-05-02] (미팅 합의 4번 채택)
**근거**: `memory/meetings/2026-05-02-bot-anu-automation-safety.md` 합의 4

---

## 목표

미팅 합의 4번(UX) + 합의 3번(랜덤 10% 검토) + 합의 4번(scope violation 별도 채널)을 P2로 구현.
- Tier 2 머지 후보를 Telegram 인라인 버튼(Approve/Reject/Diff) + HMAC-SHA256 서명 + 5분 TTL 로 처리
- 매일 09:00 어제 자동 머지(Tier 1) 다이제스트 + 무작위 10% 회장 검토 표시
- Scope violation은 ⚠️ prefix + 별도 chat(또는 색상)으로 분리 알림
- 트리거 마커는 환경변수로 추상화하여 task-2368 결과(`.done` vs `.merge-done` vs `.merged`) 호환

## 범위

### 포함
- `scripts/anu_confirm_bot/` 신규 webhook (Flask 단일 모듈 + signer + config + systemd unit)
- `scripts/daily_digest.py` 신규 (audit log JSONL 집계 + 10% 샘플링 + 단일 카드)
- `scripts/scope_violation_alert.py` 신규 (별도 채널 helper)
- `scripts/auto_merge.py` 최소 수정 (Tier 2 hook 1점 + scope violation hook 1점)
- `tests/dev3/` 4개 모듈
- `cron/` 또는 systemd timer 등록 가이드 문서화

### 제외 (P3 이후)
- 빨간 배너 시각화 (대시보드 P3)
- Tier 2 reject window 자동 머지 (현재는 button 전용)
- 회장 reply→bot 양방향 채널

## 위임 계획

- 루(백엔드): anu_confirm_bot/ 전체 + daily_digest.py + scope_violation_alert.py + auto_merge.py 통합 hook
- 모리건(테스터): tests/dev3/ 4개 모듈 + L1 스모크 (테스트 webhook + curl)
- 브리짓/아네 비활성: 디자인 작업 없음, 100% 백엔드 인프라

## 검증 기준

- pytest 100% PASS (P0 12개 + P1 18개 회귀 0건 + P2 신규 8건 이상)
- callback 서명 검증: 위조 callback → 401, 만료 callback → expired
- daily_digest.py 직접 실행 → 가짜 audit log → 단일 카드 텍스트 생성 확인
- scope violation simul → ⚠️ prefix 별도 채널 알림 확인
- auto_merge.py: classify_tier(task-2370) 호출 → tier3 (자기-바이패스 방어)
- L1: webhook 서버 기동 + curl로 healthz 200 + signed callback POST → 200
