# task-2787 A1 스파이크 — ANU ↔ Codex CC 합의 (의견 합일)

**작성**: 아누 (2026-07-17 KST). GPT 리뷰 + ANU 독립검증 + Codex CC 독립검증(codex task task-mroykuqh-i3bxrn, session 019f7035) 3자 교차 → **합의 도달.**
**원칙**: 봇/AI self-report 신뢰 아님, file:line 근거. ANU 오판은 정정.

## 결론 (합의)
A1 스파이크는 **계약 골격 구현 + 계산엔진 파이프라인 연결에 성공**. 그러나 **현재 커밋 그대로 실환경 스모크·PR 금지**. 다음 = **same-branch P0 micro-fix**. (GPT·ANU·Codex 3자 동의.)

## 합의된 검증 결과 (Codex가 ANU/GPT를 교정한 부분 명시)
1. **[확정·합의] flag OFF인데 MAIN interceptor 항상 실행**: manifest가 inject.js를 `world:"MAIN"`(mmlfcp)로 항상 주입(manifest:22,26), inject.js가 로드 즉시 `installRealInterceptors` 호출·flag 체크 없음(inject.js:206,233,270). flag는 content.js `runDevMatrixDiagnostic`만 차단(content.js:38,723). → "flag OFF=기존 동작 무변경" 계약 위반. **P0.**
2. **[확정·합의] MAIN/ISOLATED flag 가시성**: flag가 ISOLATED content.js 상수라 MAIN inject.js가 직접 못 읽음 → "content.js flag 확인" naive fix 불가.
3. **[부분·합의] 0/null/키부재**: undefined/null 모두 `PREMIUM_KEY_ABSENT`로 합쳐 absent/null 미구분(adapter:68,70); 실제 premium===0은 base==selected면 정상 EXACT 통과(adapter:90,95). 5-state split·근거없는 0 fail-closed 미구현. **단 Codex: skeleton 단계 최우선 P0 아님 → 범위 좁힘.**
4. **[정정·Codex가 ANU/GPT 교정] Math.round 라벨**: 정규화는 반올림 안 함·provenance 정밀도 보존, Math.round는 matrix.premiums에만(adapter:218,221). **"라벨 전혀 없다"는 ANU/GPT 과장 — 이미 `SCALED_LINEAR_ROUNDING_UNKNOWN` 플래그+unknown note 존재(adapter:118,213).** 남은 것=matrix-level SPIKE 라벨 + SCALED_LINEAR는 고객대면/상담확정 사용불가 표시(범위 좁음).
5. **[정정·ANU 오판 철회] base 오염 = 오판**: ANU가 `main...HEAD`(stale local main 10e488f) 기준으로 11파일·오염이라 봤으나, **실제 origin/main=cc7476b**(task-2475 PR#104 이미 머지). `origin/main...HEAD`=정확히 **8 extension 파일**, 커밋 6a3e3ea도 8파일. **오염 없음.** ANU가 병렬 안전규칙의 stale-base 오판을 그대로 저지름 — 철회.
6. **[정정·Codex가 과우려 교정] nonce/navigation**: nonce는 `crypto.getRandomValues` 랜덤·주입 시 1회 생성(inject.js:196,212,213) — 고정 marker 아님. navigation 무효화는 모든 onUpdated 아니라 `status==="loading" && url`만(background.js:336,337). → "과민반응" 우려는 이미 부분 완화 — **수정 전 어떤 onUpdated가 오탐인지 실증 먼저**. 단 "타 탭 재사용 차단"은 전역 registry 없어 UNVERIFIED.
7. **[★ 신규 P0·Codex가 ANU/GPT 모두 놓친 것] first-message nonce spoof**: content.js가 shared secret 없이 **첫 관측 nonce를 정답으로 채택**(content.js:680,699,701). 같은 페이지의 다른 스크립트가 genuine capture보다 먼저 `postMessage({type:"INSURO_OHMY_PP_CAPTURED", nonce, payload})`를 보내면 relay가 spoof payload를 background buffer에 저장 가능(content.js:709,712; background.js:214,216). = **developer-verification integrity P0**(전송 보안보다 캡처 무결성).

## flag 구조 (합의)
- **스파이크 P0 micro-fix = (B) handshake**: content.js가 flag ON일 때만 START 전송 → inject.js가 그때만 patch 설치 → "flag OFF 시 patch/postMessage/buffer 0"를 same-branch에서 직접 증명. (Codex 권고, ANU 동의.)
- 릴리즈 하드닝 = (A) manifest/build 분리(더 강한 보장) — 후속.

## 다음 단계 (합의) — same-branch P0 micro-fix (smoke/PR 보류)
**Top P0 (skeleton 단계 최우선)**:
1. **flag OFF에서 MAIN patch/postMessage/background buffer 생성 0** (handshake 구조 + MAIN/ISOLATED flag 전달 명시 + 테스트).
2. **relay 무결성**: first-message nonce spoof 차단 (shared secret 또는 spoofed first-message 거부·genuine 소스 검증).
**Secondary (범위 좁힘)**:
3. 0/null/키부재 5-state 분리 + 근거없는 0 REQUIRES_REVIEW/fail-closed (top P0 아님).
4. Math.round matrix-level `SPIKE_MATH_ROUND_UNVERIFIED` 라벨 + SCALED_LINEAR 고객대면/상담확정 사용불가 표시 (rounding-unknown 플래그는 이미 있음 → 범위 좁음).
5. navigation: 수정 전 오탐 케이스 실증(이미 loading+url 게이트).
6. **ANU가 특정 테스트 + 전체 `npx vitest run` 독립 재실행**, 정확한 파일수/전체수/신규수 기록.
**범위 제외**: 서버/DB/CRM/UI/자동전송/push/운영활성화/PR/merge.
**PR**: 오염 브랜치 아님(오염 없음 확인). PR 준비 시점 **최신 origin/main clean worktree에 task-2787 커밋만 재이식**(GPT — 준비시점 SHA 고정, 문서 SHA 고정 금지).
**별도 운영 GAP**: finish-task cwd/scope-base/goal-gate 문제 + 실패 마커 수동 삭제 — A1 코드축과 분리.

## 남은 쟁점
없음(합의). Codex 결론="부분동의 + flag OFF MAIN 동작·first-message nonce spoof가 핵심 쟁점"을 ANU가 전부 수용 → 두 쟁점을 P0 micro-fix Top으로 반영.
