altair823
f9dc0f749f
feat(app): wire IngestLogWriter into 5 ingest emit hooks (Arc<Mutex> sync)
v0.20.x ingest log feature 의 ingest pipeline wiring. 5 emit hook:
Hook 1: ingest_with_config_opts entry/exit (writer init + summary write + flush)
Hook 2: apply_ocr_to_pdf_pages closure (PdfOcrProgress::Finished → LogEvent::Ocr)
Hook 3: ingest_one_*_asset Err arm (LogEvent::Error)
Hook 4: scan 직후 fs_skips.events enumerate (LogEvent::Skip)
Hook 5: (Hook 3 통합) per-asset fatal error → LogEvent::Error
Hook 4 의 skip event carry 위해 kebab-source-fs 의 FsScanSkips 에
events: Vec<FsSkipEvent> field 추가 (kebab-source-fs 가 kebab-app
재호출 안 함 — cycle 회피).
Ownership: Option<Arc<Mutex<IngestLogWriter>>> binding 1 곳, 5 hook 이
clone+lock+write. ocr_ms_samples (Vec<u64> success-only) 는 Arc<Mutex>
로 share, summary stage 가 sort+p50/p90/max 계산. single-threaded
per-asset loop 라 deadlock/contention 위험 없음.
Writer 실패는 ingest 자체 fail 시키지 않음 (tracing::warn + 진행).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>