# task-2704 — V3.6_RUNTIME_HARNESS_CONTROL_PLANE_P0_MVP (★ 회장 verbatim 2026-05-28 · 4 contract 한정 · finish-task profile 제외 · 초안 확인 전 dispatch 금지)

- Level: **Lv.3 infrastructure** (★ enforcement control plane · 향후 모든 ANU 본체 + 봇 운영품질 영향)
- type: **coding** (★ md/report 중심 금지 · py/sh/json/schema/test/hook config 중심)
- 분류: **v3.6 Runtime Harness Control Plane P0 MVP** (★ task-2703 안전벨트의 운영층 확장 · 메타 고도화 아님)
- 담당: **dev1-team 헤르메스** (★ 회장 verbatim 지정 · bot key c38fb9955616e24d · 선정 이유 verbatim: "task-2703 의 연장선이고 hook/runtime/dispatch marker 흐름을 이미 dev1 이 가장 많이 본 상태")
- chair_authorization_id: **`CHAIR-AUTH-TASK-2704-V36-CONTROL-PLANE-P0-MVP-260528`** (★ 회장 verbatim 발급 확정 2026-05-28)
- 완료 목표: **`V36_CONTROL_PLANE_P0_MVP_ACTIVE_AND_VERIFIED`**
- 상태: **`TASK_2704_GREENLIGHT_DISPATCH_AUTHORIZED_PRIMARY_ONLY`** (★ 회장 verbatim 발사 승인 2026-05-28 · 1차 dispatch.py 단일 · fallback 조건부)
- option: **B 옵션 (★ 회장 verbatim 승인 · 최소 결선 한정)**

## ★ 발사 방식 (★ 회장 verbatim 2026-05-28 — task-2703 fallback safety-net 자동 회수 패턴 정정)

> "dispatch.py + 봇별 key 직접 cron fallback 을 동시에 진행하지 마라. 1차는 dispatch.py 단일 발사만 한다. 직접 cron fallback 은 정해진 시간 내 구조화 spawn evidence 가 없을 때만 사용한다."

### 1차 발사 (★ 단일)
- `dispatch.py --team dev1-team --task-id task-2704 --level critical --type coding --skip-qc-gate --skip-brainstorming --override-routing`
- ★ 직접 cron 동시 진행 금지

### Fallback 발동 조건 (★ 5 신호 교차 → SPAWN_UNKNOWN/NOT_STARTED evidence 시만)
1. **dispatch marker 생성 여부** (`memory/events/task-2704.dispatched-*.json`)
2. **task timer running 여부** (`task-timers.json::tasks[task-2704].status`)
3. **bot session 여부** (별도 system_prompt hex path · ★ grep -v cokacdir 버그 금지 · process system_prompt path 직접 비교)
4. **artifact/worktree/recent output 여부** (`memory/events/task-2704.*` mtime / `.worktrees/task-2704-*` / bot output file)
5. **schedule_history 여부** (`/home/jay/.cokacdir/schedule_history/<schedule_id>.log`)
- 위 5 신호 교차 결과 = `SPAWN_UNKNOWN` 또는 `NOT_STARTED` 일 때만 fallback 발동
- 그 외 (`REGISTERED`/`FIRED`/`SESSION_SEEN`/`WORK_STARTED`/`ARTIFACT_SEEN` 이상) = fallback 발동 금지

### Fallback marker 강제 6 필드 (★ 발동 시 기록)
- `fallback_reason` (string · 5 신호 교차 결과 요약)
- `primary_schedule_id` (string · 1차 dispatch.py cron id)
- `fallback_schedule_id` (string · fallback cron id)
- `spawn_state_before_fallback` (enum · 9-state machine)
- `checked_sources` (object · 5 신호 각각 결과)
- `timestamp` (ISO 8601 KST)

### ANU fallback safety-net cron (★ task-2703 패턴 정정)
- task-2703 시 ANU 가 dispatch 직후 자동 등록한 fallback safety-net cron 패턴 = 회장 verdict 5 gap #5 "fallback safety-net 이 실제 회수 주체처럼 작동" 사고
- 본 task-2704 = ★ **ANU 자동 fallback cron 등록 금지** · 5 신호 교차 후 SPAWN_UNKNOWN/NOT_STARTED evidence 시에만 명시 등록

