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.
silently leaves packages from the previous channel installed (edge > stable)
Reported by jaroet · filed Oct 5, 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
Omarchy 4.0.4-1
What's wrong?
omarchy channel set silently leaves packages from the previous channel installed, and omarchy-update-orphan-pkgs cannot detect them
Summary
After switching from the edge channel back to stable, applications that were only ever published on edge remain installed. They are not reported by the update, not offered by the orphan-cleanup step, and no prompt or warning appears at any point. Because they are no longer provided by any configured repository, pacman -Qem lists them, which makes omarchy-update-aur-pkgs run yay -Sua against those names on every subsequent update.
Steps to reproduce
omarchy channel set edge- Install an application that is only published on the
edgechannel. omarchy channel set stablepacman -Qem— theedge-only package is still listed.pacman -Qdt— the package is not listed, soomarchy-update-orphan-pkgsnever offers it for removal.omarchy update— the AUR update step now runs on every update.
What happened
After switching edge → stable, two packages installed from the edge channel stayed installed. Neither is provided by core, extra, multilib, or the stable omarchy repository any more, but both remain installed with Install Reason: Explicitly installed.
omarchy-update-aur-pkgs gates on pacman -Qem (bin/omarchy-update-aur-pkgs:5), so it ran on every update and invoked:
yay -Sua --noconfirm --cleanafter --ignore gcc14,gcc14-libs(bin/omarchy-update-aur-pkgs:8)
yay resolved one of the leftover names against the AUR. An unrelated project in the AUR shares that name and carries a higher version number, so yay treated it as an available upgrade and built it. That project is a Rust/Tauri application: each update downloaded roughly 495 crates (~48 MiB) and started compiling 783, and the build was never able to complete, so the installed version never changed. Because the version mismatch therefore survived every run, and because --cleanafter removes the build directory after a successful install (which never happened), every subsequent omarchy update repeated the full download and compile from scratch.
yay additionally printed Packages not in AUR: <name> for the second leftover package on every run. That is a direct signal that a locally installed package is not resolvable, and it is currently only a passing log line.
Root cause
Two independent gaps combine to produce this.
1. The channel switch never computes the difference between channels.
bin/omarchy-channel-set refreshes the pacman configuration for the new channel (omarchy-refresh-pacman, line 86), reinstalls only omarchy and omarchy-settings (line 88), and then runs omarchy-update -y (line 99). It never compares which packages the previous channel provided against which packages the new channel provides, so packages unique to the old channel are simply left behind.
2. The only automated cleanup structurally cannot catch them.
omarchy-update-orphan-pkgs is the existing cleanup step, but it collects candidates with:
mapfile -t orphans < <(pacman -Qtdq 2>/dev/null || true)(bin/omarchy-update-orphan-pkgs:8)
pacman -Qtdq returns only orphaned packages — those installed as a dependency, or auto-installed. A package the user installed explicitly that has since lost its repository is not an orphan, so this step can never surface the exact failure mode of a channel switch.
Impact
Leaving an edge-only package installed has consequences beyond a stale package:
pacman -Qemstays non-empty, so the AUR update step runs on everyomarchy updateeven for users with no AUR packages at all.- Any leftover name that happens to match an unrelated, higher-versioned AUR project triggers a full source build on every update, indefinitely.
--cleanafterguarantees the build directory is not reused, so nothing is cached between runs.
The user receives no indication that a channel switch left anything behind, and the one cleanup step that exists reports nothing.
Expected behavior
Either of these would prevent it:
omarchy channel setreports packages that are installed but no longer provided by any configured repository, and offers to remove them as part of the switch; oromarchy-update-orphan-pkgsadditionally considers installed packages that are not provided by any repository, not justpacman -Qtdqorphans.
Environment
- Omarchy 4.0.4-1
- Arch Linux, yay 13.0.1
- Reproduced by switching
edge→stable
View raw text
### System details Omarchy 4.0.4-1 ### What's wrong? # `omarchy channel set` silently leaves packages from the previous channel installed, and `omarchy-update-orphan-pkgs` cannot detect them ## Summary After switching from the `edge` channel back to `stable`, applications that were only ever published on `edge` remain installed. They are not reported by the update, not offered by the orphan-cleanup step, and no prompt or warning appears at any point. Because they are no longer provided by any configured repository, `pacman -Qem` lists them, which makes `omarchy-update-aur-pkgs` run `yay -Sua` against those names on every subsequent update. ## Steps to reproduce 1. `omarchy channel set edge` 2. Install an application that is only published on the `edge` channel. 3. `omarchy channel set stable` 4. `pacman -Qem` — the `edge`-only package is still listed. 5. `pacman -Qdt` — the package is **not** listed, so `omarchy-update-orphan-pkgs` never offers it for removal. 6. `omarchy update` — the AUR update step now runs on every update. ## What happened After switching `edge` → `stable`, two packages installed from the `edge` channel stayed installed. Neither is provided by `core`, `extra`, `multilib`, or the `stable` omarchy repository any more, but both remain installed with `Install Reason: Explicitly installed`. `omarchy-update-aur-pkgs` gates on `pacman -Qem` (`bin/omarchy-update-aur-pkgs:5`), so it ran on every update and invoked: ``` yay -Sua --noconfirm --cleanafter --ignore gcc14,gcc14-libs ``` (`bin/omarchy-update-aur-pkgs:8`) yay resolved one of the leftover names against the AUR. An **unrelated** project in the AUR shares that name and carries a higher version number, so yay treated it as an available upgrade and built it. That project is a Rust/Tauri application: each update downloaded roughly 495 crates (~48 MiB) and started compiling 783, and the build was never able to complete, so the installed version never changed. Because the version mismatch therefore survived every run, and because `--cleanafter` removes the build directory after a successful install (which never happened), every subsequent `omarchy update` repeated the full download and compile from scratch. yay additionally printed `Packages not in AUR: <name>` for the second leftover package on every run. That is a direct signal that a locally installed package is not resolvable, and it is currently only a passing log line. ## Root cause Two independent gaps combine to produce this. **1. The channel switch never computes the difference between channels.** `bin/omarchy-channel-set` refreshes the pacman configuration for the new channel (`omarchy-refresh-pacman`, line 86), reinstalls only `omarchy` and `omarchy-settings` (line 88), and then runs `omarchy-update -y` (line 99). It never compares which packages the previous channel provided against which packages the new channel provides, so packages unique to the old channel are simply left behind. **2. The only automated cleanup structurally cannot catch them.** `omarchy-update-orphan-pkgs` is the existing cleanup step, but it collects candidates with: ``` mapfile -t orphans < <(pacman -Qtdq 2>/dev/null || true) ``` (`bin/omarchy-update-orphan-pkgs:8`) `pacman -Qtdq` returns only *orphaned* packages — those installed as a dependency, or auto-installed. A package the user installed explicitly that has since lost its repository is **not** an orphan, so this step can never surface the exact failure mode of a channel switch. ## Impact Leaving an `edge`-only package installed has consequences beyond a stale package: - `pacman -Qem` stays non-empty, so the AUR update step runs on every `omarchy update` even for users with no AUR packages at all. - Any leftover name that happens to match an unrelated, higher-versioned AUR project triggers a full source build on every update, indefinitely. - `--cleanafter` guarantees the build directory is not reused, so nothing is cached between runs. The user receives no indication that a channel switch left anything behind, and the one cleanup step that exists reports nothing. ## Expected behavior Either of these would prevent it: - `omarchy channel set` reports packages that are installed but no longer provided by any configured repository, and offers to remove them as part of the switch; or - `omarchy-update-orphan-pkgs` additionally considers installed packages that are not provided by any repository, not just `pacman -Qtdq` orphans. ## Environment - Omarchy 4.0.4-1 - Arch Linux, yay 13.0.1 - Reproduced by switching `edge` → `stable`
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/8781· 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 21:32 UTC