fix(ingest): ingest 설정 변경 시 영향 자산 자동 재색인 #205

Merged
altair823 merged 3 commits from fix/ingest-config-invalidation into main 2026-06-03 14:33:21 +00:00
Owner

요약

증분 ingest 의 skip 판정이 ingest 산출물을 바꾸는 설정 변경(OCR/caption, 청킹 파라미터, pdf.ocr, [ingest.code])을 감지하지 못해, 설정을 바꾸고 재색인해도 자산을 "Unchanged" 로 건너뛰던 갭을 일반화 수정한다. try_skip_unchanged 는 자산 내용(blake3)+parser/chunker/embedding version 만 비교하는데, 위 설정들은 이 셋에 반영되지 않았다. 사용자 요구: OCR/caption 뿐 아니라 ingest 출력에 영향 주는 모든 설정이 변경되면 영향 자산이 자동 재색인되도록. 새 명령/플래그/wire 없음(skip 판정 정정) → patch.

설계: docs/superpowers/specs/2026-06-03-ocr-toggle-invalidation-spec.md
계획: docs/superpowers/plans/2026-06-03-config-invalidation-plan.md

변경

  • 신규 ingest_config_signature(config, media_type) — 자산 타입별 ingest 산출 영향 설정만 결정적 서명. 공통(전 타입): [chunking] target_tokens/overlap_tokens/respect_markdown_headings/chunker_version. image: + ocr(enabled,model)·caption(enabled,prompt_template_version). pdf: + pdf.ocr(enabled||always_on→enabled/always_on/model). code: + [ingest.code] 7필드. off↔off 는 안정 토큰.
  • 신규 effective_parser_version(config, asset, base) = "{base}|{signature}". md/image/pdf/code 4경로에서 이를 (a) try_skip_unchanged 비교값, (b) persist 전 canonical.parser_version override 로 사용 — 두 곳 동일.
  • doc_id 불변(base extractor 상수로 파생, workspace_path 조회) → 설정 변경에도 안정, orphan churn 없음. composite 는 비교/저장 필드에만.
  • 제외(재색인 트리거 X): search/rag/nli/ui/logging/storage/workspace + 산출 무관 런타임 파라미터(max_pixels/languages/*_timeout_secs).
  • code Tier-3 fallback 문서는 none-v1 sentinel 유지(skip bypass 의존), 정상 outcome 만 composite.
  • version 0.26.1 → 0.26.2 (patch).

검증

  • cargo clippy --workspace --all-targets -j 8 -- -D warnings → exit 0.
  • cargo test -p kebab-app -p kebab-parse-image -p kebab-parse-pdf -p kebab-parse-code -p kebab-chunk -j 8 → 67 그룹 0 failed.
  • 동작 e2e: image.ocr/caption toggle→이미지만 재색인, pdf.ocr toggle→PDF만, chunking 변경→전타입, code 옵션→코드만, 무관 설정(search/rag/ui)→재색인 0, 동일 config→전자산 skip, --force-reingest→bypass. 모두 통과.

호환성 / 비범위

  • 업그레이드 1회 효과: 기존 doc 의 저장 parser_version(상수)이 새 composite 와 달라 업그레이드 후 첫 ingest 에서 자산 1회 재색인(현재 설정대로). embedding 은 V012 캐시 히트라 저렴. 마크다운/코드도 1회 재청킹.
  • 새 config 키/CLI 플래그/wire ���음. --force-reingest 전체 강제용 유지.

시험 항목 (Test Plan)

  • image OCR off→on, force 없이 재색인
  • 동일 config 재실행 시 전 자산 skip(불필요 재색인 0)
  • search/rag 설정만 바꾸면 재색인 0

Assisted-by: Claude Code

## 요약 증분 ingest 의 skip 판정이 **ingest 산출물을 바꾸는 설정 변경**(OCR/caption, 청킹 파라미터, pdf.ocr, `[ingest.code]`)을 감지하지 못해, 설정을 바꾸고 재색인해도 자산을 "Unchanged" 로 건너뛰던 갭을 일반화 수정한다. `try_skip_unchanged` 는 자산 내용(blake3)+parser/chunker/embedding version 만 비교하는데, 위 설정들은 이 셋에 반영되지 않았다. 사용자 요구: OCR/caption 뿐 아니라 **ingest 출력에 영향 주는 모든 설정**이 변경되면 영향 자산이 자동 재색인되도록. 새 명령/플래그/wire 없음(skip 판정 정정) → patch. 설계: docs/superpowers/specs/2026-06-03-ocr-toggle-invalidation-spec.md 계획: docs/superpowers/plans/2026-06-03-config-invalidation-plan.md ## 변경 - 신규 `ingest_config_signature(config, media_type)` — 자산 타입별 **ingest 산출 영향 설정만** 결정적 서명. 공통(전 타입): `[chunking]` target_tokens/overlap_tokens/respect_markdown_headings/chunker_version. image: + ocr(enabled,model)·caption(enabled,prompt_template_version). pdf: + pdf.ocr(enabled||always_on→enabled/always_on/model). code: + `[ingest.code]` 7필드. off↔off 는 안정 토큰. - 신규 `effective_parser_version(config, asset, base) = "{base}|{signature}"`. md/image/pdf/code 4경로에서 이를 (a) `try_skip_unchanged` 비교값, (b) **persist 전 `canonical.parser_version` override** 로 사용 — 두 곳 동일. - **doc_id 불변**(base extractor 상수로 파생, workspace_path 조회) → 설정 변경에도 안정, orphan churn 없음. composite 는 비교/저장 필드에만. - **제외**(재색인 트리거 X): search/rag/nli/ui/logging/storage/workspace + 산출 무관 런타임 파라미터(max_pixels/languages/*_timeout_secs). - code Tier-3 fallback 문서는 `none-v1` sentinel 유지(skip bypass 의존), 정상 outcome 만 composite. - version 0.26.1 → **0.26.2** (patch). ## 검증 - `cargo clippy --workspace --all-targets -j 8 -- -D warnings` → exit 0. - `cargo test -p kebab-app -p kebab-parse-image -p kebab-parse-pdf -p kebab-parse-code -p kebab-chunk -j 8` → 67 그룹 0 failed. - 동작 e2e: image.ocr/caption toggle→이미지만 재색인, pdf.ocr toggle→PDF만, chunking 변경→전타입, code 옵션→코드만, **무관 설정(search/rag/ui)→재색인 0**, 동일 config→전자산 skip, `--force-reingest`→bypass. 모두 통과. ## 호환성 / 비범위 - **업그레이드 1회 효과**: 기존 doc 의 저장 parser_version(상수)이 새 composite 와 달라 업그레이드 후 첫 ingest 에서 자산 1회 재색인(현재 설정대로). embedding 은 V012 캐시 히트라 저렴. 마크다운/코드도 1회 재청킹. - 새 config 키/CLI 플래그/wire ���음. `--force-reingest` 전체 강제용 유지. ## 시험 항목 (Test Plan) - [ ] image OCR off→on, force 없이 재색인 - [ ] 동일 config 재실행 시 전 자산 skip(불필요 재색인 0) - [ ] search/rag 설정만 바꾸면 재색인 0 Assisted-by: Claude Code
altair823 added 3 commits 2026-06-03 14:29:08 +00:00
ingest 산출에 영향 주는 설정(청킹/이미지 OCR·caption/pdf.ocr/[ingest.code])의
결정적 서명을 effective parser_version 에 폴딩 → 변경 시 --force-reingest 없이
영향 자산만 자동 재색인.

- ingest_config_signature(config, media_type): per-type 산출-영향 설정만 직렬화.
  비산출 설정(search/rag/ui/log + max_pixels/languages/timeout)은 제외.
- effective_parser_version(config, asset, base) = "{base}|{signature}".
- md/image/pdf/code 경로: composite 를 (a) try_skip_unchanged 비교값,
  (b) persist 전 canonical.parser_version override 에 사용.
- doc_id 는 base parser_version 으로 계속 파생 → 설정 변경에도 안정(orphan churn 회피).
- code Tier-3 fallback 은 bare "none-v1" sentinel 유지(skip bypass 의존).
- 단위테스트 8: 결정성/청킹=전타입/이미지·pdf·code 토글/무관설정 회귀가드.

spec: docs/superpowers/specs/2026-06-03-ocr-toggle-invalidation-spec.md

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- config_invalidation.rs(신규): 동일config=전skip / 청킹변경=md+code재색인 /
  [ingest.code]변경=코드만 / search변경=재색인0 (회귀가드) end-to-end.
- code_ingest_smoke / pdf_pipeline: 저장 parser_version 이 이제
  "{base}|{sig}" composite 라, exact assert 를 base 접두사(split('|').next()) 비교로 갱신.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Cargo.toml workspace version 0.26.1 → 0.26.2 (+Cargo.lock cascade).
  결과 포맷·CLI·wire 불변(내부 skip 판정 정정) → patch (CLAUDE.md §Versioning).
- tasks/HOTFIXES.md dated entry: 일반화 + 업그레이드 1회 재색인 안내 + 도그푸딩 evidence.
- HANDOFF.md 1줄.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
claude-reviewer-01 approved these changes 2026-06-03 14:30:53 +00:00
claude-reviewer-01 left a comment
Member

회차 1 — ingest 설정 변경 자동 재색인. 독립 검증 후 actionable 결함 0, 머지 동의(APPROVE).

독립 검증(리더)

  • clippy --workspace --all-targets -j 8 -D warnings → 0.
  • cargo test -p kebab-app -p kebab-parse-image -p kebab-parse-pdf -p kebab-parse-code -p kebab-chunk -j 8 → 67 그룹 0 failed.
  • 동작 e2e 전부 green: image.ocr/caption toggle→이미지만, pdf.ocr→PDF만, chunking→전타입, code 옵션→코드만, unrelated_settings_never_invalidate(search/rag/ui→0), identical_config_skips_all_assets, force_reingest_bypasses_skip.

코드 검토

  • ingest_config_signature: 타입별 산출-영향 설정만, off↔off 안정 토큰(불필요 재색인 0), exhaustive match(미래 media 타입 컴파일 강제), pdfocr=enabled||always_on(실 ingest 게이트와 일치). 결정적.
  • effective_parser_version={base}|{sig} 를 md/image/pdf/code 4경로 모두 (a)try_skip_unchanged 비교값 + (b)persist 전 canonical.parser_version override 로 일관 적용(두 값 동일해야 다음 비교 성립 — 충족).
  • doc_id 불변(base 로 파생, workspace_path 조회) → 설정 변경에도 안정, orphan churn 회피. composite 는 비교/저장 필드에만 — 영리함.
  • code Tier-3 fallback 은 none-v1 sentinel 유지(skip 의 stored_is_tier3_fallback bypass 의존), 정상 outcome 만 composite — 엣지 정확.
  • 기존 테스트 assert: p.0.split('|').next() 로 base 추출해 동일성 검증 — 약화 아닌 정당 갱신.

좋았던 판단: 단일 헬퍼에 "무엇이 ingest 산출에 영향 주나" 를 한 곳에 모아 유지보수성↑. 무관 설정 제외 + 회귀 가드 테스트. 업그레이드 1회 재색인은 HOTFIXES/version 주석에 명시(embedding V012 캐시로 저렴).

patch(0.26.2) 분류 정확(결과 포맷·CLI·wire 불변, skip 판정 정정). 사용자 머지 권장.

회차 1 — ingest 설정 변경 자동 재색인. 독립 검증 후 actionable 결함 0, 머지 동의(APPROVE). **독립 검증(리더)** - `clippy --workspace --all-targets -j 8 -D warnings` → 0. - `cargo test -p kebab-app -p kebab-parse-image -p kebab-parse-pdf -p kebab-parse-code -p kebab-chunk -j 8` → 67 그룹 0 failed. - 동작 e2e 전부 green: image.ocr/caption toggle→이미지만, pdf.ocr→PDF만, chunking→전타입, code 옵션→코드만, **unrelated_settings_never_invalidate(search/rag/ui→0)**, identical_config_skips_all_assets, force_reingest_bypasses_skip. **코드 검토** - `ingest_config_signature`: 타입별 산출-영향 설정만, off↔off 안정 토큰(불필요 재색인 0), exhaustive `match`(미래 media 타입 컴파일 강제), pdfocr=`enabled||always_on`(실 ingest 게이트와 일치). 결정적. - `effective_parser_version`=`{base}|{sig}` 를 md/image/pdf/code **4경로 모두** (a)`try_skip_unchanged` 비교값 + (b)persist 전 `canonical.parser_version` override 로 **일관 적용**(두 값 동일해야 다음 비교 성립 — 충족). - **doc_id 불변**(base 로 파생, workspace_path 조회) → 설정 변경에도 안정, orphan churn 회피. composite 는 비교/저장 필드에만 — 영리함. - code Tier-3 fallback 은 `none-v1` sentinel 유지(skip 의 stored_is_tier3_fallback bypass 의존), 정상 outcome 만 composite — 엣지 정확. - 기존 테스트 assert: `p.0.split('|').next()` 로 base 추출해 동일성 검증 — 약화 아닌 정당 갱신. **좋았던 판단**: 단일 헬퍼에 "무엇이 ingest 산출에 영향 주나" 를 한 곳에 모아 유지보수성↑. 무관 설정 제외 + 회귀 가드 테스트. 업그레이드 1회 재색인은 HOTFIXES/version 주석에 명시(embedding V012 캐시로 저렴). patch(0.26.2) 분류 정확(결과 포맷·CLI·wire 불변, skip 판정 정정). 사용자 머지 권장.
altair823 merged commit a283e56c5c into main 2026-06-03 14:33:21 +00:00
altair823 deleted branch fix/ingest-config-invalidation 2026-06-03 14:33:22 +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#205