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

Suspend/hibernate resume stuck ~90s: unmount-fuse sleep hook's gvfs restart doesn't actually detach from user.slice thaw

Reported by swiaam · filed Sep 10, 2026Closed upstream on 2026-10-11 by its own reporter swiaam, as not planned. Closed by its own reporter — not by itself evidence of a fix.

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

Suspend/hibernate resume stuck ~90s: unmount-fuse sleep hook's gvfs restart doesn't actually detach from user.slice thawrevision 1 · captured 2026-09-28 21:23 UTC via poll

What happened

Every suspend and hibernate cycle leaves the screen/session stuck (frozen, unresponsive) for roughly 85-90 seconds after the kernel has already resumed, before the session actually thaws and becomes usable again.

Root cause

/usr/lib/systemd/system-sleep/unmount-fuse's post branch already documents the exact failure mode it's trying to avoid:

if [[ $1 == "post" ]]; then
  # Run in background — user.slice is still frozen at this point, so a
  # synchronous restart would block the thaw for up to 90 seconds.
  (
    sleep 5
    for uid_dir in /run/user/*; do
      ...
      systemctl --user restart gvfs-daemon.service 2>/dev/null || true
      ...
    done
  ) &
fi

The backgrounding via (...) & does not actually detach the job from the sleep hook's process tree/cgroup, so systemd still waits on it before it will thaw user.slice — defeating the workaround the comment describes. In practice this means every resume hits the "up to 90 seconds" case, not just the intended edge case.

Evidence

journalctl -b around a resume shows the exact gap, correlated with the backgrounded sudo ... systemctl --user restart gvfs-daemon.service call this hook spawns:

10:42:05  kernel: PM: suspend exit
10:42:10  sudo[...]: session opened for user wiaam ... systemctl --user restart gvfs-daemon.service
[85 second gap — nothing logged]
10:43:35  systemd[1]: user.slice: Unit now thawed.
10:43:35  systemd[1]: user-1000.slice: Unit now thawed.
10:43:35  systemd[1]: Finished System Suspend.

Reproduced identically across a plain suspend and a hibernate cycle on the same machine (both showed the ~85-90s gap between kernel resume and the thaw/"Finished System Suspend").

Suggested fix

Hand each restart to systemd-run as an independent transient unit instead of a shell background job, so it runs fully outside this script's process tree and cannot block the thaw:

if [[ $1 == "post" ]]; then
  for uid_dir in /run/user/*; do
    uid=$(basename "$uid_dir")
    if [[ -S $uid_dir/bus ]]; then
      systemd-run --quiet --unit="omarchy-gvfs-restart-$uid-$$" \
        /bin/bash -c "sleep 5; sudo -u '#$uid' env DBUS_SESSION_BUS_ADDRESS=unix:path=$uid_dir/bus XDG_RUNTIME_DIR=$uid_dir systemctl --user restart gvfs-daemon.service" \
        2>/dev/null || true
    fi
  done
fi

I've applied this locally (in place of the packaged script) and confirmed resume is immediate afterward, with the gvfs restart still completing successfully in the background a few seconds later.

Steps to reproduce

  1. Suspend (or hibernate) the machine.
  2. Resume.
  3. Screen/session stays stuck for ~85-90 seconds before becoming responsive again.

System details

  • Omarchy version: 4.0.3-1
  • Kernel: 7.2.3-arch1-3
  • systemd: 261 (261.2-1-arch)
  • CPU: 11th Gen Intel(R) Core(TM) i5-1145G7 @ 2.60GHz
  • GPU: Intel TigerLake-LP GT2 [Iris Xe Graphics] (i915)
  • Laptop, single integrated GPU (no hybrid/discrete graphics involved)

🤖 Generated with Claude Code

View raw text
## What happened
Every suspend and hibernate cycle leaves the screen/session stuck (frozen, unresponsive) for roughly 85-90 seconds after the kernel has already resumed, before the session actually thaws and becomes usable again.

## Root cause
`/usr/lib/systemd/system-sleep/unmount-fuse`'s `post` branch already documents the exact failure mode it's trying to avoid:

```bash
if [[ $1 == "post" ]]; then
  # Run in background — user.slice is still frozen at this point, so a
  # synchronous restart would block the thaw for up to 90 seconds.
  (
    sleep 5
    for uid_dir in /run/user/*; do
      ...
      systemctl --user restart gvfs-daemon.service 2>/dev/null || true
      ...
    done
  ) &
fi
```

The backgrounding via `(...) &` does **not** actually detach the job from the sleep hook's process tree/cgroup, so systemd still waits on it before it will thaw `user.slice` — defeating the workaround the comment describes. In practice this means every resume hits the "up to 90 seconds" case, not just the intended edge case.

## Evidence
`journalctl -b` around a resume shows the exact gap, correlated with the backgrounded `sudo ... systemctl --user restart gvfs-daemon.service` call this hook spawns:

```
10:42:05  kernel: PM: suspend exit
10:42:10  sudo[...]: session opened for user wiaam ... systemctl --user restart gvfs-daemon.service
[85 second gap — nothing logged]
10:43:35  systemd[1]: user.slice: Unit now thawed.
10:43:35  systemd[1]: user-1000.slice: Unit now thawed.
10:43:35  systemd[1]: Finished System Suspend.
```

Reproduced identically across a plain suspend and a hibernate cycle on the same machine (both showed the ~85-90s gap between kernel resume and the thaw/"Finished System Suspend").

## Suggested fix
Hand each restart to `systemd-run` as an independent transient unit instead of a shell background job, so it runs fully outside this script's process tree and cannot block the thaw:

```bash
if [[ $1 == "post" ]]; then
  for uid_dir in /run/user/*; do
    uid=$(basename "$uid_dir")
    if [[ -S $uid_dir/bus ]]; then
      systemd-run --quiet --unit="omarchy-gvfs-restart-$uid-$$" \
        /bin/bash -c "sleep 5; sudo -u '#$uid' env DBUS_SESSION_BUS_ADDRESS=unix:path=$uid_dir/bus XDG_RUNTIME_DIR=$uid_dir systemctl --user restart gvfs-daemon.service" \
        2>/dev/null || true
    fi
  done
fi
```

I've applied this locally (in place of the packaged script) and confirmed resume is immediate afterward, with the gvfs restart still completing successfully in the background a few seconds later.

## Steps to reproduce
1. Suspend (or hibernate) the machine.
2. Resume.
3. Screen/session stays stuck for ~85-90 seconds before becoming responsive again.

## System details
- Omarchy version: 4.0.3-1
- Kernel: 7.2.3-arch1-3
- systemd: 261 (261.2-1-arch)
- CPU: 11th Gen Intel(R) Core(TM) i5-1145G7 @ 2.60GHz
- GPU: Intel TigerLake-LP GT2 [Iris Xe Graphics] (i915)
- Laptop, single integrated GPU (no hybrid/discrete graphics involved)


🤖 Generated with [Claude Code](https://claude.com/claude-code)

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 11:40 UTC