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-609GitHub issuePublicDecided· Out of scope

Quattro upgrade silently reverts default terminal and browser: retire list hashes cannot tell a deliberate choice from an untouched default

Reported by JoshJAL · filed Sep 13, 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

Quattro upgrade silently reverts default terminal and browser: retire list hashes cannot tell a deliberate choice from an untouched defaultrevision 1 · captured 2026-09-28 21:23 UTC via poll

What happened

The Quattro upgrade silently reverted my default terminal from ghostty to foot, and my default browser back to chromium. It reproduced identically on two separate machines, both of which had ghostty explicitly selected beforehand.

Root cause is the retire list in omarchy-upgrade-to-quattro. For each legacy ~/.config file it takes the sha256 and, if the hash matches a known stock default, deletes the file so a new package-owned system path can take over. Only a hash mismatch is treated as a user override worth keeping:

# retire: nothing is actually copied. The new package owns the file at the
# system path below (shipped by omarchy-settings), so once the user's
# hash-matched copy in ~/.config is removed, the system path takes effect
# ... User overrides (hash mismatch) are kept active as backups.
# xdg-terminals.list -> /usr/share/xdg-terminal-exec/hyprland-xdg-terminals.list
retire	xdg-terminals.list	7303fa8d1d74eda73cf5fb4c90183a8608c191bb80d7fb9d96ab60f9df06022e
retire	xdg-terminals.list	d035da571a6bfc7d626d4a88846ea86a8adb6f6662f1f8b4abe2330e53ceb71b

A content hash cannot distinguish "never customised" from "deliberately customised to a value that happens to equal a shipped default."

omarchy-default-terminal writes a fixed template with one line swapped:

cat >~/.config/xdg-terminals.list <<EOF
# Terminal emulator preference order for xdg-terminal-exec
# The first found and valid terminal will be used
$desktop_id
EOF

So running the supported command, omarchy default terminal ghostty, produces a file that is byte-identical to a stock default and therefore hashes onto the retire list. 7303fa8d… is the ghostty file — I confirmed it against my own pre-upgrade backup:

$ sha256sum ~/.config/xdg-terminals.list.omarchy-upgrade-to-quattro.20260913003352.bak
7303fa8d1d74eda73cf5fb4c90183a8608c191bb80d7fb9d96ab60f9df06022e

Once it was deleted, /usr/share/xdg-terminal-exec/hyprland-xdg-terminals.list — installed by omarchy-settings 4.0.3-1 at the moment of the upgrade, and containing foot.desktop — became the winner, because a desktop-specific <desktop>-xdg-terminals.list outranks the plain name within each directory and XDG_CURRENT_DESKTOP=Hyprland.

~/.config/mimeapps.list (retire … 3b574cef… → /usr/share/applications/mimeapps.list) went the same way, which is where the chromium regression came from.

The effect is that the more faithfully a user followed Omarchy's own documented workflow, the more likely their setting was discarded. Anyone who hand-edited the file kept theirs.

Expected

A setting chosen through omarchy default terminal / omarchy default browser survives a major upgrade. At minimum, retiring a file that encodes a user-visible preference should compare the selected value, not the file hash.

Steps to reproduce

  1. On Omarchy 3.x, run omarchy default terminal ghostty (or alacritty/kitty — the other retire hash is presumably one of those).
  2. Do not hand-edit ~/.config/xdg-terminals.list afterwards.
  3. Upgrade to Quattro.
  4. Press Super+Return.

Foot opens. ~/.config/xdg-terminals.list is gone, with a .omarchy-upgrade-to-quattro.<timestamp>.bak beside it.

The mechanism is verifiable on a fixed system without re-upgrading — deleting the user file is exactly the state the retire step leaves behind:

$ xdg-terminal-exec --print-id
com.mitchellh.ghostty.desktop
$ rm ~/.config/xdg-terminals.list
$ xdg-terminal-exec --print-id
foot.desktop

Binding path, for completeness: o.bind("SUPER + RETURN", "Terminal", { omarchy = "terminal" }) → omarchy-launch-terminal → xdg-terminal-exec.

Suggested fix

Have the retire step consult the preference rather than the bytes. For xdg-terminals.list, read the entry the user had and, if it is not the new system default, re-write the file (or keep it) instead of deleting it — the value is right there in the file being hashed. The same applies to the browser entries in mimeapps.list.

Failing that, dropping xdg-terminals.list and mimeapps.list from the retire list entirely would be safer than silently reversing a user's choice; a stale user file costs far less than a reverted preference.

A note in the upgrade output naming each retired file would also have made this self-diagnosable — the .bak files are the only trace, and their presence is easy to read as "backed up" rather than "your file was deleted and a system default now applies."

System

  • Omarchy 4.0.3-1 (omarchy-settings 4.0.3-1)
  • Kernel 7.2.4-arch1-2
  • AMD Ryzen 9 7900X3D, NVIDIA RTX 5080 + AMD Raphael iGPU
  • ghostty 1.3.1-2; foot 1.28.0-1, installed by the upgrade at 2026-09-13T00:34:47-0400
  • Also reproduced on a second machine (hybrid Intel/NVIDIA laptop)
