# task-2787 A1 스파이크 — ANU 독립검증 (증거 기반)

**작성**: 아누 (2026-07-17 KST) · **대상**: dev5(마르둑) 완료물, 브랜치 `task/task-2787-dev5` 커밋 `6a3e3ea`.
**원칙**: 봇 self-report 신뢰 아님. 확신 등급 명시. 정상 사례를 전체 계약으로 일반화 금지.

## 0. 판정 요약
**A1 스파이크는 "계약 표현·검증 골격 구현 + 계산엔진 파이프라인 연결"에 성공. 그러나 "실환경 캡처 성공"도 "계약 CONFIRMED"도 아니다. PR 승인은 이르다.** (GPT 판정과 일치 + ANU 추가 발견.)

## 1. ★ ANU 추가 발견 — base 오염 (GPT는 diff 못 봄)
- `main...HEAD` diff = **11파일**(봇 보고 8파일과 불일치)인데, forbidden 3파일(`server/main.py`+106·`server/tests/test_infokeyword_proxy.py`+265·`.github/workflows/diagnostic-pytest.yml`)이 섞임.
- 규명: **task-2787 커밋은 단 1개(`6a3e3ea`), 정확히 8개 extension 파일만** 수정(scope-diff.txt 확인) → **dev5 스코프 위반 아님.**
- forbidden 3파일 = **task-2475(PR#104)/task-2479(PR#107) 미머지 커밋**이 브랜치 base에 얹혀 온 것. worktree base가 clean main(10e488f) 아님 = **stale/오염 base**.
- **후속**: 향후 PR 시 task-2787을 **clean main(10e488f)에 cherry-pick**(그 두 PR 미딸림). 병렬 안전규칙의 stale base 케이스.
- finish-task start-guard-fail.json: 봇이 초기에 `/home/jay/workspace`(worktree 아님)에서 실행 → 검증#1 실패 후 해소(GPT가 본 "scope 오탐"과 일치).

## 2. GPT P0 3항목 코드 검증
### P0-a [CONFIRMED — GPT 맞음] flag OFF에서도 MAIN interceptor 실행됨
- manifest: `inject.js`가 `world:"MAIN"` content_script(`run_at:document_start`, `mmlfcp.ohmymanager.com` 한정)로 **항상 등록**(별도 엔트리·ISOLATED와 분리 ✓).
- inject.js에 **flag 게이트 없음** → mmlfcp 진입 시 fetch 래핑+ProductPremiums clone 읽기가 **flag와 무관하게 항상 실행**. flag OFF는 하류 content.js matrix 생성만 차단.
- 완화(사실): interceptor는 **passive clone-only**(원본 fetch 반환·헤더·예외 무변경 — 코드/주석 확인), **mmlfcp 한정**, 버튼 미결선이라 전송 0, 수동 sideload. → "고객 전송 0·원본 동작 0"은 맞음.
- **그러나 "flag OFF = interceptor도 비활성"은 미충족(GAP).** activation 전 반드시 tighten(flag OFF 시 fetch/XHR patch 자체 미설치).

### P0-b [PARTIAL] 키 부재 vs null vs 0
- ✅ **핵심 0-버그 회피**: `raw_premium` 부재/undefined/null → **미제공(normalized=null, 키 미삽입), 절대 0 변환 안 함**(adapter:68·182). GPT 최대 우려(키 부재=0원)는 코드로 방어됨.
- ⚠️ **refinement 2개(GPT 맞음)**: ①"키 없음"과 "키 있으나 null"을 **미제공으로 합침**(데이터 장애와 미제공 미구분) ②실제 `premium===0`은 **정상 EXACT로 처리**(무료담보 근거 필드 없음). production은 근거 있을 때만 0 유효, 없으면 REQUIRES_REVIEW/fail-closed 필요. → 후속 수정 대상.

### P0-c [미검증 — 실환경 필요] 실제 mmlfcp fetch/XHR 인터셉트 작동
- **여기서 검증 불가**(회장 Edge·라이브 mmlfcp 필요). 봇 보고=실 ohmymanager 접속 불가·실 transport 실측 미완·버튼 E2E 미완. → **회장 실환경 제한 스모크가 다음 필수 단계.**

## 3. 기타 검증
- **Math.round**: 정규화는 반올림 안 함(정밀도 provenance 보존 ✓), `matrix.premiums`만 `Math.round`(adapter:221). 단 **이 반올림은 임시 SPIKE_RULE로 명시 안 됨** → 라벨 필요. Math.round 값을 계산엔진에 넣어 PASS = **파이프라인 작동 증거이지 보험료 정확 증거 아님**(L1 명칭 조정).
- **활성 플랜**: 복수 user_coverages·직접 연결키 미확정 → resolver는 후보 판정+UNIQUE_MATCH만 matrix(임의 첫항목 금지 ✓). "선택담보 authoritative 확정" 표현은 과장 → "유일 식별 시 그 details 사용"으로.
- **미완 검증(ANU 후속)**: nonce가 실제 랜덤/세션갱신/타탭 재사용 차단인지 · navigation 무효화가 과도(모든 onUpdated)한지 · 봇 보고 445 테스트 ANU 재실행 · 수동 마커 삭제/중복 callback 여부.

## 4. 다음 단계 (PR 전)
1. **ANU 정적검증 마무리**: flag OFF interceptor tighten 여부 판단 · nonce/navigation 확인 · 445 재실행 · Math.round SPIKE_RULE 라벨.
2. **회장 실환경 제한 스모크(P0-c)**: Edge 확장 수동 로드 → flag 개발환경만 ON → 실 transport(fetch/XHR) 확인 → 응답 캡처 여부 → 후보 상태 → 원화면 대조. (고객 자동생성·운영 배포·실데이터 저장 금지.)
3. 위 통과 후에만 **clean main cherry-pick → PR 후보**. merge·활성화는 별도 승인.

## 5. 표현 정정 (봇 보고 과장 교정)
- "interceptor 주입 성공" → **테스트 환경 구현 성공·실환경 미검증**.
- "계약 CONFIRMED" → **계약 골격 구현·검증 가능**(계약 확정 아님).
- "계산엔진 검증값 일치" → **스키마·파이프라인 연결 확인**(값 정확성 아님).
