Migrates the 4 try/except sites in SummaryCache:
1. load() - line 39: was `except Exception: self.cache = {}`
Now `except (OSError, json.JSONDecodeError):` and returns
Result[bool] with ErrorInfo on failure.
2. save() - line 48: was `except Exception: pass`
Now `except OSError:` and returns Result[bool] with ErrorInfo on
failure.
3. clear() - line 91: was `except Exception: pass`
Now `except OSError:` and returns Result[bool] with ErrorInfo on
failure.
4. get_stats() - line 100: was `except Exception: pass`
Now `except OSError:` and returns Result[dict] with default empty
size_bytes on failure.
All 4 sites narrowed from broad `except Exception` to specific stdlib
I/O exceptions (OSError, json.JSONDecodeError). Methods that previously
returned None now return Result[bool]; get_stats() now returns
Result[dict] instead of dict.
Callers (app_controller.py:_handle_clear_summary_cache, _cb_clear_summary_cache,
summarize.py) ignore the return value, which is backwards-compatible.
Tests verified:
- tests/test_summary_cache.py (3 tests) PASS
- tests/test_ui_cache_controls_sim.py (1 live_gui test) PASS