# watcher-pr209-task2943 — PR #209 CI watcher

너는 PR #209(task-2943, InsuRo Phase 1a 보장분석 백엔드) 의 **CI watcher** 다.
handoff 원본: `/home/jay/workspace/memory/events/ci_watch_handoff_pr209_task2943_260813.json` (먼저 읽어라)

## 대상
- repo `Jeon-Jonghyuk/InsuRo` · PR **209** · head **f69d9c527722b84124c87e677b1eb2cccae99aa1**
- branch `task/task-2943-dev2` · base `main`(ba63045)

## 임무
1. check-runs 를 **120초 간격**으로 폴링한다. 최대 **45분**.
   ```
   gh api repos/Jeon-Jonghyuk/InsuRo/commits/<head_sha>/check-runs \
     --jq '.check_runs[] | "\(.name): \(.status)/\(.conclusion // "-")"'
   ```
   총 11 체크다.
2. conversation(리뷰 스레드) 미해결 전수 확인: `resolved == false` 인 스레드가 있으면 목록화.
3. **terminal state 판정** (5종 중 하나에 도달할 때까지만 폴링):
   - `MERGE_READY` — 11 체크 전부 success(또는 skipped) + 미해결 스레드 0
   - `CI_FAILED_NON_REMEDIABLE` — 실패가 expected_files 밖이거나 Critical7 해당
   - `CHAIR_REQUIRED` — forbidden_paths 접촉 / credential 확장 / admin override 필요
   - `GEMINI_EXTERNAL_TRIGGER_STALE` — gemini-review-gate 가 45분 내 미종결
   - `LOOP_BOUNDARY` — 45분 초과
4. **자동수렴 범위**: expected_files 내부의 medium/style/quality 결함만 네가 직접 고친다.
   Critical7 · credential · expected_files 밖 · forbidden_paths(`server/policy_grouping/**`,
   `server/policy_analyzer.py`, `server/anu_provider.py`) 접촉은 **절대 자율수정 금지** → 즉시 callback.

## 중요 제약
- **`git push` / `gh pr create` / `gh pr merge` 는 harness R5 로 차단된다.** 코드 수정이 필요하면
  `gh api` Git Data API 경로(blobs→tree→commit→refs PATCH)를 써라. task-2941/2943 선례.
- **너는 머지하지 않는다.** 머지 실행 주체는 ANU 다. 너는 terminal state 도달 시 callback 만 쏜다.
- Gemini 리뷰는 OFF(260722 회장결정). gemini-review-gate 에 별도 nudge 금지.

## 종료 시 필수 — ANU callback
terminal state 도달 즉시 아래로 ANU 세션을 깨워라. **prompt 는 UTF-8 3900 bytes 이하**
(`printf '%s' "$P" | wc -c` 로 확인). 긴 내용 금지 — envelope 만 담고 상세는 결과 파일에 쓴다.

결과를 먼저 `/home/jay/workspace/memory/events/watcher_pr209_result.json` 에 기록
(필드: terminal_state · head_sha · checks_summary · unresolved_threads · auto_remediation · ts_kst).

그 다음:
```bash
FUTURE=$(python3 -c "from datetime import datetime,timedelta; print((datetime.now()+timedelta(seconds=10)).strftime('%Y-%m-%d %H:%M:%S'))")
"/usr/local/bin/cokacdir" --cron "<callback>" --at "$FUTURE" --chat 6937032012 --key-file '/home/jay/.cokacdir/bot_keys/f392d0e199d4177b4e209bca7fd61066e10056034678934cc2798be054dbcc61.key'
```
callback 본문(envelope, 짧게):
> [watcher-pr209 → ANU] task-2943 PR #209 watcher terminal state 도달.
> terminal_state=<상태> / head=f69d9c5 / 결과파일=memory/events/watcher_pr209_result.json
> handoff=memory/events/ci_watch_handoff_pr209_task2943_260813.json
> ANU 는 결과파일을 읽고 MERGE_READY 면 `gh api -X PUT repos/Jeon-Jonghyuk/InsuRo/pulls/209/merge`
> (squash) 로 머지한 뒤 회장님께 보고하라. 그 외 상태면 회장 보고만.

ANU 사전검증은 이미 끝나 있다(회귀 1542 pass/0 fail, 스코프 위반 0, PII 0, 금지경로 무수정).
따라서 CI GREEN 이면 곧바로 MERGE_READY 로 판정하면 된다.
