Two legitimate data sources only. We never tamper with the Uber Driver app — its RASP engine + Play Integrity would ban the driver account for fraud. All ride data flows through Uber's official Supplier Platform API; device data comes only from phones we own.
Data flow
Source · Uber officialAPI
Uber Supplier Platform
Vehicle Solutions · OAuth2 client-credentials · per-driver hours, trips, status, GPS.
Realtime Driver Status Changewebhook · signed
Source · we own itmanaged
Company phone · Android Enterprise (managed)
Observe-only — we see the foreground app + duration during shifts. No apps are blocked or closed.
UsageStatsManager agentKotlinmonitor-only · no hard block
signed webhook · HMAC-SHA256
POST /ingest/device-usage
api-integration · Bun/TS:8788
Webhook receiver & forwarder
Verify HMAC signature → normalize raw status → emit a versioned event.
webhook.ts→ emit →
forwarder.ts→ POST →
/ingest/uber-status
wire contractstrict
Device telemetry payload
bare JSON arrayISO-8601 tsX-Usage-Accessno screen content
correlation-backend · Bun/TS + PostgreSQL:8787
Ingest · validate · correlate
zod-validated ingest → trip-builder folds the lifecycle into sessions & trips → rules engine joins on-trip windows × foreground app. Also ingests Fleet-Dashboard acceptance / cancellation rates → flags drivers getting requests but not taking them.
zod validationtripBuilderrules engine
idle-but-onlineutilization %
low_acceptancehigh_cancellationGDPR erase_driver()
storePostgres
Coaching flags
package + category + duration + overlap. Content-free by design.
human in the loopreview
Owner dashboard · coaching queue
Flags drive schooling & coaching — advisory, not auto-discipline.
Driver status lifecycle
offline→
online→
enroute→
pickup→
on_trip · passenger on board→
dropoff
The headline rule & its proof
Correlation rule · high severity
A DISTRACTING app in the foreground while status = on_trip ⇒ a high-severity coaching flag.
e.g. TikTok open with a passenger on board. Merely enroute (no passenger yet) → medium.
End-to-end smoke test 20 / 20 ✓
- ✓ signed webhook → forwarder → backend
- ✓ trip-builder created the on_trip window
- ✓ TikTok 60s overlap ⇒ HIGH flag raised
- ✓ Maps (ALLOWED) ⇒ no flag (negative control)
- ✓ 55% acceptance ⇒ low_acceptance flag; 92% ⇒ none
- ✓ stores package + category + duration only — no screen content
Compliance gate · Germany / EU
GDPR
§26 BDSG · employee data
§87(1)(6) BetrVG · Betriebsrat agreement
§201 StGB · no audio recording
working-hours only
no off-shift tracking
short retention
DPIA before go-live