# task-2560 — context notes

## 회장 §명시 (2026-05-12 KST)

Track A 1순위. dev5 마르둑 (executor_scheduler 작성자) 자율. PR #111 (task-2558) 직후 본 작업.

## 선행 / 의존

- task-2556 PR #107~#108 — executor_scheduler 본체 도입 + PR #107 실증
- task-2558 PR #111 — auto_gemini_triage minor_in_expected_files 박제 MERGED
- task-2559 dashboard 신호등 (dev3 다그다 ACTIVE — 본 작업과 분리)
- task-2561/task-2562 Track B/C — 본 PR 과 PR 섞기 금지

## 코드 인터페이스 컨텍스트

`ExecutorScheduler._handle_single_diagnosis` (executor_scheduler.py:493~):
- diag.state 에 따라 분기: WITHIN_GRACE / MISSING_TASK_ID / CI_FAILED / FRESH / FIRST_GEMINI_TRIGGER_MISSING / STALE_ON_HEAD / unknown.
- 분기 내부 dispatch (`_dispatch_owner_trigger`, `_handle_fresh_evidence`) 에서 예외 발생 가능.
- 원래는 catch 0 → 한 PR 예외가 전체 cycle 중단 (FUC-4 갭).

`PollingState` / `BotSessionExitRequired` (polling_policy.py):
- 봇 종료는 BotSessionExitRequired 로 표현 — per-PR isolation 으로 catch 하면 봇이 영원히 안 죽으므로 명시적으로 re-raise.

`OwnerTriggerOnly._audit._has_active_trigger` 호출:
- audit 파일 손상 / IO 오류 시 OSError 발생 가능 — 본 task isolation 으로 cycle 유지 + critical-escalated marker 박제.

## Critical 7 분류 근거

회장 §명시 본질 6 "Critical 7" 은 task-2539+1 / task-2553 등에서 일관되게 쓰이는
"system 종료 / 경계 위반 / 인터페이스 위반" 카테고리. 본 task 는 7개 명시:
1. TokenBoundaryViolation — security boundary (회장 §11)
2. PermissionError — OS 권한
3. OSError — 파일시스템/네트워크 OS 레벨
4. MemoryError — 자원 고갈
5. NotImplementedError — 필수 인터페이스 미구현
6. TypeError — 타입 계약 위반 (DI 잘못)
7. AttributeError — 내부 attribute 누락

이 7개는 모두 "코드/환경 자체의 버그 신호" 라 즉시 경고 marker 가 필요.

## marker / decision 파일 구조

`memory/events/{task_id}.pr-{pr}.exception.json`:
```json
{
  "schema": "anu_v2.executor_scheduler.pr_exception.v1",
  "ts": "...",
  "cycle_started_at": "...",
  "pr_number": 9001,
  "task_id": "task-9001",
  "head_sha": "...",
  "state": "FIRST_GEMINI_TRIGGER_MISSING",
  "critical": false,
  "action": "PR_EXCEPTION_ISOLATED",
  "exception_summary": {
    "type": "RuntimeError",
    "module": "builtins",
    "message": "...",
    "origin_filename": "...",
    "origin_function": "...",
    "origin_lineno": N
  },
  "owner": "...", "repo": "...",
  "chat_notifications": 0
}
```

`memory/events/{task_id}.pr-{pr}.failed` 또는 `.critical-escalated` — 0-byte marker.

## 회장 doctrine 박제

- chat_notifications == 0 — exception 박제도 telegram/cokacdir 노출 0 (회장 §8 1:1).
- long polling 0 — `run_one_cycle` 은 본 wrapper 호출 후 즉시 반환 (외부 cron 책임).
- forbidden 0 — anu_v2/executor_scheduler.py 단독 수정. auto_gemini_triage / owner_trigger_only / dashboard 비손상.
