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.
omarchy-powerprofiles-set fails at boot (exit 1): CPU power profile never applied on AC
Reported by kshatriya-abhay · filed Aug 25, 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
Summary
omarchy-powerprofiles-set fails with exit code 1 on every AC-detection udev event during boot, so the CPU power profile is never applied on AC. The system stays on whatever profile power-profiles-daemon defaulted to (e.g. power-saver from a battery session), so the CPU is throttled even while plugged in.
Environment
- Omarchy 4.0.0-1 (package;
/usr/share/omarchy/versionreports4.0.0.alpha) - power-profiles-daemon 0.30-1
- Kernel 7.1.8-arch1-3
- CPU: 11th Gen Intel Core i7-11800H (Acer Nitro)
- Last package update: Aug 21 2026
Symptoms
journalctlshows the udev-driven profile setter failing with exit code 1 at every AC event during boot.powerprofilesctl getdoes not show the intended AC profile (performance) after boot.
Evidence
Journal (today, 3 boots):
Aug 25 11:01:56 acer-nitro (udev-worker)[770]: ACAD: Process '/usr/bin/systemd-run --no-block --collect --unit=omarchy-power-profile --property=After=power-profiles-daemon.service /home/abhay/.local/share/omarchy/bin/omarchy-powerprofiles-set' failed with exit code 1.
Aug 25 11:01:57 acer-nitro (udev-worker)[758]: ucsi-source-psy-USBC000:001: Process '/usr/bin/systemd-run --no-block --collect --unit=omarchy-power-profile --property=After=power-profiles-daemon.service /home/abhay/.local/share/omarchy/bin/omarchy-powerprofiles-set' failed with exit code 1.
Aug 25 11:02:01 acer-nitro systemd[1]: Starting Power Profiles daemon...
Aug 25 12:27:52 acer-nitro (udev-worker)[774]: ACAD: Process '...omarchy-powerprofiles-set' failed with exit code 1.
Aug 25 13:11:44 acer-nitro (udev-worker)[760]: ACAD: Process '...omarchy-powerprofiles-set' failed with exit code 1.Note the ordering: the udev event fires (11:01:56) before power-profiles-daemon starts (11:02:01), so powerprofilesctl set fails because the daemon isn't up.
Root cause
/etc/udev/rules.d/99-power-profile.rules:
SUBSYSTEM=="power_supply", ATTR{type}=="Mains", RUN+="/usr/bin/systemd-run --no-block --collect --unit=omarchy-power-profile --property=After=power-profiles-daemon.service /home/abhay/.local/share/omarchy/bin/omarchy-powerprofiles-set"systemd-run --no-blockdoes not wait for the transient unit; theAfter=power-profiles-daemon.serviceordering only applies when both units are part of the same transaction, which is not guaranteed here because udev fires the RUN program directly and the daemon may not be started yet at boot.- Result: the script races the daemon and loses;
powerprofilesctl setexits 1; the AC profile (defaultperformance) is never applied. - User state confirms the asymmetry:
~/.local/state/omarchy/powerprofiles/contains onlybattery: power-saver(noacfile), so on AC the intended profile comes from the default fallback in the script — which is never reached when the daemon is down.
Expected behavior
The AC/battery power profile should be applied reliably on every power-source event, including during boot, even if power-profiles-daemon starts after the udev event.
Suggested fix directions
- Drop
--no-block(or add--wait) so the ordering actually synchronizes, or - Have the script itself wait/retry for the daemon (e.g. loop on
powerprofilesctlorbusctlup to N seconds), or - Trigger the setter from a systemd service with proper
After=power-profiles-daemon.service/Requires=ordering instead of a udev RUN program.
Steps to reproduce
- On battery, let the profile settle to
power-saver(state file written). - Reboot while unplugged, then plug in AC (or reboot with AC attached).
- Observe
journalctl --since boot | grep omarchy-powerprofiles-set→ exit code 1. powerprofilesctl getwill not show the AC profile (performance).
Impact
The CPU profile is not switched to performance on AC as intended, so the CPU stays throttled (e.g. in power-saver) while plugged in. This is a functional bug in profile application; the performance impact on this machine was CPU-level only.
Note (out of scope for this bug)
Initial investigation surfaced a concurrent symptom — slow HDD writes (~12 MB/s) on this machine — which was initially assumed to be related. It was subsequently determined to be independent: power-profiles-daemon on this system manages only the CPU (no disk/APM handling), and the drive's aggressive head parking is a firmware characteristic (WD IntelliPark, 63k load cycles over 11k power-on hours). That is a drive-firmware matter, not an Omarchy bug.
View raw text
## Summary
`omarchy-powerprofiles-set` fails with exit code 1 on every AC-detection udev event during boot, so the CPU power profile is never applied on AC. The system stays on whatever profile power-profiles-daemon defaulted to (e.g. `power-saver` from a battery session), so the CPU is throttled even while plugged in.
## Environment
- Omarchy 4.0.0-1 (package; `/usr/share/omarchy/version` reports `4.0.0.alpha`)
- power-profiles-daemon 0.30-1
- Kernel 7.1.8-arch1-3
- CPU: 11th Gen Intel Core i7-11800H (Acer Nitro)
- Last package update: Aug 21 2026
## Symptoms
- `journalctl` shows the udev-driven profile setter failing with exit code 1 at every AC event during boot.
- `powerprofilesctl get` does not show the intended AC profile (`performance`) after boot.
## Evidence
Journal (today, 3 boots):
```
Aug 25 11:01:56 acer-nitro (udev-worker)[770]: ACAD: Process '/usr/bin/systemd-run --no-block --collect --unit=omarchy-power-profile --property=After=power-profiles-daemon.service /home/abhay/.local/share/omarchy/bin/omarchy-powerprofiles-set' failed with exit code 1.
Aug 25 11:01:57 acer-nitro (udev-worker)[758]: ucsi-source-psy-USBC000:001: Process '/usr/bin/systemd-run --no-block --collect --unit=omarchy-power-profile --property=After=power-profiles-daemon.service /home/abhay/.local/share/omarchy/bin/omarchy-powerprofiles-set' failed with exit code 1.
Aug 25 11:02:01 acer-nitro systemd[1]: Starting Power Profiles daemon...
Aug 25 12:27:52 acer-nitro (udev-worker)[774]: ACAD: Process '...omarchy-powerprofiles-set' failed with exit code 1.
Aug 25 13:11:44 acer-nitro (udev-worker)[760]: ACAD: Process '...omarchy-powerprofiles-set' failed with exit code 1.
```
Note the ordering: the udev event fires (11:01:56) *before* power-profiles-daemon starts (11:02:01), so `powerprofilesctl set` fails because the daemon isn't up.
## Root cause
`/etc/udev/rules.d/99-power-profile.rules`:
```
SUBSYSTEM=="power_supply", ATTR{type}=="Mains", RUN+="/usr/bin/systemd-run --no-block --collect --unit=omarchy-power-profile --property=After=power-profiles-daemon.service /home/abhay/.local/share/omarchy/bin/omarchy-powerprofiles-set"
```
- `systemd-run --no-block` does not wait for the transient unit; the `After=power-profiles-daemon.service` ordering only applies when both units are part of the same transaction, which is not guaranteed here because udev fires the RUN program directly and the daemon may not be started yet at boot.
- Result: the script races the daemon and loses; `powerprofilesctl set` exits 1; the AC profile (default `performance`) is never applied.
- User state confirms the asymmetry: `~/.local/state/omarchy/powerprofiles/` contains only `battery: power-saver` (no `ac` file), so on AC the intended profile comes from the default fallback in the script — which is never reached when the daemon is down.
## Expected behavior
The AC/battery power profile should be applied reliably on every power-source event, including during boot, even if power-profiles-daemon starts after the udev event.
## Suggested fix directions
- Drop `--no-block` (or add `--wait`) so the ordering actually synchronizes, or
- Have the script itself wait/retry for the daemon (e.g. loop on `powerprofilesctl` or `busctl` up to N seconds), or
- Trigger the setter from a systemd service with proper `After=power-profiles-daemon.service` / `Requires=` ordering instead of a udev RUN program.
## Steps to reproduce
1. On battery, let the profile settle to `power-saver` (state file written).
2. Reboot while unplugged, then plug in AC (or reboot with AC attached).
3. Observe `journalctl --since boot | grep omarchy-powerprofiles-set` → exit code 1.
4. `powerprofilesctl get` will not show the AC profile (`performance`).
## Impact
The CPU profile is not switched to `performance` on AC as intended, so the CPU stays throttled (e.g. in `power-saver`) while plugged in. This is a functional bug in profile application; the performance impact on this machine was CPU-level only.
### Note (out of scope for this bug)
Initial investigation surfaced a concurrent symptom — slow HDD writes (~12 MB/s) on this machine — which was initially assumed to be related. It was subsequently determined to be independent: power-profiles-daemon on this system manages only the CPU (no disk/APM handling), and the drive's aggressive head parking is a firmware characteristic (WD IntelliPark, 63k load cycles over 11k power-on hours). That is a drive-firmware matter, not an Omarchy bug.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/12552· 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 08:44 UTC