# 작업 보고: task-3007 CI 워처 — PR #253

- 팀: dev3-team (다그다/Dagda) · 역할: CI 워처 (실행자 key `0b94683120a691cf`)
- 지시서: `memory/tasks/task-3007-ci-watch_260825.md` (sha256 `be9822d06dc5bb8b…` — **선행 검증 일치**)
- 대상: PR **#253** · repo canonical `Jeon-Jonghyuk/InsuRo` · branch `task/task-3007-dev3`
- head_sha: `16c27f42b69aeecf30294a2f2a1bd7a6e3b95120`
- **레벨: 코드 수정 없음** (감시 전용 — 저장소 코드 0줄 변경)

---

## S — 상황

ANU가 PR #253의 CI 종결 판정을 dev3 워처에 위임했다(handoff `473582B5`).
handoff 기록 시점 메모는 `8/11 success, in_progress=[ci, e2e-test, diagnostic]` 였다.

## C — 복잡성

CI GREEN 여부만 보고하면 되는 단순 작업처럼 보이나, 세 곳에서 명세와 실제가 어긋났다.
그대로 따랐으면 워처가 착수 자체를 못 하거나(인증), 미완료 체크를 오판할 수 있었다(legacy status).

## Q — 핵심 질문

PR #253의 check-runs terminal state는 무엇이며, 그 판정의 권위는 어디에 두는가?

## A — 해결

**`terminal_state = MERGE_READY`** — check-runs **11/11 success, failure 0, in_progress 0**.
2회 폴링에서 동일 결과. 머지·배포 미실행.

---

## A-1. 폴링 실측

| 회차 | 시각(KST) | success | failure | pending | head_sha | PR state |
|---|---|---|---|---|---|---|
| 1 | 13:49:06 | 11 | 0 | 0 | `16c27f42` | open · merged=false |
| 2 | 13:51:48 | 11 | 0 | 0 | `16c27f42` | open · merged=false |

- 2분 간격 규정 준수 (간격 162초), 상한 45분 대비 실소요 **2.7분**
- `mergeable`=true · `mergeable_state`=**clean**
- head_sha **폴링 간 불변** → 재푸시로 인한 판정 무효화 없음

체크 11종 전건 success: `ci` · `e2e-test` · `merge-safety-check` · `qc-check` · `ci/guard` · `lock-in-check` · `gemini-review-gate` · `guard` · `hidden-path-audit` · `diagnostic` · `cancel-kill-switch`

## A-2. 범위 감사 (금지경로 침범 0)

PR 변경 파일 **2건 = expected_files 정확 일치**:

| 파일 | 상태 | +/- |
|---|---|---|
| `server/policy_analyzer.py` | modified | +40 / -2 |
| `server/tests/test_policy_analyzer_timeout.py` | added | +243 / -0 |

`src/**` · `server/main.py` · `supabase/**` · `extension/**` 침범 **0건**.

## A-3. stale base 경고는 현재 무효

`task-3007.stale-base-warn.json`(12:24, `stale=true`)은 지금 성립하지 않는다.
`compare 3dad070…16c27f42` → **ahead_by 3, behind_by 0**. base 최신.

---

## 명세 ↔ 실측 어긋남 3건

**① 지시서 1단계 인증 경로가 존재하지 않는다**
`source /home/jay/workspace/projects/insuro/.env.keys` — **파일 부재**. `BOT_GITHUB_TOKEN` 미설정(`token_len=0`).
폴링은 `gh` CLI 기존 인증(JonghyukJeon, classic PAT / `repo,workflow,read:org,admin:repo_hook`)으로 수행했다.
→ 지시서대로만 실행했다면 1단계에서 정지했을 것이다.

**② handoff의 `in_progress` 메모는 기록 시점에 이미 무효였다**
마지막 완료 체크 `ci` = `04:39:44Z`(**13:39:44 KST**), handoff `created_at` = **13:45:00+09:00**.
즉 **워처 착수 전 이미 전건 종료** — 실대기 0분. handoff 메모를 사실로 승계했다면 없는 대기를 보고할 뻔했다.

**③ legacy combined status의 `pending`은 미완료가 아니다**
`commits/{sha}/status` → `state=pending` 이나 `statuses=[]`, `total_count=0`.
이는 legacy status 미사용에 의한 GitHub 기본값이지 대기 중인 체크가 아니다.
**판정 권위 = check-runs 11/11 + `mergeable_state=clean`.**

---

## ANU 판단 필요 3건

**① 보고서 해시 불일치 — 재검토 대상**
`anu-reviewed.json` 의 `report_sha256_16` = `d7843e699cb5fc72`
현재 `memory/reports/task-3007.md` sha256 앞16 = **`6affbfdf31b9c09b`**
→ 검토 후 보고서가 변경됨. **워처는 이 보고서를 수정하지 않았다**(별도 파일로 분리 작성한 이유).

**② CI GREEN ≠ 회장 증상 해소 (핵심)**
ANU 2차 검토 기록대로, 프론트 폴링 **180초**(`maxAttempts 60 × 3000ms`)가 백엔드 **420초**보다 먼저 포기한다.
실측 5회 중 3회(**183 / 191 / 248초**)는 머지·배포해도 화면에는 여전히 타임아웃이 뜬다.
**본 PR 단독 머지로는 증상 약 60% 잔존.** 프론트 폴링 상향이 후속으로 필요하다.

**③ 타이머 귀속 표기 불일치**
`task-timers.json` 의 task-3007 항목: `team_id=dev3-team` 인데 `bot=bot-f`, `role=dev5`.
Codex가 지적한 *오케스트레이션 감사추적 흔들림*(dev3 발사인데 dev4로 기록)과 같은 계열로 보인다.

---

## 준수 사항

- **머지 미실행** — PR #253 `merged=false` 유지. 머지는 ANU 소관.
- **배포 미실행**
- 저장소 코드 **0줄** 수정 · 금지경로 접근 0
- `memory/reports/task-3007.md` **무수정**(해시 결속 보존)
- 자동수렴 **미발동** (failure 0건 → 수렴 대상 없음)

## 산출물

| 경로 | 내용 | 상태 |
|---|---|---|
| `/home/jay/workspace/memory/events/task-3007.ci-watch-result.json` | 워처 판정 본문 (sha256 `5ce4ccb6778ad883…`) | verified |
| `/home/jay/workspace/memory/events/task-3007.ci-watch-callback.json` | 콜백 cron 사이드카 | verified |
| `/home/jay/workspace/memory/reports/task-3007-ci-watch.md` | 본 보고서 | verified |

## 콜백

- cron id **`53E299FA`** · `at 2026-08-25 13:54:45` · `--once`
- owner `c119085addb0f8b7`(**독립 ANU key**) · executor `0b94683120a691cf` → `owner_is_independent_anu=true`
- launcher: `verdict=PASS` · `status=ANU_OWNED_READY` · `envelope_only_compliance=true`
- 봉투 **1090 bytes** (상한 3900 이하) · 봉투 전용(자유 지시문 0줄)
- 등록 검증: ANU key `--cron-list` 목록에 노출 확인(목록은 key-scoped → ANU 소유 증명)
- `--key` 대신 `--key-file` 사용 (프로세스 목록 키 노출 회피)

## 타이머

task-3007 타이머는 **이미 `completed`**(`13:24:25.809817`, duration 3641.7s)다.
고스트 태스크 아님 → 중복 `end` 호출 안 함. 현재 running 은 `task-3009`(dev2) 뿐.
