Proof Portal
Omarchy
ProbeLabs65 findings · 95 requirementsA 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.
Leaving fullscreen from a tiled-fullscreen window restores the wrong column geometry on the scrolling layout
Reported by taufardh · filed Sep 20, 2026 · open at source
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
System details
Intel Core 5 210H, Intel Raptor Lake-P + NVIDIA RTX 4050 Mobile, Omarchy 4.0.4-1, Hyprland 0.56.2
What's wrong?
On a scrolling-layout workspace, a window that was put into tiled fullscreen
(SUPER + CTRL + F) and then taken through the ordinary fullscreen toggle
(SUPER + F) comes back at full width inside a half-width column, and onegaps_out short on the left.
fullscreenClient itself is fine. Hyprland restores it to 2 on the way out
because that is the state the window came from, which is correct. What is not
restored is the column's width and origin.
Repro (scrolling layout, scrolling.column_width = 0.5, three columns on
the workspace):
| Step | Action | fullscreen/fullscreenClient | Geometry |
|---|---|---|---|
| 1 | — | 0/0 | 749x910 at 12 |
| 2 | SUPER + CTRL + F | 0/2 | 749x910 at 12 |
| 3 | SUPER + F | 2/2 | 1536x960 at 0 |
| 4 | SUPER + F | 0/2 | `1527x910 at 2` |
| 5 | SUPER + CTRL + F | 0/0 | 749x910 at 2 |
Steps 2 and 4 carry identical state fields and different geometry, which is
the whole bug: 0/2 means 749x910 at step 2 and 1527x910 at step 4.
Step 5 shows the layout can still size the window correctly — dropping the
client flag snaps the width back on its own.
SUPER + ALT + F ("Full width", mode = "maximized") is affected the same
way; it returns 1507x910 instead of 749x910.
Expected: leaving fullscreen returns the window to its column, `749x910 at
12, with fullscreenClient = 2` preserved.
Actual: 1527x910 at 2 — a full-width window inside a half-width column,
overlapping its neighbour, with the left gap visually gone.
Notes
- Both halves of the restore are wrong independently. Width is off by roughly
a factor of two; the origin is off by exactly gaps_out (10px here).
- The origin error is self-healing: focusing another column, or any action
that makes the layout recompute, puts it back. The width error is not.
- omarchy-hyprland-window-tiled-fullscreen-toggle itself is sound. Its
primary dispatch works and it toggles cleanly when nothing else intervenes.
Separate, smaller finding in the same script
Its fallback line is dead on current Hyprland:
$ hyprctl dispatch fullscreenstate 0 0
error: [string "return hl.dispatch(fullscreenstate 0 0)"]:1: ')' expected near '0'The pre-Lua dispatcher syntax no longer parses. It never fires while the
primary hl.dsp.window.fullscreen_state path works, but under `set -euo
pipefail` a failure of the primary path would exit 7 rather than fall through
to the fallback.
Where the fix probably belongs
The layout can still derive the correct geometry; the fullscreen-exit path just
never asks it to. Two separate nudges prove it, and they map onto the two
separate errors:
- Dropping
fullscreenClientto0and raising it back to2restores the
width (1527 -> 749), with no other change.
- A zero-width colresize +0 restores the origin (at 2 -> at 12),
touching neither the width nor the focus.
So this looks less like bad geometry maths and more like the exit path not
triggering a column recompute.
Settings that matter
Hyprland 0.56.2 (efb5099)
Monitor eDP-1, 1920x1200 @ scale 1.25 (logical 1536x960), reserved top 26
Layout scrolling (per-workspace rule), scrolling.column_width = 0.5
Gaps gaps_out 10, gaps_in 5, border_size 2Happy to attach omarchy-debug output if it would help, though this reproduces
from the settings above alone.
View raw text
### System details
Intel Core 5 210H, Intel Raptor Lake-P + NVIDIA RTX 4050 Mobile, Omarchy 4.0.4-1, Hyprland 0.56.2
### What's wrong?
On a scrolling-layout workspace, a window that was put into tiled fullscreen
(`SUPER + CTRL + F`) and then taken through the ordinary fullscreen toggle
(`SUPER + F`) comes back at full width inside a half-width column, and one
`gaps_out` short on the left.
`fullscreenClient` itself is fine. Hyprland restores it to `2` on the way out
because that is the state the window came from, which is correct. What is not
restored is the column's width and origin.
**Repro** (scrolling layout, `scrolling.column_width = 0.5`, three columns on
the workspace):
| Step | Action | `fullscreen/fullscreenClient` | Geometry |
|---|---|---|---|
| 1 | — | `0/0` | `749x910 at 12` |
| 2 | `SUPER + CTRL + F` | `0/2` | `749x910 at 12` |
| 3 | `SUPER + F` | `2/2` | `1536x960 at 0` |
| 4 | `SUPER + F` | `0/2` | **`1527x910 at 2`** |
| 5 | `SUPER + CTRL + F` | `0/0` | `749x910 at 2` |
Steps 2 and 4 carry identical state fields and different geometry, which is
the whole bug: `0/2` means `749x910` at step 2 and `1527x910` at step 4.
Step 5 shows the layout can still size the window correctly — dropping the
client flag snaps the width back on its own.
`SUPER + ALT + F` ("Full width", `mode = "maximized"`) is affected the same
way; it returns `1507x910` instead of `749x910`.
**Expected:** leaving fullscreen returns the window to its column, `749x910 at
12`, with `fullscreenClient = 2` preserved.
**Actual:** `1527x910 at 2` — a full-width window inside a half-width column,
overlapping its neighbour, with the left gap visually gone.
**Notes**
- Both halves of the restore are wrong independently. Width is off by roughly
a factor of two; the origin is off by exactly `gaps_out` (10px here).
- The origin error is self-healing: focusing another column, or any action
that makes the layout recompute, puts it back. The width error is not.
- `omarchy-hyprland-window-tiled-fullscreen-toggle` itself is sound. Its
primary dispatch works and it toggles cleanly when nothing else intervenes.
**Separate, smaller finding in the same script**
Its fallback line is dead on current Hyprland:
```
$ hyprctl dispatch fullscreenstate 0 0
error: [string "return hl.dispatch(fullscreenstate 0 0)"]:1: ')' expected near '0'
```
The pre-Lua dispatcher syntax no longer parses. It never fires while the
primary `hl.dsp.window.fullscreen_state` path works, but under `set -euo
pipefail` a failure of the primary path would exit 7 rather than fall through
to the fallback.
**Where the fix probably belongs**
The layout can still derive the correct geometry; the fullscreen-exit path just
never asks it to. Two separate nudges prove it, and they map onto the two
separate errors:
- Dropping `fullscreenClient` to `0` and raising it back to `2` restores the
**width** (`1527 -> 749`), with no other change.
- A zero-width `colresize +0` restores the **origin** (`at 2 -> at 12`),
touching neither the width nor the focus.
So this looks less like bad geometry maths and more like the exit path not
triggering a column recompute.
**Settings that matter**
```
Hyprland 0.56.2 (efb5099)
Monitor eDP-1, 1920x1200 @ scale 1.25 (logical 1536x960), reserved top 26
Layout scrolling (per-workspace rule), scrolling.column_width = 0.5
Gaps gaps_out 10, gaps_in 5, border_size 2
```
Happy to attach `omarchy-debug` output if it would help, though this reproduces
from the settings above alone.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 16:42 UTC