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-upgrade-to-quattro force-overwrites shell.json instead of migrating it, silently dropping bar/plugin config
Reported by Orneyfish · filed Aug 26, 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 quattro upgrade via omarchy-upgrade-to-quattro, Hyprland session.
What happened
After running omarchy upgrade to quattro, all bar customizations and enabled plugins disappeared: extra bar widgets (a third-party plugin widget, media, a theme switcher, active-window, others), the enabled-plugins list, transparent: true, and custom idle timers were all gone, reset to stock quattro defaults. Nothing was actually deleted from disk — every plugin directory under ~/.config/omarchy/plugins/ was untouched — only ~/.config/omarchy/shell.json had been reset.
Root cause
omarchy-upgrade-to-quattro lists omarchy/shell.json in always_copy_config_files (around line 1641), with the comment:
# These new Omarchy quattro config entry points. Older installs cannot have
# Omarchy-shipped legacy copy hash-match, so always install quattro default.backup_config_file() does save the previous file to shell.json.omarchy-upgrade-to-quattro.<timestamp>.bak before overwriting, so the data isn't lost — but the live file is unconditionally replaced with the stock quattro default regardless of whether the user's existing shell.json was already valid, parseable, and customized. There's no attempt to merge the user's bar.layout, plugins, idle, or bar.transparent values onto the new default, and no prompt or notification telling the user this happened or that a .bak exists to restore from.
The schema is unchanged between pre- and post-quattro shell.json (bar, idle, plugins, version — no new required keys), so a straight restore of the .bak works fine, which suggests a merge (or even just a "restore any preserved fields the new schema still supports") is feasible instead of a blanket overwrite.
This is the same failure family as #7100 (shell.json getting silently reset to defaults with no data-loss protection) and the same blanket-overwrite pattern flagged in #8173 for a different upgrade-time file, but this is specifically about the quattro upgrade path clobbering a previously valid, user-customized shell.json.
Suggested enhancement
- During the quattro upgrade, migrate/merge the existing
shell.json(bar layout, plugin list, idle timers, transparency) onto the new default schema instead of unconditionally overwriting it, since the schema is compatible. - If a full merge isn't feasible for some fields, at minimum print a clear message pointing at the
.bakfile so users know their config was preserved and how to restore it, rather than discovering the loss silently.
Repro
- Have a customized
~/.config/omarchy/shell.json(extra bar widgets, enabled plugins,transparent: true, custom idle timers) on a pre-quattro install. - Run
omarchy upgrade to quattro. - Observe
~/.config/omarchy/shell.jsonnow matches the stock quattro default, while~/.config/omarchy/shell.json.omarchy-upgrade-to-quattro.<timestamp>.bakcontains the pre-upgrade customized config — confirming nothing was lost, just discarded from the live file.
View raw text
**System details:** Omarchy quattro upgrade via `omarchy-upgrade-to-quattro`, Hyprland session. ## What happened After running `omarchy upgrade to quattro`, all bar customizations and enabled plugins disappeared: extra bar widgets (a third-party plugin widget, media, a theme switcher, active-window, others), the enabled-plugins list, `transparent: true`, and custom idle timers were all gone, reset to stock quattro defaults. Nothing was actually deleted from disk — every plugin directory under `~/.config/omarchy/plugins/` was untouched — only `~/.config/omarchy/shell.json` had been reset. ## Root cause `omarchy-upgrade-to-quattro` lists `omarchy/shell.json` in `always_copy_config_files` (around line 1641), with the comment: ``` # These new Omarchy quattro config entry points. Older installs cannot have # Omarchy-shipped legacy copy hash-match, so always install quattro default. ``` `backup_config_file()` does save the previous file to `shell.json.omarchy-upgrade-to-quattro.<timestamp>.bak` before overwriting, so the data isn't lost — but the live file is unconditionally replaced with the stock quattro default regardless of whether the user's existing `shell.json` was already valid, parseable, and customized. There's no attempt to merge the user's `bar.layout`, `plugins`, `idle`, or `bar.transparent` values onto the new default, and no prompt or notification telling the user this happened or that a `.bak` exists to restore from. The schema is unchanged between pre- and post-quattro `shell.json` (`bar`, `idle`, `plugins`, `version` — no new required keys), so a straight restore of the `.bak` works fine, which suggests a merge (or even just a "restore any preserved fields the new schema still supports") is feasible instead of a blanket overwrite. This is the same failure family as #7100 (shell.json getting silently reset to defaults with no data-loss protection) and the same blanket-overwrite pattern flagged in #8173 for a different upgrade-time file, but this is specifically about the quattro upgrade path clobbering a previously valid, user-customized `shell.json`. ## Suggested enhancement - During the quattro upgrade, migrate/merge the existing `shell.json` (bar layout, plugin list, idle timers, transparency) onto the new default schema instead of unconditionally overwriting it, since the schema is compatible. - If a full merge isn't feasible for some fields, at minimum print a clear message pointing at the `.bak` file so users know their config was preserved and how to restore it, rather than discovering the loss silently. ## Repro 1. Have a customized `~/.config/omarchy/shell.json` (extra bar widgets, enabled plugins, `transparent: true`, custom idle timers) on a pre-quattro install. 2. Run `omarchy upgrade to quattro`. 3. Observe `~/.config/omarchy/shell.json` now matches the stock quattro default, while `~/.config/omarchy/shell.json.omarchy-upgrade-to-quattro.<timestamp>.bak` contains the pre-upgrade customized config — confirming nothing was lost, just discarded from the live file.
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 09:14 UTC