docs(sports): re-check the hold, and close two items that are already done

The remaining-work list had two entries that finished without the doc noticing,
which is the failure mode this file exists to prevent.

- The stale plugin-test tranche is gone. run_plugin_tests.py --all now reports
  174 passed, 2 skipped, 0 failed across the whole fleet. Recorded how to
  re-check it too: these are standalone scripts, not a pytest suite, and one
  calls sys.exit(1) at import, so pointing pytest at a plugin directory
  collapses into an INTERNALERROR that looks nothing like the real state.
- CLAUDE.md already says eight panel sizes.

That leaves the hardware soaks as the only open item needing work rather than
calendar time.

B6's prerequisite is now built -- core test/test_sports_sunset_matrix.py
(#505) -- so the phase table and the regression-test section say so, and the
two modelling traps it had to work through are recorded for whoever touches it
next: the copy-removed shape must be an unguarded import or the failure names
scroll_display_legacy instead of the core module, and only the leaf module may
be hidden because a pre-3.2.0 core still ships src/common/.

The hold itself is re-checked and unchanged: v3.2.0 is still latest,
__version__ is still 3.2.0, no 3.3.0, 23 days rather than the few months the
gate asks for. Also worth stating plainly -- the core updates by git pull, not
by downloading a release, so release-asset counts would not measure uptake even
if we had them. Whatever unblocks this has to come from the store side.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01STMbQE4YctTacQXfbYqKuW
This commit is contained in:
ChuckBuilds
2026-08-26 10:33:31 -04:00
co-authored by Claude Opus 5
parent cc6a75712c
commit c2ace90353
+33 -14
View File
@@ -214,7 +214,7 @@ one of them cannot break a user on an old core and the other can.
| **B3** | Upstream the scroll **orchestration** layer as `src/common/sports_scroll.py`, reading `global_config['target_fps']` natively | ✅ | Content building stays per-sport | | **B3** | Upstream the scroll **orchestration** layer as `src/common/sports_scroll.py`, reading `global_config['target_fps']` natively | ✅ | Content building stays per-sport |
| **B4** | Ship 3.2.0 *and* make version reporting trustworthy | ✅ | Released 2026-08-03; tag, release and `src.__version__` agree; compatibility gate merged (#428, #431, #433) | | **B4** | Ship 3.2.0 *and* make version reporting trustworthy | ✅ | Released 2026-08-03; tag, release and `src.__version__` agree; compatibility gate merged (#428, #431, #433) |
| **B5** | Adoption — guarded core imports, all eight. **Bundled copies stay.** | ✅ | All eight adopted; harness byte-identical; see the B5 retrospective below — four shipped broken and were repaired in plugins #251 | | **B5** | Adoption — guarded core imports, all eight. **Bundled copies stay.** | ✅ | All eight adopted; harness byte-identical; see the B5 retrospective below — four shipped broken and were repaired in plugins #251 |
| **B6** | Sunset — delete the bundled copies | **blocked, deliberately** | 3.2.0 *in users' hands*. Released 2026-08-03; there is no adoption data yet. See "B6 — the decision as of 2026-08-05" | | **B6** | Sunset — delete the bundled copies | **blocked, deliberately** | 3.2.0 *in users' hands*. Released 2026-08-03; still no adoption data at the 2026-08-26 re-check. The prerequisite regression test is built (#505); only the evidence is missing. See "B6 — the decision as of 2026-08-05" |
### B4 — what "ship 3.2.0" actually requires ### B4 — what "ship 3.2.0" actually requires
@@ -305,7 +305,8 @@ been in users' hands long enough that the population running a core without it
is small.** The bundled copies cost disk space; deleting them early costs is small.** The bundled copies cost disk space; deleting them early costs
scoreboards, silently. That trade is not close. scoreboards, silently. That trade is not close.
Before the first sunset, add a **compatibility regression test**. It has to Before the first sunset, add a **compatibility regression test**. **Built:**
core `test/test_sports_sunset_matrix.py` (#505). It has to
cover four cases, not one — B5's safety claim and B6's failure mode are cover four cases, not one — B5's safety claim and B6's failure mode are
different propositions and only the second is obvious: different propositions and only the second is obvious:
@@ -354,6 +355,15 @@ instead of receiving one that cannot load. Every adopted plugin has a
the default download, or store-side install data if that is ever added. Revisit the default download, or store-side install data if that is ever added. Revisit
then, not on a schedule. then, not on a schedule.
**Re-checked 2026-08-26 — still held.** v3.2.0 remains the latest release and
`src.__version__` is still `3.2.0`; no 3.3.0 has been cut. That is 23 days, not
the few months above, and no store-side install data has appeared. Note also
that the core updates by `git pull --rebase` rather than by downloading a
release, so release-asset counts would not measure uptake even if we had them —
whatever eventually unblocks this has to come from the store side. The
prerequisite test is now built (#505), so when the evidence does arrive the
remaining work is the sunset itself.
**When it happens, remember:** four plugins declare their floor top-level, where **When it happens, remember:** four plugins declare their floor top-level, where
editing `versions[0]` is a silent no-op, and the floor has three live spellings editing `versions[0]` is a silent no-op, and the floor has three live spellings
(`min_ledmatrix_version`, `requires.min_ledmatrix_version`, (`min_ledmatrix_version`, `requires.min_ledmatrix_version`,
@@ -423,21 +433,30 @@ What actually remains, smallest first:
1. **Nothing on the critical path.** B6 is the only remaining phase and it is 1. **Nothing on the critical path.** B6 is the only remaining phase and it is
waiting on calendar time, not on work. Resist the urge to fill the gap by waiting on calendar time, not on work. Resist the urge to fill the gap by
adopting more modules — see the decision above. adopting more modules — see the decision above.
2. **The stale plugin-test tranche** — 5 failures across baseball, hockey and 2. ~~**The stale plugin-test tranche**~~**done** (verified 2026-08-26).
basketball, all pre-existing API drift in the plugins' own older tests The 5 failures across baseball, hockey and basketball are gone;
(`plugin.initialized`, `CacheManager(config_manager=...)`, a bare `scripts/run_plugin_tests.py --all` reports 174 passed, 2 skipped, 0 failed
`cache_manager` import, `MockLogger.setLevel`, `BasketballPluginManager`). across the whole fleet. Re-check with that runner rather than by pointing
None are scroll-related. They make the suite noisy, which is how a real pytest at a plugin directory: these are standalone scripts, not a pytest
failure gets ignored. suite, and one of them calls `sys.exit(1)` at import, which collapses a
pytest run into an INTERNALERROR that looks nothing like the real state.
3. **Soak the remaining adoptions on hardware.** Only baseball has been watched 3. **Soak the remaining adoptions on hardware.** Only baseball has been watched
through a live game, and hockey has been loaded on devpi. The other six are through a live game, and hockey has been loaded on devpi. The other six are
proven by harness, unit tests and pixel comparison — not by a live match. proven by harness, unit tests and pixel comparison — not by a live match.
Out-of-season sports cannot be soaked until their season starts. Out-of-season sports cannot be soaked until their season starts. **This is
4. **`CLAUDE.md` in the plugins repo says four panel sizes; the harness renders now the only open item that needs work rather than calendar time.**
eight.** A one-line doc fix, and the discrepancy has already produced one 4. ~~**`CLAUDE.md` says four panel sizes**~~**done.** It reads "Default
false review finding. matrix sizes are eight … design for the classic four first".
5. **Then, when the evidence supports it, B6** — with the four-case 5. **Then, when the evidence supports it, B6.** Its prerequisite — the
compatibility regression test above in CI first. four-case compatibility regression test — is built: core
`test/test_sports_sunset_matrix.py` (#505). It drives all four cells through
the real `PluginManager.load_plugin` and asserts the sunset cell as
`PluginState.ERROR` plus an error naming the missing module, not as a raise.
Two modelling traps it had to work through, worth knowing before trusting
any successor: the copy-removed shape must be an *unguarded* import, or the
failure names the missing `scroll_display_legacy` instead of the core
module; and only the leaf module may be hidden, since a pre-3.2.0 core still
ships `src/common/`.
## How to keep this project healthy ## How to keep this project healthy