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

[Quattro] Numlock ignored by Quickshell lock screen and polkit dialog despite correct compositor state

Reported by AharonG298 · filed Aug 16, 2026 · open at source

Partly in the audited area (lock) — decided by agents · verified. Not validated 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?
AreaPartly in the audited arealock· 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?
Our staff decide whether the report is valid. Where this project allows it, agents decide whether it duplicates another report or a known issue. So far: partly in the audited area (lock) — decided by agents · verified; matches no known issue — decided by agents · verified. The outcome (valid, duplicate, not a bug, …) is not decided yet. See the decision.

Original report

[Quattro] Numlock ignored by Quickshell lock screen and polkit dialog despite correct compositor staterevision 1 · captured 2026-09-28 21:29 UTC via poll

Summary

Numpad keys do not produce digits in the Quickshell lock screen or the Quickshell polkit authentication dialog, even though numlock is on. Pressing NumLock twice (off, then on) fixes it for that prompt.

The important part: the compositor's numlock state is already correct when this happens. This is not numlock_by_default failing to apply, so it is not fixable from input.lua.

Affected surfaces

Both are Quickshell, and only these:

  • /usr/share/omarchy/shell/plugins/lock/ — the lock screen (omarchy-shell lock)
  • /usr/share/omarchy/shell/plugins/polkit/ — the escalation dialog

Ordinary application windows are unaffected. Since resuming from suspend raises the lock screen, "numlock broken after waking from sleep" and "numlock broken at the password popup" are the same bug.

Evidence

Sampled hyprctl devices -j at 4 Hz across a failing polkit prompt, correlated with the journal:

20:19:33  leds=111  main=pixart-hp-wireless-keyboard-and-mouse:true   OFF=[]
20:19:34  leds=000  main=pixart-hp-wireless-keyboard-and-mouse:false  OFF=[pixart-hp-wireless-keyboard-and-mouse]
20:19:34  leds=111  main=pixart-hp-wireless-keyboard-and-mouse:true   OFF=[]
20:19:36  pkexec[131911]: pam_unix(polkit-1:session): session opened for user root(uid=0)

leds = the three /sys/class/leds/input*::numlock/brightness values. OFF=[] = keyboards reporting numLock: false.

At 20:19:33, before touching anything: Hyprland reported numLock: true on all 11 keyboards, and all three hardware numlock LEDs were lit — yet numpad keys did not register in the dialog. At 20:19:34 I pressed NumLock twice (visible as the LEDs dropping to 000 and returning to 111). The numpad then worked and the password was accepted at 20:19:36.

So the seat's numlock state is correct throughout the failure. The Quickshell surface does not honour it until a modifier-change event forces a re-read, which suggests the client is not seeding modifier state from the seat when the surface is created.

Steps to reproduce

No suspend cycle needed — the polkit path reproduces on demand:

# in one shell, watch for keyboards reporting numlock off
while :; do
  hyprctl devices -j | jq -r '[.keyboards[]|select(.numLock==false)|.name]|join(",")'
  sleep 0.25
done &

# trigger the dialog with numlock ON and its LED lit
pkexec /bin/true

Type a digit from the numpad into the password field. It does not register, while the watcher shows no keyboard reporting numLock: false. Press NumLock twice and the numpad starts working.

Expected

The numpad produces digits in Quickshell surfaces whenever the seat's numlock state is active, without requiring a manual toggle.

Possibly related (separate observation)

While sampling, the main: true keyboard designation moved between devices as fcitx5 (started by omarchy-fcitx5.service) created and destroyed its Wayland virtual keyboard. Keyboard count oscillates 10↔11 and main lands on a different device each time:

main=hl-virtual-keyboard-fcitx5
main=jabra-elite-10-(avrcp)                    <- a Bluetooth headset's AVRCP control interface
main=pixart-hp-wireless-keyboard-and-mouse

A headset control interface becoming the main keyboard looks wrong independently of this bug. I have not established a causal link, so I'm listing it as an observation rather than a cause.

Related

  • #3224 — older report of the same user-visible symptom, filed in Nov 2025 against the pre-Quattro hyprlock lock screen. The login-screen half discussed there (adding an input block to /usr/share/sddm/hyprland.conf, which still ships without one) is a genuine and separate fix; this issue is specifically the Quickshell half, which that thread flags as an unresolved separate code path.

System

Omarchy   4.0.0-1
Hyprland  0.56.2
Kernel    7.1.8-arch1-3
Hardware  ASUS Vivobook 16 (V3607VJ), Intel Core 7 240H
GPU       Intel Raptor Lake-P iGPU + NVIDIA RTX 3050 Laptop
DM        SDDM (Wayland greeter), autologin enabled
Input     fcitx5 via omarchy-fcitx5.service; kb_layout us,il
View raw text
## Summary

