refactor(core): 빈 re-export shim crate kebab-embed/kebab-llm → kebab-core 흡수 #221

Merged
altair823 merged 1 commits from refactor/fold-trait-shim-crates into main 2026-06-27 02:16:12 +00:00
Owner

요약

kebab-embed/kebab-llm 은 각자 모듈 doc 에서 "defines no new types … thin re-export crate" 라 자처한 순수 re-export 셸이었다. trait(Embedder/LanguageModel 등)은 이미 kebab-core 소유고, 둘은 pub use kebab_core::{...} + feature-gated Mock + test helper 둘셋만 보유. "kebab-core 재구성 시 downstream 안정 surface" 라는 명분은 1인 RAG 엔 speculative YAGNI — 흡수해 crate 22 → 20.

ponytail-audit 가 지목한 빈 추상화 계층. 동작·trait surface 불변 (test-only + import-rename churn; production 로직 0 변경).

변경

  • kebab-core 에 default-OFF mock feature + src/mock.rsMockEmbedder/MockLanguageModel + helper(assert_vector_shape/assert_unit_norm/assert_finish_chunk)를 kebab_core::crate:: import 만 바꿔 verbatim 이동 (mock.rs 는 외부 dep 0).
  • production import 2곳(kebab-embed-local, kebab-llm-local) + test import 다수(kebab-search/kebab-rag/kebab-parse-image/kebab-embed-local)를 kebab_core 로 repoint. mock 쓰는 crate 는 [dev-dependencies]kebab-core = { workspace = true, features = ["mock"] } (resolver 3 → default 빌드에 mock 미유입).
  • shim 자체 테스트: mock 동작 테스트 → kebab-core/tests/{mock_embedder,mock_language_model}.rs 이동(#![cfg(feature="mock")]), reexports.rs(셸 재수출 surface 테스트) 폐기.
  • crates/kebab-embed/crates/kebab-llm 삭제 + workspace member·[workspace.dependencies]·각 dependent Cargo.toml 정리.
  • docs/ARCHITECTURE.md(crate 그래프·트리·count) + HANDOFF.md(arc dated 항목) + docs/components/{embed,llm,rag,search,README}.md 갱신(22→20, trait/mock 위치를 kebab-core 로). kebab-llm-local 의 broken intra-doc link 2건([MockLanguageModel], [generate_stream])도 정리.

비범위 / 가드레일

  • kebab-embed-local/kebab-embed-ollama/kebab-llm-local 어댑터 crate 는 무손상 (이들은 실제 impl 보유 — 셸 아님).
  • mock 은 default-OFFcargo build --workspace(production)는 mock 모듈을 컴파일하지 않음. 셸 fold 가 production 바이너리에 mock 코드를 끌어들이지 않음을 빌드로 확인.
  • kebab_local_rust_report.md(repo 루트) 는 2026-04-27 원본 설계 보고서(frozen 이력) 라 손대지 않음.

검증

  • cargo build --workspace (mock-off) 성공 → production 경로에 Mock* 참조 0 입증. cargo test -p kebab-core --features mock 녹색(이동된 mock 테스트). 의존 crate(kebab-search/kebab-rag/kebab-parse-image/kebab-embed-local/kebab-llm-local) 전부 녹색. cargo clippy --workspace -D warnings 클린. cargo doc -p kebab-llm-local broken-link 0.
  • 적대적 검증 3렌즈: build-test-integrity + behavior-identity(mock 로직 git show main:… 대비 byte-identical, feature default-OFF, production type 무변경) + dead-crate-completeness(2 crate 삭제·member 정리·count 20·잔존 shim 참조 0) 통과.
  • net −279줄 (39파일 +409/−688); 핵심은 crate −2.

시험 항목 (Test Plan)

  • cargo build --release 정상 (mock 미컴파일).
  • cargo test --workspace 녹색 (mock feature 자동 활성 dev-dep 경유).
  • kebab 바이너리 동작 불변 (ingest/search/ask) — trait/mock 이동은 test-only.

Assisted-by: Claude Code

## 요약 `kebab-embed`/`kebab-llm` 은 각자 모듈 doc 에서 "**defines no new types** … thin re-export crate" 라 자처한 순수 re-export 셸이었다. trait(Embedder/LanguageModel 등)은 **이미 kebab-core 소유**고, 둘은 `pub use kebab_core::{...}` + feature-gated Mock + test helper 둘셋만 보유. "kebab-core 재구성 시 downstream 안정 surface" 라는 명분은 1인 RAG 엔 speculative YAGNI — 흡수해 **crate 22 → 20**. ponytail-audit 가 지목한 빈 추상화 계층. **동작·trait surface 불변** (test-only + import-rename churn; production 로직 0 변경). ## 변경 - **kebab-core 에 default-OFF `mock` feature** + `src/mock.rs` — `MockEmbedder`/`MockLanguageModel` + helper(`assert_vector_shape`/`assert_unit_norm`/`assert_finish_chunk`)를 `kebab_core::` → `crate::` import 만 바꿔 **verbatim 이동** (mock.rs 는 외부 dep 0). - production import 2곳(`kebab-embed-local`, `kebab-llm-local`) + test import 다수(`kebab-search`/`kebab-rag`/`kebab-parse-image`/`kebab-embed-local`)를 `kebab_core` 로 repoint. mock 쓰는 crate 는 `[dev-dependencies]` 에 `kebab-core = { workspace = true, features = ["mock"] }` (resolver 3 → default 빌드에 mock 미유입). - shim 자체 테스트: mock **동작** 테스트 → `kebab-core/tests/{mock_embedder,mock_language_model}.rs` 이동(`#![cfg(feature="mock")]`), `reexports.rs`(셸 재수출 surface 테스트) 폐기. - `crates/kebab-embed`/`crates/kebab-llm` 삭제 + workspace member·`[workspace.dependencies]`·각 dependent Cargo.toml 정리. - `docs/ARCHITECTURE.md`(crate 그래프·트리·count) + `HANDOFF.md`(arc dated 항목) + `docs/components/{embed,llm,rag,search,README}.md` 갱신(22→20, trait/mock 위치를 kebab-core 로). `kebab-llm-local` 의 broken intra-doc link 2건(`[MockLanguageModel]`, `[generate_stream]`)도 정리. ## 비범위 / 가드레일 - **`kebab-embed-local`/`kebab-embed-ollama`/`kebab-llm-local` 어댑터 crate 는 무손상** (이들은 실제 impl 보유 — 셸 아님). - **mock 은 default-OFF** — `cargo build --workspace`(production)는 mock 모듈을 컴파일하지 않음. 셸 fold 가 production 바이너리에 mock 코드를 끌어들이지 않음을 빌드로 확인. - `kebab_local_rust_report.md`(repo 루트) 는 2026-04-27 원본 설계 보고서(frozen 이력) 라 손대지 않음. ## 검증 - `cargo build --workspace` (mock-off) 성공 → production 경로에 Mock* 참조 0 입증. `cargo test -p kebab-core --features mock` 녹색(이동된 mock 테스트). 의존 crate(`kebab-search`/`kebab-rag`/`kebab-parse-image`/`kebab-embed-local`/`kebab-llm-local`) 전부 녹색. `cargo clippy --workspace -D warnings` 클린. `cargo doc -p kebab-llm-local` broken-link 0. - 적대적 검증 3렌즈: **build-test-integrity** + **behavior-identity**(mock 로직 `git show main:…` 대비 byte-identical, feature default-OFF, production type 무변경) + **dead-crate-completeness**(2 crate 삭제·member 정리·count 20·잔존 shim 참조 0) 통과. - net −279줄 (39파일 +409/−688); 핵심은 **crate −2**. ## 시험 항목 (Test Plan) - [ ] `cargo build --release` 정상 (mock 미컴파일). - [ ] `cargo test --workspace` 녹색 (mock feature 자동 활성 dev-dep 경유). - [ ] `kebab` 바이너리 동작 불변 (ingest/search/ask) — trait/mock 이동은 test-only. Assisted-by: Claude Code
altair823 added 1 commit 2026-06-27 01:07:03 +00:00
kebab-embed/kebab-llm 은 "새 type 없음"을 자처한 순수 re-export 셸이었다
(trait 은 이미 kebab-core 소유, mock + test helper 만 보유). "kebab-core
재구성 시 안정 surface" 라는 명분은 1인 RAG 엔 speculative YAGNI. 흡수:

- kebab-core 에 default-OFF `mock` feature + src/mock.rs (MockEmbedder,
  MockLanguageModel, assert_vector_shape/assert_unit_norm/assert_finish_chunk
  을 kebab_core:: → crate:: import 만 바꿔 verbatim 이동).
- production import 2곳(kebab-embed-local, kebab-llm-local) +
  test import 다수(search/rag/parse-image/embed-local) 를 kebab_core 로 repoint.
  mock 쓰는 crate 는 dev-dep 에 features=["mock"] (default 빌드 무영향).
- shim 자체 테스트: mock 동작 테스트는 kebab-core/tests/ 로 이동,
  reexports.rs(셸 재수출 테스트)는 폐기.
- crates/kebab-embed, crates/kebab-llm 삭제 + workspace member/deps 정리.
- ARCHITECTURE/HANDOFF/component README 의 crate 그래프·표·rationale 갱신
  (22 → 20 crates). llm-local 의 broken intra-doc link 2건도 정리.

trait surface·동작 불변 (test-only + import-rename). workspace build 는 mock
default-OFF 라 mock 코드 미컴파일. 적대적 검증 3렌즈(build-test-integrity +
behavior-identity[mock byte-identical] + dead-crate-completeness) 통과,
clippy --workspace -D warnings 클린.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012Mc6W1fgsrbFKTsqA6P8La
claude-reviewer-01 approved these changes 2026-06-27 01:12:20 +00:00
claude-reviewer-01 left a comment
Member

회차 1 — actionable 0건, APPROVE 로 종료.

독립 검증(6 체크 전부 PASS):

  • mock byte-identity: kebab-core/src/mock.rs 가 git show main:…embed/llm 의 mock+helper 와 logic fingerprint 18개 1:1 (hash recipe·EmbeddingKind 매핑·zero-guard·apply_stop·FinishReason·seed=0 등 전부 동일), 차이는 kebab_core:: → crate:: import 한 줄뿐.
  • feature 게이팅: [features] default=[]/mock=[], 모듈+재수출 #[cfg(feature="mock")]. cargo build --workspace(production) 에서 mock 미컴파일. 4 소비자 모두 [dev-dependencies] 에 features=["mock"] (production force-on 없음).
  • dep-graph: 2 crate 디렉토리 git rm, workspace member 20, 잔존 shim 참조 0(frozen 제외).
  • repoint: kebab-llm-local/embed-local production import + 재수출이 kebab_core 로 정확히 이동, 소비자 resolve.
  • 테스트: cargo test -p kebab-core --features mock 14 passed, llm-local/embed-local 13 passed, clippy -D warnings 클린.

trait surface·동작 불변, 재인덱싱 위험 0. 머지 동의합니다.

회차 1 — actionable 0건, APPROVE 로 종료. 독립 검증(6 체크 전부 PASS): - mock byte-identity: kebab-core/src/mock.rs 가 git show main:…embed/llm 의 mock+helper 와 logic fingerprint 18개 1:1 (hash recipe·EmbeddingKind 매핑·zero-guard·apply_stop·FinishReason·seed=0 등 전부 동일), 차이는 kebab_core:: → crate:: import 한 줄뿐. - feature 게이팅: [features] default=[]/mock=[], 모듈+재수출 #[cfg(feature="mock")]. cargo build --workspace(production) 에서 mock 미컴파일. 4 소비자 모두 [dev-dependencies] 에 features=["mock"] (production force-on 없음). - dep-graph: 2 crate 디렉토리 git rm, workspace member 20, 잔존 shim 참조 0(frozen 제외). - repoint: kebab-llm-local/embed-local production import + 재수출이 kebab_core 로 정확히 이동, 소비자 resolve. - 테스트: cargo test -p kebab-core --features mock 14 passed, llm-local/embed-local 13 passed, clippy -D warnings 클린. trait surface·동작 불변, 재인덱싱 위험 0. 머지 동의합니다.
altair823 merged commit 2f02058f63 into main 2026-06-27 02:16:12 +00:00
altair823 deleted branch refactor/fold-trait-shim-crates 2026-06-27 02:16:14 +00:00
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: altair823-org/kebab#221