3.4 KiB
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).