# PR #268 CI 워처 — 확장 다운로드 최신화 (task-3049)

## 목표
`Jeon-Jonghyuk/InsuRo` PR **#268** 의 **필수 체크 8종**이 전부 `success` 가 되면 **머지만** 하고
ANU 에 콜백한다. ★ **배포는 절대 하지 마라.** 배포는 회장 승인 후 ANU 가 직접 한다.

## 배경 (ANU 독립 재측정 완료 — 재조사 불필요)
ANU 가 전수검사를 마쳤다. 회귀 base 2900→head 2926(pytest) · 1658→1677(vitest) 실패 0,
blob 6/6 MATCH, 자작 변이 10종 검사 완료, scope-guard override 박제 완료
(`memory/events/task-3049.anu-override.json`). **머지 승인 상태**다.

머지가 405 로 막힌 원인은 CI 실패가 아니라 `mergeable_state=behind` 였다. ANU 가
`update-branch` 로 해소했고 새 head 는 `acaa300f716b20c03e7a1f8f4df421addf9d8be4` 다.
업데이트 후 델타 양방향 감사 완료 — 6파일 blob sha 전부 불변, 파일 수 6건 불변.

## ★★ 필수 체크는 8종뿐이다 (e2e-test 는 필수가 아니다)
```
cancel-kill-switch · qc-check · hidden-path-audit · lock-in-check
merge-safety-check · gemini-review-gate · ci/guard · guard
```
`e2e-test` 는 **failure 가 정상**이다. base 상속 적색이며 ANU 가 job 로그를 직접 조회해
실패 3건이 `new-design-comparison-honest-disclosure.spec.ts`(2) +
`task-2998-menu-consolidation.spec.ts`(1) 임을 확인했다. 전부 이 PR 이 한 줄도
건드리지 않은 파일이고, base PR #266 head 에서도 동일하게 failure 였다.
**e2e-test 적색을 이유로 머지를 보류하지 마라.**

## 절차
1. 토큰 로드
   ```
   set -a; source /home/jay/workspace/.env.keys; set +a
   ```
2. CI 폴링 (최대 40분, 3분 간격)
   ```
   R=Jeon-Jonghyuk/InsuRo
   H=$(GH_TOKEN="$BOT_GITHUB_TOKEN" gh api repos/$R/pulls/268 --jq '.head.sha')
   GH_TOKEN="$BOT_GITHUB_TOKEN" gh api repos/$R/commits/$H/check-runs \
     --jq '.check_runs[] | "\(.conclusion // .status) \(.name)"'
   GH_TOKEN="$BOT_GITHUB_TOKEN" gh api repos/$R/pulls/268 --jq '.mergeable_state'
   ```
3. **필수 8종이 전부 `success`** 이고 `mergeable_state` 가 `blocked`/`behind` 가 아니면 머지한다.
   ```
   GH_TOKEN="$BOT_GITHUB_TOKEN" gh api -X PUT repos/$R/pulls/268/merge \
     -f merge_method=squash -f expected_head_sha=$H
   ```
   ★ `gh pr merge` CLI 는 하네스가 차단한다. 위 REST 경로만 쓴다.
   ★ `GH_TOKEN` 주입 필수. 빠뜨리면 회장 개인 PAT 로 인증돼 감사기록이 오염된다.
   ★ 다시 `behind` 가 되면 `update-branch` 후 새 head 로 재핀하고 폴링을 이어간다.

4. 머지 후 검증 (squash 라 `--is-ancestor` 는 항상 NO — **blob 동일성**으로 판정하라)
   ```
   cd /home/jay/projects/InsuRo && git fetch origin main -q
   git rev-parse --short origin/main
   for f in .github/workflows/extension-release.yml server/routes/extension.py \
            src/pages/CompositeExtensionGuide.tsx; do
     echo "$(git rev-parse origin/main:$f)  $f"; done
   ```
   기대 blob: `d9011394…` / `e32b2f1e…` / `175461ee…`

5. **배포 금지.** `git pull` · 서버 재기동 · CF Pages 배포 전부 하지 마라.

## 종료 상태 (terminal_states) — 도달 즉시 ANU 콜백
- `MERGE_READY` — 머지 완료 + blob 3/3 MATCH
- `CI_FAILED_NON_REMEDIABLE` — 필수 8종 중 하나가 failure (어떤 체크·어떤 로그인지 명시)
- `CHAIR_REQUIRED` — 권한/룰셋 문제로 머지 불가
- `LOOP_BOUNDARY` — 40분 내 미수렴

## ANU 콜백 (UTF-8 ≤3900 bytes · 봉투만)
```
"/usr/local/bin/cokacdir" --cron "<봉투>" --at "<+10초>" --chat 6937032012 \
  --key-file '/home/jay/.cokacdir/bot_keys/f392d0e199d4177b4e209bca7fd61066e10056034678934cc2798be054dbcc61.key'
```
봉투 필수 필드: `task_id=task-3049` · `pr=268` · `terminal_state=<위 4종 중 1>` ·
`merged=<true|false>` · `main_sha=<머지 후 origin/main short sha>` · `blob_match=<n/3>` ·
`deployed=false` · `collector_role=ANU` · 한 줄 요약.
★ 봉투에 긴 보고 금지. `printf '%s' "$P" | wc -c` 로 byte 확인 후 발사.
