Name the columns the Timing screen was already drawing - #71
Open
jerome-queck wants to merge 2 commits into
Open
Conversation
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 <noreply@anthropic.com>
Twenty-five columns of figures and not one of them named on screen. A viewer
could not tell Gap from Interval, Last from Best, or which of the three `Best`
columns belonged to which sector.
The design system had specified the header all along —
`web/design-system/timing-screen.html` defines `.driver-row-header` with all
twenty-five labels, and `driver-row.css` already lays it on the same grid track
list as the rows, with header cells wearing the class of the column beneath so a
label cannot drift from the figures it names. Only the application never
rendered it: neither `web/timing-screen.ts` nor `web/index.html` contained the
string `header`. This carries it across, which is ADR-0010's direction of
travel.
The labels are one list beside the row that fills those columns, rather than
twenty-five strings in a second file free to drift from it. The header is the
table's first child, as the design system lays it out, which is also what the
row striping counts from; it carries no `data-driver`, so a click on it opens
nobody by construction rather than by a guard in main.ts.
The existing test asserted column *order* ("Gap sits left of Interval, in the
order the header names the columns") while no header existed to name them. It
now asserts the header is rendered and has a cell for every cell a row has —
one short and every label right of the gap names the wrong column while looking
perfectly plausible.
Assisted-by: Claude Opus 5 (reasoning: high)
Co-authored-by: Claude <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #70.
Twenty-five columns of figures and not one of them named on screen. A viewer could not tell Gap
from Interval, Last from Best, or which of the three
Bestcolumns belonged to which sector.The design system had specified the header all along.
web/design-system/timing-screen.html:58defines
.driver-row-headerwith all twenty-five labels, andweb/design-system/components/driver-row/driver-row.cssalready lays it on the same grid tracklist as the rows — with header cells wearing the class of the column beneath, so a label cannot
drift from the figures it names. The application simply never rendered it: neither
web/timing-screen.tsnorweb/index.htmlcontained the stringheader. This carries it across,which is the direction ADR-0010 asks changes to travel.
Decisions worth naming
index.htmlwould have been twenty-five strings in a second file, free to drift from the markupthey name.
the row striping counts from (
.driver-row:nth-child(even)), so the application's striping nowmatches the design system's reference rather than differing from it by one.
data-driver, so a click on it opens nobody by construction rather than by aguard in
main.ts.Tests
The existing test asserted column order — "Gap sits left of Interval, in the order the header
names the columns" — while no header existed to name them. It now also asserts that the header is
rendered, that it has a cell for every cell a row has, that the labels most easily confused are
present, and that clicking it opens nobody. One cell short and every label right of the gap names
the wrong column while looking perfectly plausible, so the count is the assertion that matters.
test/run,npm run typecheckandshellcheckare green, and it was checked in a browser againstthe backfilled Zandvoort 2026 Practice 1 with twenty-two Drivers on screen.
Not in scope
The issue asked that the header stay put when the field scrolls. The screen does not scroll: the
density budget puts the whole field on one
--screen-height: 1300pxscreen, which is the product'spremise. Adding
position: stickywould have been building for a case the design excludes. Worthrevisiting only if the field ever outgrows the screen.
Assisted-by: Claude Opus 5 (reasoning: high)
Co-authored-by: Claude noreply@anthropic.com