Files
2026-10-23 22:37:55 +08:00

3.4 KiB
Raw Permalink Blame History

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