- the Bot API parameter is 'scope' (verified against core.telegram.org/bots/api/methods/setmycommands); the script's 'bot_command_scope' was an unknown field Telegram silently ignores, so every call hit the default scope and the two clear calls wiped the default set entirely — the ok:true lines proved nothing about scope - registration re-run: default (agnostic/en/ms) + all_private_chats (agnostic/ms) read back help, privacy, cari via getMyCommands with the correct 'scope' param; group scopes verified cleared - docs/KNOWN-LIMITATIONS.md: the 'Telegram-side defect' attribution corrected to the actual script bug; residual client menu-caching caveat + type-the-command workaround kept - bot/README.md command row updated to the real scope set
6.1 KiB
Known limitations
araharah is a turn-by-turn navigator for the Kuala Lumpur metro, delivered inside
Telegram: you search a destination with the bot (/cari KLCC), open the Mini App,
and follow live route guidance built on OpenStreetMap data. It works today for real
drivers, and it has real limits. This page lists what araharah does not do well —
stated plainly, for two readers: a driver deciding whether araharah fits today's trip,
and a fork deciding what they are inheriting. Nothing here is a hidden defect; every
claim names its evidence, and none of it is fixed by asking harder.
Data coverage
araharah routes over a snapshot of OpenStreetMap, and inherits OSM's gaps honestly:
- No traffic awareness. There is no live traffic feed; the ETA is a distance-and-speed estimate from the route model, not a prediction.
- No lane guidance. There is no lane-level arrow guidance; the maneuver glyph names the turn, not the lane.
- Speed limits appear only where OSM maps them. Many KL roads carry no
maxspeedtag in OSM, so no limit is shown on those roads. - Turn restrictions and one-ways are only as good as the OSM snapshot the road graph was built from; a restriction edited in OSM last week may not be reflected until the next graph build.
- The road graph is a build-time artifact (
routing/data/kl-roadgraph.v1.bin), rebuilt by a maintainer — forks rebuild their own (docs/ROAD-GRAPH.md).
Cross-metro routes may not resolve
Route computation runs inside Cloudflare Workers' free plan, whose per-request CPU
allowance is small. On the real KL road graph, short product routes (2–8 km — the
common search-and-reroute trip) measure 2–8 ms of Worker CPU and resolve inside the
plan. Cross-metro routes (20–30 km) measured p95 38–93 ms against the same graph
(routing/scripts/measure-route-cpu.mjs, LADDER HISTORY; Phase 6 plan summary), which
is beyond what the free plan permits. Those trips therefore degrade honestly: the app
shows the router-pending card — "the router is not ready for this trip" — instead of
freezing or drawing a wrong line. The committed upgrade lever is ALT landmark
preprocessing (a build-time graph layout that cuts A* steering cost); it is a
next-milestone item and is not in this release. Workers Paid was rejected: it
breaks the project's $0 mandate.
The /cari command may be missing from the Telegram menu
Some drivers saw a command menu listing /help and /privacy but not /cari.
ROOT CAUSE (found and FIXED 2026-10-25, 07-06 launch-gate canary): it was a bot-side
script bug, not a Telegram defect — bot/scripts/register-commands.mjs sent the scope
under the wrong parameter name (bot_command_scope; the Bot API field is scope),
which Telegram silently ignores, so every registration call actually hit the default
scope and the group-scope "clear" calls wiped the default set entirely. The correct
parameter was verified against https://core.telegram.org/bots/api/methods/setmycommands,
the script was fixed, and all private-chat scopes now read back help, privacy, cari
via getMyCommands (verified 2026-10-25). What REMAINS: the Telegram client caches the
menu — a device that opened the bot before the fix may keep showing the stale menu
until the app restarts. The workaround: type /cari in the chat — the command
itself has always worked; only its discoverability was affected.
Beta quality
This is a private beta with a handful of drivers in Kuala Lumpur, not a finished
product. The device matrix was walked on real Android and iOS phones, Telegram
Desktop, and a plain browser; battery drain is a measured number, not an estimate —
one Android guidance run of at least 30 screen-on minutes with battery percentage
read at start and end, the method and caveats recorded in the launch-gate file
(07-LAUNCH-GATE.md) before the first driver is onboarded. Fullscreen and
orientation behaviour varies by Telegram client version; where the platform refuses
a fullscreen request the app degrades to a usable portrait/landscape layout rather
than failing. Known limits that are milestones, not defects: no voice guidance, no
live trip sharing, no toll toggle, no traffic-aware ETA — all are post-validation
items on the roadmap.
What is being worked on next
Three tracks target the limits above; none of them are in this release.
| Track | What it fixes | Honest status |
|---|---|---|
| WASM-router | A client-side router compiled to WebAssembly — the static-hosted endgame where routing cost leaves the Worker entirely | Committed direction, not built |
| ALT landmark preprocessing | The cross-metro CPU degradation (the section above) — build-time landmark layout cuts A* steering cost at $0 runtime | Next-milestone item, not built |
| Engine B | A fully client-side webview router — routing runs in the browser, the Worker serves only data | Future track, not built |
Privacy in one paragraph
Your coordinates live only in memory and in TTL-expiring KV records: sessions expire
in about 15 minutes, location pins in 5 minutes, guidance envelopes in about 2 hours;
there is no location history, no profile, and nothing retained past those TTLs. There
is NO telemetry of any kind in this release — no analytics, no crash reporting, no
usage tracking. The shipped bundle contacts only the map tile host, the Telegram API,
and the app's own Worker. docs/PRIVACY-AUDIT.md holds the full record, including
how each claim was verified.
How to run the audit yourself
Forks inherit the audit tools — run both before your first driver:
npm run privacy-audit— greps every source tree for storage-API writes outside the platform allowlist, coordinate/payload logging, and telemetry in the shipped bundle, and probes the live KV namespaces. Exit 0 = every gate passed; exit 2 = environment drift — investigate, never a pass.npm run budget-audit— re-measures Worker CPU, bundle sizes, KV write classes, and cache headers against the documented free-tier ceilings, and re-runs the golden route and search corpora. Exit 0 = every budget held; exit 2 = environment drift — investigate, never a pass.