refactor(search): 죽은 search-cache + search --explain scaffold 제거 #219

Merged
altair823 merged 2 commits from refactor/dead-search-cache-scaffold into main 2026-06-26 23:35:43 +00:00
Owner

요약

in-process LRU search cache 는 spine 재작성(#214)에서 이미 삭제됐는데, 그 비계(scaffold)만 코드·문서에 남아 있었다. 죽은 잔존물을 걷어낸다 — 코어 검색 동작은 byte-identical (제거된 search_uncached 본문이 search() 로 verbatim 이동했을 뿐).

ponytail-audit 가 지목한 "removed-but-scaffold-still-standing" 클러스터의 첫 정리 PR. 후속 PR(9-chunker 통합, 빈 re-export crate 흡수 등)이 같은 arc 로 이어진다.

제거 대상

  • App::search / App::search_uncached 붕괴 — search() 는 1줄 위임자였음. 본문을 search() 로 인라인하고 search_uncached() 삭제.
  • search_uncached_with_config facade (lib.rs) + 이를 쓰던 테스트 search_uncached_returns_same_hits_as_cached 삭제.
  • 죽은 CLI 플래그 search --no-cache (이미 _ 로 버려짐) + search --explain (이미 _) 제거. ask --explain 은 live — 그대로 유지.
  • 안 읽히던 RagCfg.explain_default config 필드 + 모든 fixture/embedded TOML 잔재 제거.
  • 제거된 표면을 가리키던 stale 주석/문서 정정 (citation_helper.rs, hybrid.rs x2, search/app-facade 컴포넌트 README, DOGFOOD.md, HANDOFF.md p9-fb-19 항목에 한 줄 cross-link).

비범위 / 가드레일

  • search_cache wire capability 는 보존schema.v1 의 required capabilities 필드라 제거 시 v1 to v2 breaking bump. search_cache: false 광고는 "캐시 없음"을 정직히 보고하는 것이라 의미도 맞음. (4곳 모두 그대로: schema.rs/wire.rs/main.rs/schema.schema.json.)
  • frozen specs/plans/handoffs/tasks 의 과거 언급은 frozen-spec 규칙대로 건드리지 않음.

검증

  • cargo build / cargo clippy -D warnings — kebab-app·cli·config·search 4 크레이트 클린.
  • cargo test — 변경 코드 경유 테스트 녹색. 남은 실패는 사전존재 환경 이슈(GPU-less box 의 FastembedEmbedder 모델 부재 + target/debug/kebab 하드코딩 경로)로, git stash 로 clean tree 에서 동일 재현해 본 변경과 독립임을 확인.
  • 적대적 검증 워크플로 3렌즈: correctness-preserved(search 본문 verbatim 이동 — diff 로 입증) + wire-config-safe(search_cache 4곳 유지 + 기존 config 의 stray explain_default 키 로드 무손상 throwaway 테스트) 통과. dead-symbol-complete 가 잡은 stale 주석/문서 5건 정정 완료 후 잔여 거짓 참조 0건.
  • 코드 내 search_uncached/explain_default/no_cache(search) 잔존 0건.

시험 항목 (Test Plan)

  • kebab search <q> 결과가 이전과 동일 (byte-identical).
  • kebab search --no-cache / kebab search --explain to unknown flag 에러 (제��� 확인).
  • kebab ask "..." --explain 정상 동작 (live 유지 확인).
  • kebab schema --json 의 capabilities 에 search_cache: false 그대로.
  • 기존 [rag] explain_default = false 가 든 config.toml 로드 무에러.

Assisted-by: Claude Code

## 요약 in-process LRU search cache 는 spine 재작성(#214)에서 이미 삭제됐는데, 그 비계(scaffold)만 코드·문서에 남아 있었다. 죽은 잔존물을 걷어낸다 — **코어 검색 동작은 byte-identical** (제거된 `search_uncached` 본문이 `search()` 로 verbatim 이동했을 뿐). ponytail-audit 가 지목한 "removed-but-scaffold-still-standing" 클러스터의 첫 정리 PR. 후속 PR(9-chunker 통합, 빈 re-export crate 흡수 등)이 같은 arc 로 이어진다. ## 제거 대상 - `App::search` / `App::search_uncached` 붕괴 — `search()` 는 1줄 위임자였음. 본문을 `search()` 로 인라인하고 `search_uncached()` 삭제. - `search_uncached_with_config` facade (lib.rs) + 이를 쓰던 테스트 `search_uncached_returns_same_hits_as_cached` 삭제. - 죽은 CLI 플래그 `search --no-cache` (이미 `_` 로 버려짐) + `search --explain` (이미 `_`) 제거. **`ask --explain` 은 live — 그대로 유지.** - 안 읽히던 `RagCfg.explain_default` config 필드 + 모든 fixture/embedded TOML 잔재 제거. - 제거된 표면을 가리키던 stale 주석/문서 정정 (`citation_helper.rs`, `hybrid.rs` x2, `search`/`app-facade` 컴포넌트 README, `DOGFOOD.md`, `HANDOFF.md` p9-fb-19 항목에 한 줄 cross-link). ## 비범위 / 가드레일 - **`search_cache` wire capability 는 보존** — `schema.v1` 의 required capabilities 필드라 제거 시 v1 to v2 breaking bump. `search_cache: false` 광고는 "캐시 없음"을 정직히 보고하는 것이라 의미도 맞음. (4곳 모두 그대로: `schema.rs`/`wire.rs`/`main.rs`/`schema.schema.json`.) - frozen specs/plans/handoffs/tasks 의 과거 언급은 frozen-spec 규칙대로 **건드리지 않음**. ## 검증 - `cargo build` / `cargo clippy -D warnings` — kebab-app·cli·config·search 4 크레이트 클린. - `cargo test` — 변경 코드 경유 테스트 녹색. 남은 실패는 사전존재 환경 이슈(GPU-less box 의 FastembedEmbedder 모델 부재 + `target/debug/kebab` 하드코딩 경로)로, `git stash` 로 clean tree 에서 동일 재현해 본 변경과 독립임을 확인. - 적대적 검증 워크플로 3렌즈: **correctness-preserved**(search 본문 verbatim 이동 — diff 로 입증) + **wire-config-safe**(search_cache 4곳 유지 + 기존 config 의 stray `explain_default` 키 로드 무손상 throwaway 테스트) 통과. **dead-symbol-complete** 가 잡은 stale 주석/문서 5건 정정 완료 후 잔여 거짓 참조 0건. - 코드 내 `search_uncached`/`explain_default`/`no_cache`(search) 잔존 0건. ## 시험 항목 (Test Plan) - [ ] `kebab search <q>` 결과가 이전과 동일 (byte-identical). - [ ] `kebab search --no-cache` / `kebab search --explain` to unknown flag 에러 (제��� 확인). - [ ] `kebab ask "..." --explain` 정상 동작 (live 유지 확인). - [ ] `kebab schema --json` 의 capabilities 에 `search_cache: false` 그대로. - [ ] 기존 `[rag] explain_default = false` 가 든 config.toml 로드 무에러. Assisted-by: Claude Code
altair823 added 1 commit 2026-06-26 17:16:05 +00:00
in-process LRU search cache 는 spine 재작성(#214)에서 이미 삭제됐는데
그 비계(scaffold)만 남아 있었다. 잔존물 제거:

- App::search/search_uncached 붕괴 (search() 는 1줄 위임자였음)
- search_uncached_with_config facade + 그 테스트 삭제
- 죽은 `search --no-cache` / `search --explain` CLI 플래그 제거
  (ask --explain 은 live — 건드리지 않음)
- 안 읽히던 RagCfg.explain_default config 필드 + fixture 제거
- 제거된 표면을 가리키던 stale 주석/문서(citation_helper/hybrid/
  search·app-facade README/DOGFOOD/HANDOFF) 정정

코어 검색 출력은 byte-identical (search_uncached 본문이 search() 로
verbatim 이동). `search_cache: false` wire capability 는 유지 — 제거 시
schema.v1 breaking bump 이라 손해. 적대적 검증 2렌즈(correctness-preserved
+ wire/config-safe) 통과, dead-symbol-complete 가 잡은 5건 주석/문서 정정 완료.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012Mc6W1fgsrbFKTsqA6P8La
altair823 added 1 commit 2026-06-26 17:25:11 +00:00
리뷰어 지적 6건 + 전체-트리 grep 으로 추가 발견한 동일 부류 4건:
- search --trace help text(CLI main.rs + MCP search tool) "Bypasses cache"
  → "always a fresh retriever run" (없는 캐시 광고 제거)
- corpus_revision 의 실제 소비자는 incremental ingest 가 아니라 cursor
  pagination(stale_cursor) 임을 반영 — HANDOFF 노트 사실 정정 + ingest.rs
  bump 주석/warn 로그 + corpus_revision/search_lexical 테스트 주석 재서술
  (검증: cursor.rs + app.rs:327/333/498 가 유일 소비자, ingest 는 bump 만)
- bulk.rs "LRU cache amortize" → embedder cold-start 만 amortize
- app.rs lexical_index_version "search cache 무효화" 제거
- app-facade README 의 search cache bullet 을 "(제거됨 — 이력)" 표시

잔여 dead-cache 개념 참조 0건(active tree), clippy -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-26 17:25:46 +00:00
claude-reviewer-01 left a comment
Member

회차 2 — 회차 1 의 actionable 6건 + 후속 grep 으로 드러난 동일 부류 4건 모두 반영 확인. 잔여 dead-cache 개념 참조 0건(active tree), clippy -D warnings 클린.

핵심 검증:

  • search() 인라인은 동작 보존(search_uncached 본문 verbatim 이동) — 코어 검색 출력 byte-identical.
  • search_cache wire capability 4곳 모두 유지(schema.v1 breaking 회피).
  • corpus_revision 의 실제 소비자가 cursor pagination(stale_cursor)임을 코드로 확인 — 사실 정정된 주석/HANDOFF 노트 정확.
  • search --trace/ask --explain 등 live 표면 무손상.

머지 동의합니다.

회차 2 — 회차 1 의 actionable 6건 + 후속 grep 으로 드러난 동일 부류 4건 모두 반영 확인. 잔여 dead-cache 개념 참조 0건(active tree), clippy -D warnings 클린. 핵심 검증: - search() 인라인은 동작 보존(search_uncached 본문 verbatim 이동) — 코어 검색 출력 byte-identical. - `search_cache` wire capability 4곳 모두 유지(schema.v1 breaking 회피). - corpus_revision 의 실제 소비자가 cursor pagination(stale_cursor)임을 코드로 확인 — 사실 정정된 주석/HANDOFF 노트 정확. - `search --trace`/`ask --explain` 등 live 표면 무손상. 머지 동의합니다.
altair823 merged commit 9e8dafd4a6 into main 2026-06-26 23:35:43 +00:00
altair823 deleted branch refactor/dead-search-cache-scaffold 2026-06-26 23:35:45 +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#219