Published artifacts

Search Sporacle

Use the up and down arrow keys to move through results. Press Enter to open a result and Escape to close search.

Type to search published players, teams, and games.

Releases

1.9.2

All releases, newest first

For you

  • The live card on a finished game shows only the Final badge now, and its ticker always states the locked kickoff call, even when the game's minute by minute history cannot be reached. On the morning of 2026-09-10 a final page showed Live and Final side by side and a ticker with nothing in it; the locked call was on the card the whole time, so it is now stamped into the page at build and no longer waits on the network. A card with no locked call to state stays hidden entirely.
  • A live game's win likelihood now survives a bad moment in the data feed. On opening night one malformed reading stopped the in game number mid fourth quarter and the rest of the game showed only the pre kickoff call; the poller now logs the failure in full and carries on, and gives up, visibly, only after ten straight failures. Two of opening night's games, the Rams' and Washington's, were missing from the live card the whole way through because the scoreboard feed spells their team names differently than our own forecasts do; both show up now.
  • The trajectory a game traces during play is recorded again. On opening night the live history behind the in game card silently failed to save for the whole game, because the recording credentials never reached the poller; they do now, so a reader joining mid game sees the path so far and a finished game keeps its record.

Under the hood

  • The Live card's global hidden rule carries !important now. Its selector ties every scoped display rule in the card at (0,2,0) specificity once Astro appends its scope attribute, and the bundle emitted the scoped rules later, so display: grid was beating display: none and a card carrying the hidden attribute rendered anyway, badges and all. components-contract.test.ts pins the declaration in the built CSS, games-pages.test.ts pins the build stamped kickoff row, and a new test/live-card.test.ts drives the card's hydration against a real DOM on the incident's own payloads: a state post stream frame and a zero row history.
  • Root cause of the opening night silence: the cadence Worker's forwarded secrets list, the only door environment reaches a container through, never named the three D1 credentials the pipeline's live persistence reads, so the live container started with no way to write history and degraded silently by design. The list now forwards D1_ACCOUNT_ID, D1_DATABASE_ID and D1_API_TOKEN, tests pin all three, and the secrets themselves still have to be set on sporacle-cadence before the next game window for the fix to bite.
  • The live loop guards each poll: a failing poll logs its full traceback and the loop continues, a success resets the streak, and ten consecutive failures end the loop with a final log naming the streak, so a persistently broken feed makes the container exit deliberately instead of crashlooping invisibly behind a fresh generated_at.
  • D1 write failures get loud without ever raising: five consecutive unpersisted readings, unconfigured credentials included, log one ERROR naming the streak and the last failure, repeated every fifty while the outage lasts, and the first persisted reading of a process logs a positive health signal so a healthy game night has something to look for, not just an absence of complaints.
  • The mid window revival of a dead live container is pinned by tests and documented at its decision point: the facts poller triggers the live kind on every in window tick, and the cadence trigger route starts the singleton whenever its state reads as stopped, a crash with a nonzero exit code included.
  • The nightly ingest is no longer failed for files it does not own. The readiness check took its verdict from the oldest file in the cloud master, and two tables only the laptop flow ever writes sat there from mid August, so the first otherwise successful cloud ingest was declared a failure after doing its whole job. The verdict now comes from the tables the nightly ingest actually maintains; the slower tables stay visible in the report as information, never a veto.
  • The scheduled ingest installs the nflverse extra its loaders require. The first cloud run proved the safety fence instead of the pipeline: every source loader reported the missing package, the ingest refused to upload a partial master, and the run went red exactly as designed. One flag makes the next run real.