Chuck and Claude Opus 5.5
3bdb5bff3b
feat(common): sports_favorites -- the reconciled favourite matching (sports family 6) ( #775 )
...
* feat(common): sports_favorites -- the reconciled favourite matching (sports family 6)
New hardware-free module src/common/sports_favorites.py, copied from
ledmatrix-plugins claude/family6-reconcile once the nine scoreboards made
_is_favorite_game (seven bodies), _select_games_for_display (two) and
_select_recent_games_for_display (three) one body each. One mixin per class
that carries the methods, so adopting one gives no manager a method it did
not have:
- SportsFavoritesMixin (SportsCore): _is_favorite_game and _favorite_code.
- SportsUpcomingFavoritesMixin: _select_games_for_display.
- SportsRecentFavoritesMixin: _select_recent_games_for_display.
Each side of a game is named by the 3.5.0 _favorite_key seam
(SportsHelpersMixin; the abbreviation by default, nrl overrides it with the
ESPN team id and None for a missing id) and compared with favorite_teams
stripped and upper-cased. The selection methods give each favourite up to the
per-team limit, count a game between two favourites for both, treat only
games with an id as possible duplicates and log their summary at INFO.
- test/test_sports_favorites.py: the plugins' pinned cases for an abbreviation
host and an id-keyed (nrl-style) host -- case, spaces, ids, the NEW
collision, the "None" favourite, missing keys; selection order, limits,
duplicates and the id-less fix, the INFO summary; host contract, one carrier
per method, and SportsGameRulesMixin reaching the shared body.
- test/test_sports_favorites_parity.py: with LEDMATRIX_PLUGINS, compares each
body with every plugin copy (drift-report normalisation plus decorators),
checks no other plugin class carries a copy, and that only nrl overrides
_favorite_key.
- mypy ratchet, src/common/README.md, CHANGELOG (Unreleased, New modules).
- sports_helpers docstrings: _favorite_key now has a caller and an override.
- docs/SPORTS_UNIFICATION.md: family 6 status and decisions, and the seam
table. SportsCoreSharedMixin._round_robin_favorites still groups by raw
abbreviation or _team_in: it is not one of the plugin bodies, so it waits
for a later family.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
* docs(sports): family 6 also routes the Upcoming favourites-only filter and three live boosts
ledmatrix-plugins claude/family6-reconcile now sends the Upcoming update()'s
favourites-only pre-filter and the basketball, hockey and lacrosse live
favourite boost through _is_favorite_game, so a lower-case favourite works on
a favourites-only Upcoming board. The module is unchanged (update() is not
promoted); the parity test still passes against the branch. Updates the
pinned row and cell counts and what is left for later families.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
* docs: cite ledmatrix-plugins #635 for the family 6 reconcile
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-05 12:33:05 -04:00
..
2026-10-04 13:25:12 -04:00
2026-10-05 09:53:43 -04:00
2026-10-01 10:45:28 -04:00
2026-10-05 09:53:43 -04:00
2026-03-20 15:06:58 -04:00
2026-09-30 10:48:14 -04:00
2026-10-04 22:44:17 -04:00
2026-10-03 13:09:53 -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-09-30 10:39:44 -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-04 20:56:00 -04:00
2026-10-04 20:56:00 -04:00
2026-09-30 10:39:44 -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-09-24 17:35:49 -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-08-19 12:28:22 -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-09-23 12:54:07 -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-01 10:45:28 -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-01 16:10:04 -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-09-24 17:32:29 -04:00
2026-09-28 10:40:16 -04:00
2026-10-04 22:44:17 -04:00
2026-10-04 15:46:15 -04:00
2026-10-03 14:14:08 -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-01 20:13:57 -04:00
2026-10-03 11:51:06 -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-03 13:35:13 -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-04 22:44:17 -04:00
2026-10-01 10:33:02 -04:00
2026-10-04 22:15:30 -04:00
2026-10-01 10:33:02 -04:00
2026-10-01 20:37:54 -04:00
2026-10-04 22:44:17 -04:00
2026-10-03 22:18:31 -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-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-09-30 09:10:41 -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-09-28 10:41:40 -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-04 20:56:00 -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-09-28 08:25:26 -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-01 14:15:22 -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-09-30 20:50:34 -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-09-15 15:32:21 -04:00
2026-10-01 10:10:22 -04:00
2026-10-01 10:10:22 -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-09-28 10:40:16 -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-09-24 17:37:15 -04:00
2026-09-24 17:37:15 -04:00
2026-10-01 08:27:16 -04:00
2026-10-01 08:27:16 -04:00
2026-09-24 19:38:22 -04:00
2026-09-28 08:25:26 -04:00
2026-09-30 20:59:16 -04:00
2026-09-30 20:59:16 -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-09-30 21:07:31 -04:00
2026-09-30 20:59:16 -04:00
2026-09-30 21:07:31 -04:00
2026-09-30 21:07:31 -04:00
2026-10-01 09:48:47 -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-01 09:48:47 -04:00
2026-09-24 17:37:15 -04:00
2026-09-28 10:39:14 -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-09-24 15:53:19 -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-09-30 10:39:44 -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