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

Recursive plugin inotify + 150ms reload: git checkout / save storms take down the shell

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

Recursive plugin inotify + 150ms reload: git checkout / save storms take down the shellrevision 1 · captured 2026-09-28 21:23 UTC via poll

System details

Intel Core Ultra 5 225, NVIDIA GeForce RTX 5080, Omarchy 4.0.2-1, Hyprland 0.56.2

What's wrong?

shell/services/PluginRegistry.qml runs inotifywait -m -r on ~/.config/omarchy/plugins (the whole tree, including each plugin's .git). localPluginIdForPath already ignores /.git/ paths, but:

  1. the kernel still watches every git object dir (omamail's .git here is ~22M / hundreds of directories)
  2. working-tree writes (a git checkout, or an editor saving QML) still fire localPluginChanged
  3. shell.qml reloads the entire plugin graph on a 150ms timer

On this seat an omamail git checkout / merge at 12:22 produced a burst of Local plugin changed, reloading: omamail, ShortcutHelp.qml incubation errors, a second Quickshell (already running), then Exiting due to IPC request. Combined with omarchy-launch-shell treating exit 0 as a deliberate stop (see follow-up), the bar / idle / screensaver stayed dead until a manual omarchy restart shell hours later.

Expected: .git (and __pycache__ / node_modules) are not watched; a save storm coalesces to one reload per second or so, not a full QML teardown per file.

Suggested guardrails in tree:

  • pass inotifywait --exclude '/\.git(/|$)|/__pycache__(/|$)|/node_modules(/|$)' (and ideally do not recurse into those dirs)
  • raise localPluginReloadTimer.interval from 150ms to ~1000ms

--exclude only filters events, not watches; skipping .git in the watch list is better. We did that out of tree with a PATH wrapper around inotifywait for the plugins invocation only.

View raw text
### System details

Intel Core Ultra 5 225, NVIDIA GeForce RTX 5080, Omarchy 4.0.2-1, Hyprland 0.56.2

### What's wrong?

`shell/services/PluginRegistry.qml` runs `inotifywait -m -r` on `~/.config/omarchy/plugins` (the whole tree, including each plugin's `.git`). `localPluginIdForPath` already ignores `/.git/` paths, but:

1. the kernel still watches every git object dir (omamail's `.git` here is ~22M / hundreds of directories)
2. **working-tree** writes (a `git checkout`, or an editor saving QML) still fire `localPluginChanged`
3. `shell.qml` reloads the **entire** plugin graph on a 150ms timer

On this seat an omamail `git checkout` / merge at 12:22 produced a burst of `Local plugin changed, reloading: omamail`, ShortcutHelp.qml incubation errors, a second Quickshell (`already running`), then `Exiting due to IPC request`. Combined with `omarchy-launch-shell` treating exit 0 as a deliberate stop (see follow-up), the bar / idle / screensaver stayed dead until a manual `omarchy restart shell` hours later.

Expected: `.git` (and `__pycache__` / `node_modules`) are not watched; a save storm coalesces to one reload per second or so, not a full QML teardown per file.

Suggested guardrails in tree:

- pass `inotifywait --exclude '/\.git(/|$)|/__pycache__(/|$)|/node_modules(/|$)'` (and ideally do not recurse into those dirs)
- raise `localPluginReloadTimer.interval` from 150ms to ~1000ms

`--exclude` only filters events, not watches; skipping `.git` in the watch list is better. We did that out of tree with a PATH wrapper around `inotifywait` for the plugins invocation only.

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 11:05 UTC