diff --git a/graph/fixes/fix-scorebug-tracker-read-failure-tolerance-prevents-false-c-096020.md b/graph/fixes/fix-scorebug-tracker-read-failure-tolerance-prevents-false-c-096020.md new file mode 100644 index 00000000000..368da469dfb --- /dev/null +++ b/graph/fixes/fix-scorebug-tracker-read-failure-tolerance-prevents-false-c-096020.md @@ -0,0 +1,35 @@ +--- +id: 0960205f-85d1-447c-9921-57fec764e1d5 +type: fix +title: "Fix: Scorebug tracker read-failure tolerance prevents false channel hiding" +tags: [major-domo, scorebug, live-scorebug-tracker, resilience, google-sheets, discord, fix] +importance: 0.7 +confidence: 0.8 +created: "2026-02-20T20:30:07.053777+00:00" +updated: "2026-02-20T20:30:07.053777+00:00" +--- + +# Scorebug Tracker: Read-Failure Tolerance + +## Project +major-domo / discord-app-v2 + +## File +`tasks/live_scorebug_tracker.py` — `_update_scorebugs()` method + +## Problem +The method hid `#live-sba-scores` whenever `active_scorebugs` was empty after the read loop. It did not distinguish between: +- All games confirmed FINAL (safe to hide) +- All sheet reads failed due to transient errors (incorrect to hide) + +A single Google Sheets timeout would cause the live scores channel to disappear mid-game. + +## Fix +Added `read_failures` and `confirmed_final` counters with three-branch logic: + +1. **Active scorebugs present** → show channel (normal case) +2. **Read failures with not all games confirmed final** → preserve last known state, log warning (resilience case) +3. **All confirmed final** → safe to hide channel (expected end-of-game case) + +## Key Takeaway +Channel visibility decisions that depend on external I/O (Google Sheets) must account for transient read failures before taking destructive action (hiding channels). Always distinguish "no data" from "failed to fetch data."