Fehlerbehebung
Die kanonische Checkliste, wenn etwas im Compliance-Stack nicht funktioniert. Geht durch MDS-Endpunkte, den Policy-Ingester, Echtzeit-Durchsetzung, das Stadt-Portal und Digest-E-Mails -- in dieser Reihenfolge, weil das grob der Abhaengigkeitsbaum ist.
MDS-Endpunkte
401 bei jeder Anfrage
Symptome: Stadt-Validator gibt 401 Unauthorized auf /vehicles/status zurueck.
Pruefungen:
- Das Bearer-Token fehlt in
Authorization: Bearer <token>. Staedte fuegen das Token manchmal ohneBearer-Praefix ein. - Das Token wurde widerrufen. Einstellungen -> API & Integrationen -> MDS-Tokens oeffnen und Aktivierung bestaetigen.
- Das Token gehoert zu einem anderen Subaccount. Ein Token pro Subaccount; Staedte, die versehentlich ueber mehrere Zustaendigkeiten testen, sehen das.
Validator scheitert am version-Feld
Symptome: mds-provider-validator beklagt, dass der Response-Envelope eine andere Version als 2.0.1 meldet.
Pruefungen: bestaetigen, dass src/lib/mds/v2/response.ts const MDS_VERSION = '2.0.1' hat. Falls ein veralteter Build deployed wurde, erneut deployen.
MDS-JWT-Header fehlt in einer Antwort
Symptome: Stadt erwartet MDS-JWT: <jwt> in jeder Antwort und der Header fehlt.
Pruefungen:
mds_jwks_keyshat keine Zeile mitis_active = truefuer den Subaccount./api/mds/<subaccountId>/.well-known/jwks.jsoneinmal aufrufen, um eine Lazy-Mint zu erzwingen, dann erneut versuchen.- Das Schluesselpaar wurde generiert, aber die aktive Zeile hat
private_key_pembeschaedigt (selten -- meist eine fehlgeleitete manuelle Bearbeitung). Sentry aufMDS sign failed-Breadcrumbs pruefen.
current_speed_limit_kph immer 0
Symptome: Fahrzeuge melden current_speed_limit_kph: 0, selbst wenn sie in einer Zone sein sollten.
Pruefungen:
- Das Fahrzeug hat keine letzte bekannte GPS-Position.
vehicles.last_lat/last_lngundvehicles.last_seenpruefen. - Keine Betreiberzone oder Policy-Geofence enthaelt den Punkt.
SELECT * FROM zones_containing_point('<subaccountId>', <lat>, <lng>)ausfuehren und bestaetigen, dass mindestens eine Zeile zurueckkommt. - Der aktive Regeltyp ist
no_ridestattspeed-- das ist eine Sperre, kein Tempolimit. Die Statuszeile sollteis_disabled = truezeigen.
Policy-Ingester
Policy-Feed der Stadt liefert 404
Symptome: Audit-Log-Eintraege mit status = 'failed' und errors mit HTTP 404.
Pruefungen:
- Die URL in
mds_jurisdictions.policy_feed_urlist falsch. Im Terminal testen:curl -i <url>. Staedte aendern Pfade manchmal zwischen provisorischen und produktiven Endpunkten. - Das Auth-Token ist abgelaufen. Mit und ohne Token versuchen, um zu isolieren.
Feed validiert, aber keine policy_geofences
Symptome: Audit zeigt status = 'success' und mds_policies-Zeilen existieren, aber policy_geofences ist leer.
Pruefungen:
- Jede Regel referenziert Geografien, die die Stadt nicht veroeffentlicht hat.
errorsin der Audit-Zeile pruefen -- nicht aufgeloeste Geografie-IDs sind dort gelistet. - Die Stadt veroeffentlichte Policies fuer einen Fahrzeugtyp, den Ihre Flotte nicht betreibt. Bestaetigen, dass die
vehicle_typesder Regeln mindestens einen Ihrer Typen enthalten.
Dieselbe Policy taucht in jedem Diff auf
Symptome: Jeder Poll-Diff zeigt dieselbe Policy in modified, selbst wenn nichts Wesentliches geaendert wurde.
Pruefungen:
- Die Stadt regeneriert die Feed-Payload bei jeder Anfrage (andere
published_date, Whitespace, Sortierung). Der sha256-Kurzschluss feuert nur bei bytegleichen Payloads. Bitten Sie die Stadt, ihre Serialisierung zu stabilisieren. - Die Stadt aendert
published_dateautomatisch -- einige CMS tun das. Das Diff ist harmlos, aber laut; kann im Audit-Log-UI gefiltert werden.
Aktivierung feuert nie
Symptome: Eine Policy ist pending, start_date ist vorbei, aber der Status flippt nie auf active.
Pruefungen:
- Der
mds-policy-activate-Cron scheitert./api/cron/mds-policy-activatein den Vercel-Cron-Logs pruefen. - Das
start_dateist Ortszeit, aber als UTC ohne Konvertierung gespeichert. Der Cron vergleicht mitnow() UTC; eine falsche Zeitzone im Feed laesst Aktivierung viel spaeter feuern als erwartet.
Echtzeit-Durchsetzung
Regel aktiviert, aber keine Befehle gesendet
Symptome: mds_policies.status = 'active', aber policy_enforcement_events hat keine Zeilen fuer die Regel.
Pruefungen:
- Keine Fahrzeuge sind in der Geometrie.
SELECT COUNT(*) FROM vehicles WHERE ST_Contains('<rule_geometry>', ...)-- wenn 0, gibt es nichts durchzusetzen. - Alle Fahrzeuge haben veraltetes GPS (>5 min). Der Skip ist beabsichtigt. Nach
error = 'stale_gps'-Ereignissen in der Tabelle suchen. - Die Fahrzeuge haben keine verknuepfte
iot_devices-Zeile. Uebersprungen miterror = 'no_iot_device'.
Befehle gesendet, aber Fahrzeuge bremsen nicht
Symptome: policy_enforcement_events zeigt command_sent_at, aber kein command_ack_at, und das Fahrzeug faehrt weiter voll.
Pruefungen:
- OEM offline oder im Schlaf. Fahrzeug im Dashboard oeffnen und last_seen pruefen.
- Das falsche Befehlsformat erreichte den OEM.
command_responseauf Fehlercode pruefen -- die meisten OEMs liefern Ablehnungscodes im Klartext. - Das IoT-Passwort des Fahrzeugs ist falsch. Bestaetigen, dass
iot_devices.iot_passwordzu dem passt, was der OEM erwartet (siehe OKAI-Integration, Queclink-Integration usw.).
Sub-Flotte sieht Befehle, eine andere nicht
Symptome: OKAI-Fahrzeuge folgen der Slow-Zone, Segway-Fahrzeuge nicht (oder umgekehrt).
Pruefungen:
- Der OEM-spezifische Versender-Zweig fehlt oder ist veraltet fuer den OEM. Bestaetigen, dass
src/lib/iot/dispatch.tseinen Case fuer diesen OEM hat und das Befehlsformat zur Protokollversion des OEM passt. - Segway-BLE-Relay-Latenz -- der Befehl wurde gesendet, aber noch nicht bestaetigt, weil das Fahrzeug weit weg von einem Telefon ist. Das ist eine bekannte Luecke; Latenz fuer Segway kann 30 Sekunden ueberschreiten.
Stadt-Portal
Magic-Link gibt "ungueltiges Token" zurueck
Symptome: Kontakt klickt den gesendeten Link und landet auf einer Fehlerseite.
Pruefungen:
- Das Token ist abgelaufen (15 Minuten). Ein neues anfordern lassen.
- Die Kontaktzeile wurde geloescht oder
portal_access = false. - Zwei Links wurden in kurzer Folge erzeugt; der erste verbraucht, der zweite scheint veraltet.
Magic-Link-E-Mail kommt nie an
Symptome: Kontakt sendet das Formular, sieht die "E-Mail pruefen"-Nachricht, keine E-Mail kommt.
Pruefungen:
- Spam-Ordner.
- Die E-Mail entspricht nicht einer
city_contacts-Zeile exakt (case-insensitive). Die Zeile pruefen. - Die E-Mail-Infra hat den Versand abgewiesen (Sentry hat den Bounce). Nach Spam-Filter-Triggern in Betreff oder Body suchen.
Portal zeigt keine Fahrzeuge, obwohl Flotte eingesetzt ist
Symptome: Stadtkontakt loggt sich ein, die Flottenkarte ist leer.
Pruefungen:
mds_jurisdictions.bboxist falsch -- zu eng oder zeigt woanders. Gegen eine Kartenvorschau bestaetigen.- Alle Fahrzeuge haben null
last_lat/last_lng. Mindestens eines pruefen.
Digest-E-Mails
Digest kam nicht am erwarteten Tag an
Symptome: Stadtkontakt erwartete einen Montags-Woche-Digest, bekam keinen.
Pruefungen:
last_digest_sent_atliegt in der aktuellen Woche -- der Cron entschied, dass das Kadenzfenster noch nicht abgelaufen ist. Wahrscheinlich feuerte ein vorheriger Digest im selben Fenster.- Der Cron lief gar nicht. Vercel-Cron-Logs fuer
/api/cron/compliance-digest. - Der Digest feuerte, aber der E-Mail-Versand erzeugte einen Fehler.
city_compliance_reportspruefen -- wenn die Zeile existiert, aber keine E-Mail ankam, ist der Fehler downstream.
Digest zeigt eine fehlgeschlagene Bedingung, die Sie bereits behoben haben
Symptome: Scoreboard im Digest zeigt rot bei complaint_sla, obwohl alle Beschwerden beantwortet wurden.
Pruefungen:
- Der Digest deckt eine abgeschlossene Periode ab (gestern fuer daily, vergangene Woche fuer weekly). Er wird nicht rueckwirkend neu berechnen. Das aktuelle Scoreboard unter
/dashboard/compliance/{id}ist die Live-Sicht.
PDF-Anhang fehlt bei Monats-Digest
Symptome: Monats-Digest kommt an, aber pdf_url ist null und der Anhang fehlt.
Pruefungen:
- Der PDF-Renderer erzeugte einen Fehler. Sentry hat den Stack-Trace. HTML/Text-Body feuert weiterhin; das PDF ist Best-Effort.
Wo in der Datenbank zu suchen ist
| Frage | Tabelle |
|---|---|
| Warum war mein Policy-Poll nicht erfolgreich? | mds_policy_audit |
| Welche Policies sind derzeit aktiv? | mds_policies WHERE status = 'active' |
| Welche Regeln kamen aus jeder Policy? | mds_policy_rules WHERE policy_id = ... |
| Welche Geofences materialisierten sich aus einer Regel? | policy_geofences WHERE rule_id = ... |
| Welche IoT-Befehle feuerten fuer eine Regel? | policy_enforcement_events WHERE rule_id = ... |
| Welche Digests hat ein Kontakt erhalten? | city_compliance_reports WHERE delivered_to_contact_id = ... |
| Welche Zustaendigkeiten hat der Betreiber? | mds_jurisdictions WHERE subaccount_id = ... |
Wenn alles andere fehlschlaegt
Schreiben Sie an support@levyelectric.com mit:
- Subaccount-ID
- Zustaendigkeits-Slug
- Den Audit-
run_id, falls das Problem im Ingester liegt - Die
policy_enforcement_events.id, falls das Problem in der Durchsetzung liegt - Die
city_compliance_reports.id, falls das Problem in einem Digest liegt
Wir haben direkten Zugang zu Logs und koennen den Fehler in der Regel innerhalb einer Stunde lokalisieren.