镜像站点 · 本页由第三方 GitHub 只读镜像提供,非 GitHub 官方站点,不接受任何登录或凭据输入。前往 github.com
Skip to content

Harness fixtures stop reaching ESPN (baseball, football, hockey, lacrosse) - #553

Merged
ChuckBuilds merged 8 commits into
mainfrom
claude/harness-window-fixture-keys
Sep 29, 2026
Merged

ChuckBuilds merged 8 commits into
mainfrom
claude/harness-window-fixture-keys

Conversation

@ChuckBuilds

@ChuckBuilds ChuckBuilds commented Sep 28, 2026 •

Copy link
Copy Markdown
Owner

Summary

Four scoreboard harness runs were fetching live from ESPN. That made them non-deterministic, and two of them rendered a blank Upcoming screen. All changes are to test fixtures only; runtime behavior is unchanged.

Baseball and football: stale schedule keys (1.51.2, 3.15.2)

#524 moved the schedule cache to f"{sport_key}_schedule_window_{lookback}_{lookahead}". These fixtures still seeded the old season keys, so every Recent and Upcoming render missed the cache and fetched the frozen window live. Those games are all final now, so Upcoming drew nothing.

Plugin Old fixture key New key
baseball-scoreboard mlb_schedule_2026 mlb_schedule_window_14_7
football-scoreboard nfl_schedule_2025 nfl_schedule_window_14_7

14_7 is the schema default (14-day lookback, 7-day lookahead), and neither harness config overrides it. The basketball equivalent landed separately in #549; merging main here cancels out the duplicate.

Lacrosse: harness no longer touches the network (1.33.2)

Each run made 112 live ESPN requests. After freeze_time ended, it also fetched next season's schedule (20270101-20270601).

  • Why the refresh thread always runs. freezegun gives the real clock to calls made close to a thread's run(). The SwitchRefresh thread that display() starts therefore always sees its manager as due and calls update(). Football and baseball do the same, but their update() reads only the seeded cache and finishes inside the freeze. Lacrosse's update() went to the network:
    • other_games_min_quality defaults to "ranked", so every update() fetched the live NCAA poll. The poll is held in memory, so the fixture can't seed it. It also made which fixture games passed the filter depend on that day's poll.
    • The live manager fetched today's scoreboard on every render. With no live games it polls on its idle back-off, not on the update_intervals.live: 9999999999 the fixture relied on to stop it.
  • Where 2027 came from. The last refresh thread was still waiting on the network when the freeze ended. Its next schedule read used the real date (September, so next season).
  • What changed in the fixture. It now sets filtering.other_games_min_quality: "any" and test_mode: true, and drops the interval guard that did nothing. test_mode has been passed through to the managers since the fixture's old note said it wasn't.

Hockey: harness no longer touches the network (1.37.2)

Same live-manager pattern as lacrosse: 16 live scoreboard?dates= requests per run, one per render, despite update_intervals.live: 9999999999. The fixture now sets test_mode: true and drops the guard. Result: 0 requests across 3 runs, and all 16 frames pixel-identical to before. Hockey's committed goldens cover only the celebration screens, so they're unaffected.

Lacrosse (ncaa_mens_lacrosse_schedule_2026) and F1 (f1_schedule_2026) schedule keys were also checked. Their code still builds season-year keys, which match the fixtures at the frozen dates.

Verification

Ran the core harness from a fresh git archive origin/main of LEDMatrix (6cfcf2e3), on this branch after merging main. Each run was wrapped so that every requests call is logged with its thread name and then blocked.

Plugin Before After
baseball 3 "ESPN rejected the date range" lines; mlb_upcoming blank at 8/8 sizes (fill warning caught 5) 0 requests; 0 blank
football 2 rejected lines; nfl_upcoming blank at 8/8 sizes (fill warning caught 5) 0 requests; 0 blank
hockey 16 live scoreboard?dates= requests from the live manager 0 requests across 3 runs; frames unchanged
lacrosse 112 requests: rankings and standings from the main and SwitchRefresh threads, and today's scoreboard; then a 2027 fetch after the freeze ended 0 requests across 3 runs; all 16 frames pixel-identical to before

Blank means getbbox() is None on *_upcoming.png.

check_version_bump.py --base origin/main passes for all three plugins. update_registry.py is in sync, and the module-collision check is clean.

🤖 Generated with Claude Code

ChuckBuilds and others added 2 commits September 28, 2026 11:07
…the managers read (1.49.3, 3.13.1)

