# 복합설계 계산기 + CRM — 현황 (2026-07-20 08:30 KST)

> 전부 **ANU 독립검증** 결과다. 봇 self-report·`.done` 마커는 권위 증거로 쓰지 않았다.

---

## 1. 완료 — Track A / Track B 개발

| Track | 브랜치 | 커밋 | ANU 검증 |
|---|---|---|---|
| **A** (확장) | `task/task-2802-dev1` | 9 | `npx vitest run extension/__tests__/` → **173 passed / 6 files** |
| **B** (서버·CRM) | `task/task-2801-dev6` | 8 | `pytest server/tests -q -p no:randomly` → **16 failed / 729 passed** |

**base**: `cc7476bfbd9f6b3ae3c99f9a7136cc9f94cd3ada` (clean main)
**계약 참조**: 커밋 `bb1c219` (미merge 브랜치에서 읽기 전용 대조, SHA-256 `c7fe00a7…bca873`)

### Track A 구현
A7 활성 write 경로 제거(3중 증명) · A1 클릭 진입 · A2 토큰 1회읽기 · A3 URL allowlist/sender 게이트 · A4 stale/owner 3중 게이트 + VALID/INVALIDATED · **A5 resource timing URL 복구** · A6 계약§1 계산 + 3축 교차검증 + fail-closed 11코드 + **`ImmutablePreviewSnapshotV1`** + 로컬 미리보기
- **서버 전송 코드 0** (불변식 준수)
- `extension/` 5파일만 변경, 밖 **0건**
- 금지패턴 스캔 5건 → **전부 오탐 확인**(MAIN world 3건=금지를 명시한 주석 / insuro.biz 2건=뮤테이션 테스트)

### Track B 구현
B1 V1 ingest router/schema/migration · B2 tenant · B3 상담 히스토리 모델 · **B4 LegacyWriteGuard ASGI middleware**(3중 증명) · B5 실패 enum
- 기준선 대비 **신규 실패 0**, 오히려 **1건 개선**(`TestGenerateStubEndpoint::test_generate_stub` 해소)
- 남은 16건 = 전부 clean main 에 원래 있던 것(security_patch 11 + keyword_pool 4 + 한화 1)

---

## 2. A↔B 스키마 정합 — **integration 사전 결함 제거**

Codex 실물 대조로 **integration 시 전부 422 로 거부됐을 불일치 3건**을 사전에 발견·수정:

| # | 불일치 | 조치 |
|---|---|---|
| 1 | A `validation` 에 계약외 `failure_counts`·`tolerance_basis` (B 는 `extra="forbid"`) | 제거 → `{overall_status, failure_codes}` 만 |
| 2 | A `age` = `string\|null`, B = `int(0~150)` | `normalizePpdQueryCondition()` 로 **정수 강제 + 범위 검사** |
| 3 | A `gender`·`insurance_type`·`plan_id` null 가능, B 는 non-null 필수 | **하나라도 없으면 fail-closed** |

**귀속 판정**: 계약 §2-1 원문 대조 결과 **B 스키마가 계약대로**, **A 가 어긋난 것** → Track A 소관으로 수정(`server/**` 수정 0).
결과: B 스키마 제약(`ge=0, le=150`, `min_length=1`)과 **1:1 정합** 확인.

---

## 3. ★ 이번 사이클의 사고와 교훈

### 3-1. 중복 작업 (회장 지적으로 발각)
2026-05-07 부터 **2개월 반 열려 있던 PR #105·#106** 이 같은 문제를 이미 고쳐놨는데, 확인 없이 CI-1~5 를 신규 발주했다.
→ **원인**: 착수 전 "열린 PR·브랜치가 이 경로를 건드리는가" 를 확인하지 않음. clean main 에서 테스트만 돌려보고 "신규 발견" 으로 단정.
→ **다만** PR #105 는 회장 2026-07-19 결정(명시적 allowlist)과 **정면 충돌**함이 실측으로 확인됨(`보험 채용`·`보험 시험`·`보험사기`·`보험계약대출`·`자살면책`·`음주운전 면책` **6개 전부 차단**). Codex 독립 검증 후 **as-is merge 금지** 합의.

### 3-2. 지시서 결함으로 인한 오STOP
1차 발주에서 A1~A6 이 STOP 됐다. **봇 판단은 정확했고 ANU 지시서가 틀렸다.**
- A5 를 "DOM 1순위" 로 썼으나 **실 DOM 에 `plan_id` 요소 0건** → 불가능한 지시
- A4 STOP 조건 "`plan_id` DOM 소스 미확정 시 즉시 STOP" — 그런데 `plan_id` 는 **A-0 스파이크에서 이미 해결**(resource timing URL 쿼리, 회장 라이브 확인: `url_construction: SOLVED`)
→ **정정**: A5 를 resource timing primary 로 뒤집고, STOP 을 "resource timing 으로도 구조적 불가" 하나로 축소, "미확정 하나로 전체 STOP 금지 — 범위 축소 후 GAP 보고" 추가 → **재발주에서 즉시 뚫림**
→ **교훈**: 선행 task 가 확정한 사실을 후속 지시서가 STOP 조건으로 **재봉인**하지 말 것

### 3-3. 범위 이탈 (회장 지적으로 복귀)
계약 PR merge → CI red → CI 수정 → CI-4c → task ledger → 하네스 8축 … **목표에서 8단계 아래**까지 내려갔다.
→ **핵심 오판**: "Track A/B 착수에 계약 merge 가 필요하다" 는 **ANU 의 설계 선택이었지 요구사항이 아니었다.** 개발은 merge 없이 가능했다.
→ CI 관련 전부 동결 후 계산기로 복귀 → 당일 A·B 완료

### 3-4. 하네스 결함 (백로그)
- **세션 사망 후 타이머 미정리**: `task-2801`·`2802`·`2803`·`2804` 전부 **작업 완료·green 인데 `.done` 미생성** → `running` 잔존 → watchdog 2분 간격 알림 → 팀 잠김
- 조치: ANU 독립검증 후 `task-timer.py end` 로 수동 종료
- 상세: `backlog_safety_axes_260719.md` B-3

---

## 4. 미승인 (전부 미착수)
PR 생성 · main merge · 배포 · 실고객 write · production 활성화 · **A↔B 실연결(integration)**

## 5. 미확정 1건 — **age 변환 규칙**
`extension/content.js` 는 resource URL 의 `age` 를 **변환 없이 그대로** 사용(자체 주석 "no age conversion logic"). `src/pages/Calculators.tsx` 의 `Math.round(exactYears)` 는 라우팅/프리페치 UI 에서만 참조되며 **연결 증거 없음**.
→ **코드로 판정 불가. 만나이/보험나이 확정은 라이브 실사 1회 필요.** (Codex 독립 확인)
→ A/B 개발에는 지장 없음. **integration 착수 전까지 확정하면 됨.**

## 6. 보류 중 (동결)
- `PR #108`(계약 문서) OPEN·미merge — CI red 로 BLOCKED
- `CI-1`·`CI-3`·`CI-4`·`CI-2b` 브랜치 — 남은 16건 실패를 고치는 것들. 커밋만 되어 있고 미merge
- `PR #105`·`#106` 처리 방향 미결
- 백로그 7축 — 착수 금지
- stale timer 3건(`task-2792`·`2796`·`2798`) — 정리 미승인

---

## 7. 다음 단계 후보
1. **age 실사 세션**(회장 로그인 1회) → integration 진입 조건 해소
2. integration gate G-1 진입조건 11개 충족 확인
3. CI 정상화 재개 여부 결정(merge 단계에서 필요)
4. PR #105·#106 처리 결정
