# task-2860-r1 — 상담이력 DELETE 엔드포인트 PK 타입 버그 수정 (HIGH, 기능 파손)

- 팀: dev1-team (헤르메스/불칸/이리스)
- 레벨: Lv.2 (surgical 버그수정) · merge_policy: none (ANU 검증·머지·배포)
- 대상 브랜치: 기존 `task/task-2860-dev1` 에 **이어서 fix 커밋** (새 브랜치 만들지 말 것)
- worktree: `/home/jay/projects/InsuRo/.worktrees/task-2860-dev1`
- base: origin/task/task-2860-dev1 = `201d520`

```yaml
allowed_resources:
  paths:
    - "server/routes/consultation_history_v1.py"
    - "server/tests/test_consultation_history_v1_delete.py"
  new_file_limit: 0
  commands: ["git","python3","pytest","npx"]
  merge_policy: "none"
```
⚠️ 위 2파일 외 수정 금지. 특히 `server/migrations/013_consultation_history_v1.sql`·프론트(`src/**`)·`server/main.py`·`conftest.py` **수정 금지**.

## 왜 (Think Before Coding — 반드시 먼저 이해)
task-2860 의 신규 DELETE 엔드포인트가 **실동작에서 100% 파손** 상태다. ANU 독립검증 + Codex 반증리뷰 교차확인 완료.

- 테이블 PK 는 `server/migrations/013_consultation_history_v1.sql:10` 의 `id BIGSERIAL PRIMARY KEY` = **정수 id (1,2,3,...)**. UUID 아님. (UUID 컬럼은 `fa_account_id`/`reference_id` 뿐이다.)
- **GET 단건 조회**(`get_consultation_history_v1`, 같은 파일 575~615)는 `record_id: str` 를 **UUID 검증 없이** 그대로 `.eq("id", record_id)` 로 넘긴다 → 정수 id 로 정상 동작.
- 그런데 **신규 DELETE**(`delete_consultation_history_v1`)에는 GET 에 없는 `UUID(record_id)` fail-fast 블록이 추가돼 있다. 정수 id 가 오면 "malformed UUID" 로 판정 → **DB 접근 전 404** → **아무 것도 삭제 안 됨**.
- 웹앱은 `record.id`(정수, BIGSERIAL)를 그대로 DELETE URL 에 보낸다 → 회장 계정에서 삭제 버튼 눌러도 항상 404, 실삭제 0. 회장이 원한 "supabase 실삭제로 DB 낭비 0" 이 실제로는 동작 안 함.
- 현 pytest 가 이 갭을 못 잡은 이유: 테스트가 **UUID 모양 가짜 record_id** 를 하드코딩(`server/tests/test_consultation_history_v1_delete.py`) → UUID 검증을 우연히 통과 → 실 정수 id 케이스 미검증.

원인 = reference_id(UUID) 검증 패턴을 PK(id, 정수)에 잘못 복붙.

## 무엇을 (Surgical Changes — 아래 2파일만, 그 외 절대 금지)

### 1) `server/routes/consultation_history_v1.py` — DELETE 핸들러만
- `delete_consultation_history_v1` 안의 `try: UUID(record_id) ... except ...: raise _generic_error(404, ...)` **블록 전체 제거**.
- GET 과 동일하게 `record_id: str` 를 검증 없이 `.eq("id", record_id).eq("fa_account_id", fa_account_id)` 로 넘긴다. (0건 삭제 → 기존 404 분기가 IDOR/not-found 를 그대로 커버. 별도 형식검증 불필요 — GET 과 대칭.)
- 나머지(게이트 Depends 순서, hard delete, 감사로그, 500 처리, deleted_rows 판정)는 **그대로 유지**. from uuid import UUID 는 파일 다른 곳(reference_id)에서 쓰면 남겨두고, DELETE 에서만 미사용이면 그대로 둬도 됨(불필요 import 정리는 선택).

### 2) `server/tests/test_consultation_history_v1_delete.py`
- 하드코딩된 **UUID 모양 record_id 를 정수 문자열(예 "123", "456")로 교체** — 실 BIGSERIAL 스키마 반영.
- "malformed UUID → 404" 취지의 테스트 케이스가 있으면 **삭제하거나** 실제 동작(존재하지 않는 정수 id → 0행 → 404)에 맞게 재작성. 검증 목표: happy path(정수 id 1행 삭제→200), 0행(타 FA/미존재→404), flag OFF(403), per-FA IDOR(타 FA id → 0행 → 404).
- mock supabase 스텁이 record_id 를 정수로 다뤄도 삭제 1행 반환하도록 정렬.

## 검증 (Goal-Driven)
- `cd worktree && python3 -m pytest server/tests/test_consultation_history_v1_delete.py -q` → 전건 PASS.
- `python3 -m pytest -k consultation -q` → 회귀 0 (기존 pre-existing CORS env 아티팩트 1건은 무관, 그대로 허용).
- `npx tsc --noEmit` → exit 0 (프론트 변경 없음, 확인만).
- L1 스모크: TestClient in-process 로 **정수 record_id** DELETE happy path 200 + 0행 404 재확인 (UUID 모양 아닌 정수로).
- 프론트는 이미 정수 id 전송 — **프론트 코드 변경 금지**(이미 올바름).

## 금지
- 스키마/마이그레이션 변경 금지(013 sql 손대지 말 것 — id 는 BIGSERIAL 유지가 정답).
- id 를 UUID 로 바꾸는 방향 절대 금지(역방향 오답).
- 계약 5-enum 손대지 말 것. 새 에러코드 신설 금지.
- 지정 2파일 외 수정 금지.

## 종결
- 기존 브랜치에 fix 커밋 push. merge_policy=none → **팀장 머지 금지**. ANU 재검증·머지·배포 소관.
- 완료 시 ANU callback 필수(독립 ANU key). result.json 에 pytest DELETE 결과 + 커밋 sha 기록.
