Result of evaluating the per-tick suppression guards: either no
guard fires, or exactly one wins and dictates the tray icon
(reason) plus whether the event-log records a GuardSuppress
entry (log_as).
Rate-limit window for repeated UserIdle::get_time failure warnings.
One log line per 60 s is enough to surface a persistent platform-API
breakage without spamming the log file once per tick.
Epoch seconds (SystemTime::UNIX_EPOCH) at which the last UserIdle
failure was logged; 0 means βnever warned yetβ (also the at-rest
value before the scheduler boots).
Pure decision: given the per-tick guard inputs, return which
SuppressReason should fire (if any) and whether the run-loop
should also write a GuardSuppress event for it.
Convert SystemTime::now() to seconds since the Unix epoch. Returns
0 if the system clock is somehow before 1970 β same fallback as
the βnever warnedβ sentinel, which simply means the next warn fires.
Surface a UserIdle::get_time error to the log, at most once per
USER_IDLE_WARN_INTERVAL_SECS. Without this gate the production
code silently fell back to β0 = activeβ forever, so a broken
platform call (X11 down, macOS API change, Wayland portal denied)
would invisibly break idle suppression and screen-time tracking.