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

`omarchy restart shell` reports failure on a successful restart (2s readiness poll vs ~6s cold start)

Reported by aimonkeymind · filed Oct 2, 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

`omarchy restart shell` reports failure on a successful restart (2s readiness poll vs ~6s cold start)revision 1 · captured 2026-10-02 02:38 UTC via poll

omarchy restart shell reports failure on a successful restart (2s readiness poll vs ~6s cold start)

Summary

omarchy restart shell printed

Omarchy shell did not become ready after restart.

and exited 1, while the shell was in fact starting up correctly and became
ready about six seconds later. Any caller that gates on the exit code is told
the restart failed when it succeeded.

Evidence

Command run at 10:18:0x, with the shell absent beforehand (no shell running):

$ omarchy restart shell
Omarchy shell did not become ready after restart.
exit=1

The shell's own journal (journalctl --user -b -t omarchy-shell) shows it came
up normally right afterwards:

Oct 02 10:18:07 omarchy omarchy-shell[3809]:   INFO: Launching config: "/usr/share/omarchy/shell/shell.qml"
Oct 02 10:18:07 omarchy omarchy-shell[3809]:   INFO: Shell ID: "c0240dfe8c8e8a421e1f8db23a03fc60" Path ID "c0240dfe8c8e8a421e1f8db23a03fc60"
Oct 02 10:18:11 omarchy omarchy-shell[3809]:  DEBUG qml: omarchy-shell paths omarchyPath=/usr/share/omarchy shellDir=/usr/share/omarchy/shell firstPartyPluginsDir=/usr/share/omarchy/shell/plugins defaultsPath=/usr/share/omarchy/config/omarchy/shell.json userConfigPath=/home/wjl/.config/omarchy/shell.json
Oct 02 10:18:12 omarchy omarchy-shell[3809]:   INFO: Configuration Loaded
Oct 02 10:18:13 omarchy omarchy-shell[3809]:  DEBUG qml: omarchy idle 2026-10-02T02:18:13.518Z service-ready
Oct 02 10:18:15 omarchy omarchy-shell[3809]:  DEBUG qml: omarchy polkit agent registered
Oct 02 10:18:16 omarchy omarchy-shell[3809]:  DEBUG qml: omarchy idle 2026-10-02T02:18:16.145Z idle-monitor: active

Confirmed healthy afterwards:

$ omarchy-shell shell ping
ok                                    # exit 0

$ hyprctl layers
Layer level 0 (background):
        Layer 5c91d124b2f0: xywh: 0 0 1200 675, a: 1, namespace: omarchy-background, pid: 3809
Layer level 2 (top):
        Layer 5c91d1caeb80: xywh: 0 0 1200 26, a: 1, namespace: omarchy-bar, pid: 3809

Cause

The readiness check in omarchy-restart-shell polls with a fixed, very short
budget:

for (( attempt = 0; attempt < 20; attempt++ )); do
  if OMARCHY_PATH="$session_omarchy_path" OMARCHY_SHELL_IPC_TIMEOUT=0.5s omarchy-shell shell ping >/dev/null 2>&1; then
    ...
  fi
  sleep 0.1
done

echo "Omarchy shell did not become ready after restart." >&2
exit 1

20 attempts at sleep 0.1 is roughly 2 seconds. Measured cold starts on the
same machine:

startlaunchreadywall time
boot10:08:4410:08:49 service-ready~5s
restart10:18:0710:18:13 service-ready~6s

Startup has to load shell.qml, discover plugins, and register the polkit
agent, so the shell simply cannot answer ping inside 2s of being spawned. The
service-ready marker is the real readiness signal, and it lands after the
deadline.

Impact

  • A user running the command directly is told the restart failed while their bar

is about to appear, and is likely to run it again.
- omarchy-restart-shell also exits 1 from the deliberate no-duplicate-launch
path and from the relock path, so exit 1 carries no usable information about
what actually happened.
- omarchy-update-restart calls omarchy-restart-shell || true, so during
omarchy update the false negative is swallowed entirely. The failure is only
visible to direct callers, which is likely why this has gone unnoticed.

Suggested change

Wait on the shell's actual readiness rather than a 2s budget: either raise the
attempt count substantially, or poll omarchy-shell shell ping against a
wall-clock deadline in the same spirit as the existing relock_session, which
already uses a generous deadline=$((SECONDS + 30)) for the same reason.

Separately, consider distinguishing "did not start" from "took longer than
expected" in the exit status, since || true currently hides both.

Steps to reproduce

  1. Stop the shell, or use a session where it is not running:

pkill -f 'quickshell -n -p /usr/share/omarchy/shell'
2. Run omarchy restart shell.
3. Observe exit 1 and the "did not become ready" message.
4. Observe hyprctl layers ~5s later: the omarchy-bar layer is present and
omarchy-shell shell ping returns ok.

System

  • Omarchy 4.0.4-1
  • kernel 7.2.5-3-omarchy, systemd 261
  • Hyprland 0.56.2-2, quickshell 0.3.1-1
  • GPU: NVIDIA GeForce 610M (GF108M) on nouveau
  • Lenovo B340 AIO, Intel Celeron G1610

Diagnostics

/usr/bin/omarchy-debug --no-sudo --print output attached. Its JOURNALCTL
section only includes warnings and errors, so the INFO/DEBUG qml lines
above came from journalctl --user -b -t omarchy-shell --no-pager.

