feat(config): config.toml v2→v3 스키마 재편 — 미디어 [ingest.*] 통합 + 무손실 자동 마이그레이션 #207
Reference in New Issue
Block a user
Delete Branch "feat/config-schema-reorg"
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?
요약
config.toml 의 옵션이 누적되며 생긴 군더더기(미디어 설정 산재, OCR 중복·비대칭, init 60+ 필드)를 정리한다. 미디어 형식 설정을
[ingest.*]우산 아래로 통합하고, 기존 v2 파일을 무손실 자동 마이그레이션하며, 각 옵션에 인라인 설명 주석을 부착한다.레이아웃:
[indexing]→[ingest](스칼라),[chunking]→[ingest.chunking],[image.ocr]/[image.caption]→[ingest.image.*],[pdf.ocr]→[ingest.pdf.ocr](+ paddle 경로 대칭 추가로 v2 의 "pdf 가 image paddle 을 빌려쓰던" 비대칭 제거).설계: docs/superpowers/specs/2026-06-04-config-schema-reorg-design.md
계획: docs/superpowers/plans/2026-06-04-config-schema-reorg.md
깨지지 않도록 고정한 3가지 불변식
ingest_config_signature출력이 값 기반이라 struct 경로 재편과 무관하게 동일 → 업그레이드 시 재색인 0 (ingest_signature_image_paddle_byte_stable골든 + 도그푸딩 실증).apply_envwhitelist 의 키 문자열(LHS) 불변, 대입 대상(RHS)만 새 경로. 기존KEBAB_*스크립트 무파손. 신규KEBAB_PDF_OCR_{DET_MODEL,REC_MODEL,DICT,SCORE_THRESH,UNCLIP_RATIO,MAX_BOXES}추가.Config::from_file이schema_version < 3파일을 디스크 미변경으로 메모리에서 변환해 유실 0. 파일 갱신은 여전히kebab config migrate.변경 카테고리
Config/IngestCfg재배치(leaf 구조체 불변),PdfOcrCfgpaddle 대칭 6키,ser_f32_clean(f32 직렬화 찌꺼기 제거),apply_envRHS 갱신,from_file자동 변환,migrate::step_2_to_3(테이블 relocation + paddle 값 복사 + 멱등),key_comment(per-option 주석).config.*→config.ingest.*call-site sweep +ocr_engine_version_for_sig미디어화.검증
cargo clippy --workspace --all-targets -j 8 -- -D warnings→ 0 warnings (리더 독립 재실행 EXIT=0).cargo test -p kebab-config -p kebab-app -p kebab-eval -j 8→ 전부test result: ok, FAILED 0 (리더 독립 재실행 EXIT=0). ignored 소수는 라이브 Ollama 의존 기존 테스트로 본 변경 무관.tests/migrate_v3.rs): 사용자 실제 v2 config 의 값·주석·대안 줄 보존 + v3 파싱 일치 + 멱등.[ingest.code]로 implicit[ingest]가 이미 있는 상태 + 비기본[indexing](7/3/true) relocation → 스칼라가 sub-table 헤더 앞에 올바르게 직렬화, 값 전부 보존, 유효 TOML.kebab config migrate(11 changes, .bak 백업, 멱등) + 재색인 0 실증(v2 자동변환·v3 디스크 양 경로 모두 unchanged).시험 항목 (Test Plan)
KEBAB_CHUNKING_*/KEBAB_IMAGE_OCR_*env 가 새 경로로 정상 반영kebab ingest→ 재색인 0kebab config migrate멱등Assisted-by: Claude Code
회차 1 — 구현 견고, 게이트(clippy/test) 리더 독립 재실행 green, 경계 케이스(implicit [ingest] + 비기본 [indexing]) 직접 검증 통과, 무손실 골든이 사용자 실제 v2 config 를 fixture 로 사용. 3대 불변식(signature 바이트 불변/env 이름 보존/load 자동변환) 모두 테스트+도그푸딩으로 고정. signature 미디어화(det/rec/dict 인자화로 pdf↔image 비대칭 제거)와 toml_edit relocation 의 decor 보존이 깔끔. actionable 은 LOW 1건(from_file 이중 toml 파싱)뿐 — 반영 후 APPROVE 예정. 관찰 1건은 수정 불요.
@@ -924,0 +991,4 @@// 설정 유실 없이 로드(불변식 #3). non-additive relocation(v2→v3) 은// serde default forward-compat 로는 커버 안 되므로 반드시 거쳐야 한다.let parse_text = {let from = toml::from_str::<toml::Value>(&text)[LOW]
from_file가 같은text를toml::Value로 두 번 파싱한다 — 위(972줄)의workspace.includedeprecation probe 와 여기(994줄)의schema_version감지. config load 는 매 CLI 호출마다 일어나므로, 두 probe 를 한 번의toml::from_str::<toml::Value>(&text)결과를 재사용하도록 합치면 파싱 1회를 아낄 수 있다. 기능엔 영향 없는 정리.@@ -194,0 +310,4 @@/// v3: pdf paddle 동작 보존. v2 는 pdf paddle 이 `[image.ocr]` 의 모델 경로를/// 빌려썼다. relocation 후 image.ocr 의 paddle 6키 실제 값을 pdf.ocr 대칭/// 키로 복사한다(pdf 가 이미 명시한 키는 덮어쓰지 않음, pdf 가 paddle 일 때만).fn copy_image_paddle_to_pdf(doc: &mut DocumentMut) {(관찰, 수정 불요)
copy_image_paddle_to_pdf가 pdf engine=paddle-onnx 일 때만 image paddle 6키를 복사하고 pdf 가 이미 명시한 키는 보존 — v2 의 'pdf 가 image paddle 을 빌려쓰던' 동작을 정확히 보존하는 좋은 처리. 재색인 0 도그푸딩으로 실증됨.회차 2 — 회차 1 의 actionable(LOW: from_file 이중 toml::Value 파싱) 반영 확인:
let probe = toml::from_str::<toml::Value>(&text).ok();한 번으로 include probe + schema_version 감지 공유(fdf09c3). kebab-config clippy/test 재실행 green. 남은 actionable 0, 관찰 1건은 수정 불요(설계 의도). 머지 동의.