## ★ 분류 / 범위 (회장 verbatim 축소)

> "task-2704 후보 범위는 다음 P0만 허용한다: 1. dispatch marker contract · 2. spawn detection contract · 3. watchdog false alert suppression · 4. closeout marker watcher."

- **범위 확정 4 contract**: layer 1 (dispatch marker) + layer 2 (spawn detection) + layer 3 (watchdog suppression) + layer 4 (closeout marker watcher)
- **범위 밖**: #5 task md sha contract (P1 보류) · #6 finish-task profile (SEPARATE_VERIFICATION_REQUIRED · 영향 큼) · #8 actor attribution contract (P1 보류)
- **상위 spec**: [[v36_runtime_harness_control_plane]] · [[v36_runtime_harness_state_machine]] · [[v36_runtime_harness_decision.schema]] · [[task-2703_operational_incidents_to_contract_map]]

## ★ task-2703 회장 verdict (배경 · 회장 verbatim 박제)

`TASK_2703_ACCEPT_WITH_CONTROL_PLANE_GAPS` (★ 회장 verbatim 2026-05-28)
- v3.6 harness production-load evidence 확보: ANU fallback session Bash echo 가 실제 hook 에 의해 **DENY** + 회장 세션 Write 가 **HOLD_FOR_CHAIR**
- task-2703 자체 무효화 0
- 단 5 control plane gap 확정 (★ 본 task-2704 가 cover 책임):
  1. **normal callback BC5600A5 가 봇 done 보다 먼저 fire → 최종 ack envelope 누락**
  2. **`.done.escalated` 자동 발생**
  3. **`task-2703.result.json` 부재**
  4. **closeout marker 생성 후 ANU 즉시 회수 실패**
  5. **fallback safety-net 이 실제 회수 주체처럼 작동**
- ★ 본 5 gap → layer 1 (dispatch marker · timing audit) + layer 2 (callback fire 순서 spawn 신호) + layer 3 (watchdog .done.escalated 분류) + layer 4 (closeout marker watcher 가 ANU 즉시 회수 책임 회복) 로 cover

## ★ 4 contract 구현 요구사항 (회장 verbatim 박제)

### 4 contract #1 — dispatch marker contract (layer 1)

- dispatch 성공 즉시 `task-N.dispatched-*.json` 생성
- 필드: `schedule_id` · `executor` · `bot_key_hash` · `fire_time` · `prompt_sha` · `task_md_sha_before` · `dispatch_method`
- **코드 강제** — ANU manual 의존 0
- dispatch_method enum: `dispatch_py` / `direct_cron_bot_key` / `fallback_safety_net`
- bot_key_hash = `sha256(bot_key)[:16]` (★ raw key 금지)

### 4 contract #2 — spawn detection contract (layer 2)

- grep/process 단독 판단 금지
- schedule_history 단독 판단 금지
- 교차 검증 신호: `task_id` · `schedule_id` · `timer` · `bot session` · `artifact mtime` · `bot output` · `dispatch marker`
- 신호 부족 시 `SPAWN_UNKNOWN` 으로 둔다. **`spawn 0` 단정 금지** (★ 회장 verbatim)
- 9-state machine ([[v36_runtime_harness_state_machine]] §1): NOT_REGISTERED / REGISTERED / FIRED / SESSION_SEEN / WORK_STARTED / ARTIFACT_SEEN / CALLBACK_REGISTERED / DONE / UNKNOWN

### 4 contract #3 — watchdog false alert suppression (layer 3)

