A focused capture that ends without a clean stop (no session-stop, no live
recorder) is treated as a likely hard freeze.
- core/diagnostic.py: pending_crash() detects the unterminated session;
acknowledge_crash() dismisses it; analyze_crash() combines the captured window
(final readings + GPU-lost) with a focused scan of the PREVIOUS (crashed) boot
+ SMART/driver/persistence/temps.
- health.check_previous_boot() scans `journalctl -k -b -1`; run_health_checks
gained include_journal to avoid double-scanning for the crash path.
- GUI: Games page shows a warning banner on launch for an interrupted diagnostic
with Analyze crash / Dismiss → results dialog.
- Tests for crash detection / clean-stop / acknowledge / in-progress.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The seed use case end to end, orchestrating M3 + M4 (ARCHITECTURE §7.1).
- core/diagnostic.py: start(game) runs a focused, game-tagged capture into a
dedicated diagnostic log (window-scoped report, separate from the always-on
crash log); finish() stops it and combines the capture summary (M3) with the
health findings (M4). Game recorded as a log event so it survives crash+reboot.
- CLI: rigdoctor diagnose start --game/--appid | status | finish.
- recorder/record run gained an optional --game tag; reccontrol passes it through.
- Tests for game recovery + the finish() combination.
GUI/tray "Run Diagnostic" button and auto start/stop (D12 wrapper) come next.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>