# Phase 4: Destination Search + KL Gazetteer - Discussion Log > **Audit trail only.** Do not use as input to planning, research, or execution agents. > Decisions captured in CONTEXT.md — this log preserves the analysis. **Date:** 2026-10-23 **Phase:** 04-destination-search-kl-gazetteer **Mode:** default (interactive) ## Areas Discussed ### Search interaction surface | Question | Options presented | Selection | |---|---|---| | Where does the user type? | /cari command / free-text / in-webview / command+shared module | /cari command | | Shortlist presentation | best+inline alternates / list-then-choose / single result | Best + inline alternates | | Backend architecture | gazetteer-first pluggable / KL-scale WASM now / full pivot | Gazetteer-first pluggable | ### Photon/VPS detour (user education round) User asked what Photon is, why static hosts (Cloudflare Pages/GitHub Pages) can't run it, and proposed SQLite/sql.js and Rust-WASM (tantivy) alternatives — including a full "Malaysia-only Photon-lite" sketch (Geofabrik pbf → SQLite/FTS5 → sql.js in browser on GitHub Pages, forkable). Explained: static hosts execute nothing; the Worker is mandatory for the webhook regardless; full-MY index exceeds Worker memory caps; client-side engine means huge mobile downloads; chat-side /cari needs server-side answers. The forkable endgame is preserved as SearchSource backend #2. **Notable: user's pushback killed the default VPS-now plan** — search is $0 in-Worker; VPS defers to Phase 5 (Valhalla). ### License (user-surfaced area) | Question | Options presented | Selection | |---|---|---| | License for forkability | MIT / Apache-2.0 / GPL-3.0 / later | **GPL-3.0** | ### Gazetteer + Malay normalizer | Question | Options presented | Selection | |---|---|---| | Sourcing | hand-curated / OSM pipeline / curated + Overpass top-up | Curated + Overpass top-up | | Canonical format | JSON in repo / SQLite now (user asked "how heavy?": ~1.5MB WASM + cold-start of pure cost at this scale) | JSON in repo | | Normalizer | rules+folding+fuzzy residual / fuzzy only / research decides | Rules + folding + fuzzy residual (after a worked-example explanation of why short-word fuzzy fails: jln→jalan is high-distance, tmn≈Tun collisions, vowel-drop conventions, glued words, Stesen/Station synonym class) | | Aliases | in entries / separate table | Aliases in entries | ### Venue card + deep-link hand-off | Question | Options presented | Selection | |---|---|---| | startapp payload | plain id / full payload / signed | Plain gazetteer id | | Venue card | sendVenue + buttons / styled message | sendVenue + buttons | | ONBD-03 scope | minimal PWA hooks / full PWA | Minimal PWA hooks | ### Acceptance corpus + thresholds | Question | Options presented | Selection | |---|---|---| | Corpus shape | pinned golden set / log-derived | Pinned golden set (~60–100, incl. negatives) | | Bake-off close | 90% top-3 + honest negatives / 80% top-1 / judgment | 90% top-3 + honest negatives; escalation order fixed (table edits → backend #2 → Photon) | ## Corrections Made None reversed; two user questions reshaped defaults materially (VPS deferral; license capture). Third-round education (fuzzy-vs-rules) ended in the recommended option being chosen with informed consent. ## Auto-Resolved Not applicable. ## External Research Deferred to planning's research step per roadmap (gazetteer sourcing, Overpass shapes, corpus composition details).