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.
Power widget shows "Charging" while battery is discharging: icon/label trust UPower.onBattery and ignore device.state
Reported by DerAlbertCom · filed Sep 15, 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
System
- Omarchy 4.0.3-mac.1
- Apple MacBook Air M2 (Asahi Linux, kernel 7.1.13-3-1-ARCH)
- Quickshell 0.3.0, UPower 1.91.4
What happened
After charging to 100% and unplugging the charger, the bar's power widget keeps showing the charging icon / "Charging" label while the battery is actually discharging.
Cause
The widget derives everything from the daemon-wide UPower.onBattery flag and never checks displayDevice.state. On this machine, the tps6598x USB-C PD port (/sys/class/power_supply/tps6598x-source-psy-0-0038) keeps reporting online: 1 after unplug (stale source state; filed separately against Asahi Linux). UPower therefore sets on-battery: no even though its own battery device reports state: discharging:
upower -d → DisplayDevice: state: discharging ... Daemon: on-battery: noWith onBattery == false, Panel.qml (discharging binding, lines 68–71) is false, so Model.batteryIcon() hits if (!onBattery) return chargingIcons[index] (Model.js:77) and modeLabel() falls through to "Charging" since percentage < 1 (Model.js:89).
Expected
When displayDevice.state === UPowerDeviceState.Discharging, show the discharging icon / "On battery" regardless of the onBattery flag.
Suggested fix
In Model.js, gate the charging icon on the device state, e.g.
if (!onBattery && d.state === states.Charging) return chargingIcons[index]and apply the same guard in modeLabel(). This also hardens the widget against driver-level inconsistencies of this kind (see also #10939, same trust-the-flag pattern).
Steps to reproduce
Charge to 100%, unplug the charger. On Asahi machines with a stale tps6598x-source-psy online=1, the widget stays on "Charging" as the battery drains.
View raw text
## System - Omarchy 4.0.3-mac.1 - Apple MacBook Air M2 (Asahi Linux, kernel 7.1.13-3-1-ARCH) - Quickshell 0.3.0, UPower 1.91.4 ## What happened After charging to 100% and unplugging the charger, the bar's power widget keeps showing the charging icon / "Charging" label while the battery is actually discharging. ## Cause The widget derives everything from the daemon-wide `UPower.onBattery` flag and never checks `displayDevice.state`. On this machine, the tps6598x USB-C PD port (`/sys/class/power_supply/tps6598x-source-psy-0-0038`) keeps reporting `online: 1` after unplug (stale source state; filed separately against Asahi Linux). UPower therefore sets `on-battery: no` even though its own battery device reports `state: discharging`: ``` upower -d → DisplayDevice: state: discharging ... Daemon: on-battery: no ``` With `onBattery == false`, `Panel.qml` (`discharging` binding, lines 68–71) is false, so `Model.batteryIcon()` hits `if (!onBattery) return chargingIcons[index]` (`Model.js:77`) and `modeLabel()` falls through to "Charging" since percentage < 1 (`Model.js:89`). ## Expected When `displayDevice.state === UPowerDeviceState.Discharging`, show the discharging icon / "On battery" regardless of the `onBattery` flag. ## Suggested fix In `Model.js`, gate the charging icon on the device state, e.g. ```js if (!onBattery && d.state === states.Charging) return chargingIcons[index] ``` and apply the same guard in `modeLabel()`. This also hardens the widget against driver-level inconsistencies of this kind (see also #10939, same trust-the-flag pattern). ## Steps to reproduce Charge to 100%, unplug the charger. On Asahi machines with a stale `tps6598x-source-psy online=1`, the widget stays on "Charging" as the battery drains.
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 13:49 UTC