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

Windows VM: omarchy-windows-vm launch fails silently ("Failed to start Windows VM") when the shared-folder anchor has the setgid bit set

Reported by StefaanBatsele · filed Sep 4, 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: omarchy-windows-vm launch fails silently ("Failed to start Windows VM") when the shared-folder anchor has the setgid bit setrevision 1 · captured 2026-10-04 12:10 UTC via poll

Title: Windows VM: omarchy-windows-vm launch fails silently ("Failed to start Windows VM") when the shared-folder anchor has the setgid bit set

System details: Intel Core i7-8850H, Intel UHD Graphics 630, Omarchy 4.0.2-1

What's wrong?

After installing and running the Windows VM (omarchy-windows-vm install → omarchy-windows-vm launch), a later omarchy-windows-vm launch can start failing with only:

Starting Windows VM (this may prompt for authorization)...
❌ Failed to start Windows VM!
   Try checking: omarchy-windows-vm status

omarchy-windows-vm status shows the container is still RUNNING, and docker logs confirms Windows booted fine — so this isn't actually a VM start failure, it's the privileged up_wait helper aborting before it even touches Docker.

Root cause

prepare_caller_mounts() requires both mount-anchor directories to be exactly mode 700:

storage_mode=$(stat -Lc '%a' "/proc/$BASHPID/fd/$storage_fd" ...)
shared_mode=$(stat -Lc '%a' "/proc/$BASHPID/fd/$shared_fd" ...)
if [[ $storage_mode != 700 || $shared_mode != 700 ]]; then
  ...
  return 1
fi

The shared anchor (bind-mounted into the guest as /shared for the Samba share) ends up with mode 2700 (setgid bit set) after normal use from inside the Windows guest — this looks like legitimate behavior from the guest's SMB client/server touching the folder, not tampering. Once that happens, every subsequent up_wait/up call fails this strict == 700 comparison and aborts.

The bigger issue: none of the failure paths here print anything to stderr, so the wrapper's launch_windows() just prints the generic "Failed to start Windows VM!" with zero indication of why. Tracing it required running pkexec bash -x /usr/bin/omarchy-windows-vm __priv up_wait to find the actual [[ 2700 != 700 ]] comparison.

Steps to reproduce

  1. omarchy-windows-vm install and let Windows finish setting up.
  2. Use the VM for a while (browse the shared/Windows folder from inside the guest) so the setgid bit gets set on the host-side shared anchor.
  3. Close RDP (VM auto-stops), then omarchy-windows-vm launch again.
  4. Observe the opaque "Failed to start Windows VM!" message even though nothing is actually wrong with Docker/the container.

Workaround

chmod g-s /home/<user>/Windows   # or wherever the shared folder points
omarchy-windows-vm launch

(Path found via findmnt -T /var/lib/omarchy/windows/mounts/users/<uid>/shared.)

Suggested fix

Either:
- mask off the setgid/setuid/sticky bits before comparing (mode=$(( 8#$mode & 0777 )) or compare against a pattern that ignores the leading digit) instead of a strict == 700/== 700, since the guest's own Samba usage legitimately sets it, or
- have prepare_caller_mounts re-clear the bit itself (it already does chmod 0700 on both fds earlier in the function — but the later comparison still reads the fd's mode via stat, and that chmod apparently doesn't stick for the shared fd, worth double-checking why), and/or
- at minimum, echo the specific failing check to stderr so launch_windows can surface something more actionable than "Failed to start Windows VM!".

View raw text
**Title:** Windows VM: `omarchy-windows-vm launch` fails silently ("Failed to start Windows VM") when the shared-folder anchor has the setgid bit set

**System details:** Intel Core i7-8850H, Intel UHD Graphics 630, Omarchy 4.0.2-1

**What's wrong?**

After installing and running the Windows VM (`omarchy-windows-vm install` → `omarchy-windows-vm launch`), a *later* `omarchy-windows-vm launch` can start failing with only:

```
Starting Windows VM (this may prompt for authorization)...
❌ Failed to start Windows VM!
   Try checking: omarchy-windows-vm status
```

`omarchy-windows-vm status` shows the container is still `RUNNING`, and `docker logs` confirms Windows booted fine — so this isn't actually a VM start failure, it's the privileged `up_wait` helper aborting before it even touches Docker.

**Root cause**

`prepare_caller_mounts()` requires both mount-anchor directories to be exactly mode `700`:

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

The `shared` anchor (bind-mounted into the guest as `/shared` for the Samba share) ends up with mode `2700` (setgid bit set) after normal use from inside the Windows guest — this looks like legitimate behavior from the guest's SMB client/server touching the folder, not tampering. Once that happens, every subsequent `up_wait`/`up` call fails this strict `== 700` comparison and aborts.

The bigger issue: **none of the failure paths here print anything to stderr**, so the wrapper's `launch_windows()` just prints the generic "Failed to start Windows VM!" with zero indication of *why*. Tracing it required running `pkexec bash -x /usr/bin/omarchy-windows-vm __priv up_wait` to find the actual `[[ 2700 != 700 ]]` comparison.

**Steps to reproduce**

1. `omarchy-windows-vm install` and let Windows finish setting up.
2. Use the VM for a while (browse the `shared`/`Windows` folder from inside the guest) so the setgid bit gets set on the host-side shared anchor.
3. Close RDP (VM auto-stops), then `omarchy-windows-vm launch` again.
4. Observe the opaque "Failed to start Windows VM!" message even though nothing is actually wrong with Docker/the container.

**Workaround**

```
chmod g-s /home/<user>/Windows   # or wherever the shared folder points
omarchy-windows-vm launch
```

(Path found via `findmnt -T /var/lib/omarchy/windows/mounts/users/<uid>/shared`.)

**Suggested fix**

Either:
- mask off the setgid/setuid/sticky bits before comparing (`mode=$(( 8#$mode & 0777 ))` or compare against a pattern that ignores the leading digit) instead of a strict `== 700`/`== 700`, since the guest's own Samba usage legitimately sets it, or
- have `prepare_caller_mounts` re-clear the bit itself (it already does `chmod 0700` on both fds earlier in the function — but the *later* comparison still reads the fd's mode via `stat`, and that chmod apparently doesn't stick for the `shared` fd, worth double-checking why), and/or
- at minimum, echo the specific failing check to stderr so `launch_windows` can surface something more actionable than "Failed to start Windows VM!".

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.