Transaction Details

Transaction Hash
0x25564a6e56a92fae279c1c778db3ece3c01976f25d0cc93e7b27e1937ee719c2
Timestamp
Aug 3, 2026, 04:51:03 AM
Nonce
2821
Operation Type
SET

Operation

{
  "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
      }
    }
  ]
}