# task-2667 — PR_149_CI_GEMINI_WATCH_HANDOFF (Track A-1 watcher)

- Level: Lv.2 (★ 관찰만 · 코드 수정 0 · merge 0 · 코드/runtime 변경 0)
- 담당: **dev7 이참나** (★ 회장 verbatim · task-2662 dev2/2663 dev6/2664 dev4/2665 dev3/2666 dev8 충돌 회피)
- base: PR #149 task/task-2662-dev2 (★ watcher 전용 · 별도 worktree task-2667-dev7)
- 단일소스: 본 task md
- chair_authorization_id: **`CHAIR-AUTH-PR149-CI-GEMINI-WATCH-20260525-JJONGS-HANDOFF-001`** (★ 회장 verbatim 발행 완료 2026-05-25)

## 배경

PR #149 X1 자동수렴 완료 후(head 4bb627fe · Thread 3+4 resolved · regression 16/16 PASS) CI/Gemini 진행 중. 회장 verbatim: "회장-ANU 핑퐁 잘못된 운영 · CI_WATCH_HANDOFF 원칙에 따라 watcher 봇 위임".

## 회장 verbatim 결정 (1:1)

- chair_authorization_id 발행 완료
- executor: dev7 이참나 (★ task-2662 작성자 dev2 오딘 제외 · 병렬 task 봇 충돌 0)
- 대상: PR #149 head `4bb627fe9252acacc1c32007211807fe9905809f`
- 목표: CI/Gemini/mergeStateStatus watcher 독립 관찰 · terminal state 도달 시 ANU normal callback 1회만 보고

## CI_WATCH_HANDOFF 12 필드 (회장 verbatim)

1. pr_number: 149
2. head_sha: 4bb627fe9252acacc1c32007211807fe9905809f
3. branch: task/task-2662-dev2
4. expected_files: ★ 관찰만 · 수정 0 (코드/test/spec 변경 절대 0)
5. forbidden_paths: 전체 (★ watcher 본분 = read-only)
6. watcher_owner: dev7 이참나
7. max_watch_minutes: 60
8. poll_interval_seconds: 120
9. gemini_nudge_policy: **NUDGE 0** (★ 회장 verbatim "Gemini nudge 재발사 금지")
10. auto_remediation_policy: **AUTO_REMEDIATION 0** (★ 회장 verbatim "코드 수정 0")
11. callback_on_terminal_state: ANU normal callback cron 1회 (★ ANU key `c119085addb0f8b7` · self-key 0 · UTF-8 ≤3900 bytes · envelope only)
12. terminal_states: ★ MERGE_READY · HOLD_FOR_CHAIR · GEMINI_EXTERNAL_TRIGGER_STALE · CI_FAILED_NON_REMEDIABLE · LOOP_BOUNDARY (★ 5 enum)

## 허용 8 (회장 verbatim 1:1)

1. PR #149 상태 관찰 (gh pr view · gh api graphql)
2. CI 11 checks 관찰
3. gemini-review-gate 관찰
4. phase3-merge-gate 관찰
5. latest Gemini review head SHA 확인 (★ head 4bb627fe 기준 fresh review 도착 여부)
6. unresolved thread count 확인
7. mergeable / mergeStateStatus 확인
8. terminal state 도달 시 ANU normal callback 1회 보고

## 금지 10 (회장 verbatim 1:1)

1. 코드 수정 (★ 전체 파일 · expected_files 밖 포함)
2. PR #149 merge
3. auto-merge
4. Gemini nudge 재발사 (★ /gemini review 코멘트 0)
5. dev bot 재dispatch
6. expected_files 밖 수정
7. Axis 1/2/3 runtime 변경
8. dispatch.py 변경
9. live settings.json 변경
10. HARNESS_ENFORCED 전체 선언

## 보고 필수 11 (회장 verbatim)

