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-5062GitHub issuePublicReceived

Power panel shows only the first battery on dual-battery laptops (omarchy-battery-status uses `head -n 1`)

Reported by brwoodside · filed Sep 13, 2026Closed upstream on 2026-09-20 by bjarneo via an automated message, as a duplicate of #6885 (R-1856). 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

Power panel shows only the first battery on dual-battery laptops (omarchy-battery-status uses `head -n 1`)revision 1 · captured 2026-10-04 12:10 UTC via poll

<img width="780" height="480" alt="Image" src="https://github.com/user-attachments/assets/8a720aeb-59ee-43c8-b61b-f458017fed48" />
<img width="560" height="700" alt="Image" src="https://github.com/user-attachments/assets/708cd46a-1576-4574-98e8-33d27cfde33c" />

System details

Lenovo ThinkPad P52s (dual battery: internal BAT0 + external BAT1), Intel i5-8350U, Intel UHD 620 + NVIDIA Quadro P500, Omarchy 4.0.3-1, Quickshell 0.3.1

What's wrong?

On a laptop with two batteries, the power panel (omarchy.power) shows contradictory numbers because omarchy-battery-status only ever looks at the first battery, while the bar icon and the panel's progress bar use UPower's composite DisplayDevice.

bin/omarchy-battery-status:

battery=$(upower -e 2>/dev/null | grep BAT | head -n 1)   # -> battery_BAT0 only
...
cycles=$(cat "$power_supply_path"/BAT*/cycle_count 2>/dev/null | head -1)

So in panels/power/Panel.qml the hero percentage (root.batteryInfo.percentage), "Battery size", "Time to full" and the charge rate all describe BAT0 alone, but batteryFraction / batteryIcon() (and the bar icon) are computed from UPower.displayDevice, which sums both packs.

Observed (BAT0 held at its 75–80% charge threshold, BAT1 charging):

SourceValue
upower -i .../battery_BAT080%, fully-charged, 31 Wh
upower -i .../battery_BAT139%, charging, 67 Wh, 31 W, 1.2 h to full
upower -i .../DisplayDevice52%, charging, 98 Wh, 31 W, 1.4 h to full
Bar icon~52% (composite) ✔
Panel hero number80% (BAT0 only)
Panel progress bar52% (composite) — disagrees with the number right above it
Panel "Battery size"31 Wh (BAT0 only; machine has 98 Wh)
Panel "Time to full" / rate— / 0 W (BAT0 is idle at its threshold; BAT1 is actually charging at 31 W)

omarchy-battery-status --shell output:

percentage	80%
state	holding
rate	0W
size	31Wh
time	
cycles	21
threshold	75-80%

Expected: the panel should either describe the composite battery (matching the icon and progress bar it already draws from UPower.displayDevice), and/or list each pack separately.

Steps to reproduce: open the power panel on any dual-battery ThinkPad (T4x0/T4x0s/P5x s-series, X1 Carbon w/ external pack, etc.) with the two packs at different charge levels.

Suggested fix: in omarchy-battery-status, read the DisplayDevice (upower -i /org/freedesktop/UPower/devices/DisplayDevice) instead of the first BAT* for percentage / size / time / rate, and sum power_now across all BAT* for the instantaneous rate. Panel.qml could also drop the script's percentage and use Math.round(batteryFraction * 100) so the hero number can never disagree with the bar beneath it. Happy to send a PR if that direction sounds right.

I worked around it locally by cloning the plugin, using UPower.displayDevice for the hero/stats and adding a per-pack list from UPower.devices (before/after screenshots attached).

View raw text
<img width="780" height="480" alt="Image" src="https://github.com/user-attachments/assets/8a720aeb-59ee-43c8-b61b-f458017fed48" />
<img width="560" height="700" alt="Image" src="https://github.com/user-attachments/assets/708cd46a-1576-4574-98e8-33d27cfde33c" />

### System details

Lenovo ThinkPad P52s (dual battery: internal BAT0 + external BAT1), Intel i5-8350U, Intel UHD 620 + NVIDIA Quadro P500, Omarchy 4.0.3-1, Quickshell 0.3.1

### What's wrong?

On a laptop with two batteries, the power panel (`omarchy.power`) shows contradictory numbers because `omarchy-battery-status` only ever looks at the first battery, while the bar icon and the panel's progress bar use UPower's composite `DisplayDevice`.

`bin/omarchy-battery-status`:

```bash
battery=$(upower -e 2>/dev/null | grep BAT | head -n 1)   # -> battery_BAT0 only
...
cycles=$(cat "$power_supply_path"/BAT*/cycle_count 2>/dev/null | head -1)
```

So in `panels/power/Panel.qml` the hero percentage (`root.batteryInfo.percentage`), "Battery size", "Time to full" and the charge rate all describe BAT0 alone, but `batteryFraction` / `batteryIcon()` (and the bar icon) are computed from `UPower.displayDevice`, which sums both packs.

**Observed** (BAT0 held at its 75–80% charge threshold, BAT1 charging):

| Source | Value |
|---|---|
| `upower -i .../battery_BAT0` | 80%, fully-charged, 31 Wh |
| `upower -i .../battery_BAT1` | 39%, charging, 67 Wh, 31 W, 1.2 h to full |
| `upower -i .../DisplayDevice` | 52%, charging, 98 Wh, 31 W, 1.4 h to full |
| Bar icon | ~52% (composite) ✔ |
| Panel hero number | **80%** (BAT0 only) |
| Panel progress bar | **52%** (composite) — disagrees with the number right above it |
| Panel "Battery size" | **31 Wh** (BAT0 only; machine has 98 Wh) |
| Panel "Time to full" / rate | **—** / **0 W** (BAT0 is idle at its threshold; BAT1 is actually charging at 31 W) |

`omarchy-battery-status --shell` output:

```
percentage	80%
state	holding
rate	0W
size	31Wh
time	
cycles	21
threshold	75-80%
```

**Expected:** the panel should either describe the composite battery (matching the icon and progress bar it already draws from `UPower.displayDevice`), and/or list each pack separately.

**Steps to reproduce:** open the power panel on any dual-battery ThinkPad (T4x0/T4x0s/P5x s-series, X1 Carbon w/ external pack, etc.) with the two packs at different charge levels.

**Suggested fix:** in `omarchy-battery-status`, read the `DisplayDevice` (`upower -i /org/freedesktop/UPower/devices/DisplayDevice`) instead of the first `BAT*` for percentage / size / time / rate, and sum `power_now` across all `BAT*` for the instantaneous rate. `Panel.qml` could also drop the script's percentage and use `Math.round(batteryFraction * 100)` so the hero number can never disagree with the bar beneath it. Happy to send a PR if that direction sounds right.

I worked around it locally by cloning the plugin, using `UPower.displayDevice` for the hero/stats and adding a per-pack list from `UPower.devices` (before/after screenshots attached).
  • 8a720aeb-59ee-43c8-b61b-f458017fed48
  • 708cd46a-1576-4574-98e8-33d27cfde33c

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.