test-filius refused every ticket as from the future: its clock was 886 ms behind the dashboard's machine, with NTP still 8 ms (one ticket in 125, as a ticket carries whole seconds). F now takes a ticket signed up to 5 s ahead (TICKET_AHEAD_SECONDS); itsdangerous refuses one second, and the oracle keeps that on record. tools/live measures and accepts on a live F, with fresh projects each run: m3 (200 rooms of the largest example with pings: probe p95 37 ms), m4 (63 KB document; dragging makes an update per pointer move, 59/s), m5 (an hour through the proxy), acceptance (two browsers, 14 checks, passed three times) and clock (F's clock against ours). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Orakel für die Eintrittskarte
Das Dashboard signiert die Eintrittskarte für Server F mit itsdangerous
(URLSafeTimedSerializer, Salz mdg-filius-ticket, 60 s), Server F prüft
sie in Node (packages/server/src/ticket.ts). Dieses Orakel lässt
itsdangerous selbst Karten ausstellen — bei fester Uhr — und hält fest, was
es beim Lesen zu einem Zeitpunkt antwortet: die Nutzlast, abgelaufen oder
falsch signiert.
./run.sh # schreibt packages/server/test/tickets.python.json
Braucht Python 3; itsdangerous kommt in der Version des Dashboards
(backend/requirements.txt) in ein eigenes .venv.
Fälle: gewöhnliche Karte (schon sie ist zlib-gepackt), Lesestufe, Umlaute und Emoji, lange Namen, genau 60 s alt, 61 s alt, aus der Zukunft, fremdes Geheimnis, Scratchs Salz, eine veränderte Nutzlast, ohne Signatur, Unsinn, leer, eine Liste statt eines Objekts (ungepackt), Karten ohne Stufe, mit unbekannter Stufe, mit einem Projekt, das keine UUID ist, ohne Namen, nur mit den Pflichtfeldern.