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 UPower's hwdb charge limit (75-80%) instead of the real asusctl-set limit, and a bogus 0 cycle count
Reported by chickymonkeys · filed Aug 18, 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 details
ASUS ROG Zephyrus G14 GA402XV (AMD Ryzen 9 7940HS, NVIDIA RTX 4060 + AMD Radeon 780M), Omarchy 4.0.0-1, kernel 7.1.8-arch1-3, asusctl 6.3.8-1, upower 1.91.3-1. SUPER+CTRL+P power panel.
What's wrong?
Two symptoms in the power panel's battery section, both traced to omarchy-battery-status preferring UPower over sysfs:
1. Charge limit shows 75-80% while the real limit is 60%.
asusctl battery limit 60 sets the real limit:
$ cat /sys/class/power_supply/BAT0/charge_control_end_threshold
60
$ asusctl battery info # end threshold: 60But UPower reports 75/80 and the widget shows that:
$ upower -i /org/freedesktop/UPower/devices/battery_BAT0 | grep threshold
charge-start-threshold: 75%
charge-end-threshold: 80%Root cause: UPower imports the udev hwdb default CHARGE_LIMIT=75,80 (from /usr/lib/udev/hwdb.d/60-upower-battery.hwdb via /usr/lib/udev/rules.d/60-upower-battery.rules), not the value asusctl/TLP actually set. The script reads thresholds from UPower first and only falls back to sysfs when UPower is empty, so the panel shows the hwdb default whenever it disagrees with the real limit. This affects any laptop where a tool sets a limit other than 75/80 (ASUS ROG, ThinkPads with TLP, etc.) — see e.g. Arch BBS #307781 and the systemd docs on CHARGE_LIMIT.
2. "Charge cycles" shows 0, but the EC exposes no real cycle count.
$ cat /sys/class/power_supply/BAT0/cycle_count
0The G14 EC only implements the basic ACPI _BIF method (not _BIX), so the kernel cannot read a cycle count and reports a literal 0; UPower reports charge-cycles: N/A. A July 2026 kernel patch (Armin Wolf) proposes removing POWER_SUPPLY_PROP_CYCLE_COUNT for _BIX-only devices because the 0 is meaningless. Several ECs/drivers do this (rust-battery #23 recommends treating 0 as None). Showing "0" misleads users into thinking the battery has zero wear.
Expected
- Charge limit reflects the real sysfs value (
charge_control_end_threshold), falling back to UPower only when sysfs exposes none. - Cycle count omits the misleading 0 (renders "—") when it is 0/empty; real counts still shown.
Steps to reproduce
- Set a charge limit that differs from 75/80, e.g.
asusctl battery limit 60(ortlp setcharge). - Open the power panel:
SUPER+CTRL+P. - Observe "Charge limit 75-80%" instead of 60%, and "Charge cycles 0".
Diagnostics
omarchy debug --no-sudo --print — attach output (or logs.omarchy.org share link). Screenshot of the panel attached (before/after).
Proposed fix (two atomic changes, regression-tested in test/shell.d/battery-status-test.sh)
- Prefer sysfs
charge_control_end_threshold/charge_control_start_thresholdover UPower; fall back to UPower only when the sysfs attribute is missing; don't fabricate a start threshold without a sysfs start file. - Omit the
cyclesline when the value is 0/empty.
View raw text
### System details
ASUS ROG Zephyrus G14 GA402XV (AMD Ryzen 9 7940HS, NVIDIA RTX 4060 + AMD Radeon 780M), Omarchy 4.0.0-1, kernel 7.1.8-arch1-3, asusctl 6.3.8-1, upower 1.91.3-1. `SUPER+CTRL+P` power panel.
### What's wrong?
Two symptoms in the power panel's battery section, both traced to `omarchy-battery-status` preferring UPower over sysfs:
**1. Charge limit shows 75-80% while the real limit is 60%.**
`asusctl battery limit 60` sets the real limit:
```
$ cat /sys/class/power_supply/BAT0/charge_control_end_threshold
60
$ asusctl battery info # end threshold: 60
```
But UPower reports 75/80 and the widget shows that:
```
$ upower -i /org/freedesktop/UPower/devices/battery_BAT0 | grep threshold
charge-start-threshold: 75%
charge-end-threshold: 80%
```
Root cause: UPower imports the **udev hwdb default** `CHARGE_LIMIT=75,80` (from `/usr/lib/udev/hwdb.d/60-upower-battery.hwdb` via `/usr/lib/udev/rules.d/60-upower-battery.rules`), not the value asusctl/TLP actually set. The script reads thresholds from UPower first and only falls back to sysfs when UPower is empty, so the panel shows the hwdb default whenever it disagrees with the real limit. This affects any laptop where a tool sets a limit other than 75/80 (ASUS ROG, ThinkPads with TLP, etc.) — see e.g. Arch BBS #307781 and the systemd docs on `CHARGE_LIMIT`.
**2. "Charge cycles" shows 0, but the EC exposes no real cycle count.**
```
$ cat /sys/class/power_supply/BAT0/cycle_count
0
```
The G14 EC only implements the basic ACPI `_BIF` method (not `_BIX`), so the kernel cannot read a cycle count and reports a literal 0; UPower reports `charge-cycles: N/A`. A July 2026 kernel patch (Armin Wolf) proposes *removing* `POWER_SUPPLY_PROP_CYCLE_COUNT` for `_BIX`-only devices because the 0 is meaningless. Several ECs/drivers do this (rust-battery #23 recommends treating 0 as None). Showing "0" misleads users into thinking the battery has zero wear.
### Expected
- Charge limit reflects the real sysfs value (`charge_control_end_threshold`), falling back to UPower only when sysfs exposes none.
- Cycle count omits the misleading 0 (renders "—") when it is 0/empty; real counts still shown.
### Steps to reproduce
1. Set a charge limit that differs from 75/80, e.g. `asusctl battery limit 60` (or `tlp setcharge`).
2. Open the power panel: `SUPER+CTRL+P`.
3. Observe "Charge limit 75-80%" instead of 60%, and "Charge cycles 0".
### Diagnostics
`omarchy debug --no-sudo --print` — attach output (or `logs.omarchy.org` share link). Screenshot of the panel attached (before/after).
### Proposed fix (two atomic changes, regression-tested in `test/shell.d/battery-status-test.sh`)
1. Prefer sysfs `charge_control_end_threshold`/`charge_control_start_threshold` over UPower; fall back to UPower only when the sysfs attribute is missing; don't fabricate a start threshold without a sysfs start file.
2. Omit the `cycles` line when the value is 0/empty.
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
- Related PRpr/12177· confirmed
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 04:42 UTC