Purpose: this is the feature/intent input that Fable 5 (then Opus) will turn into the transition + development plan. It sits alongside
org-angular-standards.mdand the current code in../current/.Status: horizons populated by Sandy; design decisions + foundations captured with Claude.
[DECISION]= resolved choice.[OPEN]= still needs a call.
org-angular-standards.md) unless a documented reason not
to.2 km/h, interaction-lock 10 km/h, off-route
50 m.### <short name>
- **What / Why / Priority / Touches / Must-not-break / Depends on / Notes**
- **[DECISION]** resolved choices **[OPEN]** unresolved questions
2 km/h) for ~2 seconds, the left panel opens
showing on-time running: an easy-to-glance mm:ss ahead/behind
schedule, over the full stop list for the route with
timepoints distinctively marked (bold/other). Shows the
current position in the list and where the vehicle
should be if on time.<2 km/h trigger) and MUST NOT apply undue pressure —
informative, not pressuring.stop_times data, new on-time-panel
component2 km/h (debounce so it doesn’t flicker);
dismissable by the driver; auto-collapse when moving
again.stop_times scheduled times vs current time.speechSynthesis).isOffRoute).10 km/h).10 km/h,
not UI-configurable (config service).isOffRoute so an actual excursion is shown
honestly (never hide reality during an off-route event)./telemetry backend is out of
scope (§5).sendBeacon for
critical/unload + fetch for batched flushes.deviceID, timestamp,
eventId (UUID), eventType,
schemaVersion — wrapping a flexible/ad-hoc
payload per event type. Ad-hoc payload, consistent
envelope so it stays parseable/dedupable/evolvable. Suggested
eventTypes: auth/lifecycle, run-lifecycle, navigation,
stop-dwell, UI, service-performance.deviceID + timestamp as the
key identity. Driver/shift correlation is worked out
separately (server-side / later), kept off the client’s
critical path.shifts.csv becomes
dynamic. The config GTFS location moves out of the repo, with a
configurable base_url.ScheduleSource interface —
StaticFileSource now, ApiSource (DriverID →
activities) later; base_url configurable;
cache-then-network so sign-on works offline.PositionSource interface (real GPS / interpolated / depot /
synthetic-test) and ordered pipeline stages; the “broadcast” position is
the single source of truth for the UI.BehaviorSubject services for global/shared
state (per org standard, maps cleanly from Knockout observables) +
Angular signals for local component state. Keep it
simple, low-boilerplate.base_url(s), API keys out of
source, and fixed thresholds (2 km/h,
10 km/h, 50 m) that are not
UI-editable./telemetry backend itself
(client-side enablement only is in scope).