# 작업 보고: task-2960 — InsuRo 프로덕션 배포 (origin/main `d381e57`)

- 팀: dev2-team (오딘)
- 일시: 2026-08-15 12:45~13:05 KST
- 작업 내용: origin/main `d381e570765f` 누적 머지분(PR#213~219)의 프로덕션 반영 — 프론트(Cloudflare Pages) 배포 + 백엔드(insuro-api) 재기동
- 생성/수정 파일: **애플리케이션 코드 수정 0줄** (배포 전용). 산출물 = 본 보고서 + 3문서 + 스크린샷
- 테스트 결과: **배포 검증 PASS / 브라우저 스모크 3종 미수행(자격증명 차단)**

---

## SCQA

- **Situation**: 회장 배포 승인. origin/main `d381e57`에 증권분석 대구분 표(PR#218) · 실손계산기(PR#219) · 실손 세대배선(PR#213~217)이 머지 완료 상태였으나 프로덕션 미반영.
- **Complication**: (1) task 파일이 지정한 `insuro-api.service`는 **system 유닛이 아니라 user 유닛**이라 지시된 경로로는 조작 불가. (2) 실손계산기가 **백엔드 라우트 의존**이라 프론트만 배포하면 404. (3) 스모크 검증에 필요한 **프로덕션 자격증명이 불일치**.
- **Question**: 배포를 안전하게 반영하고, 반영 사실을 추측 없이 실측으로 입증할 수 있는가?
- **Answer**: 배포는 **양쪽 모두 성공**(해시 변경 + 라우트 113→115). 다만 **로그인 뒤 화면 3종은 검증 불가** — 정직히 미수행으로 보고하며 자격증명 확보 후 재실행이 필요.

---

## 1. 배포 결과 (실측)

| 항목 | 배포 전 | 배포 후 | 판정 |
|---|---|---|---|
| 프론트 `index-*.js` | `index-0w1NyzLR.js` | **`index-Bl-JgF8J.js`** | PASS |
| CF Pages 프로덕션 배포 | `bbce0592` (08-09) | **`f7137ad9`** (08-15 03:54Z, stage=success) | PASS |
| `insuro.biz` HTTP | 200 | 200 | PASS |
| 백엔드 PID | 739531 (Aug14 기동) | **170946** | PASS |
| 백엔드 openapi 경로 수 | 113 | **115** | PASS |
| 신규 라우트 | 없음 | `/api/v1/silson/calculator/table`, `/estimate` | PASS |
| 기동 로그 traceback | — | **0건** | PASS |

- 프론트 빌드: `npm run build` exit 0 (12.30s, PWA precache 179 entries)
- 배포 명령: `npx wrangler pages deploy dist --project-name insuro --branch main` → exit 0, 134 files uploaded
- 백엔드 재기동: `systemctl --user restart insuro-api.service` → `active`
- 신규 라우트 미인증 호출 = **401**(404 아님) → 결선 확인

### 라이브 번들에 신규 기능 실재 확인 (로그인 불요 · 독립 증거)
| 문자열 | 청크 | 라이브 서빙 |
|---|---|---|
| `설계사 상담용 참고 도구` | `SilsonCalculator-DT7SZuVt.js` | 200, 매치 1 |
| `계산 불가 — 약관 확인 필요` | `SilsonCalculator-DT7SZuVt.js` | 200 |
| `coverage-analysis-table` | `PolicyAnalysis-BY5fFMMh.js` | 200, 매치 1 |
| `권장가입금액 합계` · `공제(자기부담금)` | `PolicyAnalysis-BY5fFMMh.js` | 200 |

---

## 2. L1 스모크테스트

- **서버 재시작**: **성공** — `systemctl --user restart insuro-api`, PID 739531→170946, `active`, traceback 0건
- **API 응답 확인**:
  - `curl http://127.0.0.1:8001/openapi.json` → **200**, 경로 113→115
  - `curl http://127.0.0.1:8001/api/v1/silson/calculator/table` → **401** (결선됨, 미인증 정상 거부)
  - `curl -X POST .../estimate` → **401**
  - `curl https://insuro.biz/` → **200**, 해시 `index-Bl-JgF8J.js`
  - `curl https://insuro.biz/assets/index-Bl-JgF8J.js` → **200**
  - ※ `/health` 는 존재하지 않음(404) — 헬스체크는 `/openapi.json` 으로 대체
- **엔진 실행 검증(배포 코드 직접 호출)**: `silson.calc.engine.estimate()` 3케이스 실행 — 정상 계산 / 한도초과 / 1세대 분기 모두 실행 성공 (아래 §4)
- **스크린샷**: `/tmp/task-2960-shots/01-login.png` ~ `06-policy-analysis.png` (6장) — **단, 전부 로그인 화면**. 로그인 뒤 화면은 캡처 실패(사유 §3)

---

## 3. ★ 브라우저 스모크 3종 — 미수행 (하드 블로커)

**전 항목 미수행. 추측 PASS 없음.**

- 원인: `/home/jay/workspace/.env.keys` 의 `INSURO_ADMIN_EMAIL`/`INSURO_ADMIN_PASSWORD` 가 **프로덕션 Supabase 계정과 불일치**.
- 교차 검증 3중:
  1. 브라우저: 화면에 "이메일 또는 비밀번호가 올바르지 않습니다." (`01-login.png`, 팀장이 직접 열람 확인)
  2. Supabase Auth API 직접 curl: `HTTP 400 {"error_code":"invalid_credentials"}` — 팀장·헤임달 각각 독립 재현
  3. 값 오염(공백/특수문자) 배제: hexdump 확인
- 모든 페이지가 `AuthGuard` 하위(`src/App.tsx:44-74`) → `/tools/silson-calculator`, `/crm/policy-analysis` 접근 시 `/login` 리다이렉트 (`02~06.png` 로 확인)
- 추가 비밀번호 추측·프로덕션 계정 비밀번호 재설정·테스트 계정 생성은 **수행하지 않음**(무단 프로덕션 변경 금지).
- 부수 확인: `tests/e2e/fixtures/` 에 **PDF 픽스처 없음**(html 4종 + json만) → 로그인이 됐어도 증권분석 업로드 항목은 픽스처 부재로 미수행이었을 것.

| 스모크 항목 | 결과 |
|---|---|
| 1. 증권분석 대구분 표 렌더 | **미수행** (로그인 차단 + PDF 픽스처 부재) |
| 2. 실손계산기 화면·계산·1세대 분기 | **미수행** (로그인 차단) — 단, 엔진 레벨은 §4에서 검증됨 |
| 3. 실손 세대블록(silson_summary) | **미수행** (로그인 차단) |
| 4. 콘솔 에러 0 | **판단 불가** — 대상 화면 미렌더. 로그인 페이지 기준 실패요청 1건(로그인 400 자체) + CSP 위반 2건(`static.cloudflareinsights.com/beacon.min.js` 차단, 기존 애널리틱스 이슈로 이번 배포와 무관) |

---

## 4. ★ 발견 결함 2건 (배포와 별개 · 회장 판단 필요)

### 결함 A — 실손계산기 `annual_limit` 미적용 → **1.87배 과대 추정** (라이브 상태)
배포된 엔진을 직접 실행해 **수치로 재현**했습니다(추측 아님).

- 코드 근거: `server/silson/calc/engine.py` 에 `annual_limit` 참조 **0건**. `_compute_item()`(engine.py:239-299)은 `deductible_rule`·`per_visit_limit`만 적용. 필드 자체는 `models.py:131`에 존재하고 `silson_calc_table.json`에 실값 존재.
- 실행 재현: 세대 `GEN4_2021_07` / `outpatient/uncovered/any/mri` / **80만원 × 10건(총 800만원)**
  - 해당 셀 `annual_limit` = **300만원**, `per_visit_limit` = None
  - 출력 **예상 수령액 = 560만원**, `calculation_status = **complete**` (경고 없이 통과)
  - **초과 배율 = 560만 ÷ 300만 = 1.87배**
- 고지문 방향 오류: 유일한 고정 문구 `ANNUAL_CAP_NOTICE` = "연간 누적 **자기부담** 한도는 반영되지 않았습니다(단건 추정)." → 실제 미적용 필드는 **총액(지급) 한도**이므로 **의미가 반대**. 게다가 이 문구는 초과 여부와 무관하게 **항상 동일하게** 붙어 실제 초과를 알리지 못함.
- 정상 케이스 대조: `GEN4_2021_07`/입원/급여 10만원×1건 → 공제 2만원(정률20%) → 수령액 8만원, `complete` (엔진 자체는 정상 동작)
- 1세대 분기: `GEN1_2003_10` → `calculation_status = unavailable`, 수령액 0 (정상 동작 확인)
- **위험**: 설계사 참고 도구지만 **과대 금액을 무경고 `complete`로 노출**. 금액 신뢰도 이슈.

### 결함 B — 실손계산기가 **메뉴에 노출되지 않음** (완료조건 미충족)
- `src/config/routes.ts:312` 에 `/tools/silson-calculator` 라우트는 **존재**하나, 실제 사이드바 렌더 소스인 `src/components/navigation/navigationConfig.ts` 에 **`silson`·`실손` 매치 0건**.
- → **URL 직접 입력으로만 접근 가능**. task-2960 완료조건 2번 "도구/분석 메뉴에 노출" **미충족**.

---

## 5. 롤백 준비 상태

- 프론트 롤백 지점: CF Pages 이전 프로덕션 배포 **`bbce0592`** (2026-08-09, `index-0w1NyzLR.js`) — 재배포로 즉시 복귀 가능
- 백엔드 롤백: 코드 변경 없이 재기동만 수행 → 이전 커밋 체크아웃 후 재기동으로 복귀 가능
- 현재 서버 다운·오류 **없음** → 롤백 미실행

---

## 6. 불변식 / trip-wire

| 항목 | 실측 |
|---|---|
| 애플리케이션 코드 수정 | **0줄** (`git status --porcelain -uno` → 0건, HEAD `d381e57` 불변) |
| Critical7 | 0 (코드 변경 없음) |
| PII net-new | 0 (자격증명은 변수로만 사용, 로그·보고서 미노출) |
| 회귀 실패 | 해당 없음 (코드 변경 없음) |
| forbidden_paths 침범 | 0 (저장소 파일 생성 0 — 팀원 산출물 전부 `/tmp/`) |
| nonce | task-2960 일치 |

---

## 7. 모델 사용 기록

| 팀원 | 역할 | 모델 | 비고 |
|---|---|---|---|
| 토르 (Thor) | 백엔드 영향도 조사 + 엔진 수치 검증 | sonnet | 2회 소집 |
| 헤임달 (Heimdall) | 스모크 경로 확정 + 실브라우저 E2E | sonnet | 2회 소집 |
| 오딘 (팀장) | 배포 실행(wrangler·systemctl)·검증·판단 | opus | 비가역 운영 조작이라 직접 수행 |

- haiku 미사용. 프레이야·미미르는 이번 작업 성격(배포)상 미소집.

---

## 8. 결론 및 회장 판단 요청

**배포 자체는 성공**했습니다(프론트 해시 변경 + 백엔드 재기동 + 신규 라우트 라이브 + 번들 내 3종 기능 실재 확인).
**다만 완료조건의 "smoke 3종 PASS + 스크린샷"은 충족하지 못했습니다.** 정직히 미완으로 보고합니다.

판단이 필요한 3건:
1. **자격증명** — 유효한 프로덕션 계정(또는 테스트 계정) 제공 시 스모크 3종 즉시 재실행하겠습니다.
2. **결함 A(1.87배 과대 추정)** — 지금 라이브입니다. ① 즉시 롤백 ② 계산기만 비활성/메뉴 차단 ③ 그대로 두고 수정 task 발주 — 중 택일 요청드립니다. (참고: 결함 B 때문에 현재 메뉴로는 도달 불가 = 사실상 노출이 제한적입니다.)
3. **결함 B(메뉴 미노출)** — 의도인지 누락인지 확인 필요. 누락이면 `navigationConfig.ts` 수정 task 발주.

수정 작업은 **배포 전용 task 범위 밖**이라 코드에 손대지 않았습니다.

## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회

