fix(ingest): ingest 설정 변경 시 영향 자산 자동 재색인 #205
Reference in New Issue
Block a user
Delete Branch "fix/ingest-config-invalidation"
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 의 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_versionoverride 로 사용 — 두 곳 동일.none-v1sentinel 유지(skip bypass 의존), 정상 outcome 만 composite.검증
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.--force-reingest→bypass. 모두 통과.호환성 / 비범위
--force-reingest전체 강제용 유지.시험 항목 (Test Plan)
Assisted-by: Claude Code
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>회차 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.코드 검토
ingest_config_signature: 타입별 산출-영향 설정만, off↔off 안정 토큰(불필요 재색인 0), exhaustivematch(미래 media 타입 컴파일 강제), pdfocr=enabled||always_on(실 ingest 게이트와 일치). 결정적.effective_parser_version={base}|{sig}를 md/image/pdf/code 4경로 모두 (a)try_skip_unchanged비교값 + (b)persist 전canonical.parser_versionoverride 로 일관 적용(두 값 동일해야 다음 비교 성립 — 충족).none-v1sentinel 유지(skip 의 stored_is_tier3_fallback bypass 의존), 정상 outcome 만 composite — 엣지 정확.p.0.split('|').next()로 base 추출해 동일성 검증 — 약화 아닌 정당 갱신.좋았던 판단: 단일 헬퍼에 "무엇이 ingest 산출에 영향 주나" 를 한 곳에 모아 유지보수성↑. 무관 설정 제외 + 회귀 가드 테스트. 업그레이드 1회 재색인은 HOTFIXES/version 주석에 명시(embedding V012 캐시로 저렴).
patch(0.26.2) 분류 정확(결과 포맷·CLI·wire 불변, skip 판정 정정). 사용자 머지 권장.