- `hb_age=-1`, `ev_age=-1` 만으로 stalled chat 발송 금지
- alive 신호 OR 집합 중 하나라도 살아 있으면 `ALERT_ONLY_INTERNAL` 로 제한 (★ 회장 verbatim)
- alive 신호: `dispatch marker` 존재 / `task timer` running / `recent artifact mtime < 900s` / `bot output` 진입 / `closeout marker` 존재 / `bot session process` active
- 회장 chat 발송은 `ESCALATE_CHAIR` 조건에서만 허용 (★ 회장 verbatim)
- ESCALATE_CHAIR 조건: silently_stalled 2 cycle 연속 + (Critical 7 분류 OR 회장 명시 escalate)
- `.escalate` / `.escalate.acked` 마커 존재 시 즉시 skip (회장 task-2405 fix#A 보존)

### 4 contract #4 — closeout marker watcher (layer 4)

- 봇이 closeout marker 를 만들면 ANU 가 **즉시 회수**
- 회수 우선순위 3 경로: `normal callback` (1순위) → `closeout marker watcher` (2순위) → `fallback safety-net` (3순위)
- closeout marker 패턴: `memory/events/<task_id>.*active.json` / `<task_id>.harness-mvp-active*` / `<task_id>.done*`
- closeout marker 이후 finish-task 진행 중이면 `DONE` 단정이 아니라 `FINISH_IN_PROGRESS` 로 구분
- 6-state machine: `WORK_CLOSEOUT_STARTED` → `FINISH_IN_PROGRESS` → `CALLBACK_LAUNCHED` → `DONE` → `ANU_RECEIVED` → `CHAIR_REPORTED`

## ★ 절대 금지 (★ 회장 verbatim 박제 + 추가)

- **finish-task.sh 수정 금지** (★ 회장 verbatim · 영향 범위 큼 · 별도 검증 필요)
- **task_mode profile 구현 금지** (★ 회장 verbatim · #6 SEPARATE_VERIFICATION_REQUIRED 유지)
- **Goal-to-Done · PHASE_AUTO · Core/Work 이원화 금지** (★ 회장 verbatim)
- **merge executor activation 금지** (★ 회장 verbatim · activation_flag=False 유지)
- **PR 생성 / branch push / merge 금지** (★ 회장 verbatim · 모든 mutating GitHub 작업 0)
- **task-2705 자동 발의 금지** (★ 회장 verbatim · 다음 task 후보는 보고만)
- **ANU 본체 직접 구현 금지** (task-2703 패턴 보존)
- **ANU 본체 단독 closeout 판정 금지** (task-2703 패턴 보존)
- **구현 executor 와 검증 주체 분리 필수** (task-2703 패턴 보존)
- **ANU 자가검증만으로 closeout PASS 처리 금지** (task-2703 패턴 보존)
- **task-timers status 위조 / manual .done 위조 / G4 marker 삭제 금지**
- 본 task 범위 외 메타 고도화 확장 금지

## ★ 회장 결정 확정 (★ B 옵션 승인 2026-05-28 · 최소 결선 한정)

회장 verbatim: "task-2704 옵션은 B 로 승인한다. 단, 허용 범위는 최소 결선으로 제한한다."

### B 옵션 허용 (★ 회장 verbatim · 1·2·3)

1. **`dispatch.py` 최소 수정**
   - dispatch 성공 직후 dispatch marker 생성 결선만 허용
   - 기존 dispatch 동작 변경 금지
   - **marker write 실패 시 dispatch 본동작을 깨지 않도록 safe-fail 설계** (★ 회장 verbatim)

2. **`scripts/session-watchdog.sh` 최소 수정**
   - hb_age=-1 / ev_age=-1 기반 false stalled chat 발송 억제
   - dispatch marker · task timer · recent artifact · bot output 교차 확인 결선
   - **ESCALATE_CHAIR 조건 외 회장 chat alert 금지** (★ 회장 verbatim)

3. **신규 모듈/테스트/fixture/schema 작성**
   - `scripts/harness/v36/` 하위 신규 파일
   - `tests/harness/` 하위 회귀
   - `memory/events`/`memory/reports` 산출물

### 조건부 허용 (★ 회장 verbatim · 기본 금지 + 별도 명시 승인 시에만)

- **`.claude/settings.json` 수정 = 기본 금지**
- 정말 필요하면 **왜 기존 v3.6 hook 결선으로 부족한지 먼저 보고** + 회장 별도 명시 승인 받음
- 본 task md 갱신 시점 기준 = ★ 기존 v3.6 harness hook 결선 활용 default · settings.json 신규 수정 0

## allowed_resources (★ 회장 B 옵션 확정 반영)

```yaml
allowed_resources:
  expected_files_new:
    - "scripts/harness/v36/dispatch_marker_writer.py (layer 1 · safe-fail 강제)"
    - "scripts/harness/v36/spawn_detector.py (layer 2 · 9-state machine · UNKNOWN 강제)"
    - "scripts/harness/v36/watchdog_suppression_gate.py (layer 3 · alive 신호 OR 7)"
    - "scripts/harness/v36/closeout_marker_watcher.py (layer 4 · daemon 또는 hook)"
    - "scripts/harness/v36/runtime_decision_logger.py (JSONL writer · schema 검증)"
    - "scripts/harness/v36/__init__.py (기존 있으면 확장 · 없으면 신규)"
    - "tests/harness/test_v36_dispatch_marker_*.py"
    - "tests/harness/test_v36_spawn_detector_*.py"
    - "tests/harness/test_v36_watchdog_suppression_*.py"
    - "tests/harness/test_v36_closeout_watcher_*.py"
    - "tests/harness/test_v36_integration_*.py"
    - "tests/harness/fixtures/v36_*.json (mock fixture)"
    - "memory/events/task-2704.* (보고/마커)"
    - "memory/reports/task-2704.md"
  allowed_existing_file_edits:
    - "dispatch.py (★ B 옵션 회장 verbatim 허용 · 최소 결선 한정 · marker 생성 결선만 · 기존 dispatch 동작 변경 0 · marker write 실패 시 safe-fail)"
    - "scripts/session-watchdog.sh (★ B 옵션 회장 verbatim 허용 · 최소 결선 한정 · hb_age=-1/ev_age=-1 기반 false stalled chat 억제 + alive 신호 교차 확인 + ESCALATE_CHAIR 외 chat 0)"
  conditional_pending_separate_chair_approval:
    - "/home/jay/.claude/settings.json (★ 기본 금지 · 정말 필요 시 '기존 v3.6 hook 결선으로 부족한 사유' 먼저 보고 + 별도 명시 승인 후)"
    - "/home/jay/workspace/.claude/settings.json (★ 동상)"
  forbidden_files:
    - "scripts/finish-task.sh (★ 회장 verbatim 절대 금지 · 영향 범위 큼)"
    - "utils/merge_queue_executor.py (★ activation 0)"
    - "utils/real_merge_hooks.py (★ activation 0)"
    - "anu_v3/goal_loop_planner.py (★ Goal-to-Done 범위 밖)"
    - "anu_v3/phase_auto*.py (★ PHASE_AUTO 범위 밖)"
    - "anu_v3/core*.py · anu_v3/work*.py (★ Core/Work 이원화 범위 밖)"
    - "PR #158 / PR #159 / PR #160 branch"
    - "task-2700 / task-2700+1 / task-2703 branch"
    - "workspace_root 외부 (★ /home/jay/workspace 만)"
  commands:
    - "구현: 신규 py/sh/json/schema/test · fixture · 기존 dispatch.py/watchdog.sh 최소 결선"
    - "검증: pytest fixture/mock · production load evidence (실제 dispatch fire → marker 생성 · watchdog cycle → chat 0 · closeout marker → ANU signal)"
    - "★ real GitHub write 0 · merge 0 · branch push 0 · PR 생성 0 · finish-task.sh 수정 0"
    - "★ task-timers 직접 위조 0 · manual .done 0 · G4 marker 삭제 0"
    - "★ dispatch.py 수정 시 safe-fail 강제 · 기존 dispatch 동작 변경 0"
    - "★ watchdog 수정 시 ESCALATE_CHAIR 외 chat 발사 0"
  merge_policy: "control_plane_p0_mvp_local_verification_no_remote_writes_no_finish_task_change_b_option"
  ttl_hours: 18
```

## ★ Definition of Done (10 항목 · 4 contract 각 + 통합)

1. **dispatch marker contract**: dispatch.py 또는 wrapper 에서 fire 직후 marker 자동 생성 evidence (7 필드 schema validation PASS · raw key 0)
2. **spawn detection contract**: 9-state machine 코드화 + `UNKNOWN` 분기 fixture coverage (★ ad-hoc grep 단정 패턴 차단 fixture 포함)
3. **watchdog false alert suppression**: alive 신호 OR 집합 7 코드화 + `ALERT_ONLY_INTERNAL` vs `ESCALATE_CHAIR` 분기 fixture PASS · chat sendMessage 발사 0 (★ alert-only 시뮬레이션에서 chat 0 evidence)
4. **closeout marker watcher**: daemon/file event/hook 중 하나로 marker 패턴 감지 + ANU 세션에 next_action signal 전달 evidence · 6-state machine 분기 coverage
5. **통합 시나리오**: 실제 fake task 발사 → dispatch marker 생성 → spawn detection state progression → watchdog skip → closeout marker watcher signal 전체 end-to-end fixture PASS
6. **JSONL evidence schema**: 모든 결정 record 가 `memory/schemas/v36_runtime_harness_decision.schema.json` 검증 PASS
7. **regression**: 본 task 신규 + 기존 affected 테스트 PASS · 새 fail 0 (★ task-2703 150 pytest 회귀 PASS 유지)
8. **forbidden write 0**: git push history 0 · gh pr/issue create 0 · finish-task.sh diff 0 · merge_queue_executor activation 0 · git diff 가 본 task scope 외 0
9. **closeout marker**: `memory/events/task-2704.control-plane-p0-active.json` + finish-task.sh 정상 실행
10. **검증 주체 분리 + 자가검증 회피**: Vulcan(Sonnet) 구현 / Maat(Sonnet 횡단) 독립 검증 / Hermes(Opus) 통합·조정 · ANU 본체 단독 closeout 판정 0 (★ task-2703 패턴 보존)

## ★ Acceptance Evidence (DoD 1~9 증거 필수)

- DoD 1: dispatch marker 7 필드 fixture sample 1건 + schema validation PASS log
- DoD 2: 9-state 각각 진입 fixture 1건 이상 + UNKNOWN 분기에서 "단정 금지" 패턴 차단 PASS
- DoD 3: alive 신호 OR 7 각각 fixture + ALERT_ONLY_INTERNAL chat 0 시뮬레이션 + ESCALATE_CHAIR 정상 chat 발사 PASS
- DoD 4: closeout marker 5 패턴 각 detect fixture + 6-state 분기 PASS
- DoD 5: end-to-end fake task `task-fake-2704-integration` 시뮬레이션 전체 PASS log
- DoD 6: JSONL schema validator 가 모든 record 검증 PASS
- DoD 7: pytest fail 0 + task-2703 회귀 150 PASS 유지
- DoD 8: git push / gh pr / merge 호출 0 confirmed
- DoD 9: closeout marker 정상 + finish-task.sh 호출 (★ 수정 0)

## ★ 보고 필드 (★ #8 actor attribution 표현 회장 verbatim 강제)

1. 4 contract 각각 구현 위치 + matched module/rule
2. dispatch marker schema PASS evidence
3. 9-state machine fixture coverage + UNKNOWN 분기
4. watchdog alive 신호 OR 7 + chat 발사 0 evidence
5. closeout marker watcher signal 전달 evidence
6. JSONL schema validation 결과
7. regression PASS 수 (신규 + task-2703 회귀)
8. forbidden write 0 confirmation
9. 다음 단계 제안 (★ 보고만 · 자동 dispatch 금지)
10. **actor 표현 (★ 회장 verbatim 박제 · 단정 금지)**:
    > "Hermes 는 주요 feature 구현자가 아니라 통합·조정자, Vulcan 은 주요 구현, Maat 는 검증. Hermes 소규모 직접 패치 가능성은 self-attestation 만으로 완전 배제 불가"
11. forbidden_action_count

## ★ 종결

성공: **`V36_CONTROL_PLANE_P0_MVP_ACTIVE_AND_VERIFIED`**

→ task-2703 v3.6 harness MVP 위에 운영층 4 contract (dispatch marker / spawn detection / watchdog suppression / closeout marker watcher) 추가. ANU 본체 + 봇 운영품질 결함 5건 (P0 #1·#2·#3·#4·#7) cover. #5·#8 P1 보류 · #6 SEPARATE_VERIFICATION_REQUIRED 유지.

★ 회장 verbatim 2026-05-28 task-2704 축소. finish-task profile (#6) 별도 task. actor attribution (#8) 별도 task. task md sha (#5) P1 보류. 표현 단정 금지. 4 contract 한정 · MVP까지만 · 자동 task-2705 발의 0.

끝