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

Windows VM: launch fails silently when the container leaves ~/Windows setgid (chmod 0700 cannot clear it)

Reported by rogerfsh · filed Sep 3, 2026Closed upstream on 2026-09-20 by bjarneo via an automated message, as a duplicate of #9334 (R-1173). GitHub close reason: completed.

Received and recorded verbatim. Nothing has been checked 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?
Not yet mapped to any requirement or component.
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. No decision has been recorded yet.

Original report

Windows VM: launch fails silently when the container leaves ~/Windows setgid (chmod 0700 cannot clear it)revision 1 · captured 2026-10-04 12:10 UTC via poll

Summary

omarchy-windows-vm launch fails with ❌ Failed to start Windows VM! and no other output, on a VM that is healthy and reachable over RDP. omarchy-windows-vm status simultaneously reports RUNNING.

The cause is a mode check in prepare_caller_mounts that the script itself cannot satisfy, and the dockurr/windows container re-creates the triggering condition on every start — so each successful start breaks the next launch.

Environment

  • Omarchy 4.0.2-1
  • Kernel 7.1.9-arch1-2, GNU coreutils 9.11, Docker Compose 5.5.0
  • Intel Core Ultra 9 275HX, Intel Arrow Lake-S + NVIDIA RTX 5070 Mobile

Root cause

bin/omarchy-windows-vm:583-593, inside prepare_caller_mounts:

chmod 0700 -- "/proc/$BASHPID/fd/$storage_fd" "/proc/$BASHPID/fd/$shared_fd" || { ... }
storage_mode=$(stat -Lc '%a' "/proc/$BASHPID/fd/$storage_fd" 2>/dev/null) || storage_mode=""
shared_mode=$(stat -Lc '%a' "/proc/$BASHPID/fd/$shared_fd" 2>/dev/null) || shared_mode=""
if [[ $storage_mode != 700 || $shared_mode != 700 ]]; then
  ...
  return 1
fi

The container sets /shared — bind-mounted from ~/Windows — to 2777 on every start. GNU chmod preserves setuid/setgid on directories when given an octal mode, so the script's own normalisation cannot clear it:

start:        2777
after 0700:   2700   <- the script's chmod, mode "retained as 2700"
after g-s:    700

stat -Lc '%a' therefore returns 2700, the comparison against the literal 700 fails, and the function returns 1. The callers at :859 and :888 propagate the bare return 1, and launch_windows prints only ❌ Failed to start Windows VM!.

Why this is unusually hard to diagnose

  • The failure is silent. Every other refusal in assert_mounts_safe prints a reason to stderr; this branch prints nothing.
  • `status` still says RUNNING, because __priv_status does not go through the mount checks.
  • It is self-perpetuating. Clearing the bit by hand fixes exactly one launch; the next container start restores 2777. Observed here: cleared 23:30, VM started 23:44, broken again by 23:47.
  • Through the desktop launcher the stderr is discarded (gtk-launch), so even the branches that do print a reason surface nothing to the user.
  • chmod 0700 ~/Windows — the obvious manual fix — reports mode retained as 2700 and changes nothing, which sends you looking in the wrong place.

Steps to reproduce

chmod 2777 ~/Windows        # what the container does on every start
omarchy-windows-vm launch   # ❌ Failed to start Windows VM!   (no other output)
omarchy-windows-vm status   # Windows VM Status: RUNNING

Workaround

chmod 0700 ~/Windows && chmod g-s ~/Windows   # both calls are required

Suggested fix

  1. Normalise the mode in a way that actually clears the high bits — chmod u=rwx,go=,g-s, or chmod 0700 followed by chmod g-s — or compare against the permission bits only rather than the literal string 700.
  2. Give this branch a message, matching the other refusals in assert_mounts_safe, e.g. omarchy-windows-vm: refusing VM mount source with unexpected mode $shared_mode. The silent return 1 is what turns a one-line fix into a long debugging session.
View raw text
### Summary

`omarchy-windows-vm launch` fails with `❌ Failed to start Windows VM!` and **no other output**, on a VM that is healthy and reachable over RDP. `omarchy-windows-vm status` simultaneously reports `RUNNING`.

The cause is a mode check in `prepare_caller_mounts` that the script itself cannot satisfy, and the `dockurr/windows` container re-creates the triggering condition on **every** start — so each successful start breaks the *next* launch.

### Environment

- Omarchy 4.0.2-1
- Kernel 7.1.9-arch1-2, GNU coreutils 9.11, Docker Compose 5.5.0
- Intel Core Ultra 9 275HX, Intel Arrow Lake-S + NVIDIA RTX 5070 Mobile

### Root cause

`bin/omarchy-windows-vm:583-593`, inside `prepare_caller_mounts`:

```bash
chmod 0700 -- "/proc/$BASHPID/fd/$storage_fd" "/proc/$BASHPID/fd/$shared_fd" || { ... }
storage_mode=$(stat -Lc '%a' "/proc/$BASHPID/fd/$storage_fd" 2>/dev/null) || storage_mode=""
shared_mode=$(stat -Lc '%a' "/proc/$BASHPID/fd/$shared_fd" 2>/dev/null) || shared_mode=""
if [[ $storage_mode != 700 || $shared_mode != 700 ]]; then
  ...
  return 1
fi
```

The container sets `/shared` — bind-mounted from `~/Windows` — to `2777` on every start. **GNU chmod preserves setuid/setgid on directories when given an octal mode**, so the script's own normalisation cannot clear it:

```
start:        2777
after 0700:   2700   <- the script's chmod, mode "retained as 2700"
after g-s:    700
```

`stat -Lc '%a'` therefore returns `2700`, the comparison against the literal `700` fails, and the function returns 1. The callers at `:859` and `:888` propagate the bare `return 1`, and `launch_windows` prints only `❌ Failed to start Windows VM!`.

### Why this is unusually hard to diagnose

- **The failure is silent.** Every other refusal in `assert_mounts_safe` prints a reason to stderr; this branch prints nothing.
- **`status` still says RUNNING**, because `__priv_status` does not go through the mount checks.
- **It is self-perpetuating.** Clearing the bit by hand fixes exactly one launch; the next container start restores `2777`. Observed here: cleared 23:30, VM started 23:44, broken again by 23:47.
- **Through the desktop launcher the stderr is discarded** (`gtk-launch`), so even the branches that do print a reason surface nothing to the user.
- `chmod 0700 ~/Windows` — the obvious manual fix — reports `mode retained as 2700` and changes nothing, which sends you looking in the wrong place.

### Steps to reproduce

```bash
chmod 2777 ~/Windows        # what the container does on every start
omarchy-windows-vm launch   # ❌ Failed to start Windows VM!   (no other output)
omarchy-windows-vm status   # Windows VM Status: RUNNING
```

### Workaround

```bash
chmod 0700 ~/Windows && chmod g-s ~/Windows   # both calls are required
```

### Suggested fix

1. Normalise the mode in a way that actually clears the high bits — `chmod u=rwx,go=,g-s`, or `chmod 0700` followed by `chmod g-s` — or compare against the permission bits only rather than the literal string `700`.
2. Give this branch a message, matching the other refusals in `assert_mounts_safe`, e.g. `omarchy-windows-vm: refusing VM mount source with unexpected mode $shared_mode`. The silent `return 1` is what turns a one-line fix into a long debugging session.

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.

No decision has been recorded yet.