# TRACK C — DISPATCH FALSE-OK RUNTIME HARDENING (★ read-only · 회장 verbatim 2026-05-27)

- 작성: 2026-05-27T09:20 KST · ANU 본 chair-facing session
- 모드: read-only design (★ dispatch.py 전역 변경 금지 · 설계만)
- 근거: task-2694 BOT_DID_NOT_START + DISPATCH_FALSE_OK 실증 + [[feedback_dispatch_false_ok_and_prompt_limit_misclassification_260524]]

## 0. DISPATCH_FALSE_OK 실증 (★ task-2694)

- dispatch.py cron_response `status:ok` + schedule_id `72916195` 반환
- 그러나 cron-history 72916195 (ANU + dev8 self-key 양쪽) = "not found or access denied"
- worktree 0 / state file 0 / process 0 / 산출물 0 / .done 0
- 5h 5m 경과 후에도 evidence 0 → **BOT_DID_NOT_START** 확정

대조: task-2694+1 (dev7) 은 동일 dispatch.py 경로로 spawn 성공 (★ schedule_id B120FDF8 dev7 self-key channel hit · duration_ms 3316817) → 동일 코드 / 다른 결과 = **비결정적 spawn**.

## 1. dispatch.py status:ok 불신 doctrine (★ 회장 verbatim)

**Rule**: `dispatch.py cron_response status:ok` + `schedule_id 반환` + `prompt accepted` 는 **봇 spawn 성공 증거 아님**.

- status:ok = cokacdir 가 cron 등록 명령을 받았다는 의미 (★ 등록 ≠ fire ≠ spawn)
- schedule_id 반환 = 등록 ID 발급 (★ 실 채널 등록 보장 안 됨 · task-2694 72916195 not found 실증)
- 신뢰 가능 증거 = **spawn verification 4 신호만**

## 2. spawn verification hard gate (★ 회장 verbatim · task-2694+1 적용 실증)

fire 후 **5분 내** 4 신호 모두 확인:

| # | 신호 | 검증 방법 | task-2694 (FAIL) | task-2694+1 (PASS) |
|---|---|---|---|---|
| 1 | worktree 생성 | `git worktree list \| grep <tid>` | 0 (★ FAIL) | af24dbf5 ✓ |
| 2 | state/동등 생성 | `.tasks/state/<tid>.json` 또는 events 가공물 | 0 (★ FAIL) | codex-gate/qc-result ✓ |
| 3 | process or schedule_history | `cron-history <sid> --key <bot>` running/started | not found (★ FAIL) | dev7 self-key hit ✓ |
| 4 | task md sha256 일치 + worktree 인식 | capabilities sha256 + worktree task file | capabilities 0 (★ FAIL) | capabilities + worktree ✓ |

★ 4 신호 중 하나라도 없으면 `SPAWN_VERIFICATION_FAILED` 즉시 HOLD_FOR_CHAIR.

## 3. 4-signal 코드 위치 (★ ANU 본 세션 read-only 검증 패턴)

```bash
# signal 1: worktree
git worktree list | grep -E "<tid>"
# signal 2: state/가공물
ls .tasks/state/<tid>.json || ls memory/events/<tid>.codex-gate memory/events/<tid>.qc-result
# signal 3: process / schedule_history
cokacdir --cron-history <schedule_id> --chat <CHAT> --key <BOT_KEY>   # count>0 + status
# signal 4: capabilities sha256
cat memory/capabilities/<tid>.json | jq .source_sha256   # task md sha256 일치
```

## 4. BOT_DID_NOT_START 자동 분류 (★ 회장 verbatim)

4 신호 평가 후:
- 4 신호 모두 0 + 5분 경과 → `BOT_DID_NOT_START`
- 일부 신호 + 작업 중단 → `BOT_STARTED_NO_RESULT`
- 신호 일부 + cron-history not found → `DISPATCH_FALSE_OK`

## 5. schedule accepted ≠ runtime started doctrine (★ 회장 verbatim)

| 단계 | 의미 | 증거 |
|---|---|---|
| schedule accepted | dispatch.py 가 cokacdir 에 cron 등록 명령 전달 | status:ok (★ 신뢰 불가) |
| schedule registered | cokacdir 가 실제 채널에 등록 | cron-history hit (★ task-2694 not found) |
| runtime started | cron fire → 봇 session spawn | worktree + process + state (★ task-2694 0) |
| runtime completed | 봇 작업 완료 + .done | .done + 산출물 (★ task-2694 0) |

★ 각 단계 별 독립 evidence 필요. 앞 단계가 뒤 단계 보장 안 함.

## 6. timeout HOLD gate (★ 회장 verbatim · task-2694 적용 실증)

- fire 후 N분(★ 회장 verbatim 10분) 내 핵심 evidence 0 → `TIMEOUT_HOLD`
- task-2694 실증: fire 18:55:20 + 10분 timeout / 5h 경과 후에도 0 → CALLBACK_REGISTRATION_ENFORCEMENT_DOGFOOD_TIMEOUT_HOLD
- 추가 polling 금지 (★ 무기한 대기 0)

## 7. fallback safety-net 연계 (★ [[feedback_dispatch_must_register_fallback_safetynet_260520]])

- task-2694+1 실측: fallback cron 등록 0 (★ cron-list total=0)
- BOT_DID_NOT_START 시 fallback safety-net 이 있었다면 자동 재spawn 또는 ANU 자동 알림 가능
- 보강 후보: dispatch 시 normal + fallback(ANU-key · cancel-on-success) 둘 다 등록 (★ 단 dispatch.py 전역 변경 금지 → helper/wrapper 차원)

## 8. 적용 순서 (★ 회장 verbatim 후 별도 chair signature)

1. 현재 (★ 2026-05-27): 본 packet 작성 완료 + spawn verification hard gate 는 ANU 본 세션 운영 doctrine 으로 즉시 적용 (★ task-2694+1 에서 실증)
2. 별도 chair signature: dispatch false-ok 코드 hardening (★ helper/wrapper 차원 spawn verification 자동화 · dispatch.py 전역 변경 회피)
3. 운영 안정화: fallback safety-net 자동 등록

## 9. ANU 본 세션 즉시 적용 doctrine (★ 코드 변경 0 · 운영 규칙)

- 모든 dispatch 후 dispatch.py status:ok 단독 신뢰 0
- fire 후 5분 내 spawn verification 4 신호 직접 확인
- 4 신호 1+ 부재 → SPAWN_VERIFICATION_FAILED 또는 BOT_DID_NOT_START 즉시 HOLD_FOR_CHAIR
- timeout 도래 + evidence 0 → TIMEOUT_HOLD + 추가 polling 0

## 10. 변경 금지 (★ 회장 verbatim)

- dispatch.py 전역 변경 0
- live settings.json / hooks live / Axis runtime 0
- HARNESS_ENFORCED 전체 선언 0

끝
