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.
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.
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)
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
omarchy plugin clone omarchy.idleomarchy plugin list— confirmomarchy.idleis nowdisabled,<you>.idleisenabled- 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.