refactor(app): doc-side expansion(별칭) 기능 제거 #202
Reference in New Issue
Block a user
Delete Branch "refactor/remove-doc-expansion"
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?
요약
doc-side expansion(별칭) 기능을 완전히 제거한다. 측정·딥리서치(
docs/superpowers/research/2026-06-03-expansion-cost-rethink-research.md)에서 별칭의 ROI 가 음수로 확인됐다: cross-lingual(한↔영)·동의어·약어 recall@10 은 e5-large 단독으로 이미 완벽하고(en 18/18, ko 18/18, syn 11/11, abbr 7/7), 별칭의 실효는 설명형 paraphrase +2 그룹(14→16)뿐인데 그 대가가 청크당 색인-시 LLM 호출(살아있는 KB 에서 지속 불가능, 정답 18문서만 2.5시간)이었다. 학계(arXiv 2309.08541 "강한 검색기엔 expansion 이 해롭다")와도 정합. 별칭은 이미 default-off 라 일반 사용자 체감은 0이며, 본 PR 은 코드·스키마·wire 표면을 정리해 유지보수 부담을 없앤다.설계: docs/superpowers/specs/2026-06-03-remove-doc-expansion-spec.md
계획: docs/superpowers/plans/2026-06-03-remove-doc-expansion-plan.md
제거 / 유지 경계
제거:
Chunk.aliases,kebab-app/src/expansion.rs+ ingest 별칭 생성·캐시·sentinel 벡터 루프,IngestExpansionCfg/[ingest.expansion],kebab-search의run_alias_query/merge_body_alias/alias lexical arm,IngestEvent::ExpansionProgress+ CLI/TUI 렌더 + wireexpansion_progresskind, 별칭 전용 테스트.유지(의도적):
Metadata.aliases(문서 메타데이터, 무관),AssetChunked/AssetTimings(+expansion_ms필드는 wire 호환 위해 값 0 유지), derivation_cacheembeddingkind(V012 임베딩 캐시),chunks_fts(본문 FTS), 그리고ALIAS_SUFFIX/strip_alias_suffix(ids.rs) — 기존 KB 의 잔존 alias sentinel 벡터를 검색 시 본문 chunk 로 graceful 매핑하는 read-side 하위호환(제거 시 옛 KB 결과 깨짐 방지).마이그레이션 / 버전
migrations/V013__drop_chunk_aliases.sql— forward-only 로chunk_aliases_fts(+ 트리거) +chunks.aliasesDROP. V010 은 freeze 규칙대로 무수정, V013 이 덮어 제거. corpus_revision cascade 불필요(본문·임베딩 불변).0.24.0 → 0.25.0.[ingest.expansion]가 남아있는 기존 config.toml 은 serde forward-compat 로 무해하게 무시됨(확인).검증
cargo clippy --workspace --all-targets -j 4 -- -D warnings→ exit 0 (리더 독립 재실행으로 재확인, 1m59s).cargo test --workspace --no-fail-fast -j 1→ 1452 tests passed, 실패 0 (195 그룹 ok).expansion::|ExpansionCfg|chunk_aliases|run_alias_query|merge_body_alias|ExpansionProgress|embed_aliases|is_nav_boilerplate,Chunk.aliases0.kebab ingest정상 종료,.schema에chunk_aliases_fts/chunks.aliases부재 확인, expand phase 미출력.[ingest.expansion]config 무해 무시 확인.시험 항목 (Test Plan)
Assisted-by: Claude Code
ingest_one_asset 의 청크당 별칭 LLM 생성·derivation_cache 조회/저장· embed_aliases sentinel 벡터(`{orig}#alias#N`) upsert 루프 제거. expansion_ms 는 wire 호환 위해 0 고정. alias_sentinel_ids_to_delete 와 orphan purge 3개 호출부를 본문 chunk_id 직접 삭제로 단순화. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>회차 1 — 별칭 제거. 독립 검증 후 actionable 결함 0, 머지 동의(APPROVE).
독립 검증한 것
cargo clippy --workspace --all-targets -j 4 -- -D warnings→ exit 0 (리뷰어가 worktree 에서 재실행, 1m59s).expansion::|ExpansionCfg|chunk_aliases|run_alias_query|merge_body_alias|ExpansionProgress|embed_aliases|is_nav_boilerplate,Chunk.aliases).migrations/V013__drop_chunk_aliases.sql실재·정확: trigger → FTS 테이블 → 컬럼 DROP 순서, V010 무수정(freeze 준수), forward-only.핵심 로직 diff 검토 (회귀 위험 영역)
kebab-search/lexical.rs: 별칭 채널(run_alias_query/merge_body_alias/alias 분기) 제거 후raw_rows = run_query(...)직결 = pre-V010 body-only 동작 복원.build_match_string_for_column→build_match_string(text고정) 원복. 깔끔.kebab-app/lib.rs: expansion 루프·캐시·sentinel 벡터 임베딩 전부 제거,expansion_ms = 0(주석으로 wire 호환 명시). purge_vector_orphans 본문 경로 유지.ingest_progress.v1:expansion_progresskind + 이제 고아가 된done프로퍼티까지 정합 제거.expansion_ms는 값 0 으로 유지(additive-compat).AssetChunked/AssetTimings보존·정상 emit(3곳).좋았던 판단
Metadata.aliases(문서 메타) vsChunk.aliases(expansion) 경계 정확히 지킴.ALIAS_SUFFIX/strip_alias_suffix(ids/filters/vector.rs) 를 손대지 않아 기존 KB 의 잔존 sentinel 벡터가 검색 시 본문 chunk 로 graceful 매핑됨 — 옛 데이터 회귀 방지.전체 테스트 1452 pass(작성자 보고) + 위 독립 검증으로 회귀 위험 낮음. 사용자 머지 권장.