Proof Portal

Project overview

Omarchy

ProbeLabs65 findings · 95 requirements

A proof layer — requirements, tests and verified fixes — for two of Omarchy's subsystems: the application menu (launcher scripts, QML model, JSONC config, search and selection) and the lock screen (lock scripts, QML, PAM authentication). Scope is deliberately limited to those components of omacom/omarchy; the rest of the distribution is not covered.

Inbox
ReportR-1020GitHub issuePublicReceived

Agents panel keeps stale Claude usage for hours after the clock is set back at boot

Reported by rdjperron · filed Sep 3, 2026Closed upstream on 2026-10-04 by the bot omarchybot; the closing comment says it was fixed by PR #14049. GitHub close reason: completed.

Received and recorded verbatim. Nothing has been checked yet.

At a glance

1 · What is claimed?
Only the report text below — no validator has restated it as checkable claims yet.
2 · What does it affect?
Not yet mapped to any requirement or component.
3 · Is it reproducible?
No validation has been run yet.
4 · What remains unclear?
  • Not validated yet: no claims, no reproducer.
5 · What happens next?
Our staff decide whether the report is valid. Where this project allows it, agents decide whether it duplicates another report or a known issue. No decision has been recorded yet.

Original report

Agents panel keeps stale Claude usage for hours after the clock is set back at bootrevision 1 · captured 2026-09-28 21:24 UTC via poll

System details

11th Gen Intel Core i7-11370H, Intel Iris Xe + NVIDIA RTX 3050 Ti Mobile (Surface Laptop Studio, dual boot with Windows), Omarchy 4.0.2-1, kernel 7.1.9-arch1-2

What's wrong?

After rebooting into 4.0.2 the Agents panel showed Claude at Session 0%, Weekly 8%, and 1 prompt for the day, and kept showing that for about two hours while I was using Claude Code the whole time. Then it corrected itself on its own. Pressing refresh in the panel (--force) always gave fresh numbers. The automatic refreshes did not.

The update is not the cause. bin/omarchy-agent-usage-claude is byte-identical in 4.0.1, 4.0.2, and current quattro. The reboot just exposed an older bug.

Cause

This machine boots with its clock two hours ahead. The CMOS clock holds local time because of the Windows dual boot, Linux reads it as UTC, and systemd-timesyncd steps the clock back about 75 seconds after boot ("Clock change detected" in the journal). The shell starts at 52 seconds and the agents plugin collects right away, so the first omarchy-agent-usage-claude run writes every cache with a timestamp two hours in the future.

Both cache readers accept a negative age:

# finite scan cache (transcripts, pi/omp, opencode)
if time.time() - path.stat().st_mtime <= max_age_seconds:
# 15-second probe throttle for claude-limits.json
if fallback and not force and time.time() - fetched_at < PROBE_MIN_INTERVAL_SECONDS:

A negative number is below every positive bound, so the scan cache stays "fresh" until its future mtime plus the TTL, and the limits throttle skips the probe until the future fetchedAtMs plus 15 seconds. That is the two-hour freeze and the automatic recovery.

The Codex collector already rejects a future-dated cache (#6780). The Claude collector does not, and its limits cache needs care because since #6795 it is also the last-known fallback when signed out or offline.

Reproduce without touching the clock

Both cases use temp directories and a stubbed usage endpoint. They are the two new assertions in the linked PR.

  1. Run the collector once so it writes claude-scan-*.json, append one 10-token assistant record to the transcript, set the cache file's mtime one hour ahead, run the collector again. It returns the old total.
  2. Write claude-limits.json with fetchedAtMs one hour ahead and an open Weekly window at 11%, give the collector a live token and a stub that answers 44%. It makes no request and returns 11%.

Expected: a future-dated scan cache is a miss, and a future fetchedAtMs does not suppress the automatic probe. If that probe fails, the still-open cached windows stay visible as before.

How common this is

The journal shows the same backwards step of about 7200 seconds on seven of the last eight boots here. Any dual-boot install that has not set timedatectl set-local-rtc 1 or RealTimeIsUniversal on the Windows side gets this at every boot. Other backwards corrections hit the same comparisons.

Fix: #9956

View raw text
### System details

11th Gen Intel Core i7-11370H, Intel Iris Xe + NVIDIA RTX 3050 Ti Mobile (Surface Laptop Studio, dual boot with Windows), Omarchy 4.0.2-1, kernel 7.1.9-arch1-2

### What's wrong?

After rebooting into 4.0.2 the Agents panel showed Claude at Session 0%, Weekly 8%, and 1 prompt for the day, and kept showing that for about two hours while I was using Claude Code the whole time. Then it corrected itself on its own. Pressing refresh in the panel (`--force`) always gave fresh numbers. The automatic refreshes did not.

The update is not the cause. `bin/omarchy-agent-usage-claude` is byte-identical in 4.0.1, 4.0.2, and current `quattro`. The reboot just exposed an older bug.

### Cause

This machine boots with its clock two hours ahead. The CMOS clock holds local time because of the Windows dual boot, Linux reads it as UTC, and systemd-timesyncd steps the clock back about 75 seconds after boot ("Clock change detected" in the journal). The shell starts at 52 seconds and the agents plugin collects right away, so the first `omarchy-agent-usage-claude` run writes every cache with a timestamp two hours in the future.

Both cache readers accept a negative age:

```python
# finite scan cache (transcripts, pi/omp, opencode)
if time.time() - path.stat().st_mtime <= max_age_seconds:
```

```python
# 15-second probe throttle for claude-limits.json
if fallback and not force and time.time() - fetched_at < PROBE_MIN_INTERVAL_SECONDS:
```

A negative number is below every positive bound, so the scan cache stays "fresh" until its future mtime plus the TTL, and the limits throttle skips the probe until the future `fetchedAtMs` plus 15 seconds. That is the two-hour freeze and the automatic recovery.

The Codex collector already rejects a future-dated cache (#6780). The Claude collector does not, and its limits cache needs care because since #6795 it is also the last-known fallback when signed out or offline.

### Reproduce without touching the clock

Both cases use temp directories and a stubbed usage endpoint. They are the two new assertions in the linked PR.

1. Run the collector once so it writes `claude-scan-*.json`, append one 10-token assistant record to the transcript, set the cache file's mtime one hour ahead, run the collector again. It returns the old total.
2. Write `claude-limits.json` with `fetchedAtMs` one hour ahead and an open Weekly window at 11%, give the collector a live token and a stub that answers 44%. It makes no request and returns 11%.

Expected: a future-dated scan cache is a miss, and a future `fetchedAtMs` does not suppress the automatic probe. If that probe fails, the still-open cached windows stay visible as before.

### How common this is

The journal shows the same backwards step of about 7200 seconds on seven of the last eight boots here. Any dual-boot install that has not set `timedatectl set-local-rtc 1` or `RealTimeIsUniversal` on the Windows side gets this at every boot. Other backwards corrections hit the same comparisons.

Fix: #9956

Validation

Not checked yet. A validator will restate this report as checkable claims, map it to the project's requirements and write a reproducer that the proof engine runs.

Linked

Not linked to any known issue, other report or change yet.

Decision

Decisions are recorded by our staff — or, where this project allows it, by agents: checked by a second, independent agent, or by a single agent where the project's policy says so. Any decision reached so far is shown below.

No decision has been recorded yet.