fix(kebab-config): p9-fb-25 — workspace.include 제거 + 지원 형식 가시성 #101
Reference in New Issue
Block a user
Delete Branch "fix/p9-fb-25-config-include-removal"
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?
요약
도그푸딩 피드백 2건 (2026-05-05):
주요 변경
설정
지원 형식 가시성
코드 정리
Spec contract impact
테스트
참조 문서
Known limitation (deferred)
머지 후
사용자 요청: patch bump (0.2.0 → 0.2.1) 별 PR 로 진행 + 새 release.
회차 1 — 7-task TDD 분해 깔끔. Skip 4 사이트 (md fallback / 3 kb:// branches) 모두 채움 + asset 루프 BTreeMap bump + CLI/TUI render breakdown — 의도 일관. 729 워크스페이스 통과 + clippy clean.
actionable 4 건:
render_skipped_breakdown가 kebab-cli + kebab-tui 양쪽 동일 body.kebab-app::ingest_progress로 추출 (양 crate 의 공통 의존) — single source.<no-ext>magic string 두 helper (ext_for_skip_warning + unsupported_media_warning) 에 박힘.const NO_EXT_SENTINEL로 추출.3번 + 4번은 영구 기록 / 사용자 발견성 영향이라 정확화 가치 있음.
unsupported_media_warning의if ext == "<no-ext>"가 magic string.ext_for_skip_warning의 sentinel 반환과 일치해야 하는데 두 곳 (fn ext_for_skip_warningline 167,fn unsupported_media_warningline 175) 에 literal 박힘.파일 상단에 추출 + 두 helper 모두 참조. wire schema description 문구도
<no-ext>literal 사용 — sentinel 이 wire 계약의 일부라는 점 더 명확.@@ -372,3 +386,4 @@println!("{}", serde_json::to_string(&wire::wire_ingest(&report))?);} else {let skipped_breakdown = render_skipped_breakdown(&report.skipped_by_extension);println!(render_skipped_breakdown가 본 파일 +crates/kebab-tui/src/ingest_progress.rs양쪽에 동일한 12-line body 로 복제. DRY 위반.plan 이 "DRY violation but acceptable" 라 했지만 양 crate 모두
kebab-app의존 →kebab-app::ingest_progress모듈에pub fn render_skipped_breakdown(map: &BTreeMap<String, u32>) -> String으로 추출 + 양쪽에서 import 하면 single source.작은 helper 라 별 module 만들 필요 없고 기존
ingest_progress.rs(AggregateCounts+status_line의 caller) 가 자연스러운 home. 후속 maintenance 시 정렬 / 형식 변경하면 한 곳만 고침.deprecation 메시지의 "다음 버전부터 config 갱신 권장" 이 모호. 사용자가 "다음 버전 = 언제?" 의문 가능.
현 상황: 본 PR 머지 후 patch bump (0.2.0 → 0.2.1) 가 즉시 예정 (PR description 명시). 사용자 입장에서 "다음 release" = 0.2.1, 즉 곧 옴. 더 명확한 문구:
또는 단순 "config 에서 이 필드를 제거해도 안전 — 더 이상 enforce 안 됨" 식. 현 "다음 버전부터 갱신 권장" 보다 직접적 action.
@@ -17,0 +22,4 @@- `kebab-config::WorkspaceCfg.include: Vec<String>` 제거. denylist-only 모델. 옛 config 의 `include = [...]` 은 serde 가 silently 무시 + `Config::from_file` 가 단발 `tracing::warn!` 으로 deprecation 안내 (`std::sync::OnceLock` — 같은 process 안에서 한 번만).- `kebab-core::IngestItem.warnings` 가 Skipped 시 사유 채움: `"unsupported media type: .{ext}"` (ext 없으면 `"unsupported media type: <no-ext>"`) / `"kb:// URI not yet supported"`.- `kebab-core::IngestReport.skipped_by_extension: BTreeMap<String, u32>` + `kebab-app::AggregateCounts.skipped_by_extension` 신규. key = lowercase ext (`docx`, `txt`), no-ext sentinel = `<no-ext>`. wire schema `ingest_report.v1` 에 additive 추가 (v1 호환 유지 — release 트리거 안 됨 per CLAUDE.md release 규약)."기존 워크스페이스 테스트 무수정 통과" 가 정확하지 않음. 본 PR 이 다음 5 개 기존 test fixture / production helper 수정:
crates/kebab-app/tests/common/mod.rs(SourceScope..Default::default()).crates/kebab-app/tests/image_pipeline.rs× 2 (deadcfg.workspace.include.push제거).crates/kebab-app/tests/pdf_pipeline.rs(동일).crates/kebab-app/tests/ingest_report_snapshot.rs(literal 에skipped_by_extension: BTreeMap::new()추가).crates/kebab-cli/src/wire.rstest (동일).crates/kebab-store-sqlite/snapshots/ingest_report.snapshot.json("skipped_by_extension": {}추가).assertion 의미는 동일 (mechanical adapter) 지만 "무수정" 문구는 잘못. 권장 변경:
회차 2 — 회차 1 의 4 건 모두 수렴.
render_skipped_breakdown단일 source (kebab-app::ingest_progress) + 양 crate 의 적절한 import path.NO_EXT_SENTINEL: &str상수 + 두 helper + wire schema description 일관.v0.2.1++ "제거해도 안전").config workspace.include 제거 + skip 사유 + breakdown 모두 정합. 730 워크스페이스 통과 + clippy clean. 사용자 도그푸딩 피드백 (case 4 모호 + 지원 형식 가시성) 정확히 해소.
머지 동의.
render_skipped_breakdown가kebab-app::ingest_progress로 이전 + 양 crate (kebab-clidirect re-export,kebab-tuiqualified path) 가 single source 참조. AggregateCounts 가 사는 같은 모듈에 helper 가 모이는 구조 깔끔.pub const NO_EXT_SENTINEL추출 + 두 helper (ext_for_skip_warning,unsupported_media_warning) 와 wire schema description 의 sentinel 일관 — single source.pub인 점이 wire 계약 (BTreeMap key) 의 일부라는 신호로 좋음.