# task-2787+6 — 진단 스케일링 관찰 필드 1개 추가 (self-smoke #2 최종 준비, OptC 합의)

## 레벨
Lv.2 (진단 병렬필드 1개 추가 + 테스트). **same-branch `task/task-2787+2-dev5` 계속 커밋. PR·merge·배포·운영활성화 금지.**

## 단일 소스
`memory/reports/task-2787-data-contract-consensus-260718.md` + 본 파일.

## 배경 (GPT·Codex·ANU 합의 = OptC)
task-2787+5 로 진단 필드 의미는 신뢰 가능해짐(0/음수 fail-closed·join_summable·input 식별·tolerance_basis·hash). 그러나 **가입금액 스케일링 계약이 미연결**: DOM 합계는 `domSum += p` 로 **API premium 원값만 합산**(정규화보험료 = 기준보험료 × 현재가입금액/기준가입금액 미적용). 그리고 `dom_amounts` 에 **API 기준금액이 없어**, self-smoke 에서 총액 불일치 시 **"선택코드 오류"인지 "스케일링 필요"인지 구분 불가** → self-smoke #3 왕복 위험.
→ **관찰 필드 1개만** 추가해 회장 self-smoke 1회로 스케일링 필요 여부까지 판정한다. **스케일링 계산 자체는 이번 범위 아님**(가입금액 원천이 self-smoke 로 확정된 후 별도 승인).

## ★ 불변식 (절대)
- 기존 user_coverages 경로 · 기존 `per_insurer`(비-dom) · `selected_coverage_count` · scrapeScreenTotals · 프로덕션 경로 **전부 무변경**.
- `dom_selected_adapter_sum` 계산식 **변경 금지**(이번엔 관찰만 추가. 스케일링 미적용 상태 유지).
- 신규 로직은 진단게이트(`__INSURO_DIAG_ACTIVE__===true` → runRealInjection) 안에서만 실행 = 프로덕션 무동작.
- `extractDomCheckedSelection` 은 **DOM-pure 유지**(API 접근 금지). API 결합은 `buildDomSelectionDiagnostic` 에서만.

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "extension/inject.js"
    - "extension/__tests__/dom_selection_snapshot.test.ts"
    - "memory/reports/task-2787+6.md"
  forbidden_paths: ["src/**","server/**","supabase/**","**/migrations/**",".github/**",".env*","extension/content.js","extension/background.js","extension/manifest.json","extension/scripts/build-diagnostic.mjs"]
  new_file_limit: 0
  commands: ["git","npm","node","npx"]
  merge_policy: "none"
  ttl_hours: 5
```

## 수정 요구 (단 하나)
### G1. dom_amounts 각 항목에 `api_amount_observation` 추가
`buildDomSelectionDiagnostic`(inject.js ~532, sanitized 와 domSelection 이 모두 있는 지점)에서 선택 cd 별로 `sanitized.coverage_premiums[].detailList[]` 를 조회해 아래 구조를 **기존 dom_amounts 항목에 덧붙인다**(기존 필드 전부 유지):
```js
api_amount_observation: {
  first_company_code: string|null,          // 이 cd 를 가진 첫 회사
  first_coverage_amount: number|string|null,// 그 회사 detailList 항목의 coverage_amount(API 기준금액)
  first_guide_coverage_amount: number|string|null,
  differs_across_companies: boolean,        // 이 cd 의 coverage_amount 가 회사마다 다른가
  company_count_with_match: number          // 이 cd 를 가진 회사 수
}
```
- cd 를 가진 회사가 0 이면 전부 null + `company_count_with_match: 0`(추측 금지).
- 값 정규화·형변환 금지(원값 그대로). 스케일 계산·비교 판정 금지(관찰만).

## 검증
- `dom_selection_snapshot.test.ts` 갱신: cd 가 여러 회사에 있고 coverage_amount 가 동일할 때 `differs_across_companies:false`, 다를 때 `true`, 미존재 cd 는 전부 null+0, 기존 dom_amounts 필드(cd·amount_attr·amount_input·input_* ·row_editable_input_count) **전부 보존** assert. **기존 테스트 전부 유지**.
- 기존 `dom_selected_adapter_sum`·`join_summable`·tolerance 산출값이 **이번 변경으로 바뀌지 않음**을 회귀 assert.
- ANU 재실행: `npx vitest run` 전체. 파일수/전체수/신규수 보고.

## goal_assertions
- `npx vitest run extension/__tests__/dom_selection_snapshot.test.ts`
- `npx vitest run`

## STOP_REPORT 조건
extractDomCheckedSelection 을 DOM-pure 로 못 남김 · dom_selected_adapter_sum 계산 변경 필요 · 기존 경로/프로덕션 수정 필요 · forbidden 파일 수정 필요.

## 금지
스케일링 계산 적용 금지(관찰만) · PR·merge·배포·운영활성화 · 서버/DB/CRM/UI 수정 · 자동전송/push · 실고객 저장 · 신규 파일 · USER_COVERAGES_NOT_UNIQUE fallback 변경 · scrapeScreenTotals 필터화 · DOM 보험료 셀 주 계산원.

## 산출물 & 보고 (PR 없음)
1. same-branch `task/task-2787+2-dev5` 커밋. PR 금지.
2. 보고: inject.js diff / api_amount_observation 예시 출력 / 기존 합계·분류 무변경 회귀 증거 / vitest 카운트 / MATCH·GAP.
3. 봇 종료 전 ANU callback(envelope만·UTF-8 ≤3900B, collector=ANU key c119085addb0f8b7).