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

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

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

setPluginEnabled answers ok for an unknown plugin id, so omarchy plugin disable <typo> reports success and does nothingrevision 1 · captured 2026-09-28 21:23 UTC via poll

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):

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 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

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.
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