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.
setPluginEnabled answers ok for an unknown plugin id, so omarchy plugin disable <typo> reports success and does nothing
Reported by Mario-Mohar · filed Sep 10, 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
What happened
omarchy plugin disable reports success for a plugin id that does not exist:
$ omarchy plugin disable does.not.exist; echo "exit=$?"
Disabled does.not.exist
exit=0Nothing happens. A typo in the id is indistinguishable from a real disable, so the plugin the user meant to switch off keeps running while the command says it was switched off.
The IPC call underneath answers ok, and shell.json is untouched:
$ md5sum ~/.config/omarchy/shell.json
cf10e466fd4e1c2e617b6f423b8be9fa /home/.../shell.json
$ omarchy-shell shell setPluginEnabled totally.made.up false
ok
$ md5sum ~/.config/omarchy/shell.json
cf10e466fd4e1c2e617b6f423b8be9fa /home/.../shell.jsonThe enable side of the same registry call gets this right:
$ omarchy-shell shell enablePlugin totally.made.up '{}'
unknownWhere it comes from
Both IPC handlers go through PluginRegistry.setEnabled (shell/shell.qml:1609 and :1613), and the guard there only covers one direction (shell/services/PluginRegistry.qml:482):
var manifest = installedPlugins[key]
if (value && !manifest) {
console.warn("PluginRegistry.setEnabled: unknown plugin " + key)
return false
}With value false the guard is skipped, the disable path finds no clonedFrom, no bar layout entry and no plugins[] entry, so it changes nothing, and the function still ends on:
if (lastEnableError) return false
registryRevision++
pluginsChanged()
return truetrue becomes ok in setPluginEnabled, and omarchy-plugin-disable prints Disabled $id on anything that is not a non-ok answer. There is no console.warn on this path either, so nothing is left in the log.
The guard's asymmetry looks deliberate
I am guessing here, but refusing an unknown id on the disable side would be wrong: a plugin whose directory was deleted has no manifest while its shell.json entry is still there, and that entry has to stay removable. So the fix is probably not to widen the guard to !manifest, but to make the return value say whether anything was actually found. Disabling an id with neither a manifest nor a config entry is the case that should answer unknown, and that keeps the ghost-entry cleanup working.
Nothing in test/shell.d/ currently covers setEnabled with an unknown id in either direction, so there is no existing expectation to weigh this against.
A smaller side effect
The same path runs registryRevision++ and pluginsChanged() before returning, so a call that changed nothing still signals every consumer that the plugin set moved.
Reproduce
omarchy plugin disable some.id.that.does.not.exist # prints "Disabled ...", exits 0
omarchy-shell shell setPluginEnabled some.id.that.does.not.exist false # ok
omarchy-shell shell enablePlugin some.id.that.does.not.exist '{}' # unknownEnvironment
- omarchy 4.0.3-1, quickshell 0.3.1-1, Hyprland 0.56.2, Arch
- Found while testing #11118; unrelated to that change, and present without it.
View raw text
## What happened
`omarchy plugin disable` reports success for a plugin id that does not exist:
```
$ omarchy plugin disable does.not.exist; echo "exit=$?"
Disabled does.not.exist
exit=0
```
Nothing happens. A typo in the id is indistinguishable from a real disable, so the plugin the user meant to switch off keeps running while the command says it was switched off.
The IPC call underneath answers `ok`, and `shell.json` is untouched:
```
$ md5sum ~/.config/omarchy/shell.json
cf10e466fd4e1c2e617b6f423b8be9fa /home/.../shell.json
$ omarchy-shell shell setPluginEnabled totally.made.up false
ok
$ md5sum ~/.config/omarchy/shell.json
cf10e466fd4e1c2e617b6f423b8be9fa /home/.../shell.json
```
The enable side of the same registry call gets this right:
```
$ omarchy-shell shell enablePlugin totally.made.up '{}'
unknown
```
## Where it comes from
Both IPC handlers go through `PluginRegistry.setEnabled` (`shell/shell.qml:1609` and `:1613`), and the guard there only covers one direction (`shell/services/PluginRegistry.qml:482`):
```javascript
var manifest = installedPlugins[key]
if (value && !manifest) {
console.warn("PluginRegistry.setEnabled: unknown plugin " + key)
return false
}
```
With `value` false the guard is skipped, the disable path finds no `clonedFrom`, no bar layout entry and no `plugins[]` entry, so it changes nothing, and the function still ends on:
```javascript
if (lastEnableError) return false
registryRevision++
pluginsChanged()
return true
```
`true` becomes `ok` in `setPluginEnabled`, and `omarchy-plugin-disable` prints `Disabled $id` on anything that is not a non-`ok` answer. There is no `console.warn` on this path either, so nothing is left in the log.
## The guard's asymmetry looks deliberate
I am guessing here, but refusing an unknown id on the disable side would be wrong: a plugin whose directory was deleted has no manifest while its `shell.json` entry is still there, and that entry has to stay removable. So the fix is probably not to widen the guard to `!manifest`, but to make the return value say whether anything was actually found. Disabling an id with neither a manifest nor a config entry is the case that should answer `unknown`, and that keeps the ghost-entry cleanup working.
Nothing in `test/shell.d/` currently covers `setEnabled` with an unknown id in either direction, so there is no existing expectation to weigh this against.
## A smaller side effect
The same path runs `registryRevision++` and `pluginsChanged()` before returning, so a call that changed nothing still signals every consumer that the plugin set moved.
## Reproduce
```bash
omarchy plugin disable some.id.that.does.not.exist # prints "Disabled ...", exits 0
omarchy-shell shell setPluginEnabled some.id.that.does.not.exist false # ok
omarchy-shell shell enablePlugin some.id.that.does.not.exist '{}' # unknown
```
## Environment
- omarchy 4.0.3-1, quickshell 0.3.1-1, Hyprland 0.56.2, Arch
- Found while testing #11118; unrelated to that change, and present without it.
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:26 UTC