View raw text
# `omarchy restart shell` reports failure on a successful restart (2s readiness poll vs ~6s cold start)

## Summary

`omarchy restart shell` printed

```
Omarchy shell did not become ready after restart.
```

and exited 1, while the shell was in fact starting up correctly and became
ready about six seconds later. Any caller that gates on the exit code is told
the restart failed when it succeeded.

## Evidence

Command run at 10:18:0x, with the shell absent beforehand (`no shell running`):

```
$ omarchy restart shell
Omarchy shell did not become ready after restart.
exit=1
```

The shell's own journal (`journalctl --user -b -t omarchy-shell`) shows it came
up normally right afterwards:

```
Oct 02 10:18:07 omarchy omarchy-shell[3809]:   INFO: Launching config: "/usr/share/omarchy/shell/shell.qml"
Oct 02 10:18:07 omarchy omarchy-shell[3809]:   INFO: Shell ID: "c0240dfe8c8e8a421e1f8db23a03fc60" Path ID "c0240dfe8c8e8a421e1f8db23a03fc60"
Oct 02 10:18:11 omarchy omarchy-shell[3809]:  DEBUG qml: omarchy-shell paths omarchyPath=/usr/share/omarchy shellDir=/usr/share/omarchy/shell firstPartyPluginsDir=/usr/share/omarchy/shell/plugins defaultsPath=/usr/share/omarchy/config/omarchy/shell.json userConfigPath=/home/wjl/.config/omarchy/shell.json
Oct 02 10:18:12 omarchy omarchy-shell[3809]:   INFO: Configuration Loaded
Oct 02 10:18:13 omarchy omarchy-shell[3809]:  DEBUG qml: omarchy idle 2026-10-02T02:18:13.518Z service-ready
Oct 02 10:18:15 omarchy omarchy-shell[3809]:  DEBUG qml: omarchy polkit agent registered
Oct 02 10:18:16 omarchy omarchy-shell[3809]:  DEBUG qml: omarchy idle 2026-10-02T02:18:16.145Z idle-monitor: active
```

Confirmed healthy afterwards:

```
$ omarchy-shell shell ping
ok                                    # exit 0

$ hyprctl layers
Layer level 0 (background):
        Layer 5c91d124b2f0: xywh: 0 0 1200 675, a: 1, namespace: omarchy-background, pid: 3809
Layer level 2 (top):
        Layer 5c91d1caeb80: xywh: 0 0 1200 26, a: 1, namespace: omarchy-bar, pid: 3809
```

## Cause

The readiness check in `omarchy-restart-shell` polls with a fixed, very short
budget:

```bash
for (( attempt = 0; attempt < 20; attempt++ )); do
  if OMARCHY_PATH="$session_omarchy_path" OMARCHY_SHELL_IPC_TIMEOUT=0.5s omarchy-shell shell ping >/dev/null 2>&1; then
    ...
  fi
  sleep 0.1
done

echo "Omarchy shell did not become ready after restart." >&2
exit 1
```

20 attempts at `sleep 0.1` is roughly 2 seconds. Measured cold starts on the
same machine:

| start | launch | ready | wall time |
|---|---|---|---|
| boot | 10:08:44 | 10:08:49 `service-ready` | ~5s |
| restart | 10:18:07 | 10:18:13 `service-ready` | ~6s |

Startup has to load `shell.qml`, discover plugins, and register the polkit
agent, so the shell simply cannot answer `ping` inside 2s of being spawned. The
`service-ready` marker is the real readiness signal, and it lands after the
deadline.

## Impact

- A user running the command directly is told the restart failed while their bar
  is about to appear, and is likely to run it again.
- `omarchy-restart-shell` also exits 1 from the deliberate no-duplicate-launch
  path and from the relock path, so exit 1 carries no usable information about
  what actually happened.
- `omarchy-update-restart` calls `omarchy-restart-shell || true`, so during
  `omarchy update` the false negative is swallowed entirely. The failure is only
  visible to direct callers, which is likely why this has gone unnoticed.

## Suggested change

Wait on the shell's actual readiness rather than a 2s budget: either raise the
attempt count substantially, or poll `omarchy-shell shell ping` against a
wall-clock deadline in the same spirit as the existing `relock_session`, which
already uses a generous `deadline=$((SECONDS + 30))` for the same reason.

Separately, consider distinguishing "did not start" from "took longer than
expected" in the exit status, since `|| true` currently hides both.

## Steps to reproduce

1. Stop the shell, or use a session where it is not running:
   `pkill -f 'quickshell -n -p /usr/share/omarchy/shell'`
2. Run `omarchy restart shell`.
3. Observe exit 1 and the "did not become ready" message.
4. Observe `hyprctl layers` ~5s later: the `omarchy-bar` layer is present and
   `omarchy-shell shell ping` returns `ok`.

## System

- Omarchy `4.0.4-1`
- kernel `7.2.5-3-omarchy`, systemd 261
- Hyprland `0.56.2-2`, quickshell `0.3.1-1`
- GPU: NVIDIA GeForce 610M (GF108M) on nouveau
- Lenovo B340 AIO, Intel Celeron G1610

## Diagnostics

`/usr/bin/omarchy-debug --no-sudo --print` output attached. Its JOURNALCTL
section only includes warnings and errors, so the `INFO`/`DEBUG qml` lines
above came from `journalctl --user -b -t omarchy-shell --no-pager`.

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 20:37 UTC