# stale-pr-ciwatch2 — InsuRo PR #217 CI 감시 · 머지 (2회차)

- 담당: 오딘 (dev2)
- 대상: Jeon-Jonghyuk/InsuRo PR #217 — task-2956 실손 분쟁/청구 판례 지식 축
- 핸드오프: memory/events/stale-pr.ci-watch-handoff.json (ANU 정정본)
- 최종 판정: **MERGE_READY → MERGED**

## S — 상황

1회차 워처는 핸드오프의 `expected_files` 4개와 실제 변경 6개가 불일치하여 머지하지 않고
CHAIR_REQUIRED 로 정지했다. ANU 재검증 결과 **명세 4개가 ANU 오류**였고 누락분은
문서 2건(금감원 2025-03-10 보도자료 근거)이었다. 핸드오프가 6개로 정정된 뒤 감시가 재개됐다.
재개 시점 CI 는 8 pass / 3 pending(`ci`, `e2e-test`, `diagnostic`) 이었다.

## C — 갈등

`update-branch` 로 head 가 `30bc190` 으로 갱신되어 CI 가 재실행 중이었다.
자동수정이 금지된 상태에서, CI 완주 전 머지하거나 파일 목록을 재확인하지 않고 머지하면
1회차에 정확히 잡아낸 범위 검증이 무의미해진다.

## Q — 질문

CI 11개가 전부 통과하는가, 그리고 변경 파일이 정정된 `expected_files` 6개와 정확히 일치하는가?

## A — 답변

둘 다 충족하여 squash 머지했다. `merge_commit_sha=41b6b95885b74ecbd58036a17313bbc117c4d10c`.

### 1) 파일 범위 (CI 대기와 무관하게 선행 확정)

expected 6 ↔ actual 6, **missing 0 · extra 0 · 집합 완전 일치**.

| 파일 | 상태 | +/- | 검증 상태 |
|---|---|---|---|
| docs/silson-dispute-case-law-reference-for-agents.md | added | +217 / -0 | verified |
| server/silson/__init__.py | modified | +29 / -0 | verified |
| server/silson/data/silson_disputes.json | added | +251 / -0 | verified |
| server/silson/data/sources/case_law/FSS_20250310_보도자료.md | added | +280 / -0 | verified |
| server/silson/disputes.py | added | +508 / -0 | verified |
| server/tests/test_silson_disputes.py | added | +444 / -0 | verified |

- **총 삭제 0줄** — ANU 핸드오프의 "신규 5 + 기존수정 1(export 추가만·제거 0건)" 설명과 실측 일치.
- `forbidden_paths` (`src/**`, `supabase/migrations/**`, `ops/**`, `scripts/deploy/**`, `.github/**`) 침범 **0건**.

### 2) CI 폴링 (2분 간격, 실측 로그)

| 시각(KST) | pending | failed |
|---|---|---|
| 14:53:05 | e2e-test, ci, diagnostic | 0 |
| 14:55:05 | ci, diagnostic | 0 |
| 14:57:06 | ci | 0 |
| 14:59:07 | ci | 0 |
| 15:01:07 | (없음) | 0 |

**CI_ALL_PASS — 11/11 success**: cancel-kill-switch, ci, ci/guard, diagnostic, e2e-test,
gemini-review-gate, guard, hidden-path-audit, lock-in-check, merge-safety-check, qc-check.
실패·취소 체크 0건. 소요 약 8분(한도 40분 내).

### 3) 머지 직전 재확인

- `head` = `30bc1905d0203b10b29563e9ae0af65b41d32e77` — 감시 시작 시점과 **불변**
- `mergeable=true`, `mergeable_state=clean`
- `changed_files=6`

### 4) 머지 후 반영 검증 — blob sha 동일성

squash 머지이므로 `--is-ancestor <PR head>` 는 구조적으로 ANCESTOR_NO 가 되어 무의미하다.
권위 있는 판정으로 PR head(`30bc190`) ↔ merge commit(`41b6b95`) 의 blob sha 를 대조했다.

| 파일 | blob (head) | blob (merged) | 판정 |
|---|---|---|---|
| docs/silson-dispute-case-law-reference-for-agents.md | 457003ad1a73 | 457003ad1a73 | PASS |
| server/silson/__init__.py | a5aa9f101a20 | a5aa9f101a20 | PASS |
| server/silson/data/silson_disputes.json | 5222826bd5e2 | 5222826bd5e2 | PASS |
| server/silson/data/sources/case_law/FSS_20250310_보도자료.md | d709dc5baea8 | d709dc5baea8 | PASS |
| server/silson/disputes.py | 768037a30f0c | 768037a30f0c | PASS |
| server/tests/test_silson_disputes.py | 0a29606ac9f0 | 0a29606ac9f0 | PASS |

**blob identity 6/6 PASS.** 40hex 형식 선검사를 통과했으므로 404==404 거짓 PASS 가 아니다.

- `state=closed`, `merged=true`, `merged_at=2026-08-21T06:01:41Z`
- `merged_by=jeon-jonghyuk-taskctl-bot[bot]` — **회장님 개인 PAT 오염 없음**
- `origin/main` head = `41b6b95885b7` "task-2956: … (#217)"

### 5) 접근 금지 PR 무접촉 확인

| PR | state | head | updated_at | 판정 |
|---|---|---|---|---|
| #215 | open | 64111fbd0d69 | 2026-08-14T12:42:00Z | 무접촉 |
| #202 | open | 8f6692a6b776 | 2026-08-08T10:15:04Z | 무접촉 |

두 PR 모두 이번 회차 이전 타임스탬프 그대로다.

## 사건 기록

**봇 토큰 미주입 차단이 정상 작동했다.** 첫 머지 시도에서 pre-commit 훅이
`GH_TOKEN` 없는 `gh api -X PUT` 을 거부했다. 그대로 나갔다면 회장님 개인 PAT 으로 머지되어
`merged_by` 가 오염될 뻔했다(2026-08-20 실제 사고와 동일 경로).
`source .env.keys` → `GH_TOKEN="$BOT_GITHUB_TOKEN"` 주입 후 재실행하여 해소.
결과적으로 `merged_by` 가 봇 계정으로 정확히 찍혔다.

## 미이행 항목 (은폐 없이 명시)

- **task-timer start/end 미호출.** `task-timer.py` 가 `task-N[.N]` 형식만 허용하는데
  이 감시 작업에는 정본 task id 가 배정되지 않았다(보고서 슬러그 `stale-pr-ciwatch2`).
  가짜 ID 를 만들어 타이머를 오염시키는 대신 미등록으로 두고 여기에 기록한다.
  대상 작업 자체(task-2956)의 타이머는 이 워처의 소관이 아니다.
- **코드 수정 0줄 · 자동수정 0건** — 지시대로 감시·검증·머지만 수행했다.

## 레벨: 코드 수정 없음
