3a22d225a0
delete_file 파라미터가 광고만 하고 본문에서 0회 참조(soft-delete만, 파일 영구 잔존 + 프론트가 실제 호출)되던 거짓 계약 구현. (c) 큐드삭제: - 마이그 359: documents.purge_requested_at 컬럼(ADD COLUMN IF NOT EXISTS, replayable). - delete_document: delete_file=true 시 purge_requested_at 마커 set(deleted_at 과 별도). - document_purge_sweep cron(03:20 KST): purge_requested_at + grace(30일) 경과 + 파일 존재 시 NAS 원본 unlink + AUDIT 로그. ★sweep 는 deleted_at 아니라 purge_requested_at 기준 — 일반 숨김(delete_file=false)은 파일 보존(undelete 가능), 명시 purge 만 물리삭제(데이터 안전). - DELETE 요청 경로엔 동기 비가역 op 0. 파일 존재 체크로 멱등. unlink 는 to_thread(R5 일관). 검증: py_compile 통과. migration txn 제어문 없음. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>