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.
Migration 1781063758 can truncate a customized hyprland.lua to two lines
Reported by omarchybot · filed Aug 16, 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: Omarchy quattro @ 7488eade (post-4.0.0), QEMU/KVM VM. Found by an automated QA pass; reproduced on a disposable worker VM.
Migration 1781063758.sh can truncate a customized ~/.config/hypr/hyprland.lua to two lines, discarding every require() and every personal override, with no backup. Hyprland then starts with no monitors, no bindings and no input config.
The migration replaces the old package.path = ... preamble with the bootstrap dofile. The awk at migrations/1781063758.sh:21-26 swallows every line after the trigger without printing it until it finds a line matching exactly ^[[:space:]]*\.\. package\.path$:
while ((getline line) > 0) {
if (line ~ /^[[:space:]]*\.\. package\.path$/) {
break
}
}
nextIf that terminator is not there verbatim, getline runs to EOF discarding everything, and the result is mv'd over the user's file at :40. There is no fallback when the terminator is absent, no check that the output is non-degenerate, and no backup.
Two realistic edits, both of which hit it — a user who folded the continuation onto one line, and one who appended their own path entry:
########## CASE: user_one_line
--- BEFORE (12 lines: require("hypr.monitors"), require("hypr.bindings"),
require("hypr.input"), a custom windowrule, bind and monitor)
--- AFTER (2 lines)
-- Omarchy's bootstrap keeps path setup out of this user config.
dofile((os.getenv("OMARCHY_PATH") or "/usr/share/omarchy") .. "/default/hypr/bootstrap.lua")
########## CASE: user_extended_path
$ luac -p .config/hypr/hyprland.lua
luac: .config/hypr/hyprland.lua:3: unexpected symbol near '..'The stock file shape is handled correctly — only edited files are at risk, so the affected population is users carrying a pre-bootstrap hyprland.lua (the quattro beta/edge cohort and 4.0 upgraders), not fresh 4.0 installs, which are skipped by the grep -Fq at :5.
Worth aligning at the same time: 1781043107.sh:39-40 and :71-73 use the same unguarded transform-then-write-back shape (awk ... >"$tmp" then cat "$tmp" >"$file", with no success check) against hyprland.conf, hyprland.lua, alacritty.toml, foot.ini, ghostty/config and kitty.conf. 1785189600.sh:49-53 shows the correct shape.
Correction, after an independent review of this report:
Narrower than filed. This needs a hand-edited pre-bootstrap hyprland.lua that keeps both trigger lines but moves or loses the standalone .. package.path terminator. Stock fresh 4.0 installs and ordinary 3.x upgrades are skipped by the grep -Fq guard at :5, so the population is the early edge/beta cohort, not upgraders generally.
View raw text
**System details:** Omarchy `quattro` @ 7488eade (post-4.0.0), QEMU/KVM VM. Found by an automated QA pass; reproduced on a disposable worker VM.
Migration `1781063758.sh` can truncate a customized `~/.config/hypr/hyprland.lua` to two lines, discarding every `require()` and every personal override, with no backup. Hyprland then starts with no monitors, no bindings and no input config.
The migration replaces the old `package.path = ...` preamble with the bootstrap `dofile`. The awk at `migrations/1781063758.sh:21-26` swallows every line after the trigger *without printing it* until it finds a line matching exactly `^[[:space:]]*\.\. package\.path$`:
```awk
while ((getline line) > 0) {
if (line ~ /^[[:space:]]*\.\. package\.path$/) {
break
}
}
next
```
If that terminator is not there verbatim, `getline` runs to EOF discarding everything, and the result is `mv`'d over the user's file at `:40`. There is no fallback when the terminator is absent, no check that the output is non-degenerate, and no backup.
Two realistic edits, both of which hit it — a user who folded the continuation onto one line, and one who appended their own path entry:
```
########## CASE: user_one_line
--- BEFORE (12 lines: require("hypr.monitors"), require("hypr.bindings"),
require("hypr.input"), a custom windowrule, bind and monitor)
--- AFTER (2 lines)
-- Omarchy's bootstrap keeps path setup out of this user config.
dofile((os.getenv("OMARCHY_PATH") or "/usr/share/omarchy") .. "/default/hypr/bootstrap.lua")
########## CASE: user_extended_path
$ luac -p .config/hypr/hyprland.lua
luac: .config/hypr/hyprland.lua:3: unexpected symbol near '..'
```
The stock file shape is handled correctly — only edited files are at risk, so the affected population is users carrying a pre-bootstrap `hyprland.lua` (the quattro beta/edge cohort and 4.0 upgraders), not fresh 4.0 installs, which are skipped by the `grep -Fq` at `:5`.
Worth aligning at the same time: `1781043107.sh:39-40` and `:71-73` use the same unguarded transform-then-write-back shape (`awk ... >"$tmp"` then `cat "$tmp" >"$file"`, with no success check) against `hyprland.conf`, `hyprland.lua`, `alacritty.toml`, `foot.ini`, `ghostty/config` and `kitty.conf`. `1785189600.sh:49-53` shows the correct shape.
---
**Correction, after an independent review of this report:**
Narrower than filed. This needs a hand-edited pre-bootstrap `hyprland.lua` that keeps both trigger lines but moves or loses the standalone `.. package.path` terminator. Stock fresh 4.0 installs and ordinary 3.x upgrades are skipped by the `grep -Fq` guard at `:5`, so the population is the early edge/beta cohort, not upgraders generally.
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 04:20 UTC