chore: bump version 0.30.1 → 0.31.0 + v0.31.0 release notes
척추 단순화(#214) + 임베딩 캐시 전면화(#216) + OCR/caption 캐시(#217) 누적 릴리스. minor 트리거 = 척추의 V015 drop chat_sessions + config v4→v5 breaking 마이그레이션. 도그푸딩 evidence(HOTFIXES 2026-06-25): OCR 캐시 17 jira PNG 재인덱싱 7× + 캐시 히트 created_at 17/17 고정 / 실 v3 KB 마이그레이션(config v5 + V14/V15 자동, chat_sessions 드롭).
This commit is contained in:
44
Cargo.lock
generated
44
Cargo.lock
generated
@@ -4236,7 +4236,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kebab-app"
|
||||
version = "0.30.1"
|
||||
version = "0.31.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"base64 0.22.1",
|
||||
@@ -4282,7 +4282,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kebab-chunk"
|
||||
version = "0.30.1"
|
||||
version = "0.31.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"blake3",
|
||||
@@ -4300,7 +4300,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kebab-cli"
|
||||
version = "0.30.1"
|
||||
version = "0.31.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"clap",
|
||||
@@ -4320,7 +4320,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kebab-config"
|
||||
version = "0.30.1"
|
||||
version = "0.31.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"dirs 5.0.1",
|
||||
@@ -4336,7 +4336,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kebab-core"
|
||||
version = "0.30.1"
|
||||
version = "0.31.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"blake3",
|
||||
@@ -4350,7 +4350,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kebab-embed"
|
||||
version = "0.30.1"
|
||||
version = "0.31.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"blake3",
|
||||
@@ -4364,7 +4364,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kebab-embed-local"
|
||||
version = "0.30.1"
|
||||
version = "0.31.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"fastembed",
|
||||
@@ -4377,7 +4377,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kebab-embed-ollama"
|
||||
version = "0.30.1"
|
||||
version = "0.31.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"kebab-config",
|
||||
@@ -4392,7 +4392,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kebab-eval"
|
||||
version = "0.30.1"
|
||||
version = "0.31.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"kebab-app",
|
||||
@@ -4411,7 +4411,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kebab-llm"
|
||||
version = "0.30.1"
|
||||
version = "0.31.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"kebab-core",
|
||||
@@ -4420,7 +4420,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kebab-llm-local"
|
||||
version = "0.30.1"
|
||||
version = "0.31.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"kebab-config",
|
||||
@@ -4437,7 +4437,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kebab-mcp"
|
||||
version = "0.30.1"
|
||||
version = "0.31.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"kebab-app",
|
||||
@@ -4455,7 +4455,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kebab-nli"
|
||||
version = "0.30.1"
|
||||
version = "0.31.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"hf-hub",
|
||||
@@ -4470,7 +4470,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kebab-parse-code"
|
||||
version = "0.30.1"
|
||||
version = "0.31.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"gix",
|
||||
@@ -4493,7 +4493,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kebab-parse-image"
|
||||
version = "0.30.1"
|
||||
version = "0.31.0"
|
||||
dependencies = [
|
||||
"ab_glyph",
|
||||
"anyhow",
|
||||
@@ -4521,7 +4521,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kebab-parse-md"
|
||||
version = "0.30.1"
|
||||
version = "0.31.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"kebab-core",
|
||||
@@ -4538,7 +4538,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kebab-parse-pdf"
|
||||
version = "0.30.1"
|
||||
version = "0.31.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"blake3",
|
||||
@@ -4553,7 +4553,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kebab-rag"
|
||||
version = "0.30.1"
|
||||
version = "0.31.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"blake3",
|
||||
@@ -4575,7 +4575,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kebab-search"
|
||||
version = "0.30.1"
|
||||
version = "0.31.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"globset",
|
||||
@@ -4594,7 +4594,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kebab-source-fs"
|
||||
version = "0.30.1"
|
||||
version = "0.31.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"blake3",
|
||||
@@ -4612,7 +4612,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kebab-store-sqlite"
|
||||
version = "0.30.1"
|
||||
version = "0.31.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"blake3",
|
||||
@@ -4632,7 +4632,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kebab-store-vector"
|
||||
version = "0.30.1"
|
||||
version = "0.31.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"arrow",
|
||||
|
||||
@@ -30,7 +30,7 @@ edition = "2024"
|
||||
rust-version = "1.85"
|
||||
license = "MIT OR Apache-2.0"
|
||||
repository = "https://github.com/altair823/kebab"
|
||||
version = "0.30.1" # v0.30.1 — 후속 배치 3건. (1) pdf-page-v1.2: md-heading-v2 의 oversize 분할을 PDF 청커로 확장 — 거대 PDF 페이지(> max_chunk_tokens)만 공유 `crate::oversize` 모듈로 재분할, 미분할 페이지는 v1.1 과 동일. `chunker_version` v1.1→v1.2 → 다음 ingest 에서 PDF 1회 자동 재청크(markdown/코드 무영향). (2) rag-v4 provenance 라벨: RAG 컨텍스트의 각 청크 머리에 `source=/trust=` 라벨 렌더 + system prompt 에 신뢰도 우선(discount)·[#번호] 귀속 2규칙 추가, `prompt_template_version` 기본 rag-v3→rag-v4, `search_hit.v1` 에 `source_id`/`trust_level` additive optional(v2 bump 아님). LLM-judge 도그푸딩(gemma3:4b@R9700, competing 66): jira-override 0/0(실패 모드 미재현) — v4 무해, trust-steering 효과는 미입증. (3) config `[ingest.chunking]` budget floor 검증. NB: chunker_version·prompt_template_version 변경은 §Versioning 상 minor 트리거지만 사용자 재량으로 patch(0.30.1) 처리. — CLAUDE.md §Release
|
||||
version = "0.31.0" # v0.31.0 — 척추 단순화 + 캐시 전면화. (1) 척추 재작성(#214, breaking): tui·multi-turn 세션·rag-v1/v2·search캐시·candle 제거(crate 24→22), config v4→v5 무손실 마이그레이션, V015 drop chat_sessions. (2) 임베딩 캐시 전면화(#216, patch): image/pdf/code 핸들러를 markdown 과 동일한 embed_with_cache 경유로 — 출력 byte-identical. (3) OCR/caption derivation 캐시(#217, patch): ocr/caption 네임스페이스로 비전 산출물을 소스 바이트로 캐싱 → 버전-캐스케이드에서 분리, 출력 불변. minor 트리거 = 척추의 V015 + config v5 breaking. 도그푸딩 evidence: HOTFIXES 2026-06-25(OCR 캐시 17 jira PNG 7× + v3 KB 마이그레이션). 상세 docs/release-notes/v0.31.0-draft.md — 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),
|
||||
|
||||
39
docs/release-notes/v0.31.0-draft.md
Normal file
39
docs/release-notes/v0.31.0-draft.md
Normal file
@@ -0,0 +1,39 @@
|
||||
# v0.31.0 — 척추 단순화 + 캐시 전면화 (spine simplification + cache everywhere)
|
||||
|
||||
v0.30.1 이후 누적된 세 PR(#214 척추 재작성 · #216 임베딩 캐시 전면화 · #217 OCR/caption 캐시)을 묶은 릴리스. **breaking 변경**(세션 제거 V015 마이그레이션 + config v4→v5)이 포함되어 minor bump. 실 데이터 도그푸딩 evidence는 `tasks/HOTFIXES.md` 2026-06-25 항목.
|
||||
|
||||
## 1. 척추 재작성 / 단순화 (#214) — breaking
|
||||
|
||||
기능 추가로 산만해진 표면·동작·내부를 강하게 정리. **능력은 (거의) 유지하되 조작 표면과 코드 구조를 단순화.**
|
||||
|
||||
- **제거된 기능 (crate 24→22)**: `kebab tui` 서브커맨드 + `kebab-tui` crate, multi-turn 세션(`ask --session`·`chat_sessions`/`chat_turns`), legacy RAG 템플릿 rag-v1/v2(rag-v3/v4만 유지), search LRU 캐시, candle 임베더 provider(`kebab-embed-candle`).
|
||||
- **config v4→v5 무손실 자동 마이그레이션**: OCR 엔진 설정 중복을 공유 `[ingest.ocr]` 블록으로 통합. `kebab config migrate` 또는 로드 시 자동 — 사용자 개입 불필요(.bak 백업). env arm 75→22, 노출 키 정리.
|
||||
- **V015 마이그레이션**: 기존 KB 의 `chat_sessions`/`chat_turns` 테이블을 첫 store open 시 자동 드롭.
|
||||
- **trade-off**: 구 `v0.30.1` 바이너리는 v5 config(`[ingest.ocr]` 슬림화로 `missing field engine`)를 못 읽음 — **downgrade 는 마이그레이션 전 config 백업(.bak) 복원 필요**. multi-turn 세션·tui 를 쓰던 워크플로는 제거됨.
|
||||
- **upgrade**: 새 바이너리로 아무 명령이나 실행하면 config v3/v4→v5 + DB V14/V15 가 자동 적용. 별도 조치 불필요. (실 v3 KB 도그푸딩: 마이그레이션 후 lexical search 정상.)
|
||||
|
||||
## 2. 임베딩 캐시 전면화 (#216) — patch (출력 불변)
|
||||
|
||||
markdown 만 타던 임베딩 derivation 캐시를 **image/pdf/code 핸들러 전부**에 배선. 재인덱싱 시 청크 텍스트가 동일하면(force-reingest 또는 chunker 외 버전 유지) 임베딩을 재계산하지 않고 캐시 재사용.
|
||||
|
||||
- **trade-off**: 없음 — 출력 byte-identical(fresh-dir=전부 미스=기존과 동일, 재인덱싱=캐시 히트로 동일 LE-f32 벡터). 미디어 무관 version_key 라 같은 텍스트는 미디어 교차로 한 엔트리 공유.
|
||||
- **mitigation**: 4 미디어 전부 cache hit/miss 를 `tracing::info!` 로 노출 — warm 재인덱싱이 embed 0회인지 확인 가능.
|
||||
- **upgrade**: 자동. 새 바이너리부터 image/pdf/code 재인덱싱이 임베딩 캐시를 탐.
|
||||
|
||||
## 3. OCR/caption derivation 캐시 (#217) — patch (출력 불변)
|
||||
|
||||
이미지 OCR·이미지 caption·PDF 페이지 OCR 결과를 **소스 바이트 + OCR/caption 버전키**로 캐싱. 재인덱싱이나 chunker/embedding 버전 bump 시 비싼 비전 엔진(paddle ONNX / ollama-vision)을 재실행하지 않고 캐시된 텍스트 재사용 — **비전 작업을 버전-캐스케이드에서 분리**.
|
||||
|
||||
- **변경 사실**: 새 `ocr`/`caption` derivation_cache 네임스페이스(마이그레이션 불필요 — 스키마 namespace-agnostic). 결과는 full-struct serde 로 캐싱돼 block 레벨까지 byte-identical 재구성.
|
||||
- **trade-off**: 없음 — 출력 불변. 캐시 히트 시 provenance 이벤트는 재현 안 함(wire 스키마/게이트에 없어 무영향). ollama-vision 의 잔여 비결정성은 첫 결과를 박제해 **재현성 오히려 향상**.
|
||||
- **mitigation**: 엔진/모델/paddle 출력 파라미터(score_thresh/unclip_ratio/max_boxes) 변경 시 version key 변경→캐시 미스→재계산(stale 방지). PDF 경로 캐시 GET 에러는 debug 로그 후 미스로 degrade(per-page 회복력).
|
||||
- **upgrade**: 자동. **실 도그푸딩**(17개 jira 스크린샷, paddle OCR): 재인덱싱이 OCR 캐시 히트(created_at 17/17 고정) → **7.0× 빠름**(8.5s→1.2s), 16/17 실 OCR 텍스트.
|
||||
|
||||
## 버전
|
||||
|
||||
`0.30.1 → 0.31.0` (minor — 세션 제거 V015 + config v5 breaking 변경이 트리거). 새 CLI flag·wire breaking 변경은 없으나(캐시는 자동·표면 무변경), 척추의 마이그레이션·인터페이스 제거가 minor 를 강제.
|
||||
|
||||
## 알려진 한계 / 후속
|
||||
|
||||
- ollama-vision caption 품질 도그푸딩은 lemonade(인터랙티브 서비스 의존) 중단 비용으로 이연 — 캐시 메커니즘은 engine-agnostic(mock + paddle 실엔진 게이트로 입증)이라 caption 도 동일 코드 경로. GPU 박스 가용 시 quality-only 확인 예정.
|
||||
- paddle 결정적 게이트 코퍼스(텍스트-bearing fixture)는 미커밋 — 현재 `paddle_e2e.rs` 는 fixture 부재 시 skip. 캐시 정확성 게이트는 mock(`ocr_caption_cache.rs`) + 실엔진(`paddle_image_cache.rs`)이 담당.
|
||||
@@ -14,6 +14,31 @@ 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-25 — v0.31.0 릴리스 도그푸딩: OCR 캐시(PR #217) + 마이그레이션(PR #214) evidence
|
||||
|
||||
v0.31.0 = 척추 재작성(#214) + 임베딩 캐시 전면화(#216) + OCR/caption 캐시(#217) 누적
|
||||
릴리스. release 바이너리(388 MB, HEAD cfffbf6)로 실 데이터 종단 도그푸딩.
|
||||
|
||||
- **OCR 캐시 (PR2 #217, b1 이미지 경로) — 실 jira 스크린샷**: 17개 실제 jira 첨부 PNG를
|
||||
paddle-onnx OCR(번들·CPU·결정적) + `embedding=none` 으로 cold ingest → `--force-reingest`
|
||||
warm 재인덱싱. 결과: **17개 `kind='ocr'` derivation_cache 행, 16/17이 비어있지 않은 OCR
|
||||
텍스트**(paddle 가 실 스크린샷에서 텍스트 추출). warm 재인덱싱: **created_at fingerprint
|
||||
동일(cold==warm, 17/17 행 고정), last_used_at 만 갱신(17/17 touched=캐시 HIT), wall-clock
|
||||
8.5s→1.2s = 7.0× 빠름**. 비싼 paddle OCR 가 재인덱싱에서 완전 스킵됨을 실증. (caption b2 는
|
||||
동일 캐시 코드 경로 — engine-agnostic 메커니즘은 mock 게이트 + 이 paddle 실엔진 게이트로
|
||||
입증. ollama-vision caption 품질 도그푸딩은 lemonade(.243, opencode/hermes 의존) 중단
|
||||
비용으로 이연 — 메커니즘은 동일하므로 후속 GPU 박스 가용 시 quality-only 확인.)
|
||||
- **마이그레이션 (척추 #214) — 실 v3 KB**: schema_version=3 config + chat_sessions/chat_turns
|
||||
포함 구 sqlite(refinery V13)에 새 바이너리 적용. `kebab config migrate`: **v3→v5 무손실**
|
||||
(OCR 키를 `[ingest.ocr]` 로 통합 + max_chunk_tokens 추가, .bak 백업, schema_version=5).
|
||||
store open(lexical search) 시 **DB 마이그레이션 V14(documents_source_id)+V15(drop_chat_sessions)
|
||||
자동 적용 → chat_sessions/chat_turns DROPPED**. 마이그레이션된 KB 에서 lexical search 정상
|
||||
동작(실 jira 결과 반환) — breaking 변경이 user-visible 파손 없이 적용됨.
|
||||
- **임베딩 캐시 (PR1 #216)**: `embed_cache_reingest.rs`(fastembed, AVX, `report.new==1` 격리)로
|
||||
이미 execution-proven(재인덱싱=캐시 히트, byte-identical 벡터). 별도 corpus 도그푸딩 생략.
|
||||
- 도그푸딩 store: `large_data/out/kebab-dogfood/{cache-release-run,migration-test}`. corpus =
|
||||
실 jira 첨부 88 assets(이중 이미지 17, 그 외 OCR 비대상 65 skip).
|
||||
|
||||
## 2026-06-24 — spine-rewrite Phase 3: ingest 스파인 stage 추출
|
||||
|
||||
kebab-app ingest 모놀리스(lib.rs)를 stage 헬퍼 시퀀스로. 각 단위 **재인덱싱 패리티
|
||||
|
||||
Reference in New Issue
Block a user