hyungi
68e2d7ea04
feat(documents): S1-ADD dedup·원본명 3컬럼 + md_status success→completed 매핑 (A) + office→md PoC (C-1)
plan ds-s1-backend-1 (r5 수렴). 코드만 스테이징 — migration 미적용(restart 보류, E-2 Soft Lock 예외창).
A (앱 v1 디코딩 비파괴 최소선):
- A-1 migrations/287_documents_dedup_fields.sql: original_filename TEXT / duplicate_of BIGINT FK ON DELETE SET NULL
/ duplicate_count INTEGER NOT NULL DEFAULT 0. 단일 statement·PG16 fast-path·BEGIN/COMMIT 금지. backfill 미포함(B-4).
- A-2 app/models/document.py: 1계층 블록에 3 mapped_column (+ ForeignKey import). md_* 는 기존.
- A-3 app/api/documents.py: DocumentResponse 3필드(duplicate_count=0 non-opt) + DocumentDetailResponse
field_validator(success→completed, mode=before) — read-time DB→API 단방향, write(ORM) 미적용.
- A-4 tests/test_s1_dedup_shape.py: success→completed 동작 + 비-success 통과 + 3필드 디폴트/roundtrip
+ ds-app contract fixture 디코드(skip-if-absent). py_compile OK. ★ backend 절반 — 전체 비파괴는 S3 render 테스트와 AND.
C-1 PoC (워커 미연결 — C-2 에서 marker_worker 분기 연결):
- app/workers/office_md.py: OOXML=markitdown(신규 dep, lazy) / hwp·hwpx=LibreOffice headless→HTML→markdownify(기존 dep).
실패·빈출력·타임아웃·dep부재 → OfficeMdError raise (success+빈md 금지 = C-5 postcondition 의 변환기 계약).
- scripts/poc_office_md.py: 표 fidelity 측정 하니스. E-1 = prod LibreOffice 버전핀 안전컨텍스트 실행(hwpx 필터 버전 의존).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 03:05:30 +00:00
..
2026-05-02 16:12:38 +09:00
2026-04-02 13:21:45 +09:00
2026-04-02 14:49:12 +09:00
2026-04-02 15:24:50 +09:00
2026-04-03 09:27:18 +09:00
2026-04-03 10:10:03 +09:00
2026-04-03 10:37:44 +09:00
2026-04-03 13:11:43 +09:00
2026-04-03 13:32:20 +09:00
2026-04-06 07:15:13 +09:00
2026-04-06 07:15:13 +09:00
2026-04-06 12:49:45 +09:00
2026-04-06 13:38:07 +09:00
2026-04-06 14:16:00 +09:00
2026-04-07 13:26:37 +09:00
2026-04-07 08:29:12 +09:00
2026-04-07 14:36:22 +09:00
2026-04-09 07:56:50 +09:00
2026-04-10 09:49:56 +09:00
2026-04-10 08:52:26 +09:00
2026-04-13 14:32:55 +09:00
2026-04-13 16:02:45 +09:00
2026-04-13 16:02:45 +09:00
2026-04-13 16:03:35 +09:00
2026-04-13 16:02:45 +09:00
2026-04-13 16:02:45 +09:00
2026-04-13 16:02:45 +09:00
2026-04-13 16:02:45 +09:00
2026-04-13 16:02:45 +09:00
2026-04-14 08:36:16 +09:00
2026-04-14 14:55:45 +09:00
2026-04-14 15:31:16 +09:00
2026-04-14 15:31:16 +09:00
2026-04-15 08:40:19 +09:00
2026-04-15 08:40:19 +09:00
2026-04-15 08:40:19 +09:00
2026-04-15 10:03:00 +09:00
2026-04-15 10:03:00 +09:00
2026-04-15 10:03:00 +09:00
2026-04-15 10:03:00 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 15:10:01 +09:00
2026-04-16 13:54:15 +09:00
2026-04-16 13:54:15 +09:00
2026-04-16 13:58:58 +09:00
2026-04-17 08:11:06 +09:00
2026-04-17 08:11:06 +09:00
2026-04-17 08:11:06 +09:00
2026-04-17 08:11:06 +09:00
2026-05-02 16:12:38 +09:00
2026-04-23 15:46:00 +09:00
2026-04-23 15:46:00 +09:00
2026-04-23 15:46:00 +09:00
2026-04-23 15:46:00 +09:00
2026-04-24 06:47:36 +09:00
2026-04-24 06:47:36 +09:00
2026-04-24 06:47:36 +09:00
2026-04-24 06:47:36 +09:00
2026-04-24 06:47:36 +09:00
2026-04-24 09:14:56 +09:00
2026-04-24 09:38:40 +09:00
2026-04-24 09:38:40 +09:00
2026-04-24 09:38:40 +09:00
2026-04-24 10:22:40 +09:00
2026-04-24 10:22:40 +09:00
2026-04-24 10:22:40 +09:00
2026-04-24 10:22:40 +09:00
2026-04-24 10:22:40 +09:00
2026-04-24 10:33:32 +09:00
2026-04-24 10:33:32 +09:00
2026-04-24 12:59:39 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 12:08:36 +09:00
2026-04-27 12:08:36 +09:00
2026-04-27 12:08:36 +09:00
2026-04-27 12:38:03 +09:00
2026-04-27 12:38:03 +09:00
2026-04-28 07:06:37 +09:00
2026-04-28 07:06:37 +09:00
2026-04-28 07:06:37 +09:00
2026-04-28 07:06:37 +09:00
2026-04-28 07:06:37 +09:00
2026-04-28 07:06:37 +09:00
2026-04-28 07:06:37 +09:00
2026-04-28 08:00:37 +09:00
2026-04-28 08:00:37 +09:00
2026-04-28 08:00:37 +09:00
2026-04-28 08:00:37 +09:00
2026-04-28 08:00:37 +09:00
2026-04-28 08:41:46 +09:00
2026-04-28 08:41:46 +09:00
2026-04-28 08:54:02 +09:00
2026-04-28 08:54:02 +09:00
2026-04-28 09:31:06 +09:00
2026-04-28 09:31:06 +09:00
2026-04-28 09:31:06 +09:00
2026-04-28 13:44:59 +09:00
2026-04-28 13:44:59 +09:00
2026-04-28 15:58:35 +09:00
2026-04-28 15:58:35 +09:00
2026-04-28 15:58:35 +09:00
2026-04-28 15:58:35 +09:00
2026-04-28 15:58:35 +09:00
2026-04-28 15:58:35 +09:00
2026-04-28 16:49:21 +09:00
2026-04-28 16:49:21 +09:00
2026-04-28 16:49:21 +09:00
2026-04-28 16:49:21 +09:00
2026-04-29 08:45:15 +09:00
2026-04-30 01:57:11 +00:00
2026-04-30 01:57:11 +00:00
2026-04-30 01:57:11 +00:00
2026-04-30 01:57:11 +00:00
2026-04-30 01:57:11 +00:00
2026-04-30 01:57:11 +00:00
2026-04-30 01:57:11 +00:00
2026-04-30 01:57:11 +00:00
2026-04-30 01:57:11 +00:00
2026-05-01 07:22:31 +09:00
2026-05-01 07:22:31 +09:00
2026-05-01 00:06:23 +00:00
2026-05-01 09:32:16 +09:00
2026-05-01 09:32:16 +09:00
2026-05-01 09:32:16 +09:00
2026-05-01 09:32:16 +09:00
2026-05-01 09:49:01 +09:00
2026-05-01 11:42:08 +09:00
2026-05-01 11:42:08 +09:00
2026-05-02 07:20:29 +09:00
2026-05-02 07:20:29 +09:00
2026-05-02 07:20:29 +09:00
2026-05-10 14:05:41 +09:00
2026-05-10 14:05:41 +09:00
2026-05-10 14:05:41 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 12:04:21 +09:00
2026-05-11 12:04:21 +09:00
2026-05-11 12:04:21 +09:00
2026-05-11 12:04:21 +09:00
2026-05-11 12:06:41 +09:00
2026-05-12 13:04:56 +09:00
2026-05-12 13:04:56 +09:00
2026-05-12 13:04:56 +09:00
2026-05-12 13:04:56 +09:00
2026-05-12 21:47:15 +00:00
2026-05-12 22:05:06 +00:00
2026-05-12 22:05:06 +00:00
2026-05-12 22:05:06 +00:00
2026-05-12 22:05:06 +00:00
2026-05-16 13:44:15 +09:00
2026-05-16 13:44:15 +09:00
2026-05-17 06:20:46 +00:00
2026-05-18 20:24:59 +09:00
2026-05-18 20:24:59 +09:00
2026-05-18 20:24:59 +09:00
2026-05-18 20:24:59 +09:00
2026-05-18 20:24:59 +09:00
2026-05-19 08:54:07 +09:00
2026-05-19 08:54:07 +09:00
2026-05-24 06:11:29 +00:00
2026-05-24 06:11:29 +00:00
2026-05-24 07:01:34 +00:00
2026-05-24 07:01:34 +00:00
2026-05-24 07:01:34 +00:00
2026-05-24 12:47:41 +00:00
2026-05-24 12:47:41 +00:00
2026-05-24 13:12:42 +00:00
2026-05-24 13:12:42 +00:00
2026-05-24 13:45:30 +00:00
2026-06-08 03:05:30 +00:00
2026-06-06 21:33:12 +09:00
2026-06-06 21:33:12 +09:00
2026-06-06 21:33:12 +09:00
2026-06-06 21:33:12 +09:00
2026-06-06 21:33:12 +09:00
2026-06-06 21:33:12 +09:00
2026-06-06 21:33:12 +09:00
2026-06-06 21:33:12 +09:00
2026-06-06 21:33:12 +09:00
2026-06-06 21:33:12 +09:00
2026-06-06 21:33:12 +09:00
2026-06-06 21:33:12 +09:00
2026-06-07 10:18:17 +09:00
2026-06-07 10:18:17 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00
2026-06-07 20:42:32 +09:00