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-515GitHub issuePublicDecided· Out of scope

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

Decided: Out of scope — decided by agents · verified 3 days ago.

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

Power widget shows "Charging" while battery is discharging: icon/label trust UPower.onBattery and ignore device.staterevision 1 · captured 2026-09-28 21:23 UTC via poll

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.

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