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

omarchy plugin enable never restores a bar-widget icon when the plugin id still exists in plugins[]

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

omarchy plugin enable never restores a bar-widget icon when the plugin id still exists in plugins[]revision 1 · captured 2026-09-28 21:23 UTC via poll

Summary

omarchy plugin enable <id> reports success but never restores a bar widget's icon if the plugin's id already has an entry in the top-level plugins[] array of shell.json. The widget ends up silently gone from the bar even though enable printed "Enabled".

Environment

  • Omarchy 4.0.4-1 (shell code matches omacom/omarchy HEAD at shell/services/PluginRegistry.qml sha e8b8ad3)
  • Reproduced on this machine with:
  • akshar.radio-atlas (kinds: panel, bar-widget)
  • anishfn.widgets (kinds: panel, bar-widget, service)

Repro

  1. Have a plugin that is both a bar-widget and a panel (or service), whose id already sits in plugins[] (e.g. it was enabled back when it was panel-only, or a legacy plugins[] record lingers from an older Omarchy id scheme).
  2. Its bar widget is also present in bar.layout.<section>.
  3. omarchy plugin disable <id> -> removes only the bar.layout entry; the plugins[] entry survives (by design, the panel stays summonable).
  4. omarchy plugin enable <id> -> prints Enabled <id>.
  5. Expected: the widget reappears in the bar. Actual: nothing appears.

After the steps, the shell itself still considers the widget disabled:

$ omarchy-shell shell listPlugins                       # (ids matching)
anishfn.widgets    false    panel,bar-widget,service
akshar.radio-atlas false    panel,bar-widget

and the id is absent from every section of bar.layout in both shell.json and live config.

Root cause

In shell/services/PluginRegistry.qml, setEnabled() keys the bar-widget re-insert off location.found returned by findEntryLocation():

var location = findEntryLocation(config, key)            // line 522

if (value) {
  ...
  if (!location.found && isBarWidget) {                  // line 528: insert into bar.layout
    ...
  } else if (!location.found && !isFirstParty) {         // line 541: plugins.push
    config.plugins.push(entry)
  }
  if (isBarWidget && !insertedWithPlacement
      && placement && Object.keys(placement).length)
    moveBarEntry(config, key, placement)                 // line 545; skipped when placement == {} or entry missing
}

findEntryLocation() matches any config presence, including a plugins[] entry. So when the plugin still has a plugins[] record, location.found === true, the isBarWidget insert branch never runs, and moveBarEntry() also bails (for placement === {}, and there is no layout entry to move anyway). setEnabled still bumps registryRevision, fires pluginsChanged(), and returns true — hence the misleading success.

omarchy bar put <id> cannot work around it either: putBarWidget() funnels into the same setEnabled call and hits the same skip.

Suggested fix

Decide the widget insert on bar presence, not general config presence:

if (value) {
  removeDisabled(config, key)
  var entry = { id: key }
  var insertedWithPlacement = false
  var onBar = findBarLocation(config, key, "").found
  if (!onBar && isBarWidget) {
    // ... existing insert/replace logic ...
  } else if (!location.found && !isFirstParty) {
    config.plugins.push(entry)
  }
  ...
}

i.e. isBarWidget && !onBar must always recreate the layout entry, regardless of a lingering plugins[] entry, and the plugins.push fallback should stay reserved for non-bar-widget plugins.

Workaround

Manually add {"id":"<id>"} to the desired bar.layout section in ~/.config/omarchy/shell.json, then omarchy-shell shell reloadConfig.

View raw text
## Summary

`omarchy plugin enable <id>` reports success but never restores a bar widget's icon if the plugin's id already has an entry in the top-level `plugins[]` array of `shell.json`. The widget ends up silently gone from the bar even though enable printed "Enabled".

## Environment

- Omarchy 4.0.4-1 (shell code matches `omacom/omarchy` HEAD at `shell/services/PluginRegistry.qml` sha `e8b8ad3`)
- Reproduced on this machine with:
  - `akshar.radio-atlas` (kinds: `panel`, `bar-widget`)
  - `anishfn.widgets` (kinds: `panel`, `bar-widget`, `service`)

## Repro

1. Have a plugin that is both a `bar-widget` and a `panel` (or `service`), whose id already sits in `plugins[]` (e.g. it was enabled back when it was panel-only, or a legacy `plugins[]` record lingers from an older Omarchy id scheme).
2. Its bar widget is also present in `bar.layout.<section>`.
3. `omarchy plugin disable <id>` -> removes only the `bar.layout` entry; the `plugins[]` entry survives (by design, the panel stays summonable).
4. `omarchy plugin enable <id>` -> prints `Enabled <id>`.
5. Expected: the widget reappears in the bar. Actual: nothing appears.

After the steps, the shell itself still considers the widget disabled:

```
$ omarchy-shell shell listPlugins                       # (ids matching)
anishfn.widgets    false    panel,bar-widget,service
akshar.radio-atlas false    panel,bar-widget
```

and the id is absent from every section of `bar.layout` in both `shell.json` and live config.

## Root cause

In `shell/services/PluginRegistry.qml`, `setEnabled()` keys the bar-widget re-insert off `location.found` returned by `findEntryLocation()`:

```qml
var location = findEntryLocation(config, key)            // line 522

if (value) {
  ...
  if (!location.found && isBarWidget) {                  // line 528: insert into bar.layout
    ...
  } else if (!location.found && !isFirstParty) {         // line 541: plugins.push
    config.plugins.push(entry)
  }
  if (isBarWidget && !insertedWithPlacement
      && placement && Object.keys(placement).length)
    moveBarEntry(config, key, placement)                 // line 545; skipped when placement == {} or entry missing
}
```

`findEntryLocation()` matches _any_ config presence, including a `plugins[]` entry. So when the plugin still has a `plugins[]` record, `location.found === true`, the `isBarWidget` insert branch never runs, and `moveBarEntry()` also bails (for `placement === {}`, and there is no layout entry to move anyway). `setEnabled` still bumps `registryRevision`, fires `pluginsChanged()`, and returns `true` — hence the misleading success.

`omarchy bar put <id>` cannot work around it either: `putBarWidget()` funnels into the same `setEnabled` call and hits the same skip.

## Suggested fix

Decide the widget insert on bar presence, not general config presence:

```qml
if (value) {
  removeDisabled(config, key)
  var entry = { id: key }
  var insertedWithPlacement = false
  var onBar = findBarLocation(config, key, "").found
  if (!onBar && isBarWidget) {
    // ... existing insert/replace logic ...
  } else if (!location.found && !isFirstParty) {
    config.plugins.push(entry)
  }
  ...
}
```

i.e. `isBarWidget && !onBar` must always recreate the layout entry, regardless of a lingering `plugins[]` entry, and the `plugins.push` fallback should stay reserved for non-bar-widget plugins.

## Workaround

Manually add `{"id":"<id>"}` to the desired `bar.layout` section in `~/.config/omarchy/shell.json`, then `omarchy-shell shell reloadConfig`.

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 16:00 UTC