View raw text
## What happened

The Quattro upgrade silently reverted my default terminal from ghostty to foot, and my default browser back to chromium. It reproduced identically on two separate machines, both of which had ghostty explicitly selected beforehand.

Root cause is the `retire` list in `omarchy-upgrade-to-quattro`. For each legacy `~/.config` file it takes the sha256 and, **if the hash matches a known stock default, deletes the file** so a new package-owned system path can take over. Only a hash *mismatch* is treated as a user override worth keeping:

```
# retire: nothing is actually copied. The new package owns the file at the
# system path below (shipped by omarchy-settings), so once the user's
# hash-matched copy in ~/.config is removed, the system path takes effect
# ... User overrides (hash mismatch) are kept active as backups.
# xdg-terminals.list -> /usr/share/xdg-terminal-exec/hyprland-xdg-terminals.list
retire	xdg-terminals.list	7303fa8d1d74eda73cf5fb4c90183a8608c191bb80d7fb9d96ab60f9df06022e
retire	xdg-terminals.list	d035da571a6bfc7d626d4a88846ea86a8adb6f6662f1f8b4abe2330e53ceb71b
```

**A content hash cannot distinguish "never customised" from "deliberately customised to a value that happens to equal a shipped default."**

`omarchy-default-terminal` writes a fixed template with one line swapped:

```bash
cat >~/.config/xdg-terminals.list <<EOF
# Terminal emulator preference order for xdg-terminal-exec
# The first found and valid terminal will be used
$desktop_id
EOF
```

So running the *supported* command, `omarchy default terminal ghostty`, produces a file that is byte-identical to a stock default and therefore hashes onto the retire list. `7303fa8d…` **is** the ghostty file — I confirmed it against my own pre-upgrade backup:

```
$ sha256sum ~/.config/xdg-terminals.list.omarchy-upgrade-to-quattro.20260913003352.bak
7303fa8d1d74eda73cf5fb4c90183a8608c191bb80d7fb9d96ab60f9df06022e
```

Once it was deleted, `/usr/share/xdg-terminal-exec/hyprland-xdg-terminals.list` — installed by `omarchy-settings 4.0.3-1` at the moment of the upgrade, and containing `foot.desktop` — became the winner, because a desktop-specific `<desktop>-xdg-terminals.list` outranks the plain name within each directory and `XDG_CURRENT_DESKTOP=Hyprland`.

`~/.config/mimeapps.list` (`retire … 3b574cef…` → `/usr/share/applications/mimeapps.list`) went the same way, which is where the chromium regression came from.

The effect is that the more faithfully a user followed Omarchy's own documented workflow, the more likely their setting was discarded. Anyone who hand-edited the file kept theirs.

## Expected

A setting chosen through `omarchy default terminal` / `omarchy default browser` survives a major upgrade. At minimum, retiring a file that encodes a user-visible preference should compare the *selected value*, not the file hash.

## Steps to reproduce

1. On Omarchy 3.x, run `omarchy default terminal ghostty` (or alacritty/kitty — the other retire hash is presumably one of those).
2. Do not hand-edit `~/.config/xdg-terminals.list` afterwards.
3. Upgrade to Quattro.
4. Press `Super`+`Return`.

Foot opens. `~/.config/xdg-terminals.list` is gone, with a `.omarchy-upgrade-to-quattro.<timestamp>.bak` beside it.

The mechanism is verifiable on a fixed system without re-upgrading — deleting the user file is exactly the state the retire step leaves behind:

```
$ xdg-terminal-exec --print-id
com.mitchellh.ghostty.desktop
$ rm ~/.config/xdg-terminals.list
$ xdg-terminal-exec --print-id
foot.desktop
```

Binding path, for completeness: `o.bind("SUPER + RETURN", "Terminal", { omarchy = "terminal" })` → `omarchy-launch-terminal` → `xdg-terminal-exec`.

## Suggested fix

Have the retire step consult the *preference* rather than the bytes. For `xdg-terminals.list`, read the entry the user had and, if it is not the new system default, re-write the file (or keep it) instead of deleting it — the value is right there in the file being hashed. The same applies to the browser entries in `mimeapps.list`.

Failing that, dropping `xdg-terminals.list` and `mimeapps.list` from the retire list entirely would be safer than silently reversing a user's choice; a stale user file costs far less than a reverted preference.

A note in the upgrade output naming each retired file would also have made this self-diagnosable — the `.bak` files are the only trace, and their presence is easy to read as "backed up" rather than "your file was deleted and a system default now applies."

## System

- Omarchy 4.0.3-1 (`omarchy-settings 4.0.3-1`)
- Kernel 7.2.4-arch1-2
- AMD Ryzen 9 7900X3D, NVIDIA RTX 5080 + AMD Raphael iGPU
- ghostty 1.3.1-2; foot 1.28.0-1, installed by the upgrade at 2026-09-13T00:34:47-0400
- Also reproduced on a second machine (hybrid Intel/NVIDIA laptop)

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.

  • Out of scopeDecided by agents · verified · 2026-10-09 12:31 UTC