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.
Shell startup can overwrite enabled plugins with defaults before user config loads
Reported by ekollof · filed Oct 6, 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
AMD Ryzen 7 5800X3D, AMD Navi 21 GPU, Omarchy dev (86aea9d6), dev-linked Quattro checkout. The startup code is also present in upstream quattro at 81145eb1.
What's wrong?
Changing the system font restarted the shell and my enabled third-party plugins disappeared from ~/.config/omarchy/shell.json. The file was replaced by the stock config plus Elsewhen's automatically seeded cities. Motion Wallpaper, OMAConnect, the on-screen keyboard, and its applet stopped loading. Their installed files and wallpaper playback state were intact; re-enabling them restored playback.
Observed timeline (2026-10-06, Europe/Amsterdam):
- 08:10: the shell log confirms the custom keyboard and OMAConnect plugins were loaded.
- 08:16:03–04:
omarchy font set "BerkeleyMono Nerd Font Mono"caused a shell restart. - 08:16:23: shell.json was replaced. Its contents match the default configuration after JSON serialization, except for Elsewhen's seeded cities;
pluginsis empty and the custom bar widgets are absent. omarchy notification font systemwas also run in this interval. The exact production event ordering has not been reproduced, so the font command is an observed trigger, not proof that every font change causes this.
Validated unsafe path
defaultsFile.onLoaded calls loadDefaults() → applyShellConfig(). The user FileView loads asynchronously and text() can return an empty string before the first load completes. The shell consequently uses defaults. Widget initialization (for example Elsewhen's seedFirstRun()) can then call updateEntryInline() → persistShellConfig(), which writes that whole fallback configuration over the existing user file.
A deterministic regression test executes the actual host configuration functions, delays the user-read completion behind defaults, and invokes an automatic widget mutation. On unmodified upstream code the test records a write containing defaults before user data has arrived. With a readiness/write guard it records no premature write and subsequent edits preserve the custom plugin entries.
Expected: restarts and font changes preserve enabled plugins and other user configuration. Fallback display state must not overwrite a pending, invalid, or unreadable user configuration. A genuinely missing file should still support first-run customization.
Related: #10885 / #13913 concern stale configuration during concurrent external edits; #12990 / #12992 / #13104 concern truncated files. This report isolates initial asynchronous loading and fallback persistence. Quickshell documents the initial empty read at https://quickshell.org/docs/v0.2.1/types/Quickshell.Io/FileView/.
View raw text
### System details AMD Ryzen 7 5800X3D, AMD Navi 21 GPU, Omarchy dev (86aea9d6), dev-linked Quattro checkout. The startup code is also present in upstream quattro at 81145eb1. ### What's wrong? Changing the system font restarted the shell and my enabled third-party plugins disappeared from `~/.config/omarchy/shell.json`. The file was replaced by the stock config plus Elsewhen's automatically seeded cities. Motion Wallpaper, OMAConnect, the on-screen keyboard, and its applet stopped loading. Their installed files and wallpaper playback state were intact; re-enabling them restored playback. Observed timeline (2026-10-06, Europe/Amsterdam): - 08:10: the shell log confirms the custom keyboard and OMAConnect plugins were loaded. - 08:16:03–04: `omarchy font set "BerkeleyMono Nerd Font Mono"` caused a shell restart. - 08:16:23: shell.json was replaced. Its contents match the default configuration after JSON serialization, except for Elsewhen's seeded cities; `plugins` is empty and the custom bar widgets are absent. - `omarchy notification font system` was also run in this interval. The exact production event ordering has not been reproduced, so the font command is an observed trigger, not proof that every font change causes this. ### Validated unsafe path `defaultsFile.onLoaded` calls `loadDefaults()` → `applyShellConfig()`. The user FileView loads asynchronously and `text()` can return an empty string before the first load completes. The shell consequently uses defaults. Widget initialization (for example Elsewhen's `seedFirstRun()`) can then call `updateEntryInline()` → `persistShellConfig()`, which writes that whole fallback configuration over the existing user file. A deterministic regression test executes the actual host configuration functions, delays the user-read completion behind defaults, and invokes an automatic widget mutation. On unmodified upstream code the test records a write containing defaults before user data has arrived. With a readiness/write guard it records no premature write and subsequent edits preserve the custom plugin entries. Expected: restarts and font changes preserve enabled plugins and other user configuration. Fallback display state must not overwrite a pending, invalid, or unreadable user configuration. A genuinely missing file should still support first-run customization. Related: #10885 / #13913 concern stale configuration during concurrent external edits; #12990 / #12992 / #13104 concern truncated files. This report isolates initial asynchronous loading and fallback persistence. Quickshell documents the initial empty read at https://quickshell.org/docs/v0.2.1/types/Quickshell.Io/FileView/.
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 21:46 UTC