# task-2861 보고서 — 상담이력 DELETE 엔드포인트 PK 타입 버그 수정

- 팀: dev1-team (헤르메스 팀장 / 불칸 백엔드)
- 레벨: Lv.2 (surgical 버그수정) · merge_policy: **none** (ANU 재검증·머지·배포 소관)
- 대상 브랜치: `task/task-2860-dev1` (기존 브랜치에 이어서 fix 커밋)
- worktree: `/home/jay/projects/InsuRo/.worktrees/task-2860-dev1`
- base: `201d520` → fix HEAD: **`25b6ad2`** (origin push 완료)

## Situation
task-2860 의 신규 DELETE 상담이력 엔드포인트가 실동작에서 100% 파손 상태. 회장이 원한 "supabase 실삭제로 DB 낭비 0" 이 실제로는 항상 404 로 실삭제 0건.

## Complication
- 테이블 PK `id` 는 `BIGSERIAL PRIMARY KEY`(정수 1,2,3...). UUID 아님 (UUID 컬럼은 `fa_account_id`/`reference_id` 뿐).
- DELETE 핸들러에 GET 에는 없는 `UUID(record_id)` fail-fast 블록이 잘못 삽입되어, 정수 id 가 오면 "malformed UUID" 로 판정 → **DB 접근 전 404** → 실삭제 0건.
- 웹앱은 `record.id`(정수)를 그대로 DELETE URL 로 전송 → 회장 계정에서 삭제 버튼 눌러도 항상 404.
- 기존 pytest 가 갭을 못 잡은 이유: 테스트가 **UUID 모양 가짜 record_id** 를 하드코딩 → UUID 검증을 우연히 통과 → 실 정수 id 케이스 미검증.
- 원인 = reference_id(UUID) 검증 패턴을 PK(id, 정수)에 잘못 복붙.

## Question
정수 BIGSERIAL id 가 pre-DB UUID 검증에 막히지 않고 실제 삭제까지 도달하게 하려면?

## Answer (Surgical Changes — 지정 2파일만)

### 1) server/routes/consultation_history_v1.py — `delete_consultation_history_v1` 함수만
- `try: UUID(record_id) except ...: raise _generic_error(404, ...)` **블록 전체 제거** (9줄). docstring 다음 바로 `sb = _get_supabase_client()` 로 이어짐 (GET 핸들러와 대칭).
- docstring 404 조건 목록에서 `record_id 가 UUID 형식이 아님(malformed) — DB 접근 전에 fail-fast` bullet 1줄 제거.
- `from uuid import UUID` import 는 **유지** (reference_id 검증에서 여전히 사용, 370/547줄).
- 나머지(Depends 게이트 순서, delete 체인 `.eq("id",...).eq("fa_account_id",...)`, hard delete, 감사로그, 500 처리, deleted_rows 판정, 200 반환) **그대로 유지**.

### 2) server/tests/test_consultation_history_v1_delete.py
- `_RECORD_ID` UUID 문자열(`9cdbe18e-...`) → **정수 문자열 `"123"`** 교체 (실 BIGSERIAL 반영).
- test 6 재작성: `test_delete_malformed_record_id_returns_404_before_db_access` → **`test_delete_integer_record_id_reaches_db`**. 존재하지 않는 정수 id "999" → 0행 → 404 이되, **`sb.table.call_count >= 1`** (정수 id 는 pre-DB 검증에 막히지 않고 DB 도달해야 함 = 버그 재발 방지 가드). 기존 `== 0` 전제(버그였음)를 뒤집음.
- 모듈 docstring 커버리지 문구 정정.

## 수정/생성 파일 목록
- 수정: `server/routes/consultation_history_v1.py` (블록 9줄 + docstring 1줄 제거)
- 수정: `server/tests/test_consultation_history_v1_delete.py` (_RECORD_ID 상수 + test 6 재작성 + docstring)
- 생성 파일: 없음 (new_file_limit: 0 준수)
- 금지 파일(013 sql / src/** / main.py / conftest.py) **미변경 확인**

## 테스트 결과
- `pytest server/tests/test_consultation_history_v1_delete.py -q` → **7 passed**
- `pytest -k consultation -q` → **126 passed, 750 deselected, 회귀 0** (pre-existing CORS env 아티팩트는 이번 실행에서 미발생)
- `npx tsc --noEmit` → **exit 0** (프론트 무변경 확인)

## L1 스모크테스트 결과
- 서버 재시작: 해당없음 (in-process TestClient — service-role/JWT/supabase mock)
- API 응답 확인 (직접 실행, `/tmp/l1_smoke_2861.py`):
  - 정수 id "42" happy path → **200**, body `{"ok":true,"deleted_id":"42"}`, `.eq("id","42")` 그대로 전달, `sb.table.call_count=1` (DB 접근됨)
  - 정수 id "999" 0행 → **404** CONSULTATION_HISTORY_NOT_FOUND, `sb.table.call_count=1` (pre-DB 차단 없음)
  - → 수정 전이었다면 정수 id 는 UUID 블록에 막혀 `table_calls=0` 으로 404 였을 것. 버그가 실제로 고쳐졌음이 실동작으로 증명됨.
- 스크린샷: 해당없음 (백엔드 API — curl 대체로 in-process TestClient 실호출)

## Edit 직후 grep 검증
- `UUID(record_id)` → **0건** (제거 성공)
- `from uuid import UUID` → **1건** (유지)
- `_RECORD_ID = "123"` → 확인
- `test_delete_integer_record_id_reaches_db` → 1건

## 머지 판단
- **머지 필요**: No (팀장 머지 금지 — merge_policy: none)
- **브랜치**: `task/task-2860-dev1` (fix HEAD `25b6ad2`, origin push 완료)
- **워크트리 경로**: `/home/jay/projects/InsuRo/.worktrees/task-2860-dev1`
- **머지 의견**: surgical 9줄 제거 + 테스트 정수화. pytest 전건 PASS·회귀 0·tsc 0·정수 id L1 실동작 증명. 계약 5-enum 미변경, 새 에러코드 미신설, 스키마/013 sql 미변경. ANU 재검증·머지·배포 소관.

## 모델 사용 기록
- 불칸(백엔드): sonnet — surgical 코드 수정+테스트 (haiku 미사용)
- 헤르메스(팀장, Opus): 설계/검토/L1 직접 검증/통합

## 금지사항 준수 확인
- 지정 2파일 외 미변경 · 새 파일 0 · 스키마/013 sql 미변경 · id→UUID 역방향 미시도 · 계약 5-enum 미변경 · 프론트 미변경.

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


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


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

