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-4862GitHub issuePublicReceived

Cloning a service plugin silently breaks its bar indicator

Reported by simonlomax · filed Sep 3, 2026Closed upstream on 2026-09-20 by bjarneo via an automated message, as a duplicate of #7355 (R-1694). GitHub close reason: completed.

Received and recorded verbatim. Nothing has been checked yet.

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?
Not yet mapped to any requirement or component.
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?
Our staff decide whether the report is valid. Where this project allows it, agents decide whether it duplicates another report or a known issue. No decision has been recorded yet.

Original report

Cloning a service plugin silently breaks its bar indicatorrevision 1 · captured 2026-10-04 12:10 UTC via poll

What happened

Cloning any first-party service plugin silently kills the bar indicator that
depends on it. The indicator stops reflecting state and its click handler
becomes a no-op, with nothing logged.

Concretely, after omarchy plugin clone omarchy.notifications:

  • the Dnd bar indicator never lights up, so there is no visual cue that

notifications are silenced
- clicking it does nothing
- SUPER + CTRL + , and the omarchy menu's "Notifications" toggle still work

That last point is the tell: the IPC path resolves clones correctly, the
service-object path does not.

Expected

A cloned service should keep driving its bar indicator, the same way IPC calls
keep reaching it.

Steps to reproduce

  1. omarchy plugin clone omarchy.notifications
  2. omarchy restart shell
  3. omarchy-shell notifications setDnd on
  4. Observe the bar: no DND indicator appears. Click where it would be: nothing.
  5. omarchy-toggle-notification-silencing still toggles state correctly

(omarchy-shell notifications dndState confirms), proving only the
indicator's lookup is broken.

Cause

shell/shell.qml:275

function serviceFor(pluginId) {
  return _services[String(pluginId)] || null
}

function firstPartyServiceFor(pluginId) {
  return serviceFor(pluginId)
}

This is a plain map lookup on the built-in id. Cloning disables
omarchy.notifications and enables <user>.notifications, so the key is absent
and the call returns null.

shell/services/PluginRegistry.qml:146 already has the function that solves
this, and its comment says exactly what is intended:

function resolveEnabledId(id) {
  // Callers keep using the built-in id after cloning; the enabled local
  // manifest is the implementation that should receive the call.

The IPC layer routes through it. serviceFor does not.

Suggested fix

Route firstPartyServiceFor (or serviceFor) through resolveEnabledId, so
both paths agree.

Affected call sites

All hardcode a built-in id and break identically once that plugin is cloned:

FileLooks up
shell/plugins/bar/indicators/Dnd.qml:8omarchy.notifications
shell/plugins/bar/indicators/NightLight.qml:7omarchy.nightlight
shell/plugins/bar/indicators/StayAwake.qml:7omarchy.idle
shell/plugins/panels/audio/Panel.qml:20omarchy.media
shell/plugins/services/media/BarWidget.qml:10omarchy.media

Why it matters beyond a dead button

For Dnd the failure mode is genuinely harmful: notifications can be silenced
with no indicator and no working way to unsilence from the bar. It reads as
"notifications are broken" rather than "you are in DND".

System

  • Omarchy 4.0.2-1
  • Hyprland 0.56.2
  • Kernel 7.1.9-arch1-2
  • AMD Ryzen 7 7800X3D / NVIDIA RTX 4090
View raw text
## What happened

Cloning any first-party **service** plugin silently kills the bar indicator that
depends on it. The indicator stops reflecting state *and* its click handler
becomes a no-op, with nothing logged.

Concretely, after `omarchy plugin clone omarchy.notifications`:

- the `Dnd` bar indicator never lights up, so there is no visual cue that
  notifications are silenced
- clicking it does nothing
- `SUPER + CTRL + ,` and the omarchy menu's "Notifications" toggle still work

That last point is the tell: the IPC path resolves clones correctly, the
service-object path does not.

## Expected

A cloned service should keep driving its bar indicator, the same way IPC calls
keep reaching it.

## Steps to reproduce

1. `omarchy plugin clone omarchy.notifications`
2. `omarchy restart shell`
3. `omarchy-shell notifications setDnd on`
4. Observe the bar: no DND indicator appears. Click where it would be: nothing.
5. `omarchy-toggle-notification-silencing` still toggles state correctly
   (`omarchy-shell notifications dndState` confirms), proving only the
   indicator's lookup is broken.

## Cause

`shell/shell.qml:275`

```qml
function serviceFor(pluginId) {
  return _services[String(pluginId)] || null
}

function firstPartyServiceFor(pluginId) {
  return serviceFor(pluginId)
}
```

This is a plain map lookup on the built-in id. Cloning disables
`omarchy.notifications` and enables `<user>.notifications`, so the key is absent
and the call returns `null`.

`shell/services/PluginRegistry.qml:146` already has the function that solves
this, and its comment says exactly what is intended:

```qml
function resolveEnabledId(id) {
  // Callers keep using the built-in id after cloning; the enabled local
  // manifest is the implementation that should receive the call.
```

The IPC layer routes through it. `serviceFor` does not.

## Suggested fix

Route `firstPartyServiceFor` (or `serviceFor`) through `resolveEnabledId`, so
both paths agree.

## Affected call sites

All hardcode a built-in id and break identically once that plugin is cloned:

| File | Looks up |
|---|---|
| `shell/plugins/bar/indicators/Dnd.qml:8` | `omarchy.notifications` |
| `shell/plugins/bar/indicators/NightLight.qml:7` | `omarchy.nightlight` |
| `shell/plugins/bar/indicators/StayAwake.qml:7` | `omarchy.idle` |
| `shell/plugins/panels/audio/Panel.qml:20` | `omarchy.media` |
| `shell/plugins/services/media/BarWidget.qml:10` | `omarchy.media` |

## Why it matters beyond a dead button

For `Dnd` the failure mode is genuinely harmful: notifications can be silenced
with no indicator and no working way to unsilence from the bar. It reads as
"notifications are broken" rather than "you are in DND".

## System

- Omarchy 4.0.2-1
- Hyprland 0.56.2
- Kernel 7.1.9-arch1-2
- AMD Ryzen 7 7800X3D / NVIDIA RTX 4090

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.

No decision has been recorded yet.