feat: v0.17.0 한국어 trigram FTS tokenizer + lexical builder + hint surface #159
Reference in New Issue
Block a user
Delete Branch "feat/korean-trigram-tokenizer"
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?
요약
v0.17.0 release 의 본체. P10 종합 도그푸딩 round 2 (2026-05-22) 에서 발견된 "한국어 lexical 검색 무용" 문제 (FTS5
unicode61토크나이저가 한국어 어절 단위로 잘라 부분 매칭 불가) 를 closure 한다.chunks_fts의 tokenizer 를unicode61→trigram으로 V007 migration 으로 교체 (chunks 원본 + embedding + vector 불변, FTS shadow 만 자동 backfill — re-ingest 불필요) +lexical.rs::build_match_stringtrigram-aware 재설계 (whole-phrase + token-AND OR-combined, 3자 미만 토큰 drop, 후보 0이면 None 으로 빈 MATCH FTS5 syntax error 회피) + CLI/TUI/wirehintsurface 안내 (2자 이하 query → "3자 이상 키워드 권장"). 동반 PR-B (C typedef + parser_version cascade + same-workspace_path orphan purge) + PR-C (code_lang_chunk_breakdown additive) 도 같이 v0.17.0 cut 예정.설계: docs/superpowers/specs/2026-05-22-korean-trigram-tokenizer-design.md
계획: docs/superpowers/plans/2026-05-22-korean-trigram-tokenizer.md
변경 요약
migrations/V007__fts_trigram.sql(앞선 commit 에 머지) —chunks_ftstokenizer 교체 + trigger 재생성 + 자동 backfill INSERT. 컬럼 구성 V002 와 동일.crates/kebab-search/src/lexical.rs::build_match_string— Codex round 2 권장 알고리즘. raw single-quote mode 유지.SearchResponse.hint: Option<String>additive +docs/wire-schema/v1/search_response.schema.json명세 +kebab_app::short_query_hinthelper export.[hint] <message>stderr 한 줄.--json은search_response.v1.hint필드.SearchState.short_query_hint+poll_worker의 stale-aware set (generation guard 후 last_query 기반) +fire_search/mark_input_changed시 reset +dynamic_status가 Search pane 일 때 idle 보다 높은 우선순위로 표시.fts_v007_matches_design_section_5_5_verbatim(앞선 commit).사용자 가시 영향
--mode lexical/--mode hybrid정상 동작 (3자 이상 substring 매칭). 도그푸딩 round 2 "한국어 lexical 무용" 문제 closure.token이tokenizer도 hit (recall ↑ / 단어 경계 ↓). 의도된 변경, 회귀 핀fts_trigram_english_substring_hits.hint안내. raw FTS5 mode ('...') 제외.kebab.sqlite파일 크기 ~2-5배 또는 수백 MB 증가 (trigram index 비대화).retrieval.lexical_score노출값 변동.검증
lexical::tests::build_match_string_*9 PASS (신규 4 + 기존 2 expectation 갱신 + 3 기존).fts.rs::fts_trigram_*(한국어/영어 substring + 2자 0-hit 핀, 3 신규).search_korean.rs::lexical_multi_token_korean_query_hits+lexical_mixed_korean_english_multi_token_query_hits(multi-token 통합 회귀, 2 신규).fts_v007_matches_design_section_5_5_verbatim).wire_search_response::search_json_truncates_with_max_tokens+search_plain_emits_truncated_hint_to_stderr— 다중 doc fixture 로 budget hit-pop 경로.fetch_integration::fetch_chunk_with_context_returns_neighbors— fixture 5-char unique words + querycherry.eval/runner::runner_per_query_snapshot_matches_fixture— BM25 raw score 분포 변경 reflect.cargo test --workspace --no-fail-fast -j 1+cargo clippy --workspace --all-targets -- -D warningsgreen.시험 항목 (Test Plan)
kebab search --mode lexical "충돌은"hit,"해시 충돌"multi-token hit,"충돌"0-hit + stderr[hint],"충돌" --json의 hint 필드 검증.kebab.sqlite를 v0.17.0 binary 로 open → V007 자동 backfill 후 동일 한국어 query 시퀀스 검증 (re-ingest 없음).kebab search --mode lexical "token"이tokenizer도 hit. 도그푸딩 KB 에서 false positive 비율 관찰.kebab tuiSearch 패널에서 2자 query 입력 → status bar 가 hint 표시, 3자 query 로 바꾸면 hint 사라짐 확인.kebab.sqlite파일 크기 비교 (v0.16.x vs v0.17.0 backfill 후).Assisted-by: Claude Code