Chuck and Claude Opus 5.5
3bfb4a139e
feat(common): sports_live_fetch -- the reconciled live fetch and odds (sports family 9)
...
New hardware-free module src/common/sports_live_fetch.py, copied from
ledmatrix-plugins claude/family9-reconcile once the nine scoreboards made
_fetch_todays_games (seven bodies when measured) and _fetch_odds (three) one
body each. Both live on the plugins' SportsCore, so one mixin,
SportsLiveFetchMixin, carries exactly those two plus the odds worker
_drain_odds_queue; no manager gains a method it lacks today.
Owner decisions (2026-10-12):
- Live scores are always fresh: every poll asks ESPN through
get_espn_scoreboard and leaves the answer under the shared
espn_scoreboard_cache_key for its dates (max_age=1: only a copy another
reader fetched within the last second is reused). The plugins' 30 s
<sport_key>_scoreboard_current cache is gone.
- College basketball is asked by date like every other league (ESPN
answered single dates for both college leagues on 2026-10-12).
- Odds never block update(): one daemon worker per manager answers a queue
and attaches each line in place under _games_lock; one batch in flight per
manager, games queued meanwhile join it, every dict queued for an id gets
the one answer. show_odds, the two odds intervals and a missing odds
manager (debug, not ERROR) are respected.
- An answer whose events is not a list is no games.
Fix: get_espn_scoreboard() no longer caches an answer whose events is not a
list ("events": null), which every reader of the shared key inherited; it is
still returned to the caller.
- test/test_sports_live_fetch.py: the plugins' pinned cases (requests,
dates and keys at 10:00 and 02:00 Eastern, freshness, malformed and failed
answers, odds that never block and land later, the intervals, one batch per
manager, a worker that cannot start, update and display on two threads),
plus the host contract. Mutation-checked (11 mutants, all caught).
- test/test_sports_live_fetch_parity.py: with LEDMATRIX_PLUGINS, compares
each body with every plugin copy. Passes against claude/family9-reconcile;
fails against the pre-reconcile tree.
- test/test_espn_scoreboard_cache.py: the null-events regression.
- mypy ratchet, src/common/README.md, CHANGELOG (Unreleased: New modules,
Fixes), docs/SPORTS_UNIFICATION.md family 9 status and decisions.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-12 15:45:04 -04:00
..
2026-10-09 10:40:08 -04:00
2026-10-09 10:40:08 -04:00
2026-10-01 10:45:28 -04:00
2026-10-09 12:15:40 -04:00
2026-03-20 15:06:58 -04:00
2026-10-08 15:55:50 -04:00
2026-10-04 22:44:17 -04:00
2026-10-09 14:16:03 -04:00
2026-10-03 12:11:27 -04:00
2026-07-12 10:38:52 -04:00
2026-10-02 18:15:28 -04:00
2026-09-30 10:39:44 -04:00
2026-10-01 20:37:54 -04:00
2026-09-28 08:24:43 -04:00
2026-09-30 10:39:44 -04:00
2026-09-30 10:39:44 -04:00
2026-10-09 12:15:40 -04:00
2026-09-11 10:07:38 -04:00
2026-09-30 11:15:31 -04:00
2026-10-03 22:18:54 -04:00
2026-10-06 08:50:48 -04:00
2026-10-04 20:56:00 -04:00
2026-10-04 20:56:00 -04:00
2026-09-30 10:39:44 -04:00
2026-10-09 12:15:40 -04:00
2026-08-23 11:44:23 -04:00
2026-10-03 22:30:39 -04:00
2026-10-04 22:44:17 -04:00
2026-10-03 22:30:39 -04:00
2026-09-28 08:24:43 -04:00
2026-10-03 22:30:28 -04:00
2026-10-03 22:30:39 -04:00
2026-09-30 10:39:44 -04:00
2026-09-30 10:48:14 -04:00
2026-10-03 22:30:39 -04:00
2026-10-03 22:30:39 -04:00
2026-09-23 10:29:16 -04:00
2026-10-09 12:15:40 -04:00
2026-09-11 10:07:38 -04:00
2026-10-04 15:07:19 -04:00
2026-09-30 10:39:44 -04:00
2026-09-11 10:07:38 -04:00
2026-09-24 17:35:49 -04:00
2026-09-28 10:42:07 -04:00
2026-10-03 22:18:42 -04:00
2026-09-28 10:40:16 -04:00
2026-10-03 13:09:53 -04:00
2026-10-03 13:09:53 -04:00
2026-09-18 09:56:50 -04:00
2026-09-28 11:08:43 -04:00
2026-08-26 10:03:43 -04:00
2026-09-01 09:54:04 -04:00
2026-09-30 10:48:14 -04:00
2026-10-03 14:26:03 -04:00
2026-08-07 16:17:11 -04:00
2026-09-13 11:53:50 -04:00
2026-09-28 10:41:40 -04:00
2026-09-28 10:39:40 -04:00
2026-09-24 15:51:53 -04:00
2026-09-30 09:38:16 -04:00
2026-08-12 08:42:56 -04:00
2026-10-03 22:18:00 -04:00
2026-10-03 14:14:08 -04:00
2026-10-01 10:45:28 -04:00
2026-10-08 15:55:50 -04:00
2026-10-03 22:18:00 -04:00
2026-09-07 13:37:54 -04:00
2026-08-12 08:40:07 -04:00
2026-09-17 12:38:39 -04:00
2026-10-03 14:26:03 -04:00
2026-10-08 15:55:50 -04:00
2026-08-11 14:14:25 -04:00
2026-10-03 14:14:08 -04:00
2026-08-19 17:40:52 -04:00
2026-09-14 09:42:24 -04:00
2026-09-23 16:33:24 -04:00
2026-09-28 08:26:05 -04:00
2026-09-28 10:41:40 -04:00
2026-09-23 12:52:50 -04:00
2026-10-01 08:27:16 -04:00
2026-10-03 22:30:16 -04:00
2026-09-11 10:07:38 -04:00
2026-10-03 22:30:16 -04:00
2026-08-06 14:04:23 -04:00
2026-10-03 22:18:42 -04:00
2026-09-23 12:36:26 -04:00
2026-09-24 17:32:02 -04:00
2026-09-17 16:37:29 -04:00
2026-09-30 10:48:14 -04:00
2026-08-04 13:46:28 -04:00
2026-09-03 16:06:40 -04:00
2026-09-28 10:39:40 -04:00
2026-10-08 15:55:50 -04:00
2026-10-01 08:37:15 -04:00
2026-09-23 16:48:02 -04:00
2026-09-28 15:00:45 -04:00
2026-10-04 22:15:30 -04:00
2026-09-28 08:25:26 -04:00
2026-09-28 09:07:08 -04:00
2026-09-23 10:29:16 -04:00
2026-08-23 11:43:39 -04:00
2026-10-01 16:10:04 -04:00
2026-09-23 10:29:16 -04:00
2026-10-02 22:30:52 -04:00
2026-09-28 08:26:05 -04:00
2026-09-28 10:39:40 -04:00
2026-09-24 17:37:15 -04:00
2026-09-23 12:36:26 -04:00
2026-10-01 20:27:20 -04:00
2026-09-07 13:37:54 -04:00
2026-10-03 22:18:19 -04:00
2026-10-01 14:51:38 -04:00
2026-09-17 16:37:29 -04:00
2026-10-04 17:17:10 -04:00
2026-09-28 10:39:40 -04:00
2026-10-03 11:51:06 -04:00
2026-10-08 15:55:50 -04:00
2026-09-24 17:35:49 -04:00
2026-09-30 11:15:31 -04:00
2026-08-06 14:04:23 -04:00
2026-09-28 10:40:16 -04:00
2026-09-28 10:40:16 -04:00
2026-09-24 17:32:29 -04:00
2026-08-07 13:27:20 -04:00
2026-10-08 15:55:50 -04:00
2026-09-28 10:40:16 -04:00
2026-10-04 22:44:17 -04:00
2026-10-09 14:16:03 -04:00
2026-10-06 08:50:37 -04:00
2026-10-12 15:45:04 -04:00
2026-09-29 11:49:36 -04:00
2026-10-04 18:56:32 -04:00
2026-10-01 10:00:26 -04:00
2026-09-24 17:31:41 -04:00
2026-10-03 14:01:23 -04:00
2026-10-05 08:26:26 -04:00
2026-09-24 17:32:29 -04:00
2026-09-23 16:50:42 -04:00
2026-10-08 15:55:50 -04:00
2026-10-09 10:40:08 -04:00
2026-08-21 14:30:29 -04:00
2026-10-04 22:15:30 -04:00
2026-09-07 13:37:38 -04:00
2026-07-12 10:38:52 -04:00
2026-09-30 21:32:07 -04:00
2026-08-21 15:50:55 -04:00
2026-09-28 11:08:43 -04:00
2026-09-23 12:36:26 -04:00
2026-08-12 14:58:05 -04:00
2026-08-23 11:42:51 -04:00
2026-10-06 13:35:49 -04:00
2026-08-03 16:52:42 -04:00
2026-10-03 13:35:13 -04:00
2026-10-03 13:09:53 -04:00
2026-10-03 13:48:27 -04:00
2026-09-28 15:00:45 -04:00
2026-10-04 20:56:00 -04:00
2026-10-08 15:55:50 -04:00
2026-10-01 10:33:02 -04:00
2026-10-08 15:55:50 -04:00
2026-10-08 15:55:50 -04:00
2026-10-01 20:37:54 -04:00
2026-10-04 22:44:17 -04:00
2026-10-08 15:55:50 -04:00
2026-08-21 15:50:55 -04:00
2026-09-23 10:29:16 -04:00
2026-10-03 14:38:27 -04:00
2026-09-28 15:00:45 -04:00
2026-09-18 11:09:25 -04:00
2026-10-06 08:51:15 -04:00
2026-09-24 17:35:49 -04:00
2026-09-11 08:41:58 -04:00
2026-09-23 12:36:26 -04:00
2026-09-28 10:40:16 -04:00
2026-09-28 08:26:05 -04:00
2026-09-28 08:26:05 -04:00
2026-09-28 10:40:16 -04:00
2026-10-05 10:47:29 -04:00
2026-09-28 10:39:40 -04:00
2026-09-24 17:32:02 -04:00
2026-10-03 22:30:51 -04:00
2026-09-08 08:34:52 -04:00
2026-08-11 16:10:56 -04:00
2026-09-24 19:57:03 -04:00
2026-10-09 12:05:22 -04:00
2026-10-04 19:27:51 -04:00
2026-09-07 13:37:38 -04:00
2026-09-29 17:59:12 -04:00
2026-09-30 10:39:44 -04:00
2026-09-23 10:34:20 -04:00
2026-10-08 15:55:50 -04:00
2026-09-30 10:39:44 -04:00
2026-09-30 10:39:44 -04:00
2026-09-30 10:39:44 -04:00
2026-09-28 10:40:16 -04:00
2026-09-15 19:17:48 -04:00
2026-08-17 15:35:02 -04:00
2026-09-08 08:34:52 -04:00
2026-09-28 15:00:45 -04:00
2026-09-30 09:10:41 -04:00
2026-09-30 09:31:16 -04:00
2026-08-21 16:19:33 -04:00
2026-09-11 08:41:58 -04:00
2026-09-30 09:10:41 -04:00
2026-08-19 12:28:22 -04:00
2026-10-03 22:18:42 -04:00
2026-10-03 22:18:42 -04:00
2026-09-28 08:25:45 -04:00
2026-09-24 17:32:29 -04:00
2026-08-23 11:43:39 -04:00
2026-10-05 08:26:26 -04:00
2026-09-28 08:25:45 -04:00
2026-09-24 17:32:02 -04:00
2026-07-09 07:54:18 -04:00
2026-10-05 01:39:02 -04:00
2026-10-02 13:42:23 -04:00
2026-10-06 08:51:15 -04:00
2026-09-30 10:48:14 -04:00
2026-09-24 17:32:02 -04:00
2026-09-17 16:37:29 -04:00
2026-09-30 10:48:14 -04:00
2026-10-03 22:18:42 -04:00
2026-09-30 20:59:16 -04:00
2026-09-23 12:36:26 -04:00
2026-10-03 14:01:23 -04:00
2026-09-30 10:48:14 -04:00
2026-09-30 10:39:44 -04:00
2026-09-24 15:49:51 -04:00
2026-10-03 13:09:53 -04:00
2026-08-07 13:02:59 -04:00
2026-10-08 15:55:50 -04:00
2026-09-24 17:32:02 -04:00
2026-09-30 10:39:44 -04:00
2026-10-03 14:14:08 -04:00
2026-09-23 16:33:24 -04:00
2026-09-28 10:39:40 -04:00
2026-10-04 13:25:12 -04:00
2026-10-01 15:59:14 -04:00
2026-10-01 20:37:54 -04:00
2026-10-01 15:59:14 -04:00
2026-09-17 16:37:29 -04:00
2026-09-24 17:32:02 -04:00
2026-10-01 14:32:24 -04:00
2026-08-21 16:22:48 -04:00
2026-08-07 10:17:30 -04:00
2026-05-15 10:19:55 -04:00
2026-09-28 10:41:40 -04:00
2026-10-04 22:15:30 -04:00
2026-10-09 10:40:08 -04:00
2026-07-31 09:40:38 -04:00
2026-09-28 08:26:05 -04:00
2026-10-01 09:48:47 -04:00
2026-10-08 15:55:50 -04:00
2026-10-03 22:18:19 -04:00
2026-09-30 21:07:31 -04:00
2026-10-03 14:26:03 -04:00
2026-09-17 16:37:29 -04:00
2026-10-04 14:41:47 -04:00
2026-10-01 20:27:20 -04:00
2026-09-29 12:38:40 -04:00
2026-10-03 22:19:05 -04:00
2026-09-29 12:38:40 -04:00
2026-10-01 10:10:22 -04:00
2026-09-30 09:11:02 -04:00
2026-10-05 12:33:05 -04:00
2026-10-05 12:33:05 -04:00
2026-09-29 12:38:40 -04:00
2026-10-01 10:10:22 -04:00
2026-10-05 09:36:12 -04:00
2026-10-05 09:36:12 -04:00
2026-09-13 11:53:50 -04:00
2026-10-05 17:42:27 -04:00
2026-10-12 15:45:04 -04:00
2026-10-12 15:45:04 -04:00
2026-10-01 10:10:22 -04:00
2026-10-01 10:10:22 -04:00
2026-10-12 12:23:58 -04:00
2026-10-12 14:07:58 -04:00
2026-10-09 13:31:27 -04:00
2026-10-09 13:31:27 -04:00
2026-10-03 14:01:23 -04:00
2026-10-01 20:39:44 -04:00
2026-09-17 16:37:29 -04:00
2026-10-05 09:52:22 -04:00
2026-09-29 12:38:40 -04:00
2026-10-01 10:10:22 -04:00
2026-08-26 11:25:10 -04:00
2026-09-29 09:05:10 -04:00
2026-10-03 22:19:05 -04:00
2026-09-30 21:32:07 -04:00
2026-09-23 16:33:12 -04:00
2026-09-11 10:07:38 -04:00
2026-09-28 08:26:05 -04:00
2026-10-04 15:07:19 -04:00
2026-09-24 17:32:02 -04:00
2026-09-28 10:41:40 -04:00
2026-09-28 15:00:45 -04:00
2026-09-23 16:33:24 -04:00
2026-09-28 08:24:43 -04:00
2026-09-30 10:39:44 -04:00
2026-10-03 22:18:42 -04:00
2026-10-05 09:06:56 -04:00
2026-09-24 17:32:02 -04:00
2026-07-13 09:32:37 -04:00
2026-09-24 17:31:41 -04:00
2026-09-24 17:31:41 -04:00
2026-09-24 15:51:14 -04:00
2026-10-08 15:55:50 -04:00
2026-09-11 08:45:40 -04:00
2026-09-30 10:39:44 -04:00
2026-10-03 14:26:03 -04:00
2026-09-24 17:31:41 -04:00
2026-08-06 14:04:23 -04:00
2026-09-28 08:25:45 -04:00
2026-10-01 20:19:30 -04:00
2026-09-30 10:48:14 -04:00
2026-09-23 12:36:26 -04:00
2026-09-30 15:35:26 -04:00
2026-08-21 14:30:29 -04:00
2026-10-03 13:09:53 -04:00
2026-10-08 15:55:50 -04:00
2026-10-08 15:55:50 -04:00
2026-10-08 15:55:50 -04:00
2026-10-08 15:55:50 -04:00
2026-10-08 15:55:50 -04:00
2026-10-08 15:55:50 -04:00
2026-09-30 20:59:16 -04:00
2026-10-08 15:55:50 -04:00
2026-08-23 11:42:33 -04:00
2026-08-12 14:06:32 -04:00
2026-09-24 17:37:15 -04:00
2026-09-30 21:07:31 -04:00
2026-10-08 15:55:50 -04:00
2026-09-30 20:59:16 -04:00
2026-10-08 15:55:50 -04:00
2026-10-08 15:55:50 -04:00
2026-10-08 15:55:50 -04:00
2026-10-01 08:27:16 -04:00
2026-10-01 09:48:47 -04:00
2026-08-21 15:50:55 -04:00
2026-10-04 20:56:00 -04:00
2026-07-08 09:43:13 -04:00
2026-10-08 15:55:50 -04:00
2026-09-24 17:37:15 -04:00
2026-10-08 15:55:50 -04:00
2026-10-06 08:50:48 -04:00
2026-09-30 09:30:37 -04:00
2026-09-24 19:57:03 -04:00
2026-09-23 16:33:24 -04:00
2026-09-23 12:36:26 -04:00
2026-10-04 20:56:00 -04:00
2026-09-30 15:35:26 -04:00
2026-09-10 17:42:00 -04:00
2026-09-23 12:36:53 -04:00
2026-10-09 12:15:40 -04:00
2026-09-30 09:02:01 -04:00
2026-10-04 20:56:00 -04:00
2026-09-30 10:39:44 -04:00
2026-10-08 15:55:50 -04:00
2026-09-30 09:38:16 -04:00
2026-10-03 13:09:53 -04:00
2026-09-09 16:25:45 -04:00
2026-09-14 09:42:24 -04:00
2026-09-28 10:42:07 -04:00
2026-09-14 12:40:41 -04:00
2026-09-14 12:40:41 -04:00
2026-09-24 17:32:29 -04:00
2026-10-01 15:51:00 -04:00
2026-09-28 08:26:05 -04:00