From 47ef6532f7cd1ad173dfbeb38ec75bab12b024a1 Mon Sep 17 00:00:00 2001 From: altair823 Date: Wed, 3 Jun 2026 14:14:23 +0000 Subject: [PATCH] =?UTF-8?q?chore(release):=20v0.26.2=20=E2=80=94=20ingest?= =?UTF-8?q?=20=EC=84=A4=EC=A0=95=20=EB=B3=80=EA=B2=BD=20=EC=9E=90=EB=8F=99?= =?UTF-8?q?=20=EC=9E=AC=EC=83=89=EC=9D=B8=20+=20=EB=AC=B8=EC=84=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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) --- Cargo.lock | 48 +++++++++++++++++++++++----------------------- Cargo.toml | 2 +- HANDOFF.md | 1 + tasks/HOTFIXES.md | 49 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 75 insertions(+), 25 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bb18b21..ad7c8d4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4724,7 +4724,7 @@ dependencies = [ [[package]] name = "kebab-app" -version = "0.26.1" +version = "0.26.2" dependencies = [ "anyhow", "base64 0.22.1", @@ -4772,7 +4772,7 @@ dependencies = [ [[package]] name = "kebab-chunk" -version = "0.26.1" +version = "0.26.2" dependencies = [ "anyhow", "blake3", @@ -4790,7 +4790,7 @@ dependencies = [ [[package]] name = "kebab-cli" -version = "0.26.1" +version = "0.26.2" dependencies = [ "anyhow", "clap", @@ -4811,7 +4811,7 @@ dependencies = [ [[package]] name = "kebab-config" -version = "0.26.1" +version = "0.26.2" dependencies = [ "anyhow", "dirs 5.0.1", @@ -4827,7 +4827,7 @@ dependencies = [ [[package]] name = "kebab-core" -version = "0.26.1" +version = "0.26.2" dependencies = [ "anyhow", "blake3", @@ -4841,7 +4841,7 @@ dependencies = [ [[package]] name = "kebab-embed" -version = "0.26.1" +version = "0.26.2" dependencies = [ "anyhow", "blake3", @@ -4855,7 +4855,7 @@ dependencies = [ [[package]] name = "kebab-embed-candle" -version = "0.26.1" +version = "0.26.2" dependencies = [ "anyhow", "candle-core", @@ -4875,7 +4875,7 @@ dependencies = [ [[package]] name = "kebab-embed-local" -version = "0.26.1" +version = "0.26.2" dependencies = [ "anyhow", "fastembed", @@ -4888,7 +4888,7 @@ dependencies = [ [[package]] name = "kebab-embed-ollama" -version = "0.26.1" +version = "0.26.2" dependencies = [ "anyhow", "kebab-config", @@ -4903,7 +4903,7 @@ dependencies = [ [[package]] name = "kebab-eval" -version = "0.26.1" +version = "0.26.2" dependencies = [ "anyhow", "kebab-app", @@ -4922,7 +4922,7 @@ dependencies = [ [[package]] name = "kebab-llm" -version = "0.26.1" +version = "0.26.2" dependencies = [ "anyhow", "kebab-core", @@ -4931,7 +4931,7 @@ dependencies = [ [[package]] name = "kebab-llm-local" -version = "0.26.1" +version = "0.26.2" dependencies = [ "anyhow", "kebab-config", @@ -4948,7 +4948,7 @@ dependencies = [ [[package]] name = "kebab-mcp" -version = "0.26.1" +version = "0.26.2" dependencies = [ "anyhow", "kebab-app", @@ -4966,7 +4966,7 @@ dependencies = [ [[package]] name = "kebab-nli" -version = "0.26.1" +version = "0.26.2" dependencies = [ "anyhow", "hf-hub", @@ -4981,7 +4981,7 @@ dependencies = [ [[package]] name = "kebab-parse-code" -version = "0.26.1" +version = "0.26.2" dependencies = [ "anyhow", "gix", @@ -5004,7 +5004,7 @@ dependencies = [ [[package]] name = "kebab-parse-image" -version = "0.26.1" +version = "0.26.2" dependencies = [ "ab_glyph", "anyhow", @@ -5028,7 +5028,7 @@ dependencies = [ [[package]] name = "kebab-parse-md" -version = "0.26.1" +version = "0.26.2" dependencies = [ "anyhow", "kebab-core", @@ -5045,7 +5045,7 @@ dependencies = [ [[package]] name = "kebab-parse-pdf" -version = "0.26.1" +version = "0.26.2" dependencies = [ "anyhow", "blake3", @@ -5060,7 +5060,7 @@ dependencies = [ [[package]] name = "kebab-rag" -version = "0.26.1" +version = "0.26.2" dependencies = [ "anyhow", "blake3", @@ -5082,7 +5082,7 @@ dependencies = [ [[package]] name = "kebab-search" -version = "0.26.1" +version = "0.26.2" dependencies = [ "anyhow", "globset", @@ -5101,7 +5101,7 @@ dependencies = [ [[package]] name = "kebab-source-fs" -version = "0.26.1" +version = "0.26.2" dependencies = [ "anyhow", "blake3", @@ -5119,7 +5119,7 @@ dependencies = [ [[package]] name = "kebab-store-sqlite" -version = "0.26.1" +version = "0.26.2" dependencies = [ "anyhow", "blake3", @@ -5139,7 +5139,7 @@ dependencies = [ [[package]] name = "kebab-store-vector" -version = "0.26.1" +version = "0.26.2" dependencies = [ "anyhow", "arrow", @@ -5163,7 +5163,7 @@ dependencies = [ [[package]] name = "kebab-tui" -version = "0.26.1" +version = "0.26.2" dependencies = [ "anyhow", "crossterm", diff --git a/Cargo.toml b/Cargo.toml index f56aae6..249b8fa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,7 +32,7 @@ edition = "2024" rust-version = "1.85" license = "MIT OR Apache-2.0" repository = "https://github.com/altair823/kebab" -version = "0.26.1" # v0.26.1 — ingest 진행 로그 개선: TTY 진행바에 현재 파일명 + 느린 phase(ocr/caption/embed)+모델명 실시간 + 경과초 heartbeat `(Ns)`, 종료 시 최장 소요 파일 top-5 요약. 신규 wire 이벤트 `asset_phase{idx,total,phase,model}` + `asset_timings.ocr_ms`/`caption_ms` 추가(additive, ingest_progress.v1 유지, serde default 0). 기본 동작 불변. — CLAUDE.md §Release +version = "0.26.2" # v0.26.2 — ingest 설정 변경 시 영향 자산 자동 재색인: ingest 산출에 영향 주는 설정(청킹/이미지 OCR·caption/pdf.ocr/[ingest.code])의 결정적 서명을 effective parser_version(skip 비교 + 저장 doc 필드 양쪽)에 폴딩 → 해당 설정 변경 시 `--force-reingest` 없이 영향 자산만 자동 재색인. 비산출 설정(search/rag/ui/log + max_pixels/languages/timeout 등)은 제외(과도 무효화 회피). doc_id 는 base parser_version 으로 안정 유지(orphan churn 회피). 결과 포맷·CLI·wire 불변(내부 skip 판정 정정) → patch. — CLAUDE.md §Release # pre-v0.18 workspace-wide cleanup: enable clippy::pedantic group with # intentional allow-list. The allowed lints are either cosmetic (doc style), diff --git a/HANDOFF.md b/HANDOFF.md index d4fc47b..478464a 100644 --- a/HANDOFF.md +++ b/HANDOFF.md @@ -35,6 +35,7 @@ P0~P5 직렬. P6~P9 P5 이후 병렬 가능. 머지 후 발견된 모든 deviation / hotfix 의 dated 로그는 [tasks/HOTFIXES.md](tasks/HOTFIXES.md). 본 요약은 \"누군가가 인수받을 때 알아두면 시간을 많이 절약하는\" 항목만: +- **2026-06-03 ingest 설정 변경 자동 재색인** — v0.26.2. ingest 산출에 영향 주는 설정(청킹/이미지 OCR·caption/pdf.ocr/`[ingest.code]`)을 변경하면 `--force-reingest` 없이 영향 자산만 자동 재색인. 그 설정들의 결정적 서명(`ingest_config_signature`)을 effective parser_version(skip 비교 + 저장 doc 필드 양쪽)에 폴딩 → 다음 ingest 비교가 mismatch. 비산출 설정(search/rag/ui/log + max_pixels/languages/timeout)은 제외(과도 무효화 회피), doc_id 는 base 로 안정 유지. **업그레이드 후 첫 ingest 는 전 자산 1회 재색인**(저장된 상수 parser_version ≠ 새 composite; embedding 은 V012 캐시 히트). 결과 포맷·CLI·wire 불변(내부 skip 판정 정정). 자세한 내용: `tasks/HOTFIXES.md` (2026-06-03 ingest 설정 변경 자동 재색인), spec/plan `docs/superpowers/{specs,plans}/2026-06-03-*invalidation*.md`. - **2026-06-03 ingest 진행 로그 개선** — v0.26.1. 이미지/PDF + OCR/caption on 볼트 ingest 가 "멈춘 듯" 보이던 문제 해소: TTY 진행바에 현재 파일명 + 느린 phase(ocr/caption/embed)+모델명 + 경과초 `(Ns)` heartbeat, 종료 시 최장 소요 파일 top-5 요약. 신규 wire `asset_phase{idx,total,phase,model}` + `asset_timings.ocr_ms`/`caption_ms`(additive, `ingest_progress.v1` 유지, serde default 0). 이미지·PDF 경로도 `asset_timings` emit(이전 markdown 만). 기본 동작 불변. 자세한 내용: `tasks/HOTFIXES.md` (2026-06-03 ingest 진행 로그), spec/plan `docs/superpowers/{specs,plans}/2026-06-03-ingest-log-improve-*.md`. - **2026-06-03 arctic-embed-l-v2.0 임베더 통합** — v0.26.0. 별칭 제거 후 설명형 query recall 보강(측정 recall@10 130/132, e5 +7). `kebab-embed-candle` 모델 레지스트리화(e5 mean + `snowflake-arctic-embed-l-v2.0` CLS, 모델별 pooling/prefix) + 신규 `kebab-embed-ollama`(`provider="ollama"`, `/api/embed`). config `endpoint: Option` 추가. 기본 e5 유지(opt-in), arctic 전환은 embedding_version cascade → 재색인. candle↔Ollama cosine>0.99 게이트로 pooling/prefix 정확성 고정(`#[ignore]`). 자세한 내용: `tasks/HOTFIXES.md` (2026-06-03 arctic), spec `docs/superpowers/specs/2026-06-03-arctic-embedder-spec.md`. - **2026-06-03 doc-side expansion(별칭) 기능 완전 제거** — v0.25.0. 아래 2026-05-31 항목의 색인-시 청크당 LLM 별칭 생성 + 별칭 검색 채널을 **전부 제거**(ROI 음수: cross-lingual 은 e5-large 단독으로 충분, 기여는 설명형 +2 그룹뿐인데 대가가 청크당 색인-시 LLM). `Chunk.aliases`/`expansion.rs`/`IngestExpansionCfg`/alias lexical arm/`expansion_progress` wire kind 제거, 신규 마이그레이션 **V013** 이 `chunk_aliases_fts`+`chunks.aliases` DROP. 별칭 default-off 였어 사용자 체감 0, 기존 KB 도 재색인 불요(잔존 별칭 벡터는 `strip_alias_suffix` graceful 매핑/`reset` 정리). `AssetTimings.expansion_ms` 는 wire 호환 위해 값 0 으로 유지. 자세한 내용: `tasks/HOTFIXES.md` (2026-06-03), spec `docs/superpowers/specs/2026-06-03-remove-doc-expansion-spec.md`. diff --git a/tasks/HOTFIXES.md b/tasks/HOTFIXES.md index 90e00d2..e52583d 100644 --- a/tasks/HOTFIXES.md +++ b/tasks/HOTFIXES.md @@ -14,6 +14,55 @@ historical contract that was implemented; this file accumulates the deltas so phase 5+ readers can find the live behavior without diffing git history. +## 2026-06-03 — ingest 출력 영향 설정 변경 시 영향 자산 자동 재색인 (v0.26.2) + +**무엇이 깨졌나.** `[image.ocr]` / `[image.caption]` 를 off→색인→on 으로 바꿔도 증분 +skip(`try_skip_unchanged`, `kebab-app/src/lib.rs`)이 그 이미지를 "Unchanged" 로 건너뛰어 +재색인이 안 됐다. 더 일반적으로, skip 판정은 자산 내용(blake3) + `parser_version` + +`chunker_version` + `embedding_version` 만 비교하는데, **ingest 산출물을 바꾸는 다른 설정들** +(청킹 파라미터, OCR/caption, pdf.ocr, `[ingest.code]` 옵션)이 이 셋 중 어디에도 반영되지 +않아, 변경해도 재색인이 트리거되지 않았다. 사용자 요구: OCR/caption 뿐 아니라 **ingest 출력에 +영향 주는 모든 설정**이 변경되면 영향 자산이 자동 재색인. + +**무엇이 바뀌었나 (내부 skip 판정 정정 — 결과 포맷·CLI·wire 불변, patch).** + +- 신규 헬퍼 `ingest_config_signature(config, media_type) -> String` — 그 자산 타입의 + **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개 필드. markdown: 공통만. +- 각 ingest 경로(md/image/pdf/code)의 effective parser_version 을 + `format!("{base}|{signature}")` composite 로 만들어 (a) `try_skip_unchanged` 비교값, + (b) **persist 전 `canonical.parser_version` override** — 두 값이 같은 함수에서 나오므로 + 설정 변경 시 다음 run 비교가 mismatch → 영향 자산만 자동 재색인. +- **doc_id 는 손대지 않음**: base parser_version(extractor 상수)으로 계속 파생 → + 설정 변경에도 doc_id 안정(orphan churn 회피). composite 는 비교/저장 필드에만. +- **제외(재색인 트리거 X)**: search/rag/nli/ui/logging/storage/workspace + 산출 무관 + 런타임 파라미터(max_pixels/languages/*_timeout_secs). "그 값이 바뀌면 색인되는 + chunk/embedding 내용이 달라지는가" 기준. 과도 무효화 회피. +- code 의 Tier-3 fallback 문서는 의도적으로 bare `"none-v1"` sentinel 유지(skip 의 + `stored_is_tier3_fallback` bypass 가 정확히 그 문자열에 의존) — composite 는 정상 outcome 에만. + +**업그레이드 1회 효과.** 기존 doc 의 저장 parser_version(상수)이 새 composite 와 달라, +업그레이드 후 첫 `kebab ingest` 에서 **전 자산이 현재 설정대로 1회 재색인**된다(force 불필요). +마크다운/코드도 1회 재청킹되나 embedding 은 V012 derived-cache 히트라 재임베딩 비용은 작다. +`--force-reingest` 는 전체 강제용으로 그대로. + +**도그푸딩 evidence (release 바이너리, Ollama down — OCR 호출은 Lenient 실패).** +이미지 1장, `[image.ocr] enabled=false` 색인 → New=1. config 에서 `enabled=true` 로 변경 후 +`kebab ingest`(force 없이) → **Updated=1**(재색인, errors=0). 동일 config 재실행 → **Unchanged=1** +(불필요 재색인 0). 저장된 parser_version = +`image-meta-v1|chunk:500:80:true:md-heading-v1|ocr:1:gemma4:e4b|cap:0`(base 보존 + OCR on 반영). + +**테스트.** `kebab-app/src/lib.rs::ingest_config_signature_tests`(8 단위: 결정성, 청킹=전타입, +이미지 ocr/caption 토글=이미지만, pdf.ocr=pdf만, code 옵션=코드만, search/rag/ui·런타임 파라미터 +불변 회귀가드) + `kebab-app/tests/config_invalidation.rs`(4 end-to-end: 동일 config=전 skip, +청킹 변경=md+code 재색인, `[ingest.code]` 변경=코드만, search 변경=재색인 0). 기존 skip 테스트 +회귀 0(parser_version exact assert 는 base 접두사 비교로 갱신 — code_ingest_smoke/pdf_pipeline). + +spec/plan: `docs/superpowers/specs/2026-06-03-ocr-toggle-invalidation-spec.md` / +`…/plans/2026-06-03-config-invalidation-plan.md`. + ## 2026-06-03 — ingest 진행 로그 개선: 파일명·phase·heartbeat·slowest 요약 (v0.26.1) **무엇을 왜 추가했나.** arctic 도그푸딩 중 이미지/PDF 혼재 + OCR/caption on 볼트에서