Both fixtures still seeded season keys (mlb_schedule_2026, nfl_schedule_2025)
the managers stopped reading when #524 moved the schedule cache to per-window
keys. Every Recent/Upcoming render missed the cache and fetched the frozen
window from ESPN; those games are all final now, so mlb_upcoming and
nfl_upcoming drew nothing at all eight sizes, and the fill warning flagged
only five of them. The fixtures now seed <league>_schedule_window_14_7.
Test fixtures only, no runtime change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…agers read (1.36.1)

The fixture still seeded nba_schedule_2025, a key the managers stopped
reading when #524 moved the schedule cache to per-window keys. Every
Recent/Upcoming render missed the cache and fetched the frozen January 2026
window from ESPN; those games are all final now, so nba_upcoming drew
nothing at all eight sizes. The fill warning only covers panels at least
twice the design size, so it flagged five of them. The fixture now seeds
nba_schedule_window_14_7. Test fixture only, no runtime change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Advanced

Run ID: c5de11ad-e628-4aeb-88b8-a79de29d2cec


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@codacy-production

Copy link
Copy Markdown

Up to standards ✅

🟢 Issues 0 issues

Results:
0 new issues

View in Codacy

NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.

ChuckBuilds and others added 2 commits September 28, 2026 11:20
The harness made 112 live ESPN requests per run and, after freeze_time ended,
fetched next season's schedule (20270101-20270601, rejected as a range).

freezegun hands the real clock to calls made within a few frames of a
thread's run(), so the SwitchRefresh thread display() starts always sees its
manager as due and runs update(). Football and baseball do the same, but
their update() only reads the seeded cache and finishes inside the freeze.
Lacrosse's fetched:
- other_games_min_quality defaults to 'ranked', so every update() fetched
  the live NCAA poll -- held in memory, unseedable, and it made which
  fixture games pass the filter depend on that day's poll.
- The live manager fetched today's scoreboard on every render. With no live
  games it polls on its idle back-off, not the 9999999999
  update_intervals.live the fixture relied on to stop it.
The last thread was still on the network when the freeze ended, and its
schedule read then used the real date.

The fixture now sets filtering.other_games_min_quality 'any' and test_mode
(passed through since the note saying otherwise was written) and drops the
dead interval guard. 0 requests across three runs; all 16 frames are
pixel-identical to before. Test fixture only, no runtime change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ChuckBuilds ChuckBuilds changed the title Harness fixtures seed the per-window schedule keys (basketball, baseball, football) Harness fixtures stop reaching ESPN (baseball, football, lacrosse) Sep 28, 2026
The harness made 16 live ESPN scoreboard requests per run, one per render:
the always-instantiated NHL live manager fetched today's games because, with
no live games, it polls on its idle back-off rather than the 9999999999
update_intervals.live the fixture relied on to stop it. The fixture now sets
test_mode (passed through since the note saying otherwise was written), so
the live manager simulates its game, and drops the dead interval guard.
0 requests across three runs; all 16 frames are pixel-identical to before.
Test fixture only, no runtime change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ChuckBuilds ChuckBuilds changed the title Harness fixtures stop reaching ESPN (baseball, football, lacrosse) Harness fixtures stop reaching ESPN (baseball, football, hockey, lacrosse) Sep 28, 2026
…-fixture-keys

# Conflicts:
#	plugins.json
#	plugins/baseball-scoreboard/CHANGELOG.md
#	plugins/baseball-scoreboard/manifest.json
#	plugins/football-scoreboard/CHANGELOG.md
#	plugins/football-scoreboard/manifest.json
#	plugins/hockey-scoreboard/CHANGELOG.md
#	plugins/hockey-scoreboard/manifest.json
#	plugins/lacrosse-scoreboard/CHANGELOG.md
#	plugins/lacrosse-scoreboard/manifest.json
…-fixture-keys

# Conflicts:
#	plugins/baseball-scoreboard/CHANGELOG.md
#	plugins/baseball-scoreboard/manifest.json
#	plugins/football-scoreboard/CHANGELOG.md
#	plugins/football-scoreboard/manifest.json
#	plugins/hockey-scoreboard/CHANGELOG.md
#	plugins/hockey-scoreboard/manifest.json
#	plugins/lacrosse-scoreboard/CHANGELOG.md
#	plugins/lacrosse-scoreboard/manifest.json
@ChuckBuilds
ChuckBuilds merged commit c175c68 into main Sep 29, 2026
5 checks passed
ChuckBuilds added a commit that referenced this pull request Sep 29, 2026
#553 took baseball 1.51.2, football 3.15.2, hockey 1.37.2 and lacrosse
1.33.2; this branch's entry moves to .3 on top of it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ChuckBuilds
ChuckBuilds deleted the claude/harness-window-fixture-keys branch September 29, 2026 16:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant