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-43GitHub issuePublicFixed

omarchy-channel-set asks for the sudo password on every step; the switch never establishes its own authorization

Reported by nightdevil00 · filed Sep 27, 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

omarchy-channel-set asks for the sudo password on every step; the switch never establishes its own authorizationrevision 1 · captured 2026-09-28 21:23 UTC via poll

What happened

Switching stable -> edge from the menu (omarchy-channel-set edge) asked for the sudo password 19 times in a single switch on 2026-09-27. Nineteen, for one channel switch.

The run is reproducible from a log of the full session. Mapping each prompt to the step that issued it:

#StepSource
1sudo cp of /etc/pacman.conf ("Setting channel to edge")omarchy-channel-set:133 via omarchy-refresh-pacman:33
2pacman -S --needed --noconfirm --ask 4 omarchy-dev omarchy-settings-devomarchy-channel-set:137
3paccache -rk2 ("Prune package cache")omarchy-update:66
4-8snapper config query, create, and cleanup ("Create system snapshot")omarchy-update:71
9-10pacman-key refresh ("Update Arch signing keys")omarchy-update:78
11pacman -Syu ("Update system packages")omarchy-update:83
12-13migration 1788129995, "Replace Satty and Tensaku with Omasnap"omarchy-update:90
14migration 1788163635, "Remove legacy temporary passwordless sudo grants"omarchy-update:90
15migration 1788596255, "Add vi as a standard terminal editor"omarchy-update:90
16migration 1789294350, "Switch TCP congestion control to BBR with fq pacing"omarchy-update:90
17migration 1789764927, "Enable OWE desktop video backgrounds and lock feed"omarchy-update:90
18migration 1790042972, "Install Elsewhen"omarchy-update:90
19pacman -Rns ("Removing orphan system packages")omarchy-update:91

Steps 3-19 are all the hand-off update, not the switch itself. 41 of the shipped migrations call sudo, so this count scales with how many of them your machine has pending.

#13323 already fixed most of this

This report is a follow-up, not a duplicate. #13319 was closed by #13323 ("Ask for the sudo password once per omarchy update"), merged 2026-09-26. My run is omarchy-dev 4.0.0.r2304.g7b336b1-1, which predates that merge and still has the old shape: omarchy_security_enable_no_update_sudo at omarchy-update:28 puts the no-update wrapper on PATH for the whole run, and per-phase sudo -k revokes mean no timestamp survives to the next helper. That is the r2304 behaviour and it accounts for steps 3-19.

So the remaining gap is the one #13323's own description names:

Channel switching still authorizes its own steps command by command. The update it hands off to then asks once for its own phases.

The remaining gap, on current master

omarchy-channel-set still has no authorization of its own. It revokes the timestamp on entry (omarchy-channel-set:21) and never establishes one, so each of its privileged steps starts cold:

  1. omarchy-refresh-pacman revokes on entry (:24), then sudo cp (:33-37) — prompt 1.
  2. It revokes again around the pre-refresh-pacman hook (:44, :47) and calls pacman -Syyuu (:50) — prompt 2. Its EXIT cleanup trap (:23) revokes once more.
  3. omarchy-update-pacman -S --needed for the omarchy <-> omarchy-dev swap (omarchy-channel-set:137) — prompt 3. The cleanup trap on omarchy-channel-set revokes again.
  4. The hand-off omarchy-update then establishes its own — prompt 4.

That is four password entries for a channel switch where omarchy update now costs one, and on r2304 it was nineteen. I verified bin/omarchy-refresh-pacman and bin/omarchy-channel-set on master are byte-identical to the r2304 copies I ran, so this gap is still live.

Expected

A channel switch is a single user-initiated operation against the same machine, in the same terminal, with the same trust level as omarchy update. It should cost the same one authorization, not four.

Suggested direction

omarchy-channel-set already brackets itself with omarchy_security_install_sudo_cleanup_traps / omarchy_security_revoke_sudo_timestamp. It could establish one authorization after its entry revoke, in the same shape #13323 gave omarchy-update — one sudo /usr/bin/true and a keepalive — and hand that timestamp to the steps it trusts, omarchy-refresh-pacman and omarchy-update-pacman.

The two revokes inside omarchy-refresh-pacman are the part that needs care: they exist because pre-refresh-pacman is a user hook, and the comment at :41-43 is explicit that authorization the hook obtained must not carry into the transaction. Revoking the parent's shared authorization there would be wrong. The split that #13323 used is the obvious one: trusted steps reuse the shared authorization, the user hook and the transaction after it run cold. That still costs a second prompt after the hook, unless the hook boundary is what gets relaxed.

Worth deciding explicitly rather than inheriting: the pre-refresh-pacman hook is the only genuinely untrusted code between the first and last channel-switch prompts. Everything else in the switch is Omarchy's own scripts.

System details

Omarchy        4.0.0.r2304.g7b336b1-1 (omarchy-dev / omarchy-settings-dev, edge)
OMARCHY_PATH   /usr/share/omarchy
channel        stable -> edge
kernel         7.2.5-3-omarchy running, 7.2.5-4 installed by this switch
CPU            Intel Core i7-10750H (CometLake-H)
GPU            Intel UHD (GT2) + NVIDIA GTX 1650 Ti (hybrid)
sudo           1.9.17p2
date           2026-09-27

I can attach the full 981-line log from this run if it is useful.

View raw text
## What happened

Switching stable -> edge from the menu (`omarchy-channel-set edge`) asked for the sudo password **19 times** in a single switch on 2026-09-27. Nineteen, for one channel switch.

The run is reproducible from a log of the full session. Mapping each prompt to the step that issued it:

| # | Step | Source |
|---|------|--------|
| 1 | `sudo cp` of `/etc/pacman.conf` ("Setting channel to edge") | `omarchy-channel-set:133` via `omarchy-refresh-pacman:33` |
| 2 | `pacman -S --needed --noconfirm --ask 4 omarchy-dev omarchy-settings-dev` | `omarchy-channel-set:137` |
| 3 | `paccache -rk2` ("Prune package cache") | `omarchy-update:66` |
| 4-8 | `snapper` config query, `create`, and cleanup ("Create system snapshot") | `omarchy-update:71` |
| 9-10 | `pacman-key` refresh ("Update Arch signing keys") | `omarchy-update:78` |
| 11 | `pacman -Syu` ("Update system packages") | `omarchy-update:83` |
| 12-13 | migration 1788129995, "Replace Satty and Tensaku with Omasnap" | `omarchy-update:90` |
| 14 | migration 1788163635, "Remove legacy temporary passwordless sudo grants" | `omarchy-update:90` |
| 15 | migration 1788596255, "Add vi as a standard terminal editor" | `omarchy-update:90` |
| 16 | migration 1789294350, "Switch TCP congestion control to BBR with fq pacing" | `omarchy-update:90` |
| 17 | migration 1789764927, "Enable OWE desktop video backgrounds and lock feed" | `omarchy-update:90` |
| 18 | migration 1790042972, "Install Elsewhen" | `omarchy-update:90` |
| 19 | `pacman -Rns` ("Removing orphan system packages") | `omarchy-update:91` |

Steps 3-19 are all the hand-off update, not the switch itself. 41 of the shipped migrations call `sudo`, so this count scales with how many of them your machine has pending.

## #13323 already fixed most of this

This report is a follow-up, not a duplicate. #13319 was closed by #13323 ("Ask for the sudo password once per `omarchy update`"), merged 2026-09-26. My run is `omarchy-dev 4.0.0.r2304.g7b336b1-1`, which predates that merge and still has the old shape: `omarchy_security_enable_no_update_sudo` at `omarchy-update:28` puts the no-update wrapper on `PATH` for the **whole** run, and per-phase `sudo -k` revokes mean no timestamp survives to the next helper. That is the r2304 behaviour and it accounts for steps 3-19.

So the remaining gap is the one #13323's own description names:

> Channel switching still authorizes its own steps command by command. The update it hands off to then asks once for its own phases.

## The remaining gap, on current master

`omarchy-channel-set` still has no authorization of its own. It revokes the timestamp on entry (`omarchy-channel-set:21`) and never establishes one, so each of its privileged steps starts cold:

1. `omarchy-refresh-pacman` revokes on entry (`:24`), then `sudo cp` (`:33-37`) — prompt 1.
2. It revokes again around the `pre-refresh-pacman` hook (`:44`, `:47`) and calls `pacman -Syyuu` (`:50`) — prompt 2. Its `EXIT` cleanup trap (`:23`) revokes once more.
3. `omarchy-update-pacman -S --needed` for the `omarchy` <-> `omarchy-dev` swap (`omarchy-channel-set:137`) — prompt 3. The cleanup trap on `omarchy-channel-set` revokes again.
4. The hand-off `omarchy-update` then establishes its own — prompt 4.

That is **four** password entries for a channel switch where `omarchy update` now costs **one**, and on r2304 it was nineteen. I verified `bin/omarchy-refresh-pacman` and `bin/omarchy-channel-set` on master are byte-identical to the r2304 copies I ran, so this gap is still live.

## Expected

A channel switch is a single user-initiated operation against the same machine, in the same terminal, with the same trust level as `omarchy update`. It should cost the same one authorization, not four.

## Suggested direction

`omarchy-channel-set` already brackets itself with `omarchy_security_install_sudo_cleanup_traps` / `omarchy_security_revoke_sudo_timestamp`. It could establish one authorization after its entry revoke, in the same shape #13323 gave `omarchy-update` — one `sudo /usr/bin/true` and a keepalive — and hand that timestamp to the steps it trusts, `omarchy-refresh-pacman` and `omarchy-update-pacman`.

The two revokes inside `omarchy-refresh-pacman` are the part that needs care: they exist because `pre-refresh-pacman` is a user hook, and the comment at `:41-43` is explicit that authorization the hook obtained must not carry into the transaction. Revoking the parent's shared authorization there would be wrong. The split that #13323 used is the obvious one: trusted steps reuse the shared authorization, the user hook and the transaction after it run cold. That still costs a second prompt after the hook, unless the hook boundary is what gets relaxed.

Worth deciding explicitly rather than inheriting: the `pre-refresh-pacman` hook is the only genuinely untrusted code between the first and last channel-switch prompts. Everything else in the switch is Omarchy's own scripts.

## System details

```
Omarchy        4.0.0.r2304.g7b336b1-1 (omarchy-dev / omarchy-settings-dev, edge)
OMARCHY_PATH   /usr/share/omarchy
channel        stable -> edge
kernel         7.2.5-3-omarchy running, 7.2.5-4 installed by this switch
CPU            Intel Core i7-10750H (CometLake-H)
GPU            Intel UHD (GT2) + NVIDIA GTX 1650 Ti (hybrid)
sudo           1.9.17p2
date           2026-09-27
```

I can attach the full 981-line log from this run if it is useful.

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

  • Fixed bypr/13479· confirmed
  • Related PRpr/9474· 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 19:23 UTC