A second-pass content audit checked the guides' substantive claims
against the code (the first pass only fixed mechanical drift). Fixes:
- GETTING_STARTED: described booting a prebuilt SD image and seeing
default clock/weather plugins — neither exists. Now documents the real
install (Pi OS Lite + one-shot installer / first_time_install.sh) and
that displays come from the Plugin Store. Duration and ordering
instructions moved to the Rotation tab where the controls actually
live.
- WEB_INTERFACE_GUIDE: three whole tabs were undocumented (Rotation,
Backup & Restore, Tools) and the Display tab's Vegas Scroll section
was unmentioned. Fonts overrides are per display element (not per
plugin); Logs has an Auto-scroll checkbox (not a Pause button); the
aspirational keyboard-shortcut list and no-JS claim removed.
- TROUBLESHOOTING: the hand-written service-file template (wrong user,
wrong ExecStart, dropped the autostart gate) replaced with the real
systemd/ units + install scripts; recovery steps no longer copy
placeholder units verbatim; WiFi curl endpoint corrected to /api/v3/;
cache-clearing advice now targets the real cache locations.
- ADVANCED_FEATURES: removed a false claim that CacheManager has no
delete(); fixed two example snippets that raise TypeError
(BackgroundDataService and get_config_file_mode signatures); fixed
cache paths, a 5-minute TTL that is actually 1 hour, and the vegas
table now links the complete 26-key reference.
- EMULATOR_SETUP_GUIDE: documented run.py flags that don't exist
(--plugin/--test-plugins) removed in favor of dev_server.py and
check_plugin.py; shipped emulator config values corrected (browser
adapter default on :8888, not pygame).
- PLUGIN_QUICK_REFERENCE: drag-and-drop reordering is shipped, not
'not yet supported'; discovery-fallback and registry-repo claims
corrected. PLUGIN_API_REFERENCE: get_vegas_segment_width returns
panels, not pixels. CONTRIBUTING: the repo uses flake8/mypy/bandit
pre-commit hooks, not black/ruff, and tests need requirements-test.txt.
- SKIN_SYSTEM/DEVELOPER_QUICK_REFERENCE: stale module paths.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SXb4mKcAkVaxkeTb3YnAdr
* Add skin system: user-installable visual overlays for sports scoreboards
Skins restyle a scoreboard's live/recent/upcoming rendering while the
host plugin keeps doing data fetching, scheduling, caching, live
priority, and vegas mode — the anti-fork alternative for users who only
want a different layout.
- src/skin_system/: ScoreboardSkin API, SkinContext (canvas + adaptive
layout + logo/font helpers), discovery/loading runtime with API major
version gating and per-skin module namespacing
- src/base_classes/sports.py: _render_game() seam at the three
_draw_scorebug_layout call sites; skin-first with built-in fallback,
3-strikes session disable, slow-render warning; per-mode skin config
- scripts/validate_skin.py: headless multi-mode/multi-size validator
with bundled per-sport fixtures (no hardware or network needed)
- skins/example-classic-baseball/: working reference skin
- Web UI: served-schema Visual Skin dropdown (validation never
enum-restricted, so uninstalled skins can't invalidate configs) and
GET /api/v3/skins
- Store: registry entries with type "skin" install to skins/
- docs/SKIN_SYSTEM.md (architecture), docs/CREATING_SKINS.md (author
guide incl. Claude Code prompt), view-model contract locked by tests
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LrCusPasy1qeUN5anK3aA1
* Address review feedback on skin system
- skin_runtime: cache the entry module so the 2nd/3rd load of the same
skin (live/recent/upcoming hosts) doesn't re-execute it with unbound
sibling aliases; rebind cached sibling modules to their bare names
around entry import and restore prior bindings after; include per-
manifest mtimes in the discovery cache fingerprint so in-place skin
updates are picked up
- sports.py: count render_skin_card exceptions toward the 3-strike
session disable
- store_manager: validate skin ids (pattern + resolved-path containment
in skins/), reject registry/manifest id mismatches, and stage+validate
downloads in a temp sibling before replacing an existing skin
- schema_manager: leave the schema untouched when the configured skin
value is a per-mode mapping (a string dropdown could overwrite it)
- validate_skin.py: reject non-positive sizes and non-object --options
at parse time; support --output-dir outside the repo; type annotations
- example skin: validate accent_color once at load with logged fallback
- fixtures: pregame 0-0 scores in football/hockey upcoming fixtures
- api /skins: rely on the self-invalidating discovery cache instead of
force_refresh
- docs: valid JSON manifest example, load_logo caching semantics spelled
out, language ids on fenced blocks
- tests: view-model contract test now exercises the real extractor;
regression test for repeated same-skin loads with sibling modules
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LrCusPasy1qeUN5anK3aA1
---------
Co-authored-by: Claude <noreply@anthropic.com>