feat(ingest): asset 내부 phase 진행 로깅 (asset_chunked/expansion_progress/asset_timings) #201
Reference in New Issue
Block a user
Delete Branch "feat/ingest-progress-detail"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
요약
ingest 진행 이벤트가 asset(문서) 단위(
asset_started/asset_finished)뿐이라, 한 문서 내부의 parse / chunk / expansion(별칭 LLM, 청크당 순차 호출) / embed / store 가 깜깜했다. expansion 은 청크당14s(원격 GPU Ollama)이고 큰 문서는 청크 수백~천 개 → 그 한 문서에서 수십 분이 걸리는데 진행바는1/N에 멈춘 듯 보여 사용자가 병목을 못 봤다.이 PR 은 asset 내부 phase 를 노출해 어디서 시간이 가는지 즉시 보이게 한다 — 청크 수 · expansion 라이브 카운터 · phase 별 소요시간. wire
ingest_progress.v1은 additive(backward-compat) 유지.설계: docs/superpowers/specs/ 없음(진행-로깅 계측, design §2.4a 의 "future embed-batch events" 자리 확장). 동기/벤치 근거는
tasks/HOTFIXES.md2026-06-02 항목.변경
IngestEvent신규 변이 3개 (#[serde(tag="kind")]→ wire v1 호환):asset_chunked { idx, total, chunks }— 청킹 직후(expansion/embed 전) 청크 수 즉시 노출. markdown/image/pdf 모두.expansion_progress { idx, total, done, chunks }— expansion 루프 중 스로틀(25청크 또는 ≥1s). 캐시 히트도done포함. 채널 폭주 방지.asset_timings { idx, total, parse_ms, chunk_ms, expansion_ms, embed_ms, store_ms }— markdown 경로 phase 별 소요시간.ingest_one_asset/_image_asset/_pdf_asset에idx,total스레딩 + markdown 경로 phase 타이머.progress.rs렌더 —→ N chunks,별칭 확장 done/chunks,⏱ parse … · store ….--json자동,--quiet억제.검증
cargo clippy --workspace --all-targets -j 4 -- -D warnings→ exit 0.cargo test -p kebab-app -p kebab-cli -j 4 --no-fail-fast→ exit 0, 312 passed. (독립 재실행 2회 확인.)--json에asset_chunked/asset_timings출현, human stderr⏱ parse 3ms · chunk 673ms · expand 0ms · embed 96ms · store 33ms.비범위 / 한계
asset_chunked만 — phase shape 가 OCR/caption 이라 다름).expansion_progress비-TTY human 은 로그 폭주 방지로 기본 억제(--json은 전량). 라이브 카운터 rate/ETA 의 실제 체감은 원격 LLM 연결 도그푸딩에서 별도 확인 권장.<worktree>/target/debug/kebab하드코딩 →CARGO_TARGET_DIR리다이렉트와 충돌. 이 PR 무관(기존 이슈),env!("CARGO_BIN_EXE_kebab")로 교체 권장.시험 항목 (Test Plan)
kind판별 + 순서 불변식 테스트--json새 kind + human phase 타이밍 라인expansion_progress라이브 카운터 체감 확인Assisted-by: Claude Code
asset(문서) 단위뿐이던 ingest 진행 이벤트에 문서 내부 phase 가시성을 추가. 큰 문서가 expansion(별칭 LLM, 청크당 순차)으로 수십 분 걸려도 진행바가 1/N 에 멈춘 듯 보이던 문제 해결. wire ingest_progress.v1 additive (backward-compat): - asset_chunked {idx,total,chunks} — 청킹 직후, markdown/image/pdf 전 경로 - expansion_progress {idx,total,done,chunks} — expansion 루프 스로틀 (25청크 또는 1s, 종료 시 done==chunks). 캐시 히트도 done 에 포함 - asset_timings {idx,total,parse_ms,chunk_ms,expansion_ms,embed_ms,store_ms} — markdown 경로 phase별 wall-clock 설계: timing 은 kebab_core::IngestItem(wire-stable) 변경을 피해 신규 AssetTimings 이벤트로 ingest_one_asset 가 직접 emit (AssetFinished 무변경). CLI(progress.rs): 진행바 sub-message(→ N chunks / 별칭 확장 done/chunks) + asset 종료 시 phase timing 한 줄(fmt_ms). TUI reducer no-op arm. 검증: clippy -D warnings exit 0; cargo test -p kebab-app -p kebab-cli 312 passed/0 failed. ordering-invariant 테스트 재작성 + 신규 직렬화 테스트. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>회차 1 — 독립 opus 코드리뷰 후 MEDIUM/LOW 반영 검토. wire ingest_progress.v1 additive(신규 kind 3개, 기존 필드 무변경, serde tag 보존, TUI reducer no-op arm)로 호환 유지. idx/total 스레딩 off-by-one 없음(AssetStarted 와 동일 값). 리뷰 반영 확인: store_ms 경계 정정(stale-vector purge 를 embed/vector phase 로 이동 → store_ms=SQLite put_* 만, 진단 정확도), 최종 expansion_progress 프레임 done!=last_done 가드(중복/0-0 제거), schema/HOTFIXES dangling ref 정정. clippy -D warnings 0, test 312 passed(독립 재실행). 잔여 actionable 0 — 머지 동의. (한계: image/pdf phase timing 없음, expansion_progress 라이브 카운터 실측은 원격 LLM 도그푸딩에서.)