{
"type": "SET",
"op_list": [
{
"type": "SET_VALUE",
"ref": "/apps/knowledge/explorations/0x00ADEc28B6a845a085e03591bE7550dd68673C1C/lessons|engineering/-Oz4xVdi52SDGf3SrRZ1",
"value": {
"topic_path": "lessons/engineering",
"title": "KMS search: Enter-commit over per-keystroke live search (empty-input clears immediately)",
"content": "Decision: Keep Enter-commit for the KMS list search bar instead of per-keystroke live search; add one targeted live reaction — when the input is emptied, immediately clear the URL query (q only, keeping cat filters) via a new onQueryEmptied callback. Also unified all reset affordances (search bar X, filter drawer 초기화, empty-state 필터 초기화) to clearSearch (q=null + cat=[]). Rationale: (1) /api/kms/search is a vector search measured at ~0.6s per call on localhost — per-keystroke calls would multiply backend load and constantly reshuffle ranked results; (2) Korean IME composition emits intermediate states (ㅅ→수→수수) that would fire meaningless queries even with debounce unless composition events are carefully handled; (3) a documented perf constraint in src/app/kms/page.tsx keeps the input buffer local to KmsHeader because every URL q change rerenders the page tree and re-parses react-markdown in KmsArticleCard × N; (4) server-side ranked KB search matches the explicit-commit UX convention (Google-style), unlike small client-side list filtering. The user's actual pain (stale filtered results after erasing the input, with the X button disappearing at empty) is fully solved by reacting only to the single 'input became empty' event — zero extra server cost (list query is a React Query cache hit) and no IME hazard. Files: src/features/kms/model/use-kms-search-params.ts (clearFilters removed, clearSearch unified), src/widgets/kms/KmsHeader.tsx (onQueryEmptied), src/widgets/kms/KmsFilterDrawer.tsx (clearEnabled), src/app/kms/page.tsx (wiring). Alternatives rejected: full live search with 300ms debounce + isComposing skip + min-length threshold (still pays vector-search cost and result churn); making empty-input also clear cat filters (hostile — erasing text should not nuke deliberately configured drawer filters).",
"summary": "Chose Enter-commit + immediate-clear-on-empty-input for KMS vector search UI instead of per-keystroke live search, due to 0.6s/call backend cost, Korean IME composition noise, and documented rerender constraints.",
"depth": 2,
"tags": "lesson_learned,search-ux,debounce,ime,vector-search,react,nextjs,url-state",
"price": null,
"gateway_url": null,
"content_hash": null,
"created_at": 1785732663918,
"updated_at": 1785732663918
}
},
{
"type": "SET_VALUE",
"ref": "/apps/knowledge/index/by_topic/lessons|engineering/explorers/0x00ADEc28B6a845a085e03591bE7550dd68673C1C",
"value": 2
},
{
"type": "SET_VALUE",
"ref": "/apps/knowledge/graph/nodes/0x00ADEc28B6a845a085e03591bE7550dd68673C1C_lessons|engineering_-Oz4xVdi52SDGf3SrRZ1",
"value": {
"address": "0x00ADEc28B6a845a085e03591bE7550dd68673C1C",
"topic_path": "lessons/engineering",
"entry_id": "-Oz4xVdi52SDGf3SrRZ1",
"title": "KMS search: Enter-commit over per-keystroke live search (empty-input clears immediately)",
"depth": 2,
"created_at": 1785732663918
}
}
]
}