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

Cloning a first-party service plugin breaks other plugins that reference it via firstPartyServiceFor(id)

Reported by LexGrishin · filed Sep 6, 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 first-party service plugin breaks other plugins that reference it via firstPartyServiceFor(id)revision 1 · captured 2026-10-04 12:10 UTC via poll

Cloning a first-party service plugin breaks other plugins that reference it via firstPartyServiceFor(id)

Omarchy version: 4.0.2-1

What happened

I cloned the built-in omarchy.idle service plugin (omarchy plugin clone omarchy.idle) to add a custom hibernate-after-idle timer. This is the documented way to customize a first-party plugin (see plugins.md), and it worked exactly as described: the clone (lex.idle) became the active idle service, and omarchy.idle was automatically marked disabled in omarchy plugin list.

However, this silently broke the built-in "Stay Awake" bar indicator (the cup icon in the Indicators bar widget): it stopped appearing and clicking it did nothing.

Root cause

shell/plugins/bar/indicators/StayAwake.qml resolves the idle service with:

readonly property var idleService: bar?.shell?.firstPartyServiceFor("omarchy.idle")

firstPartyServiceFor (shell/shell.qml, ~line 279) is a literal-string lookup into a _services map keyed by plugin id:

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

Once omarchy.idle is disabled (as a result of cloning it), this lookup returns null, so idleService is always null — the indicator can't read state or call setIdleEnabled().

Interestingly, PluginRegistry.qml already tracks a clonedFrom field on cloned plugins and uses it elsewhere (e.g. to swap bar-widget ids in the layout config when a bar-widget is cloned). That resolution just isn't applied to firstPartyServiceFor/serviceFor, so any other plugin that hardcodes a first-party service id breaks the moment that service gets cloned — even though cloning a service plugin is an explicitly supported customization path.

Steps to reproduce

  1. omarchy plugin clone omarchy.idle
  2. omarchy plugin list — confirm omarchy.idle is now disabled, <you>.idle is enabled
  3. Try the Stay Awake indicator in the bar (hover the Indicators widget, click the cup icon) — it no longer shows or responds

Expected behavior

firstPartyServiceFor (or serviceFor) should fall back to a plugin's active clone when the original id is disabled but a clone with clonedFrom == pluginId is enabled — consistent with how bar-widget cloning already redirects references.

Workaround

Also clone the consuming plugin (omarchy plugin clone omarchy.indicators) and patch its copy of StayAwake.qml to point firstPartyServiceFor at the new service id. Works, but is easy to miss and will need to be redone for any other plugin that references a cloned service by hardcoded id.

View raw text
# Cloning a first-party service plugin breaks other plugins that reference it via firstPartyServiceFor(id)

**Omarchy version:** 4.0.2-1

## What happened

I cloned the built-in `omarchy.idle` service plugin (`omarchy plugin clone omarchy.idle`) to add a custom hibernate-after-idle timer. This is the documented way to customize a first-party plugin (see plugins.md), and it worked exactly as described: the clone (`lex.idle`) became the active idle service, and `omarchy.idle` was automatically marked `disabled` in `omarchy plugin list`.

However, this silently broke the built-in "Stay Awake" bar indicator (the cup icon in the Indicators bar widget): it stopped appearing and clicking it did nothing.

## Root cause

`shell/plugins/bar/indicators/StayAwake.qml` resolves the idle service with:

```qml
readonly property var idleService: bar?.shell?.firstPartyServiceFor("omarchy.idle")
```

`firstPartyServiceFor` (`shell/shell.qml`, ~line 279) is a literal-string lookup into a `_services` map keyed by plugin id:

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

Once `omarchy.idle` is disabled (as a result of cloning it), this lookup returns `null`, so `idleService` is always `null` — the indicator can't read state or call `setIdleEnabled()`.

Interestingly, `PluginRegistry.qml` already tracks a `clonedFrom` field on cloned plugins and uses it elsewhere (e.g. to swap bar-widget ids in the layout config when a bar-widget is cloned). That resolution just isn't applied to `firstPartyServiceFor`/`serviceFor`, so any *other* plugin that hardcodes a first-party service id breaks the moment that service gets cloned — even though cloning a service plugin is an explicitly supported customization path.

## Steps to reproduce

1. `omarchy plugin clone omarchy.idle`
2. `omarchy plugin list` — confirm `omarchy.idle` is now `disabled`, `<you>.idle` is `enabled`
3. Try the Stay Awake indicator in the bar (hover the Indicators widget, click the cup icon) — it no longer shows or responds

## Expected behavior

`firstPartyServiceFor` (or `serviceFor`) should fall back to a plugin's active clone when the original id is disabled but a clone with `clonedFrom == pluginId` is enabled — consistent with how bar-widget cloning already redirects references.

## Workaround

Also clone the consuming plugin (`omarchy plugin clone omarchy.indicators`) and patch its copy of `StayAwake.qml` to point `firstPartyServiceFor` at the new service id. Works, but is easy to miss and will need to be redone for any other plugin that references a cloned service by hardcoded id.

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.