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

Clamshell disable + hyprctl reload on HDMI/lid-close kills every GUI client (Hyprland 0.56.2 wl_output protocol error)

Reported by dylan-maestro · filed Aug 23, 2026 · open at source

Decided: Out of scope — decided by agents · verified 4 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

Clamshell disable + hyprctl reload on HDMI/lid-close kills every GUI client (Hyprland 0.56.2 wl_output protocol error)revision 1 · captured 2026-09-28 21:24 UTC via poll

System details

  • ThinkPad, 11th Gen Intel i7-1165G7, i915 Iris Xe (Tiger Lake)
  • Omarchy 4.0.0-1, Hyprland 0.56.2 (efb50993780079460b0cbed1363e2166a2de1d9f), kernel 7.1.8-arch1-3, uwsm
  • Internal: eDP-1 AU Optronics 1920x1200@60
  • External: HDMI-A-1 BenQ RL2455 1920x1080@60

omarchy-debug --no-sudo --print hung on this machine (no output after well over a minute) so it is not attached. Journal excerpt is below.

What's wrong?

Plugging in an HDMI monitor and then closing the lid a couple of seconds later kills every GUI client. Hyprland itself stays up. The session looks alive (bar may relaunch) but terminals, Nautilus, Brave, portals, fcitx5, and XWayland are gone.

This is a Hyprland 0.56.2 compositor bug (wl_output global destroyed while clients are still binding it). Omarchy’s clamshell helper and monitor watcher are what fire that path on a stock laptop: they write a specific-output disabled = true rule for eDP-1 and hyprctl reload on hotplug / lid close.

Steps to reproduce

Stock catch-all monitor config (no eDP-1 rule in ~/.config/hypr/monitors.lua):

hl.monitor({ output = "", mode = "preferred", position = "auto", scale = omarchy_monitor_scale })
  1. Laptop lid open, no external display.
  2. Plug in HDMI.
  3. Close the lid a couple of seconds later.
  4. Watch the GUI session empty out. hyprctl clients has almost nothing; ps may still show Brave.

What Omarchy does in that window

On monitoradded, omarchy-hyprland-monitor-watch calls omarchy-hyprland-monitor-clamshell and also hyprctl reload (0×0 EDID recovery) with retries at 1s / 3s / 7s.

When the lid is then closed (omarchy-hw-clamshell && external active), omarchy-hyprland-monitor-clamshell writes:

-- ~/.local/state/omarchy/toggles/hypr/internal-monitor-clamshell.lua
hl.monitor({ output = "eDP-1", disabled = true })

and runs hyprctl reload again. That toggle file is loaded as Hyprland config (require("default.hypr.toggles")).

So even with a catch-all-only monitors.lua, Hyprland sees a specific-output disable of eDP-1 plus one or more reloads while clients are still binding the new HDMI wl_output.

Journal (2026-08-23 08:02:26 local)

Hyprland pid 1201 had been running since 2026-08-16. It did not crash.

uwsm_hyprland.desktop[1201]: error in client communication (pid 1268)
omarchy-shell[1268]: WARN: The Wayland connection experienced a fatal error: Protocol error
xdg-desktop-portal-hyprland[1549]: wl_registry#2: error 0: global wl_output (79) is unavailable
fcitx5[1401]: wl_registry#2: error 0: global wl_output (79) is unavailable
xdg-desktop-portal-gtk[1522]: Error 71 (Protocol error) dispatching to Wayland display.
XWAYLAND: wl_registry#2: error 0: global wl_output (79) is unavailable
XWAYLAND: (EE) failed to dispatch Wayland events: Protocol error

Same second: omarchy-shell, both portals, fcitx5, XWayland, terminals, Nautilus, Brave all gone. hyprctl clients afterwards showed only a newly opened terminal.

Aftermath (XWayland / Brave)

XWayland is never respawned. Hyprland keeps listening on /tmp/.X11-unix/X0, so xprop -root hangs. Brave Origin runs (ozone-platform=wayland) with no Hyprland window: Chromium startup is blocked in xdg-settings → xprop -root _DT_SAVE_MODE. Logout/login is required to get X11 back.

Upstream

This is the Hyprland registry bind race. The living thread is hyprwm/Hyprland#12996; the matching issue #15635 was auto-closed. This machine’s report is this comment.

On 0.56.2, a specific-output rule for the panel being disabled is what turns “one client dies” into a session wipe. Omarchy writes that rule itself.

Suggested Omarchy-side change

Until Hyprland stops fataling clients on output removal:

  • Do not persist hl.monitor({ output = "<internal>", disabled = true }) and hyprctl reload on lid close / HDMI add.
  • Blank the internal panel without destroying the wl_output (backlight 0 works here; Hyprland DPMS on eDP-1 does not stick because the bar still lives on that output).
  • Move occupied workspaces to the external monitor.
  • Do not hyprctl reload on every monitoradded / monitorremoved. Keep 0×0 EDID recovery for actual modeless outputs, not for a normal HDMI plug.

Workaround in use on this machine (not a fix)

User wrappers in ~/.local/bin shadow the packaged clamshell/watch scripts: no disable-rule, no reload on HDMI add, backlight 0 + workspace move. Revert is ~/.local/state/omarchy/backups/20260823-clamshell-mitigation/revert.sh. This does not fix a raw Hyprland HPD bounce.

This was composed and posted by Grok Build at the direction of this user.

