test(app): caption 캐시 검증 보강 — mock-LLM CI 가드 + GPU 도그푸딩 evidence #218

Merged
altair823 merged 2 commits from test/caption-cache-mock into main 2026-06-25 04:46:37 +00:00
Owner

요약

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)

변경

  • 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 과 동일(라인별 검증).
  • mock-LLM 결정적 테스트 (crates/kebab-app/tests/caption_cache.rs): CountingCaptionMock(generate_stream 호출 카운터)로 cache_image_caption 를 직접 구동. 재실행=LLM 1회만(히트) + block.caption full-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 입증.
  • GPU 도그푸딩 evidence (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_cache green; deliberate-break→fail(left:2 right:1) 입증.
  • cargo clippy --workspace --all-targets -- -D warnings 0. kebab-app lib 89 passed(추출 byte-neutral).
  • 코드리뷰: byte-neutral 라인별 검증 PASS + 테스트 유효성(false-green 아님) 확인.

비범위

  • v0.31.0 자체는 이미 릴리스됨(이 PR 은 후속 검증 보강, 동작 불변). 버전 bump 없음.

시험 항목 (Test Plan)

  • caption_cache 결정적 게이트 green (GPU 불필요)
  • clippy --workspace --all-targets 0
  • 추출 byte-neutral (kebab-app lib 89 passed)

Assisted-by: Claude Code

## 요약 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) ## 변경 - **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 과 동일(라인별 검증). - **mock-LLM 결정적 테스트** (`crates/kebab-app/tests/caption_cache.rs`): `CountingCaptionMock`(`generate_stream` 호출 카운터)로 `cache_image_caption` 를 직접 구동. 재실행=LLM 1회만(히트) + `block.caption` full-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 입증. - **GPU 도그푸딩 evidence** (`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_cache` green; deliberate-break→fail(`left:2 right:1`) 입증. - `cargo clippy --workspace --all-targets -- -D warnings` 0. kebab-app lib 89 passed(추출 byte-neutral). - 코드리뷰: byte-neutral 라인별 검증 PASS + 테스트 유효성(false-green 아님) 확인. ## 비범위 - v0.31.0 자체는 이미 릴리스됨(이 PR 은 후속 검증 보강, 동작 불변). 버전 bump 없음. ## 시험 항목 (Test Plan) - [ ] caption_cache 결정적 게이트 green (GPU 불필요) - [ ] clippy --workspace --all-targets 0 - [ ] 추출 byte-neutral (kebab-app lib 89 passed) Assisted-by: Claude Code
altair823 added 2 commits 2026-06-25 04:44:27 +00:00
claude-reviewer-01 approved these changes 2026-06-25 04:45:08 +00:00
claude-reviewer-01 left a comment
Member

회차 1 — subagent-driven 개발로 byte-neutral 추출 + 테스트 유효성을 이미 full code-review 했고(APPROVE), 유일한 Nit(doc 줄바꿈)은 PR 전 amend(602d752)로 해소. 잔여 actionable 0건. APPROVE.

검증 완료

  • byte-neutral 추출 (라인별): 인라인 caption wrap → 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 복구 확인).
  • 테스트 유효성 (false-green 아님): call_count(generate_stream 호출 카운터) 판별자는 LM 호출을 세지 DB 행을 안 세므로 INSERT-OR-REPLACE row-count false-green 에 면역. 3중 어설션(cold=1 / warm=1 히트 / version-bump=2 미스) + full-struct ModelCaption PartialEq identity. deliberate-break(decode→None) 시 warm call_count 2≠1 로 fail 입증(caption_cache.rs:222).
  • seam: #[doc(hidden)] pub fn + lib.rs 재export — 기존 test_ingest_config_signature seam 과 동일 컨벤션, public API 미확대.
  • GPU 도그푸딩 evidence(docs): ollama-vision 실엔진 b2 검증(22× + 비결정성 박제 + 캡션 품질). lemonade 복구 확인.
  • clippy --workspace --all-targets 0, caption_cache green, kebab-app lib 89 passed.

머지 차단 0건. APPROVE.

회차 1 — subagent-driven 개발로 byte-neutral 추출 + 테스트 유효성을 이미 full code-review 했고(APPROVE), 유일한 Nit(doc 줄바꿈)은 PR 전 amend(602d752)로 해소. 잔여 actionable 0건. **APPROVE.** ## 검증 완료 - **byte-neutral 추출 (라인별)**: 인라인 caption wrap → `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 복구 확인). - **테스트 유효성 (false-green 아님)**: `call_count`(generate_stream 호출 카운터) 판별자는 LM 호출을 세지 DB 행을 안 세므로 INSERT-OR-REPLACE row-count false-green 에 면역. 3중 어설션(cold=1 / warm=1 히트 / version-bump=2 미스) + full-struct `ModelCaption` PartialEq identity. deliberate-break(decode→None) 시 warm call_count 2≠1 로 fail 입증(caption_cache.rs:222). - **seam**: `#[doc(hidden)] pub fn` + lib.rs 재export — 기존 `test_ingest_config_signature` seam 과 동일 컨벤션, public API 미확대. - **GPU 도그푸딩 evidence**(docs): ollama-vision 실엔진 b2 검증(22× + 비결정성 박제 + 캡션 품질). lemonade 복구 확인. - clippy --workspace --all-targets 0, caption_cache green, kebab-app lib 89 passed. 머지 차단 0건. APPROVE.
altair823 merged commit fd3b4ae3d2 into main 2026-06-25 04:46:37 +00:00
altair823 deleted branch test/caption-cache-mock 2026-06-25 04:46:38 +00:00
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: altair823-org/kebab#218