# EXPIRED_ONCE_SCHEDULE_ANALYSIS (REFOCUS) — read-only, 실행/restart/canary 0

작성: 2026-06-09 KST / ANU 직접 / 근거 = 선별 schedule 문자열 + schedule_history 타임라인 (raw binary 덤프 0)
상태: `EXPIRED_ONCE_SCHEDULE_ANALYSIS_REFOCUS_ACTIVE_FALSE`
질문: **expired once-schedule 이 실제 wake loss 를 의미하는가?**
정정 유지: 이전 "fire_grace_period"(=Discord guild prune 맥락)·"[schedule_polling]"(=AI 스트리밍 polling)은 cron 무관 — 폐기.

## 선별 문자열 9개 — 각 "의미하는 것 / 의미하지 않는 것"
1. `[scheduler_loop] cycle` — 의미: scheduler 가 cycle 단위 반복(카운트 로깅). 의미 안 함: cycle 의 trigger(메시지 vs timer)는 이 문자열만으론 불명.
2. `[scheduler_loop] bot messages found` — 의미: cycle 이 bot 메시지 존재를 확인/처리. 의미 안 함: 메시지 없을 때 cycle 빈도.
3. `[scheduler_loop] busy check for chat` — 의미: chat 별 busy 여부 점검. 의미 안 함: schedule 발사 자체.
4. `parsed as absolute datetime` — 의미: once-schedule(절대 --at)을 절대 datetime 으로 파싱. 의미 안 함: 발사 보장.
5. `cron recurring` — 의미: 반복 cron 과 1회성 구분 존재. 의미 안 함: once 의 발사/폐기 결과.
6. `not yet due` — 의미: due 전 schedule 은 skip(대기). 의미 안 함: due 후 동작.
7. `[Scheduler] Chat busy, pending` — 의미: due 인데 chat 사용중이면 pending(defer, 보존). 의미 안 함: 폐기.
8. `[Scheduler] Discarded expired once-schedule` — 의미: once-schedule 을 "expired" 판정 시 **discard(폐기)**. 별도 분기. 의미 안 함: (이 문자열만으론) 발사 후 cleanup 인지 발사 전 폐기인지 100% 단정 — 단 문구가 "Discarded ... once-schedule"(발사 동사 없음)이라 **발사 없는 폐기로 강하게 시사**.
9. `handle_cron_register / list / update / remove / history` — 의미: cron CRUD 핸들러 존재. 의미 안 함: 발사 스케줄러 동작.

## fire 후 cleanup 인지 / fire 없이 폐기인지
- `Chat busy, pending`(보존) 과 `Discarded expired`(폐기) 가 **나란한 별개 분기** + `not yet due`(대기) → Scheduler 가 once-schedule 을 **대기 / 발사 / pending / 폐기** 로 분류.
- `Discarded` 분기에 발사 동사 부재 → **fire 없이 폐기(추정, 강함)**. 단 "fire 후 cleanup"을 코드 한 줄로 100% 배제하진 못함(strace/source 부재).

## schedule_history 타임라인 (사실 — 발사 기록만 남음)
- **B14BCE8F**: due 17:58:24 → **fire 17:59:15.553**(+51s). schedule_history 기록 존재. → +51s 는 "due"(발사) 범위, "expired" 아님 → 만료 임계 **> 51s**.
- **06942998**: schedule_history **없음** — ANU 가 발사 전 제거(outbound 만, 미발사).
- **03FF92A7**: schedule_history **없음** — ANU 가 발사 전 제거(quiet 15분 방치 후 제거).
- ★ **discard 발생 기록 0** — 3 canary 모두 ANU cleanup 으로 discard 도달 전 제거. **실제 discard 직접 관측 사례 없음.**

## wake loss 가능성 — 사실 / 추정 / 미확정 구분
- **사실(fact)**:
  - 바이너리에 `Discarded expired once-schedule` 분기 문자열 존재.
  - `not yet due` / `Chat busy, pending` / `Discarded expired` 가 별개 상태로 존재.
  - B14BCE8F 만 발사 기록, 나머지 2 는 발사 기록 없음(ANU 제거).
- **추정(inference)**:
  - `Discarded` = fire 없는 폐기(문구상 강함) → 발생 시 wake loss.
  - scheduler cycle 이 메시지 활동에 결합(quiet 시 cycle 미advance) → due 가 임계 초과 가능.
- **미확정(unconfirmed)**:
  - 정확 만료 임계(초/분) — B14BCE8F 로 >51s 만 확정.
  - cycle 의 독립 timer 존재/간격.
  - **실제 discard/wake-loss 발생 여부 — 관측 0**.

## confidence level
- discard **분기 존재** = HIGH (문자열 명시).
- discard = **fire 없는 폐기** = MODERATE-HIGH (문구 강함, 단 strace 미확보).
- **실제 wake loss 발생** = LOW (직접 관측 0, 추정만).
- 정확 임계·빈도 = UNKNOWN.

## 질문 직답
- expired once-schedule 은 **wake loss 를 일으킬 수 있는 코드 분기로 존재**(분기 HIGH, fire-없는-폐기 MODERATE-HIGH). 단 **실제 유실은 관측되지 않았고**(LOW), 임계·빈도는 미확정. → "위험 경로는 실재, 실증은 미완"으로 정리.

## capability matrix 영향
- wake_fire_loss_risk = **DISCARD_BRANCH_EXISTS_LOSS_UNOBSERVED (threshold UNKNOWN)** (이전 CONFIRMED 표현을 관측 0 반영해 하향).
- wake_fire_root_cause = SCHEDULER_LOOP_MESSAGE_DRIVEN_COUPLING (MODERATE-HIGH).
- ACTIVE=false.

## 금지 (현재)
production activation / ACTIVE=true / 추가 canary / daemon restart / systemd 설치. **분석 보고까지만.**

## 판정
- **EXPIRED_ONCE_SCHEDULE_ANALYSIS_REFOCUS_READY**. wake loss = 분기 실재(HIGH)·fire-없는-폐기(MOD-HIGH)·실제 유실 미관측(LOW)·임계 미확정. production activation 전 임계/실증 확인 필요.