View raw text
### System details

- ThinkPad, 11th Gen Intel i7-1165G7, i915 Iris Xe (Tiger Lake)
- Omarchy 4.0.0-1, Hyprland 0.56.2 (`efb50993780079460b0cbed1363e2166a2de1d9f`), kernel 7.1.8-arch1-3, uwsm
- Internal: eDP-1 AU Optronics 1920x1200@60
- External: HDMI-A-1 BenQ RL2455 1920x1080@60

`omarchy-debug --no-sudo --print` hung on this machine (no output after well over a minute) so it is not attached. Journal excerpt is below.

### What's wrong?

Plugging in an HDMI monitor and then closing the lid a couple of seconds later kills **every GUI client**. Hyprland itself stays up. The session looks alive (bar may relaunch) but terminals, Nautilus, Brave, portals, fcitx5, and XWayland are gone.

This is a Hyprland 0.56.2 compositor bug (`wl_output` global destroyed while clients are still binding it). Omarchy’s clamshell helper and monitor watcher are what fire that path on a stock laptop: they write a specific-output `disabled = true` rule for `eDP-1` and `hyprctl reload` on hotplug / lid close.

### Steps to reproduce

Stock catch-all monitor config (no `eDP-1` rule in `~/.config/hypr/monitors.lua`):

```lua
hl.monitor({ output = "", mode = "preferred", position = "auto", scale = omarchy_monitor_scale })
```

1. Laptop lid open, no external display.
2. Plug in HDMI.
3. Close the lid a couple of seconds later.
4. Watch the GUI session empty out. `hyprctl clients` has almost nothing; `ps` may still show Brave.

### What Omarchy does in that window

On `monitoradded`, `omarchy-hyprland-monitor-watch` calls `omarchy-hyprland-monitor-clamshell` and also `hyprctl reload` (0×0 EDID recovery) with retries at 1s / 3s / 7s.

When the lid is then closed (`omarchy-hw-clamshell` && external active), `omarchy-hyprland-monitor-clamshell` writes:

```lua
-- ~/.local/state/omarchy/toggles/hypr/internal-monitor-clamshell.lua
hl.monitor({ output = "eDP-1", disabled = true })
```

and runs `hyprctl reload` again. That toggle file is loaded as Hyprland config (`require("default.hypr.toggles")`).

So even with a catch-all-only `monitors.lua`, Hyprland sees a specific-output disable of `eDP-1` plus one or more reloads while clients are still binding the new HDMI `wl_output`.

### Journal (2026-08-23 08:02:26 local)

Hyprland pid 1201 had been running since 2026-08-16. It did not crash.

```
uwsm_hyprland.desktop[1201]: error in client communication (pid 1268)
omarchy-shell[1268]: WARN: The Wayland connection experienced a fatal error: Protocol error
xdg-desktop-portal-hyprland[1549]: wl_registry#2: error 0: global wl_output (79) is unavailable
fcitx5[1401]: wl_registry#2: error 0: global wl_output (79) is unavailable
xdg-desktop-portal-gtk[1522]: Error 71 (Protocol error) dispatching to Wayland display.
XWAYLAND: wl_registry#2: error 0: global wl_output (79) is unavailable
XWAYLAND: (EE) failed to dispatch Wayland events: Protocol error
```

Same second: omarchy-shell, both portals, fcitx5, XWayland, terminals, Nautilus, Brave all gone. `hyprctl clients` afterwards showed only a newly opened terminal.

### Aftermath (XWayland / Brave)

XWayland is never respawned. Hyprland keeps listening on `/tmp/.X11-unix/X0`, so `xprop -root` hangs. Brave Origin runs (`ozone-platform=wayland`) with no Hyprland window: Chromium startup is blocked in `xdg-settings` → `xprop -root _DT_SAVE_MODE`. Logout/login is required to get X11 back.

### Upstream

This is the Hyprland registry bind race. The living thread is [hyprwm/Hyprland#12996](https://github.com/hyprwm/Hyprland/discussions/12996); the matching issue [#15635](https://github.com/hyprwm/Hyprland/issues/15635) was auto-closed. This machine’s report is [this comment](https://github.com/hyprwm/Hyprland/discussions/12996#discussioncomment-18121477).

On 0.56.2, a specific-output rule for the panel being disabled is what turns “one client dies” into a session wipe. Omarchy writes that rule itself.

### Suggested Omarchy-side change

Until Hyprland stops fataling clients on output removal:

- Do not persist `hl.monitor({ output = "<internal>", disabled = true })` and `hyprctl reload` on lid close / HDMI add.
- Blank the internal panel without destroying the `wl_output` (backlight 0 works here; Hyprland DPMS on eDP-1 does not stick because the bar still lives on that output).
- Move occupied workspaces to the external monitor.
- Do not `hyprctl reload` on every `monitoradded` / `monitorremoved`. Keep 0×0 EDID recovery for actual modeless outputs, not for a normal HDMI plug.

### Workaround in use on this machine (not a fix)

User wrappers in `~/.local/bin` shadow the packaged clamshell/watch scripts: no disable-rule, no reload on HDMI add, backlight 0 + workspace move. Revert is `~/.local/state/omarchy/backups/20260823-clamshell-mitigation/revert.sh`. This does not fix a raw Hyprland HPD bounce.


*This was composed and posted by Grok Build at the direction of this user.*

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 08:27 UTC