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

windows-vm: launch fires xfreerdp3 before the guest is ready because the readiness wait greps stale log lines

Reported by DataDave-Dev · filed Aug 14, 2026Closed upstream on 2026-08-15 by the merge of PR #6893 (closed by dhh). 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 fires xfreerdp3 before the guest is ready because the readiness wait greps stale log linesrevision 1 · captured 2026-10-04 12:03 UTC via poll

System details

  • CPU: 12th Gen Intel Core i9-12900H
  • GPU: Intel Iris Xe (Alder Lake-P GT2) + NVIDIA RTX 3060 Mobile
  • Omarchy: 4.0.0-1
  • Docker 29.7.2, Docker Compose 5.4.0, freerdp 2:3.30.0-2, dockurr/windows v5.16

What's wrong?

omarchy-windows-vm launch starts the container and then exits without ever opening an RDP window. From the user's side the symptom is "only Docker comes up, no Windows window appears."

The readiness wait in launch_windows() greps the entire container log:

until docker logs omarchy-windows 2>&1 | grep -qi "windows started successfully"; do

docker logs keeps output across docker stop / docker start — it is only cleared when the container is removed. Any container that survives a session therefore already contains Windows started successfully lines from previous boots, so the loop matches on the first iteration and xfreerdp3 is invoked roughly one second after docker compose up -d, while the guest is still in firmware/boot. RDP is not listening yet, freerdp fails, no window is drawn.

On this machine the guest needs ~30s from Booting Windows using QEMU to Windows started successfully, so the client is fired about 29s too early.

The same race hits a second path that has nothing to do with stale logs: when the container is already running (CONTAINER_STATUS = running) the readiness wait is skipped entirely. dockurr/windows restarts the guest inside a running container whenever Windows reboots or shuts down, so launching during that window connects to a container that is up but a guest that is not.

Steps to reproduce

  1. Launch the Windows VM and let it come up normally.
  2. Close the session in a way that leaves the container in place rather than removing it — e.g. omarchy-windows-vm launch --keep-alive, or shut Windows down from inside the guest.
  3. docker stop omarchy-windows (container kept, not removed).
  4. omarchy-windows-vm launch

The container starts, the readiness loop returns instantly against the previous boot's log line, xfreerdp3 fails, and no RDP window opens. Launching from the .desktop entry (Terminal=false) hides freerdp's error entirely, so the user sees nothing at all.

Evidence from an affected container

$ docker inspect omarchy-windows --format '{{.Created}} {{.State.StartedAt}}'
2026-08-13T14:49:54Z   2026-08-14T18:07:11Z          # restarted, never removed

$ docker logs omarchy-windows 2>&1 | grep -ci "windows started successfully"
9                                                     # 9 stale matches

$ docker logs -t omarchy-windows | grep -E "Booting|started successfully" | tail -2
2026-08-14T18:07:11.878Z  Booting Windows using QEMU v10.0.8...
2026-08-14T18:07:41.886Z  Windows started successfully...   # 30s later

Auth and networking are fine on this host — connecting manually once the guest has finished booting works on the first try with the exact command the script builds.

Expected behavior

launch waits for the guest to actually accept RDP before starting xfreerdp3, whether the container was just started or was already running.

Suggested fix

Anchor the log scan to the current container start, and run the wait unconditionally instead of only on the cold-start path:

STARTED_AT=$(docker inspect --format='{{.State.StartedAt}}' omarchy-windows)
until docker logs --since "$STARTED_AT" omarchy-windows 2>&1 | grep -qi "windows started successfully"; do

A readiness probe against the guest would be sturdier still, since it covers guest reboots inside a long-lived container:

GUEST_IP=$(docker exec omarchy-windows awk '{print $3}' /var/lib/misc/dnsmasq.leases | head -1)
until docker exec omarchy-windows nc -z "$GUEST_IP" 3389; do sleep 2; done

Probing 127.0.0.1:3389 from the host does not work as a readiness check: docker-proxy accepts the TCP connection whether or not the guest is listening.

Related

  • #2599 (closed) — same user-visible symptom, fixed by adding this log-grep wait; the stale-log and already-running cases remain
  • #5202 (open) — the auto-stop that follows an xfreerdp3 failure, which makes this failure mode look like the VM refusing to start
