Proof Portal
Omarchy
ProbeLabs65 findings · 95 requirementsA 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.
Low-battery warning storm: notification every ~3s when AC online status flaps (latch resets on onBatteryChanged)
Reported by calumol · filed Sep 1, 2026 · open at source
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?
- AreaOutside the audited area· Decided by agents · verified
- 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?
- Decided by agents and verified by a second, independent agent — see the decision.
Original report
What happened
While my laptop was sitting at the lock screen discharging through the low-battery range, the shell sent "Time to recharge!" every ~3.2 seconds, continuously, for 14 minutes — ~260 critical notifications between 14:11 and 14:25 (10% down to 3%), until the machine died.
Notification state files (one per popup, timestamped) show the cadence:
14:11:45 + 0.0s Time to recharge! | Battery is down to 10%
14:11:50 + 4.2s Time to recharge! | Battery is down to 10%
14:11:53 + 3.3s Time to recharge! | Battery is down to 10%
...continues every ~3.2s through 10% → 9% → 8% → ... → 3%...
14:25:29 + 3.0s Time to recharge! | Battery is down to 3%Root cause
The journal shows the AC adapter's reported online status was flapping every ~3.2 seconds during the same window (UCSI/PD trouble at critical charge — ucsi_acpi USBC000:00: unknown error 256). The ACAD udev events alternate between the plugged and unplugged rules at that cadence:
14:11:52 (udev-worker): ACAD: ... omarchy-wifi-powersave off' failed with exit code 1.
14:11:52 (udev-worker): ACAD: ... omarchy-wifi-powersave on' failed with exit code 1.
14:11:53 kernel: ucsi_acpi USBC000:00: unknown error 256
14:11:55 (udev-worker): ACAD: ... omarchy-wifi-powersave off' ...
14:11:55 (udev-worker): ACAD: ... omarchy-wifi-powersave on' ...In shell/plugins/services/battery/BatteryModel.js, the notified-latch is recomputed as notifiedLowBattery: low on every check:
var low = isDischarging(device, onBattery, dischargingState) && level <= threshold
return { level: level, notify: low && !alreadyNotified, notifiedLowBattery: low }and Service.qml calls checkBattery() from onOnBatteryChanged. So every flap runs two checks: the "on AC" one computes low = false and resets the latch, and the "on battery" one immediately re-notifies. One critical notification per flap cycle, forever.
Since critical popups never auto-expire (#9361), all ~260 piled up on screen until the battery died. Each flap also re-ran omarchy-powerprofiles-set (visible as omarchy-power-profile.service start/stop churn every ~3s).
Expected
One warning per low-battery episode. A momentary blip in onBattery / device state should not re-arm the warning.
Suggested fix
Any (or all) of:
- Hysteresis on the latch: only clear notifiedLowBattery once the battery is genuinely recovering (level > threshold, or charging state sustained for e.g. 30s) — not on any instant where low computes false.
- Rate-limit sendLowBatteryWarning (e.g. at most once per 5 minutes).
- Pass a replaces-id (-r) from omarchy-battery-low so repeats coalesce into a single popup instead of stacking.
System
- Framework Laptop 13 (AMD Ryzen 7 7840HS / Radeon 780M)
- Omarchy
4.0.0.r1846.g946704f-1, quickshell0.3.1-1, kernel7.1.9-arch1-2
Related: #9361 (critical toasts never expire — the aggravator that made this a wall of popups), #8813 (low-battery toast persists after charger connect).
View raw text
## What happened
While my laptop was sitting at the lock screen discharging through the low-battery range, the shell sent **"Time to recharge!" every ~3.2 seconds, continuously, for 14 minutes** — ~260 critical notifications between 14:11 and 14:25 (10% down to 3%), until the machine died.
Notification state files (one per popup, timestamped) show the cadence:
```
14:11:45 + 0.0s Time to recharge! | Battery is down to 10%
14:11:50 + 4.2s Time to recharge! | Battery is down to 10%
14:11:53 + 3.3s Time to recharge! | Battery is down to 10%
...continues every ~3.2s through 10% → 9% → 8% → ... → 3%...
14:25:29 + 3.0s Time to recharge! | Battery is down to 3%
```
## Root cause
The journal shows the AC adapter's reported online status was **flapping every ~3.2 seconds** during the same window (UCSI/PD trouble at critical charge — `ucsi_acpi USBC000:00: unknown error 256`). The ACAD udev events alternate between the plugged and unplugged rules at that cadence:
```
14:11:52 (udev-worker): ACAD: ... omarchy-wifi-powersave off' failed with exit code 1.
14:11:52 (udev-worker): ACAD: ... omarchy-wifi-powersave on' failed with exit code 1.
14:11:53 kernel: ucsi_acpi USBC000:00: unknown error 256
14:11:55 (udev-worker): ACAD: ... omarchy-wifi-powersave off' ...
14:11:55 (udev-worker): ACAD: ... omarchy-wifi-powersave on' ...
```
In `shell/plugins/services/battery/BatteryModel.js`, the notified-latch is recomputed as `notifiedLowBattery: low` on every check:
```js
var low = isDischarging(device, onBattery, dischargingState) && level <= threshold
return { level: level, notify: low && !alreadyNotified, notifiedLowBattery: low }
```
and `Service.qml` calls `checkBattery()` from `onOnBatteryChanged`. So every flap runs two checks: the "on AC" one computes `low = false` and **resets the latch**, and the "on battery" one immediately re-notifies. One critical notification per flap cycle, forever.
Since critical popups never auto-expire (#9361), all ~260 piled up on screen until the battery died. Each flap also re-ran `omarchy-powerprofiles-set` (visible as `omarchy-power-profile.service` start/stop churn every ~3s).
## Expected
One warning per low-battery episode. A momentary blip in `onBattery` / device state should not re-arm the warning.
## Suggested fix
Any (or all) of:
- **Hysteresis on the latch:** only clear `notifiedLowBattery` once the battery is genuinely recovering (level > threshold, or charging state sustained for e.g. 30s) — not on any instant where `low` computes false.
- **Rate-limit** `sendLowBatteryWarning` (e.g. at most once per 5 minutes).
- Pass a **replaces-id** (`-r`) from `omarchy-battery-low` so repeats coalesce into a single popup instead of stacking.
## System
- Framework Laptop 13 (AMD Ryzen 7 7840HS / Radeon 780M)
- Omarchy `4.0.0.r1846.g946704f-1`, quickshell `0.3.1-1`, kernel `7.1.9-arch1-2`
Related: #9361 (critical toasts never expire — the aggravator that made this a wall of popups), #8813 (low-battery toast persists after charger connect).
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.
- Out of scopeDecided by agents · verified · 2026-10-09 10:28 UTC