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.
Network panel never reopens the passphrase prompt for a saved network with a stale password
Reported by andrei-himself · filed Aug 17, 2026 · open at source
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
Omarchy 4.0.0-1, Hyprland, NetworkManager + wpa_supplicant.
What happens
A saved Wi-Fi network whose stored PSK the AP no longer accepts (router password changed) becomes impossible to reconnect from the network panel. Clicking it shows Passphrase required and the passphrase prompt never opens, so there is no way to enter the new password. The panel offers no path forward; the only fix is nmcli connection delete <SSID> from a terminal, after which the network is "unknown" and clicking it prompts normally.
Repro
- Connect to a protected network so the profile is saved.
- Change the password on the AP (or edit the stored PSK to a wrong value).
- Click the network in the panel.
Logs
journalctl -b -t omarchy-shell:
WARN scene: file:///usr/share/omarchy/shell/plugins/panels/network/Panel.qml[1634:-1]: ReferenceError: root is not definedone per attempt, matching NetworkManager:
device (wlp7s0): Activation: (wifi) psk mismatch reported by supplicant, asking for new key
wpa_supplicant: CTRL-EVENT-SSID-TEMP-DISABLED ssid="..." auth_failures=1 reason=WRONG_KEY
device (wlp7s0): no secrets: No agents were available for this request.
device (wlp7s0): state change: need-auth -> failed (reason 'no-secrets')Cause
plugins/panels/network/Panel.qml:1628-1635, in the wifi row delegate:
function onConnectionFailed(reason) {
var ours = root.actionKind === "connect" && root.actionSsid === (row.net.ssid || "")
root.failNetworkAction(root.networkForSsid(row.net.ssid), reason)
if (ours && root.shouldRepromptPassphrase(reason, row.isProtected)) root.openPasswordPrompt(row.net.ssid) // line 1634
}failNetworkAction() (line 734) ends in refresh(), which rebuilds the network list and destroys the delegate running this handler. Its QML context dies with it, so the root lookup on the next line throws ReferenceError and openPasswordPrompt() is never reached.
The existing comment already anticipates that failNetworkAction clears the action state — hence caching ours first — but not that it also invalidates the delegate context, which takes root and row down with it.
shouldRepromptPassphrase itself is correct; it just never gets called.
Suggested fix
Capture what the line needs into locals before the call, so nothing is resolved through the dead context:
function onConnectionFailed(reason) {
var panel = root
var ssid = row.net.ssid || ""
var protectedNet = row.isProtected
var ours = panel.actionKind === "connect" && panel.actionSsid === ssid
panel.failNetworkAction(panel.networkForSsid(ssid), reason)
if (ours && panel.shouldRepromptPassphrase(reason, protectedNet)) panel.openPasswordPrompt(ssid)
}The same teardown hazard applies to any delegate-scoped handler that calls failNetworkAction() or clearNetworkAction() and then keeps using root/row.
View raw text
**Omarchy 4.0.0-1**, Hyprland, NetworkManager + wpa_supplicant.
## What happens
A **saved** Wi-Fi network whose stored PSK the AP no longer accepts (router password changed) becomes impossible to reconnect from the network panel. Clicking it shows `Passphrase required` and the passphrase prompt **never opens**, so there is no way to enter the new password. The panel offers no path forward; the only fix is `nmcli connection delete <SSID>` from a terminal, after which the network is "unknown" and clicking it prompts normally.
## Repro
1. Connect to a protected network so the profile is saved.
2. Change the password on the AP (or edit the stored PSK to a wrong value).
3. Click the network in the panel.
## Logs
`journalctl -b -t omarchy-shell`:
```
WARN scene: file:///usr/share/omarchy/shell/plugins/panels/network/Panel.qml[1634:-1]: ReferenceError: root is not defined
```
one per attempt, matching NetworkManager:
```
device (wlp7s0): Activation: (wifi) psk mismatch reported by supplicant, asking for new key
wpa_supplicant: CTRL-EVENT-SSID-TEMP-DISABLED ssid="..." auth_failures=1 reason=WRONG_KEY
device (wlp7s0): no secrets: No agents were available for this request.
device (wlp7s0): state change: need-auth -> failed (reason 'no-secrets')
```
## Cause
`plugins/panels/network/Panel.qml:1628-1635`, in the wifi row delegate:
```qml
function onConnectionFailed(reason) {
var ours = root.actionKind === "connect" && root.actionSsid === (row.net.ssid || "")
root.failNetworkAction(root.networkForSsid(row.net.ssid), reason)
if (ours && root.shouldRepromptPassphrase(reason, row.isProtected)) root.openPasswordPrompt(row.net.ssid) // line 1634
}
```
`failNetworkAction()` (line 734) ends in `refresh()`, which rebuilds the network list and destroys the delegate running this handler. Its QML context dies with it, so the `root` lookup on the next line throws `ReferenceError` and `openPasswordPrompt()` is never reached.
The existing comment already anticipates that `failNetworkAction` clears the action state — hence caching `ours` first — but not that it also invalidates the delegate context, which takes `root` and `row` down with it.
`shouldRepromptPassphrase` itself is correct; it just never gets called.
## Suggested fix
Capture what the line needs into locals before the call, so nothing is resolved through the dead context:
```qml
function onConnectionFailed(reason) {
var panel = root
var ssid = row.net.ssid || ""
var protectedNet = row.isProtected
var ours = panel.actionKind === "connect" && panel.actionSsid === ssid
panel.failNetworkAction(panel.networkForSsid(ssid), reason)
if (ours && panel.shouldRepromptPassphrase(reason, protectedNet)) panel.openPasswordPrompt(ssid)
}
```
The same teardown hazard applies to any delegate-scoped handler that calls `failNetworkAction()` or `clearNetworkAction()` and then keeps using `root`/`row`.
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 04:33 UTC