1. terminal state (★ 5 enum 중 하나)
2. PR 번호 (149)
3. head SHA (★ 관찰 시점 head)
4. CI 11 checks 상태 (각 check status/conclusion)
5. gemini-review-gate 상태
6. phase3-merge-gate 상태
7. latest Gemini review head 일치 여부 (★ head 4bb627fe match check)
8. unresolved thread count
9. mergeStateStatus
10. forbidden_action_count (target 0)
11. recommended next action

## 완료 상태 (회장 verbatim)

- 성공: **`PR_149_CI_GEMINI_WATCH_HANDOFF_DISPATCHED`** (★ dispatch 시점 인정)
- watcher 종료 분류: terminal_states 5 enum 중 1개 도달 후 ANU normal callback

## expected_files (~5 · 관찰 산출물만)

- `memory/events/task-2667.pr-149-ci-gemini-watch-result-260525.json` (★ 보고 11 필드 + watcher poll history)
- `memory/events/task-2667.done`
- `memory/reports/task-2667.md`

## allowed_resources

```yaml
allowed_resources:
  paths:
    - "memory/events/task-2667.*"
    - "memory/reports/task-2667.md"
    - "memory/tasks/task-2667.md"
    - "memory/system/.callback_ledger.jsonl"
    - "memory/.callback_inbox/**"
    - "INDEX.md"
  read_only_reference:
    - "PR #149 GitHub state (gh pr view / gh api graphql)"
    - "memory/events/track-a1-pr-149-single-polling-after-gemini-nudge-hold-for-chair-260525.json"
    - "memory/tasks/task-2662.md (★ PR #149 작성 task 참조)"
  forbidden_paths:
    - "/home/jay/.claude/settings.json"
    - "/home/jay/.claude/hooks/**"
    - "/usr/local/bin/cokacdir"
    - ".github/**"
    - "hooks/**"
    - "dispatch.py"
    - "dispatch/**"
    - "scripts/finish-task.sh"
    - "utils/**"
    - "tests/**"
    - "schemas/**"
    - "memory/specs/**"
    - "memory/events/task-2662*"
    - "memory/events/task-2663*"
    - "memory/events/task-2664*"
    - "memory/events/task-2665*"
    - "memory/events/task-2666*"
    - "memory/tasks/task-2662*"
    - "memory/tasks/task-2663*"
    - "memory/tasks/task-2664*"
    - "memory/tasks/task-2665*"
    - "memory/tasks/task-2666*"
    - "**/.env*"
    - "**/credentials*"
  commands:
    - "gh pr view"
    - "gh api graphql"
    - "gh api"
    - "python3 -c"
    - "python3 -m json.tool"
    - "ls"
    - "cat"
    - "stat"
    - "sha256sum"
    - "wc"
    - "printf"
    - "grep"
    - "find"
    - "tail"
    - "head"
    - "cokacdir --cron"
    - "cokacdir --currenttime"
    - "touch"
    - "mkdir"
    - "sleep"
  merge_policy: "watch_only_no_pr_no_merge_no_code_change"
  ttl_hours: 2
```

## frozen anchors

- ANCHOR-1: "★ watcher = read-only · 코드 수정/PR/merge/PR comment/Gemini nudge 일체 0"
- ANCHOR-2: "★ max_watch_minutes=60 · poll_interval=120s · 5 terminal_states 중 1개 도달 시 즉시 종료"
- ANCHOR-3: "★ terminal state 도달 시 ANU normal callback 1회 (★ ANU key c119085addb0f8b7 · UTF-8 ≤3900 bytes · envelope only)"
- ANCHOR-4: "★ task-2662 작성자 dev2 오딘 제외 · 병렬 task 봇(2663/2664/2665/2666) 충돌 0"
- ANCHOR-5: "★ Track B/C/D 병렬 유지 · 본 watcher 격리"

## 종결

성공: **`PR_149_CI_GEMINI_WATCH_HANDOFF_DISPATCHED`**

끝
