docs(eval): Phase 2 canary retry GO — success 37/40 (92.5%) failed 2 skipped 1

옵션 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 정리)
This commit is contained in:
2026-05-03 02:41:51 +00:00
committed by Hyungi Ahn
parent 5bf9ff9dc2
commit df2b09b0fa
+58
View File
@@ -106,3 +106,61 @@ canary 종료 후 (02:31 UTC) 측정:
위 A/B/C/D 중 선택. 추천 = **C (3817+4059 즉시 재 enqueue)** 또는 **A (그대로 진입, 야간 GPU contention 낮음 가정)**. B 는 plan scope 확장이라 별도 라운드 권장. 위 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 라 사용자 승인 후. 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