# task-2671 — PR_149_B557FE71_CI_GEMINI_WATCHER (★ task-2667 후속)

- Level: Lv.2 (★ read-only 관찰 · 코드 수정 0 · merge 0 · nudge 0)
- 담당: **dev6 페룬** (★ 회장 verbatim · task-2670 dev8 라와 분리 · task-2662~2669 작성자 충돌 회피)
- base: PR #149 task/task-2662-dev2 (★ watcher 전용 · 별도 worktree task-2671-dev6)
- 단일소스: 본 task md
- chair_authorization_id: **`CHAIR-AUTH-PR149-B557FE71-CI-GEMINI-WATCH-20260526-JJONGS-WATCH-001`** (★ ANU 권고 · 회장 verbatim 발급 대기)

## 배경

PR #149 b557fe71 GEMINI_EXTERNAL_TRIGGER_STALE 분류 → /gemini review nudge 1회 발사 (★ 회장 verbatim 승인 · comment_id 4535375647 · 2026-05-26T00:27:34+09:00 KST). 이후 fresh Gemini review for head b557fe71 도착 + CI 재실행 관찰 강제.

task-2667 watcher (head 4bb627fe 기준) 결과와 혼합 금지 (★ 회장 verbatim 1:1).

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

- chair_authorization_id 발급 권고 (★ 위 ID)
- executor: dev6 페룬 (★ task-2670 dev8 라와 executor 분리 · idle 상태 봇)
- 범위: read-only 관찰 (★ 코드 0 · merge 0 · auto-merge 0 · nudge 0)
- 대상: PR #149 head `b557fe712367e4eb920bba662631487426e18091`

## CI_WATCH_HANDOFF 12 필드 (회장 verbatim)

1. pr_number: 149
2. head_sha: b557fe712367e4eb920bba662631487426e18091
3. branch: task/task-2662-dev2
4. expected_files: ★ 관찰만 · 수정 0
5. forbidden_paths: 전체 (★ watcher = read-only)
6. watcher_owner: dev6 페룬
7. max_watch_minutes: 60
8. poll_interval_seconds: 120
9. gemini_nudge_policy: **NUDGE_0** (★ 회장 verbatim 금지 · 이미 nudge 1회 완료)
10. auto_remediation_policy: **AUTO_REMEDIATION_0** (★ 회장 verbatim 금지)
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 b557fe71 기준 fresh review 도착 여부)
6. unresolved thread count 확인
7. mergeable / mergeStateStatus 확인
8. terminal state 도달 시 ANU normal callback 1회 보고

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

1. 코드 수정 (★ 전체 파일)
2. PR #149 merge
3. auto-merge
4. **Gemini nudge** (★ 이미 1회 완료 · 추가 금지)
5. dev bot 재dispatch
6. expected_files 밖 수정
7. Axis 1/2/3 runtime 변경
8. dispatch.py 변경
9. live settings.json 변경
10. HARNESS_ENFORCED 전체 선언

## ★ 중요 격리 anchor (회장 verbatim)

- ★ **task-2670 RCA 결과와 본 watcher 결과 혼합 금지**
- ★ task-2667 (head 4bb627fe) 결과는 historical 기록 · 본 task와 별개
- ★ head b557fe71 기준 평가만 수행

## 보고 필수 11

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

## 완료 상태 (회장 verbatim)

- 성공: **`PR_149_B557FE71_CI_GEMINI_WATCH_TERMINAL_STATE_REPORTED`**
- watcher 종료 분류: terminal_states 5 enum 중 1개 도달 후 ANU normal callback

## expected_files (~3)

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

## allowed_resources

```yaml
allowed_resources:
  paths:
    - "memory/events/task-2671.*"
    - "memory/reports/task-2671.md"
    - "memory/tasks/task-2671.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/anu-timeline-queue-collision-normalized-cfa86a2-260526.json"
    - "memory/events/task-2667.pr-149-ci-gemini-watch-result-260525.json (★ historical · 4bb627fe 기준 · 혼합 금지)"
  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/events/task-2668*"
    - "memory/events/task-2669*"
    - "memory/events/task-2670*"
    - "memory/tasks/task-2662*"
    - "memory/tasks/task-2663*"
    - "memory/tasks/task-2664*"
    - "memory/tasks/task-2665*"
    - "memory/tasks/task-2666*"
    - "memory/tasks/task-2667*"
    - "memory/tasks/task-2668*"
    - "memory/tasks/task-2669*"
    - "memory/tasks/task-2670*"
    - "**/.env*"
    - "**/credentials*"
  commands:
    - "gh pr view"
    - "gh api graphql"
    - "gh api"
    - "python3 -c"
    - "python3 -m json.tool"
    - "ls"
    - "cat"
    - "sha256sum"
    - "wc"
    - "printf"
    - "grep"
    - "find"
    - "tail"
    - "head"
    - "cokacdir --cron"
    - "cokacdir --currenttime"
    - "touch"
    - "mkdir"
    - "sleep"
  merge_policy: "watch_only_b557fe71_no_pr_no_merge_no_code"
  ttl_hours: 2
```

## frozen anchors

- ANCHOR-1: "★ watcher = read-only · 코드 수정/PR/merge/PR comment/Gemini nudge 일체 0"
- ANCHOR-2: "★ max_watch=60min · poll_interval=120s · 5 terminal_states 중 1개 도달 시 즉시 종료"
- ANCHOR-3: "★ terminal state 도달 시 ANU normal callback 1회 (★ ANU key · UTF-8 ≤3900 bytes · envelope only)"
- ANCHOR-4: "★ executor dev6 페룬 (★ task-2670 dev8 라와 분리 · task-2662~2669 작성자 충돌 회피)"
- ANCHOR-5: "★ head b557fe71 기준만 평가 · task-2667 결과 혼합 금지 · task-2670 RCA와 혼합 금지"

## finalize 프로토콜

1. base = PR #149 task/task-2662-dev2
2. 별도 worktree task-2671-dev6
3. dev6 페룬 봇 작업 (★ read-only 관찰만)
4. poll_interval 120s · max 60min (★ 30 polls max)
5. 5 terminal_states 중 1개 도달 시 즉시 종료 + ANU callback
6. result memory/events/task-2671.pr-149-b557fe71-ci-gemini-watch-result-260526.json
7. ANU normal callback cron (helper · ANU key `c119085addb0f8b7` · self-key 0 · UTF-8 ≤3900 bytes · envelope only · terminal state 도달 시점 absolute timestamp now+30s)
8. .done 발행

## 회장 보고 형식 (verbatim)

성공: **`PR_149_B557FE71_CI_GEMINI_WATCH_TERMINAL_STATE_REPORTED`**

끝
