# Agent 미팅: 봇 상태 추적 시스템 재설계

**날짜**: 2026-03-17
**소집 이유**: 아누가 봇들의 실시간 상태를 모르는 반복적 버그. 워치독/1회성 체크 등 반창고 해결책 실패.
**참여 페르소나**: 토르, 불칸, 야누스, 오딘, 헤르메스, 헤임달, 아르고스, 마아트, 로키(DA), SRE전문가, Unix프로세스전문가, 이벤트아키텍처전문가, 상태머신전문가, 분산시스템전문가, 장애복구전문가, 동시성전문가, 리눅스시스템전문가, 모니터링전문가, 미미르, 프레이야 (20명)
**미팅 모드**: hybrid
**토론 깊이**: thorough
**총 사이클 수**: 1 (Round 1에서 만장일치 합의 도달)

---

## Cycle 1

### 아누 분석

현재 상태 추적 흐름:
```
dispatch.py → set_bot_status("processing")     ← SET
    ↓
cokacdir --cron → claude 프로세스 시작 (PID 모름)
    ↓
작업 수행
    ↓
finish-task.sh → notify-completion.py → set_bot_idle()  ← CLEAR (실패 가능)
```

근본 결함: Push 모델의 단일 실패점. 봇이 finish-task.sh를 호출해야만 idle로 돌아옴.
실패 지점 5곳: crash, hang, skip, finish-task.sh 에러, cokacdir 실패.

### 페르소나 의견 (20명 종합)

#### 만장일치 합의
- **bot-activity.json은 거짓말하는 캐시**: 상태 파일 ≠ 진실. 커널 프로세스 테이블이 진실. (토르, 불칸, SRE, 모니터링, 아르고스 등 18+명)
- **워치독/데몬 불필요**: 조회 시점에 계산하면 됨 (전원 동의)
- **Push → Pull 전환**: pgrep으로 직접 확인 (토르, SRE, 모니터링 등)

#### 강한 합의
- **봇별 개별 파일 분리**: race condition 해소 (동시성전문가, 분산시스템, 헤임달)
- **flock 기반 생존 감지**: OS가 lock 자동 해제 (토르, 프로세스전문가, 야누스)
- **Derived state**: task-timers.json에서 파생 (오딘, 헤르메스)
- **이벤트 소싱**: append-only jsonl (오딘, EDA전문가)

#### 주요 개별 의견
- **토르**: flock + PID 파일 조합. SIGKILL도 OS가 lock 해제하므로 구조적으로 불가능한 stale 상태 제거.
- **오딘**: events.jsonl 기반 이벤트 소싱이 영구 해결. 20봇까지 확장 가능.
- **야누스**: cokacdir 안 바꾸고 래퍼 스크립트 패턴. trap EXIT + flock.
- **헤르메스**: 최소 변경 = finish-task.sh에 idle 강제 전환 1줄 추가 + bot_activity.py 로깅.
- **상태머신**: 3상태(idle/processing/failed) + entered_at 타임스탬프.
- **미미르**: 상태 신뢰도 표시 ("작업중✓" vs "미확인?").
- **리눅스전문가**: systemd --user 서비스가 idiomatic Linux.

### Devil's Advocate (로키)
**지정**: 로키 (레드팀)

1. **실패 시나리오**:
   - Pull(ps aux): 확인 직후 봇 사망 → 여전히 모름
   - flock: 파일시스템 장애 시 lock 해제 안 될 수 있음
   - Heartbeat: 감시자를 감시하는 무한 회귀
   - Derived state: source data(task-timers)가 stale하면 결과도 stale

2. **후회 이유**: Heartbeat 시스템은 6개월 후 전체 복잡도의 절반을 차지할 것

3. **더 단순한 대안**: "완벽한 추적은 불가능" 전제에서 출발 → 멱등 작업 + SLA 타임아웃. 무한정 기다리지 않는 것이 해결책.

**반박**: Pull 모델의 스냅샷 한계는 사실이나, "확인 시점에 정확"한 것만으로 5시간+ stale 문제 해결. SLA는 보완책으로 병행.
**판정**: DA 지적 일부 수용. Pull 모델 + SLA 타임아웃 병행.

### 합의/결론

#### 3레이어 설계

**Layer 1: 실시간 프로세스 체크 (핵심)**
- whisper-briefing hook에서 bot-activity.json 읽기 → `pgrep -f "claude.*teams/dev1"` 직접 확인으로 교체
- task-timers.json의 running task와 교차 검증
- 프로세스 있으면 "작업중✓(N분)", 없으면 "유휴"
- 불확실하면 "미확인?" 표시 (오보보다 나음)

**Layer 2: finish-task.sh 방어 강화 (보조)**
- finish-task.sh에서 idle 전환 중복 보장
- bot_activity.py의 silent fail(except pass) → 경고 로그
- bot-activity.json은 "캐시"로 격하 (있으면 참고, 없어도 됨)

**Layer 3: SLA 타임아웃 (안전망)**
- dispatch 시 예상 타임아웃 설정
- 초과 시 아누에게 텔레그램 알림
- 무한 대기 방지

#### 버리는 것
- ~~워치독 (cron/데몬)~~ → 제거 확정
- ~~bot-activity.json을 Source of Truth로 사용~~ → 캐시로 격하
- ~~Heartbeat 데몬~~ → 감시자의 감시자 무한회귀 우려 (로키)

### 미해결 항목
- cokacdir 수정 가능 여부 (PID 반환, 래퍼 스크립트)
- systemd --user 서비스 전환 장기 검토

---

## 최종 합의 사항

1. whisper-briefing hook을 수정하여 pgrep 기반 실시간 프로세스 체크로 전환
2. bot-activity.json은 Source of Truth에서 캐시로 격하
3. 워치독(cron/데몬) 완전 제거
4. finish-task.sh에 idle 전환 중복 보장 추가
5. bot_activity.py의 silent fail 제거 (로깅 추가)
6. SLA 타임아웃: dispatch 시 타임아웃 설정, 초과 시 알림
7. 상태 표시 개선: "작업중✓(N분)" / "유휴" / "미확인?"

## 다음 단계
- 2팀에 위임: whisper-briefing hook 수정 + finish-task.sh 방어 강화 + bot_activity.py 로깅
- 3문서 불필요 (기능/옵션 수준 수정)
