test(app): caption 캐시 검증 보강 — mock-LLM CI 가드 + GPU 도그푸딩 evidence #218
Reference in New Issue
Block a user
Delete Branch "test/caption-cache-mock"
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?
요약
v0.31.0 의 caption 캐시(b2, #217)는 코드리뷰 + payload 테스트로 검증됐으나, OCR(b1 paddle 게이트 / b3 mock 게이트)과 달리 결정적 실행 테스트가 없었다. 이 PR 은 그 공백을 (A) GPU 실엔진 도그푸딩 evidence + (B) GPU 없이 도는 mock-LLM 결정적 CI 가드로 닫는다.
설계: docs/superpowers/specs/2026-06-24-cache-everywhere-ocr-caption-design.md §3 (b2)
변경
crates/kebab-app/src/ingest.rs):ingest_one_image_asset인라인 caption 캐시 wrap 을#[doc(hidden)] pub fn cache_image_caption(...)로 byte-neutral 추출 — b3 의apply_ocr_to_pdf_pages와 대칭인 mock-injectable seam 확보. 동작·provenance·cache-key·enabled 게이트 모두 v0.31.0 과 동일(라인별 검증).crates/kebab-app/tests/caption_cache.rs):CountingCaptionMock(generate_stream호출 카운터)로cache_image_caption를 직접 구동. 재실행=LLM 1회만(히트) +block.captionfull-struct byte-identical +prompt_template_version변경=미스 검증. call_count 판별자는 row-count 의 INSERT-OR-REPLACE false-green 에 면역(LM 호출을 세지 DB 행을 안 셈). deliberate-break(decode_model_caption→None) 시 warm call_count 2≠1 로 fail 입증.tasks/HOTFIXES.md+docs/release-notes/v0.31.0-draft.md): ollama-r9700(gemma3:4b) 로 실 jira 스크린샷 4개 caption → 재인덱싱 캐시 HIT(created_at 4/4 고정, 22× 빠름), 비결정적 LLM 캡션 verbatim 재현(비결정성 박제 실엔진 확증), 캡션 품질 양호. lemonade 무조건 복구 확인.검증
cargo test -p kebab-app --test caption_cachegreen; deliberate-break→fail(left:2 right:1) 입증.cargo clippy --workspace --all-targets -- -D warnings0. kebab-app lib 89 passed(추출 byte-neutral).비범위
시험 항목 (Test Plan)
Assisted-by: Claude Code
회차 1 — subagent-driven 개발로 byte-neutral 추출 + 테스트 유효성을 이미 full code-review 했고(APPROVE), 유일한 Nit(doc 줄바꿈)은 PR 전 amend(
602d752)로 해소. 잔여 actionable 0건. APPROVE.검증 완료
pub fn cache_image_caption추출이 version key/cache key/HIT(block.caption 설정+touch, apply_caption 스킵, provenance 미push)/MISS(apply_caption + record_failure + cache_put)/enabled 게이트(호출부 유지)/?전파 전부 v0.31.0 과 1:1 동일. cold ingest 출력·provenance 불변.derivation_payload.rs무수정(break 복구 확인).call_count(generate_stream 호출 카운터) 판별자는 LM 호출을 세지 DB 행을 안 세므로 INSERT-OR-REPLACE row-count false-green 에 면역. 3중 어설션(cold=1 / warm=1 히트 / version-bump=2 미스) + full-structModelCaptionPartialEq identity. deliberate-break(decode→None) 시 warm call_count 2≠1 로 fail 입증(caption_cache.rs:222).#[doc(hidden)] pub fn+ lib.rs 재export — 기존test_ingest_config_signatureseam 과 동일 컨벤션, public API 미확대.머지 차단 0건. APPROVE.