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 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.
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
<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):
| 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).
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.