From df2b09b0fa55215ec835e3192643f5b03de884b2 Mon Sep 17 00:00:00 2001 From: Hyungi Ahn Date: Sun, 3 May 2026 02:41:51 +0000 Subject: [PATCH] =?UTF-8?q?docs(eval):=20Phase=202=20canary=20retry=20GO?= =?UTF-8?q?=20=E2=80=94=20success=2037/40=20(92.5%)=20failed=202=20skipped?= =?UTF-8?q?=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 옵션 C 실행 (2026-05-03 02:36-02:39 UTC): - 5201 documents stuck processing → failed (conditional UPDATE 1 row) - 3817 재 enqueue → success 35.8s - 4059 재 enqueue → success 100.7s - GPU contention 해소 확인 (free 8820 MiB) 최종 tally: success 37 / failed 2 (3810 corrupt PDF + 5201 scan-likely timeout) / skipped 1 (5090 MAX_PAGES). Plan 3 게이트 모두 PASS. 다음 = 사용자 승인 게이트 (2-C 진입 + nightly 모드 선택). main 머지 + parent pull + cron 추가 4단계 대기. 후속 백로그 (Phase 1B+, 별도 PR): - B1 scan-likely auto-skip (5201 패턴) - B2 OOM 503 transient (야간 contention 자동 복구) - B3 queue exhausted → doc.md_status 동기화 (corner case 정리) --- evals/markdown/phase2_canary_result.md | 58 ++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/evals/markdown/phase2_canary_result.md b/evals/markdown/phase2_canary_result.md index ce26775..85c0440 100644 --- a/evals/markdown/phase2_canary_result.md +++ b/evals/markdown/phase2_canary_result.md @@ -106,3 +106,61 @@ canary 종료 후 (02:31 UTC) 측정: 위 A/B/C/D 중 선택. 추천 = **C (3817+4059 즉시 재 enqueue)** 또는 **A (그대로 진입, 야간 GPU contention 낮음 가정)**. B 는 plan scope 확장이라 별도 라운드 권장. 5201 의 stuck 'processing' 은 어느 옵션 가도 **수동 정리 필요** (`UPDATE documents SET md_status='failed', md_extraction_error='ReadTimeout after 3 attempts (Phase 1B corner case)' WHERE id=5201`). production DB write 라 사용자 승인 후. + +--- + +## Retry 결과 (2026-05-03 02:36-02:39 UTC) — GO 게이트 통과 + +옵션 C 실행 결과: + +| 작업 | 결과 | +|---|---| +| 5201 documents 정리 (`md_status='processing' → 'failed'`, conditional UPDATE) | 1 row updated, error_message 새로 박음 | +| 5201 queue 정리 | 불필요 (이미 status='failed' terminal) | +| 3817 재 enqueue | success (35.8s, GPU free 8820 MiB) | +| 4059 재 enqueue | success (100.7s, large bias 영향) | + +### 최종 분포 + +| md_status | count | rate | +|---|---|---| +| success | **37** | 92.5% | +| failed | **2** | 5.0% | +| skipped | **1** | 2.5% | + +failed 2건 분류: +- doc 3810: corrupt PDF (PdfiumError) — Marker 책임 아님, non-retryable +- doc 5201: scan-likely + 빈 텍스트 + ReadTimeout — Phase 1B+ corner case backlog + +### Plan 게이트 재판정 + +| 기준 | 임계 | 실측 | 판정 | +|---|---|---|---| +| success rate | ≥ 36/40 (90%) | 37/40 (92.5%) | ✅ PASS | +| failed | ≤ 2 | 2 | ✅ PASS | +| skipped | ≤ 6 | 1 | ✅ PASS | + +**→ 2-C nightly sweep 진입 GO.** + +### 다음 = 2-C 진입 게이트 (사용자 승인 필요) + +옵션: +- **모드 A (cron)** — 추천. 23:00 KST nightly, 50건/limit, max-active-queue 5 +- 모드 B (manual nightly) +- 모드 C (systemd timer) + +cron 추가 전 필수 작업: +1. main 머지: feat/phase2-backfill (HEAD `79dc31b` 또는 retry 반영 후 새 commit) → main FF +2. parent repo `git pull --ff-only` → `/app/scripts/phase2_backfill.py` canonical path 활성 +3. `~/logs/phase2/` 디렉토리 생성 +4. crontab entry 추가 + +사용자 승인 + 모드 선택 시 위 4 단계 진행. + +### Phase 1B+ backlog (Phase 2 외 별도) + +retry 결과는 다음 후속 작업의 우선순위 데이터: + +- **B2 후보**: server.py 가 OutOfMemoryError 만 503 으로 분류 (현재 422 = non-retryable). 야간 GPU contention 발생 시 자동 retry 가능. → 1B+ small PR +- **B1 후보**: marker_worker scan-likely + tiny text 자동 skip (5201 패턴). text_density < 1 OR text_len < 100 시 skipped. → 1B+ small PR +- **B3 후보**: queue 영구 실패 시 doc.md_status 동기화. processing 상태 stuck 방지. → 1B+ small PR