View raw text
### System details

- CPU: 12th Gen Intel Core i9-12900H
- GPU: Intel Iris Xe (Alder Lake-P GT2) + NVIDIA RTX 3060 Mobile
- Omarchy: 4.0.0-1
- Docker 29.7.2, Docker Compose 5.4.0, freerdp 2:3.30.0-2, dockurr/windows v5.16

### What's wrong?

`omarchy-windows-vm launch` starts the container and then exits without ever opening an RDP window. From the user's side the symptom is "only Docker comes up, no Windows window appears."

The readiness wait in `launch_windows()` greps the **entire** container log:

```bash
until docker logs omarchy-windows 2>&1 | grep -qi "windows started successfully"; do
```

`docker logs` keeps output across `docker stop` / `docker start` — it is only cleared when the container is *removed*. Any container that survives a session therefore already contains `Windows started successfully` lines from previous boots, so the loop matches on the first iteration and `xfreerdp3` is invoked roughly one second after `docker compose up -d`, while the guest is still in firmware/boot. RDP is not listening yet, freerdp fails, no window is drawn.

On this machine the guest needs ~30s from `Booting Windows using QEMU` to `Windows started successfully`, so the client is fired about 29s too early.

The same race hits a second path that has nothing to do with stale logs: when the container is already running (`CONTAINER_STATUS = running`) the readiness wait is **skipped entirely**. dockurr/windows restarts the guest inside a running container whenever Windows reboots or shuts down, so launching during that window connects to a container that is up but a guest that is not.

### Steps to reproduce

1. Launch the Windows VM and let it come up normally.
2. Close the session in a way that leaves the container in place rather than removing it — e.g. `omarchy-windows-vm launch --keep-alive`, or shut Windows down from inside the guest.
3. `docker stop omarchy-windows` (container kept, not removed).
4. `omarchy-windows-vm launch`

The container starts, the readiness loop returns instantly against the previous boot's log line, `xfreerdp3` fails, and no RDP window opens. Launching from the `.desktop` entry (`Terminal=false`) hides freerdp's error entirely, so the user sees nothing at all.

### Evidence from an affected container

```
$ docker inspect omarchy-windows --format '{{.Created}} {{.State.StartedAt}}'
2026-08-13T14:49:54Z   2026-08-14T18:07:11Z          # restarted, never removed

$ docker logs omarchy-windows 2>&1 | grep -ci "windows started successfully"
9                                                     # 9 stale matches

$ docker logs -t omarchy-windows | grep -E "Booting|started successfully" | tail -2
2026-08-14T18:07:11.878Z  Booting Windows using QEMU v10.0.8...
2026-08-14T18:07:41.886Z  Windows started successfully...   # 30s later
```

Auth and networking are fine on this host — connecting manually once the guest has finished booting works on the first try with the exact command the script builds.

### Expected behavior

`launch` waits for the guest to actually accept RDP before starting `xfreerdp3`, whether the container was just started or was already running.

### Suggested fix

Anchor the log scan to the current container start, and run the wait unconditionally instead of only on the cold-start path:

```bash
STARTED_AT=$(docker inspect --format='{{.State.StartedAt}}' omarchy-windows)
until docker logs --since "$STARTED_AT" omarchy-windows 2>&1 | grep -qi "windows started successfully"; do
```

A readiness probe against the guest would be sturdier still, since it covers guest reboots inside a long-lived container:

```bash
GUEST_IP=$(docker exec omarchy-windows awk '{print $3}' /var/lib/misc/dnsmasq.leases | head -1)
until docker exec omarchy-windows nc -z "$GUEST_IP" 3389; do sleep 2; done
```

Probing `127.0.0.1:3389` from the host does not work as a readiness check: docker-proxy accepts the TCP connection whether or not the guest is listening.

### Related

- #2599 (closed) — same user-visible symptom, fixed by adding this log-grep wait; the stale-log and already-running cases remain
- #5202 (open) — the auto-stop that follows an `xfreerdp3` failure, which makes this failure mode look like the VM refusing to start

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.