# Track A (task-2800 + task-2802) — ANU 독립검증 기록

> **작성 주체**: 아누. **봇이 세션 사망으로 보고서·`.done` 을 남기지 못해, ANU 독립검증 결과로 대체 기록한다.**
> **원칙**: 봇 self-report 는 권위 증거가 아니다. 아래는 전부 ANU 가 직접 실행·확인한 것이다.
> 작성 2026-07-20 01:1x KST

---

## 1. 대상
| task | 팀 | 범위 | 브랜치 |
|---|---|---|---|
| `task-2800` | dev1 헤르메스 | **A7** | `task/task-2800-dev1` (3커밋) |
| `task-2802` | dev1 헤르메스 | **A1~A6** | `task/task-2802-dev1` (A7 위 4커밋) |

**최종 브랜치**: `task/task-2802-dev1` — base `cc7476bfbd9f6b3ae3c99f9a7136cc9f94cd3ada`, 총 **7커밋**

---

## 2. 커밋
**A7 (task-2800)**
```
4869c10 A7 활성 서버 write 경로 제거 (background.js POST 함수 삭제 + content.js 캡처버튼 부착경로 제거)
3649c5f A7 3중 증명 테스트(정적/동적/뮤테이션) 추가
dfbd7f5 expected_files 위반 원복 — extension/inject.js 는 allowed_resources 밖
```
> `dfbd7f5` 주목: 봇이 **스스로 expected_files 위반을 발견하고 원복**했다.

**A1~A6 (task-2802)**
```
777ec57 background.js OHMY_PPD_FETCH_V1 핸들러 (A1 직접조회 + A2 토큰검증 + A3 URL allowlist/sender 게이트)
4074e6f content.js A1/A2/A4/A5 (클릭 진입점 + 토큰 1회읽기 + resource timing URL복구 + stale/owner 3중 게이트 + VALID/INVALIDATED)
a681cc2 content.js A6 (계약 §1 계산 + 3축 교차검증 + fail-closed 11코드 + ImmutablePreviewSnapshotV1 + 로컬 미리보기)
f443582 검증 테스트 3종(거부분기/토큰미유출/뮤테이션) + A4 fail-open 결함 수정 + NEGATIVE_INVALID 분류 정정
```
> `f443582` 주목: 봇이 **지시받지 않은 A4 fail-open 결함을 스스로 찾아 수정**했다.

---

## 3. ANU 검증 결과

### 3-1. 테스트 (직접 실행)
```
$ npx vitest run extension/__tests__/     # /home/jay/projects/InsuRo/.worktrees/task-2802-dev1
Test Files  6 passed (6)
     Tests  152 passed (152)
```
- A7 단독 시점: **41 passed / 3 files**
- A1~A6 포함: **152 passed / 6 files** (신규 테스트 3파일 1,497줄)

### 3-2. expected_files 준수
변경 파일 **5개, 전부 `extension/` 내부**:
`__tests__/track-a-gates.test.ts` · `__tests__/track-a-mutation.test.ts` · `__tests__/track-a-preview.test.ts` · `background.js` · `content.js`
→ **`extension/` 밖 변경 0건**

### 3-3. 금지패턴 스캔 — **위반 0**
초기 스캔에서 5건이 잡혔으나 **전수 확인 결과 전부 오탐**:
| 잡힌 것 | 실체 |
|---|---|
| `MAIN world` 3건 | **주석**. "MAIN world 가로채기를 전면 제거한 대체 설계" · "MAIN world 주입 금지" — 금지를 *명시한* 문장 |
| `insuro.biz` POST 2건 | **뮤테이션 테스트**. 일부러 서버 전송을 주입해 테스트가 잡는지 검증. 요구한 3중 증명 그 자체 |

→ 실제 `.skip`·`xfail`·MAIN world 주입·서버 전송 코드 **0**

---

## 4. 계약 준수 확인
- **A6 불변식(서버 전송 코드 미포함)**: 준수 — 전송 코드 0
- **`ImmutablePreviewSnapshotV1`** 산출: 확인 (계약 §2-3-c 대로 `reference`·`consent`·`idempotency_key` 미포함)
- **VALID / INVALIDATED 상태**: 구현 확인 (계약 §3-4-a)
- **resource timing primary**: 구현 확인 — 정정된 A5 지시대로

---

## 5. ★ 지시서 결함과 그 정정 (사고 기록)
**1차 발주(task-2800)에서 A1~A6 이 STOP 됐다.** 봇 판단은 정확했고 **ANU 지시서가 틀렸다.**

| 잘못 쓴 것 | 실제 |
|---|---|
| A5 "**DOM 1순위** / resource timing fallback" | 실 DOM 에 `plan_id` 요소 **0건** → DOM primary 는 **애초에 불가능한 지시** |
| A4 STOP 조건 "`plan_id` DOM 소스 미확정 시 **즉시 STOP**" | `plan_id` 는 **A-0 스파이크에서 이미 해결**(resource timing URL 쿼리). 회장 라이브 확인분: `url_construction: SOLVED` · `token_source: URL_QUERY` · `http_status: 200` · `company_count: 10` |

**정정 내용**: A5 를 **resource timing primary** 로 뒤집고 A-0 실증 근거 명기 / A4 의 plan_id STOP 삭제 / STOP 은 "resource timing 으로도 URL 복구가 **구조적으로 불가능**함이 실증될 때" 하나만 / "미확정 항목 하나로 전체 STOP 하지 말고 **관측 가능 범위로 축소해 진행하고 GAP 보고**" 추가.
→ 재발주(task-2802) 에서 **즉시 뚫렸다.**

**교훈**: 선행 task 가 이미 해결한 것을 후속 지시서가 **STOP 조건으로 재봉인**했다. 지시서 작성 시 **선행 산출물의 확정 사실을 먼저 반영**할 것.

---

## 6. 세션 사망 (하네스 결함 — 백로그 B-3)
- 마지막 커밋 **00:43** → 이후 미커밋 변경 0 · 파일 수정 0 · 프로세스 0
- `.done` 마커 **0** · 봇 보고서 **0** → 타이머 `running` 잔존 → **watchdog 2분 간격 알림**(hb_age 734s→1458s)
- **작업 자체는 완료·green.** 완료 핸드셰이크 직전 사망.
- 동일 패턴 선례: `task-2792`(dev4) · `task-2796`(dev2)
- 조치: 회장 승인 후 `task-timer.py end task-2802` 로 타이머 종료(소요 1시간 38분 기록)

---

## 7. 판정
**Track A 개발 완료. ANU 독립검증 PASS.**

⚠️ **미승인 사항** — PR 생성 · merge · 배포 · 실고객 write · production 활성화 · A↔B 실연결 **전부 미착수**.
⚠️ **미확정 1건** — age 변환 규칙(만나이/보험나이). `src/pages/Calculators.tsx` 에 `Math.round(exactYears)` "6개월 이상 올림" 이 있으나 **이 플로우 적용 여부 미확인**. A1~A6 진행에는 지장 없음.