Numpad keys do not produce digits in the Quickshell **lock screen** or the Quickshell **polkit authentication dialog**, even though numlock is on. Pressing NumLock twice (off, then on) fixes it for that prompt.

The important part: **the compositor's numlock state is already correct when this happens.** This is not `numlock_by_default` failing to apply, so it is not fixable from `input.lua`.

## Affected surfaces

Both are Quickshell, and only these:

- `/usr/share/omarchy/shell/plugins/lock/` — the lock screen (`omarchy-shell lock`)
- `/usr/share/omarchy/shell/plugins/polkit/` — the escalation dialog

Ordinary application windows are unaffected. Since resuming from suspend raises the lock screen, "numlock broken after waking from sleep" and "numlock broken at the password popup" are the same bug.

## Evidence

Sampled `hyprctl devices -j` at 4 Hz across a failing polkit prompt, correlated with the journal:

```
20:19:33  leds=111  main=pixart-hp-wireless-keyboard-and-mouse:true   OFF=[]
20:19:34  leds=000  main=pixart-hp-wireless-keyboard-and-mouse:false  OFF=[pixart-hp-wireless-keyboard-and-mouse]
20:19:34  leds=111  main=pixart-hp-wireless-keyboard-and-mouse:true   OFF=[]
20:19:36  pkexec[131911]: pam_unix(polkit-1:session): session opened for user root(uid=0)
```

`leds` = the three `/sys/class/leds/input*::numlock/brightness` values. `OFF=[]` = keyboards reporting `numLock: false`.

At **20:19:33**, before touching anything: Hyprland reported `numLock: true` on all 11 keyboards, and all three hardware numlock LEDs were lit — yet numpad keys did not register in the dialog. At 20:19:34 I pressed NumLock twice (visible as the LEDs dropping to `000` and returning to `111`). The numpad then worked and the password was accepted at 20:19:36.

So the seat's numlock state is correct throughout the failure. The Quickshell surface does not honour it until a modifier-change event forces a re-read, which suggests the client is not seeding modifier state from the seat when the surface is created.

## Steps to reproduce

No suspend cycle needed — the polkit path reproduces on demand:

```bash
# in one shell, watch for keyboards reporting numlock off
while :; do
  hyprctl devices -j | jq -r '[.keyboards[]|select(.numLock==false)|.name]|join(",")'
  sleep 0.25
done &

# trigger the dialog with numlock ON and its LED lit
pkexec /bin/true
```

Type a digit from the numpad into the password field. It does not register, while the watcher shows no keyboard reporting `numLock: false`. Press NumLock twice and the numpad starts working.

## Expected

The numpad produces digits in Quickshell surfaces whenever the seat's numlock state is active, without requiring a manual toggle.

## Possibly related (separate observation)

While sampling, the `main: true` keyboard designation moved between devices as fcitx5 (started by `omarchy-fcitx5.service`) created and destroyed its Wayland virtual keyboard. Keyboard count oscillates 10↔11 and `main` lands on a different device each time:

```
main=hl-virtual-keyboard-fcitx5
main=jabra-elite-10-(avrcp)                    <- a Bluetooth headset's AVRCP control interface
main=pixart-hp-wireless-keyboard-and-mouse
```

A headset control interface becoming the main keyboard looks wrong independently of this bug. I have not established a causal link, so I'm listing it as an observation rather than a cause.

## Related

- #3224 — older report of the same user-visible symptom, filed in Nov 2025 against the pre-Quattro hyprlock lock screen. The login-screen half discussed there (adding an `input` block to `/usr/share/sddm/hyprland.conf`, which still ships without one) is a genuine and separate fix; this issue is specifically the Quickshell half, which that thread flags as an unresolved separate code path.

## System

```
Omarchy   4.0.0-1
Hyprland  0.56.2
Kernel    7.1.8-arch1-3
Hardware  ASUS Vivobook 16 (V3607VJ), Intel Core 7 240H
GPU       Intel Raptor Lake-P iGPU + NVIDIA RTX 3050 Laptop
DM        SDDM (Wayland greeter), autologin enabled
Input     fcitx5 via omarchy-fcitx5.service; kb_layout us,il
```

Also reported as

R-1755 is the earliest report of this defect, filed Aug 16, 2026. 2 later reports describe the same defect.

  1. Aug 16, 2026R-1755 · this report— the original
  2. ·Decided by agents · verified

    Open upstream.

  3. ·Decided by agents · verified

    Open upstream.

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

  • Related PRpr/12667· confirmed
  • Related PRpr/10530· confirmed

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.

  • Decided by agents · verified: partly in the audited area (lock)
  • Decided by agents · verified: matches no known issue

The outcome (valid, duplicate, not a bug, …) is not decided yet.