The low-disk monitor consumed its trigger only after the clean
succeeded, so a failing pass left both the one-hour throttle and the
armed flag untouched and the next 5-second tick started the whole
thing again - retrying forever against a disk that was already full.
Consume the trigger first, and route the run through the shared
RunSafeCleanAsync so a no-op pass no longer logs an activity entry.
The recency guard treated an unreadable timestamp as "old", making a
file the app could not even stat a deletion candidate, and the browser
cleanup cleared its interrupted-state file with the caller's token, so
a cancel arriving after a successful clean left a phantom interrupted
run to be reported on the next launch. Both now fail safe. The agent's
Dispose also disposed the timer and CTS out from under a RunAsync that
Task.Run may not have started yet; it now only cancels and lets the
loop own its timer.
Also collapses three identical toast builders, removes two nested
Task.Run hops on the Overview scan, and un-obscures a couple of
expressions that read as bugs.