# `.followup.txt` 작성 가이드 (봇 → 아누 후속 알림)

봇이 `finish-task.sh` 호출 직전에 `memory/events/<task_id>.followup.txt`를
작성하면, 그 내용이 `extract_followup.py`로 파싱되어 아누 chat에
표준 5섹션 cron 메시지로 발송된다 (task-2360).

## 언제 쓰는가

다음 중 하나라도 해당하면 작성을 권한다:

- 회장 결정이 필요한 항목이 있다 (예: 보안 트레이드오프, PR 머지 타이밍)
- 머지가 필요한 PR/브랜치가 있다 (특히 PR 번호 + 상태)
- 범위 내/외 미해결 항목이 있다 (DEFER 분류 포함)
- 다음 단계 후속 task 후보가 있다

작성하지 않으면 `extract_followup.py`가 보고서에서 자동 추출한다.
**중요한 결정/머지/미해결을 강조하고 싶을 때만** `.followup.txt`로 명시 작성.

## 작성 위치

```
/home/jay/workspace/memory/events/<task_id>.followup.txt
```

`finish-task.sh`가 실행되기 전에 존재해야 한다.
`extract_followup.py`가 우선순위 1로 읽는다.

## 포맷

마크다운 헤더 + bullet 리스트. 헤더는 정확한 이름을 쓰지 않아도 정규식 매칭됨
(예: "회장 결정", "회장 승인", "회장 결재" 모두 인식).

```markdown
## 핵심 결과
한 줄 또는 한 단락으로 작업의 결과 요약.

## 회장 결정 필요
- 항목 1 — 결정 옵션 A vs B
- 항목 2

## 머지 필요
- PR #80 (대기) — Gemini 리뷰 5분 후 자동 머지 예정
- PR #81 (완료) — main에 머지됨

## 미해결
- 범위 외 미해결: XXX (별도 task로 분리 예정)

## 다음 단계 권장
- task-XXXX (영역 — 예: Phase 2 비교 UI)
```

### 인식되는 헤더

| 우선 헤더 | 정규식 매칭 (대소문자 무관) |
|-----------|-----------------------------|
| `## 핵심 결과` | `핵심\s*결과` |
| `## 회장 결정 필요` | `회장\s*(결정|승인|결재)` |
| `## 머지 필요` | `머지\s*(필요|판단)?` |
| `## 미해결` | `미해결` / `follow.?up` / `남은` |
| `## 다음 단계 권장` | `다음\s*단계` / `next\s*steps?` / `후속` |

## 추출 우선순위 (3단)

`extract_followup.py`는 다음 순서로 항목을 수집한다:

1. **`<task_id>.followup.txt`** — 봇이 명시 작성한 강조 메모 (이 파일이 1순위)
2. **`memory/reports/<task_id>.md`** — 정식 보고서에서 정규식 자동 추출
3. **`<task_id>.completion.txt`** — notify-completion.py 1줄 폴백

같은 섹션을 followup.txt에서 채우면 보고서 추출은 덮어쓰지 않는다.
followup.txt에서 비운 섹션은 보고서에서 보충된다.

## 발송 메커니즘

1. `finish-task.sh` 마지막 단계에서 `python3 scripts/extract_followup.py send <task_id>` 호출
2. `cokacdir --cron` 으로 10초 후 발송 등록 (chat=6937032012, key=ANU)
3. `memory/events/<task_id>.anu-notified` 마커 생성 — 중복 발송 방지
4. `finish-task.sh` 누락 시 `done-watcher.py`가 5분 후 폴백 발사

## 안전장치

- **무한 cron 루프 방지**: `.anu-notified` 마커 체크 + dedupe
- **메시지 길이 제한**: 4000자 초과 시 회장결정/머지/미해결 우선 보존, 나머지는 "외 N건은 보고서 참조"로 잘림
- **환경변수 비활성화**: `DISABLE_ANU_FOLLOWUP=1`로 임시 OFF 가능
- **task_id 패턴 검증**: done-watcher 폴백은 `task-NNNN(.NN)?` 패턴만 처리

## CLI 디버깅

```bash
# 추출 결과 dict로 확인
python3 scripts/extract_followup.py extract task-2356

# 실제 메시지 텍스트 미리보기
python3 scripts/extract_followup.py format task-2356

# 발송 시뮬레이션 (실제 cron 등록 없이)
python3 scripts/extract_followup.py send task-2356 --dry-run

# 즉시 발송 (테스트 환경에서만)
python3 scripts/extract_followup.py send task-2356 --delay 5
```

## 운영 메모

- task-2360에서 도입된 자동 알림 파이프라인이다
- 기존 `notify-completion.py`는 그대로 유지 (Telegram 직접 알림 — 단순 완료 통보)
- `extract_followup.py`는 그 다음 단계로, 회장결정/머지/미해결을 별도 cron으로 강조 발사
- `.anu-notified`는 finish-task.sh와 done-watcher.py 양쪽에서 동일 마커 사용
