v0.2.11 Cut D — FTS5 search + 회고 view (F19 A+D) #29
Reference in New Issue
Block a user
Delete Branch "worktree-v0211-cut-d-fts5-review"
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?
Summary
v0.2.11 Cut D — F19 (recall 메커니즘) 의 A+D 옵션 적용. recall 핵심 가치 도달 — 누적 노트에서 키워드 검색 + 일/주/월 회고 view.
notes_fts(raw_text/ai_title/ai_summary/tags). m007 마이그레이션 + AFTER INSERT/UPDATE/DELETE 트리거 (notes 컬럼 자동 sync) + tags 는rebuildFtsTagsForNotesingle write path. inbox 헤더 search box (debounce 200ms) + 결과 렌더 분기. 빈 query → 기본 list. 기본 trashed 제외 + status filter 가능.useInbox.viewenum 에review-daily/review-weekly/review-monthly추가.updateAiResult/updateUserAiFields/importNote) 가rebuildFtsTagsForNote(noteId)호출 — final review 단계에서 importNote 누락 발견 → 패치.findById(id).rawTextsource 코드 무수정. raw_text 가변 (Cut C) 의 trigger AFTER UPDATE 가 자동 sync — 회귀 검증.변경 내역 (10 commits)
Phase 0: 문서
1104a8cdocs(plan) — Cut D plan + spec m006→m007 정정 (Cut C 가 m006 선점) + ai_title/ai_summary + note_tags JOIN 정정Phase 1: schema
19edeabTask 1 — m007 마이그레이션 (notes_ftsFTS5 + 트리거 3 + backfill, status != 'trashed')Phase 2: repo
726d155Task 2 —rebuildFtsTagsForNote헬퍼 + tags 변경 path 통합 (updateAiResult / updateUserAiFields)e60a2a2Tasks 3-5 —ftsHelpers(sanitize + computeCutoff) +NoteRepository.search+reviewAggregatePhase 3: 와이어업
143684cTask 6 —InboxApi.search+reviewAggregate(types + IPC + preload)Phase 4: store
f5e4313Task 7 — store search + reviewData state + actions + view enum 확장Phase 5: UI
be125b8Task 8 — SearchBox (debounce 200ms) + 헤더 mount + inbox 결과 렌더 분기9feb712Task 9 — ReviewView (period 라벨 + tag bar + due progress + 최근 노트) + 헤더 dropdown 진입점Phase 6: release
5801a98chore(release) — F19 promoted 마킹 + version 0.2.10→0.2.11Phase 7: final review fix
735d549fix(v0211) —importNote가rebuildFtsTagsForNote호출 (final review 발견: F5 import 후 tag keyword 검색 매칭 안 되는 회귀). 회귀 test 2건 (insert / fork path) 추가. NoteRepository 의note_tagsINSERT path 3곳 모두 헬퍼 호출 보장 — invariant 회복.테스트 / 빌드
Schema 변경
notes_ftsFTS5 가상 테이블 (note_id UNINDEXED + raw_text + ai_title + ai_summary + tags + tokenize='unicode61'). AFTER INSERT/UPDATE/DELETE 트리거 3개 (notes 컬럼 자동 sync, tags 는 헬퍼 path). 기존status != 'trashed'노트 backfill (note_tags JOIN GROUP_CONCAT). transaction 안 단일 exec (runMigrations wrap)메모리 정책 갱신 (Cut D 머지 후 적용)
notes.raw_text/ai_title/ai_summary/tags csv (FTS5 인덱스 latest only — revision X). Cut C 의 raw_text 가변 정책과 일관 (옛 revision 검색 X)updateAiResult/updateUserAiFields/importNote3곳, 모두rebuildFtsTagsForNote호출 보장 — invariant 검증 완료kstTodayIso)Risk 잔재 (final review)
OR/AND/NEAR:sanitizeFtsQuery가"*():만 strip.회의 OR 결재같은 mixed query 가 Boolean OR 로 동작 — dogfood 시 사용자 헷갈림 가능. 향후 cut 에서 lowercase 정규화 또는 doc 정정Test Plan
",*,(,),:) 입력 시 crash 없이 안전 처리status='trashed'명시 시만 노출🤖 Generated with Claude Code
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- F19 promoted (✅ v0.2.11 Cut D — A+D 옵션) - version 0.2.10 → 0.2.11 (package.json + package-lock.json) - 단위 569 → 606 (m007 6 + tags sync 2 + ftsHelpers 7 + search 6 + reviewAggregate 5 + IPC 3 + store 3 + SearchBox 2 + ReviewView 3 = 37 신규) - typecheck 0 errors코드 리뷰 — v0.2.11 Cut D
Scope: 10 commits (1104a8c..735d549)
Spec coverage ✅ 100%
Cut D design 의 모든 섹션이 task 매핑됨. F19-A (FTS5 search) + F19-D (일/주/월 회고 view).
m007_fts.ts— virtual table + index + backfill (status != 'trashed', note_tags JOIN GROUP_CONCAT)sanitizeFtsQuery+notes_fts MATCH+ ORDER BY rank + 기본 trashed 제외 + 빈 query → []SearchBox.tsx— 200ms debounce + clearSearch on emptyinbox:search+inbox:review-aggregate(period validation)viewenum 확장 +setView의loadReview자동 발동코드 품질
Strengths
ftsHelpers.ts):sanitizeFtsQuery/computeCutoff분리 → 단위 테스트 용이 (7건). KST cutoff 산식 verified (2026-05-10T05:30Z → 2026-05-09T15:00Z daily).rebuildFtsTagsForNote(NoteRepository.ts:942)private+updateAiResult/updateUserAiFields/importNote(final review fix) 3 path 모두 동일 transaction 안 호출. tags 갱신 invariant 강제.AND n.status != 'trashed') — cleanup 안 함. YAGNI 적절. 명시적으로 default vsstatus옵션 두 path 모두 검증.findById(id).rawTextsource 코드 무수정. Cut C raw_text 가변 정책의 trigger AFTER UPDATE 가 자동 sync — 회귀 검증 포함.kstTodayIso) 기준 — 5건 reviewAggregate 테스트로 검증.Final review follow-up 적용 (
735d549)initial final review (Opus, 1차) 에서 발견된 Important issue:
importNote가rebuildFtsTagsForNote호출 안 함 → F5 import 후 tag keyword 검색 매칭 안 되는 회귀→ Fix:
importNotetransaction 끝에서 헬퍼 호출 (NoteRepository.ts:856)tests/unit/NoteRepository.test.ts:1108-1166)note_tagsINSERT path = 3곳 (updateAiResult / updateUserAiFields / importNote), 모두 헬퍼 호출 보장 검증re-verification 결과:
note_tags변경하는 모든 path 가rebuildFtsTagsForNote호출importNote+ 회귀 test 만 변경, 다른 path 무영향)Architecture
sanitizeFtsQuery= pure /search= JOIN+rank /reviewAggregate= 4 read query /rebuildFtsTagsForNote= post-mutation syncMoveStatusModal/RevisionHistoryModalmodal pattern 와 다른 컴포넌트 (SearchBox/ReviewView) 도 zustand 패턴 일관Risk 잔재 (final review 분석)
OR/AND/NEAR:sanitizeFtsQuery가"*():만 strip. mixed query (한+영) 에서 Boolean 동작 — 향후 operator 정규화 또는 doc 추가Sub-review 트레일
머지 권장
v0.2.11+npm run dist:win→ Windows exe 빌드dist:mac+dist:linux후 dmg/AppImage/deb 추가 attachOverall
Ready to merge. Spec 100% coverage, 569 → 608 unit (+39) + typecheck 0, m007 마이그레이션 외래키 안전 + trigger 자동 sync, single write path 정책 invariant 검증 (3 path 전수 점검), v0.2.6 #10 fix / Cut B 'disabled' / Cut C revision API 모두 호환. final review follow-up 완료. Cut E (v0.3.0 — F21 양방향 sync) 진입 가능.
🤖 Reviewed by Claude Opus 4.7 (1M context) with Sonnet/Haiku sub-agents per subagent-driven-development skill