From d057b2557ca52401e7c1b3dbd3cd115533a95d7c Mon Sep 17 00:00:00 2001 From: Jerome Queck Date: Fri, 21 Aug 2026 17:02:38 +0800 Subject: [PATCH] Reach the live feed on the endpoint Formula 1 still answers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Formula 1 has closed the legacy SignalR endpoint the upstream recorder used. A negotiate against `livetiming.formula1.com/signalr` now answers 401 with `WWW-Authenticate: Basic realm="Authentication"` and `Bearer`, so the live path received nothing at all — the Ingestor sat in a reconnect loop and the broker carried no records. The replacement, `livetiming.formula1.com/signalrcore`, still negotiates and subscribes without a credential. Upstream chooses between the two clients by whether `F1_TOKEN` is *set*, not by whether its value authenticates: unset omits `--auth` and takes the dead endpoint, set passes `--auth` and takes the live one. So the fix is to set it, and the value is deliberately not a credential — this project holds no F1TV token and is not becoming a system that does (ADR-0002). Whether the free subset actually arrives over an unauthenticated connection is the measurement ADR-0002 leaves outstanding; #42 settles it against a live Session. This change is what makes that measurement possible at all. Verified against the running stack: the recorder now reports `Connection established` and subscribes to all sixteen topics, `server/live.ts` connects to the broker, and a browser's WebSocket receives its seed frame stamped `mode: "live"`. Assisted-by: Claude Opus 5 (reasoning: high) Co-authored-by: Claude --- deploy/compose.yaml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/deploy/compose.yaml b/deploy/compose.yaml index e034cbf..0a1a2c5 100644 --- a/deploy/compose.yaml +++ b/deploy/compose.yaml @@ -36,6 +36,20 @@ services: # No username or password: the broker allows anonymous connections, because a credential # this project invented is still a credential to store and keep out of a commit (ADR-0002). OPENF1_MQTT_NO_TLS: "true" + # A switch spelled as a credential, and the value is deliberately not one. + # + # Formula 1 has closed the legacy SignalR endpoint the recorder used to reach: a negotiate + # against `livetiming.formula1.com/signalr` now answers 401 with `WWW-Authenticate: Basic` + # and `Bearer`, so the live path receives nothing at all. The replacement, + # `livetiming.formula1.com/signalrcore`, still negotiates and subscribes anonymously. + # + # Upstream chooses between the two by whether `F1_TOKEN` is *set*, not by whether its value + # authenticates: unset omits `--auth` and takes the dead endpoint, set passes `--auth` and + # takes the live one (`real_time/recording.py`). It is then sent as a bearer, which Formula 1 + # is expected to ignore — this project holds no F1TV token and is not becoming a system that + # does (ADR-0002). Whether the free subset arrives on an unauthenticated connection is the + # measurement ADR-0002 leaves outstanding, and #42 settles it against a live Session. + F1_TOKEN: unauthenticated depends_on: - api