59 lines
3.4 KiB
Markdown
59 lines
3.4 KiB
Markdown
# 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).
|