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.
omarchy-hw-laptop: DMI chassis fallback never matches, so any machine without an ACPI lid button reports "not a laptop"
Reported by flip-in · filed Sep 6, 2026Closed upstream on 2026-09-06 by flip-in; the closing comment says it was fixed by PR #7948, as not planned.
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
Summary
omarchy-hw-laptop's DMI chassis fallback can never match, because the command substitution it tests always expands to the empty string.
The bug
bin/omarchy-hw-laptop:
case $(< /sys/class/dmi/id/chassis_type 2>/dev/null) in
8 | 9 | 10 | 14 | 30 | 31 | 32) exit 0 ;;
esacBash's $(< file) fast path applies only when the substitution contains nothing but the redirect. Adding 2>/dev/null turns it into a null command with two redirections, which produces no output at all:
$ echo "[$(< /sys/class/dmi/id/chassis_type)]"
[9]
$ echo "[$(< /sys/class/dmi/id/chassis_type 2>/dev/null)]"
[]So the case never matches and the fallback always falls through to exit 1.
Impact
The fallback exists for "laptops that don't expose an ACPI lid button", and it never works for them. On a machine with no /proc/acpi at all (any aarch64 machine — this was found on an Apple Silicon MacBook under Asahi), the first probe finds nothing and the fallback silently fails, so omarchy-hw-laptop reports "not a laptop" on hardware whose chassis_type is 9 and whose hostnamectl chassis is laptop.
bin/omarchy-hyprland-monitor-watch gates its clamshell reconciliation poll on this helper:
if omarchy-hw-laptop && omarchy-hyprland-monitor-external-active; thenso the backstop that recovers clamshell state (e.g. across suspend/resume) never starts on affected hardware.
Suggested fix
Drop the redirect, or use a form that keeps working with it:
case $(cat /sys/class/dmi/id/chassis_type 2>/dev/null) in$(< file) on a missing file is already silent under set +e, so the redirect was not buying anything.
Worth a grep for the same pattern elsewhere in the tree.
Environment
- Omarchy 4.0.2-mac.1 (
omarchy-dev 4.0.2.r6875.g2afd2ef-1, built from github.com/maralcbr/omarchy-mx-mac) - MacBookPro18,3, Asahi, kernel 7.1.6-1-1-ARCH aarch64
- The bash behaviour itself is not platform-specific.
Related
#8418 reports that Asahi lid handling can never fire (wrong switch name, and /proc/acpi absent). This is a third, independent reason clamshell stays broken on that hardware, and unlike the other two it is not Apple-specific: it disables the omarchy-hyprland-monitor-watch reconciliation poll, which is the backstop that would otherwise recover clamshell state on its own.
View raw text
### Summary `omarchy-hw-laptop`'s DMI chassis fallback can never match, because the command substitution it tests always expands to the empty string. ### The bug `bin/omarchy-hw-laptop`: ```bash case $(< /sys/class/dmi/id/chassis_type 2>/dev/null) in 8 | 9 | 10 | 14 | 30 | 31 | 32) exit 0 ;; esac ``` Bash's `$(< file)` fast path applies **only** when the substitution contains nothing but the redirect. Adding `2>/dev/null` turns it into a null command with two redirections, which produces no output at all: ```console $ echo "[$(< /sys/class/dmi/id/chassis_type)]" [9] $ echo "[$(< /sys/class/dmi/id/chassis_type 2>/dev/null)]" [] ``` So the `case` never matches and the fallback always falls through to `exit 1`. ### Impact The fallback exists for "laptops that don't expose an ACPI lid button", and it never works for them. On a machine with no `/proc/acpi` at all (any aarch64 machine — this was found on an Apple Silicon MacBook under Asahi), the first probe finds nothing and the fallback silently fails, so `omarchy-hw-laptop` reports "not a laptop" on hardware whose `chassis_type` is `9` and whose `hostnamectl chassis` is `laptop`. `bin/omarchy-hyprland-monitor-watch` gates its clamshell reconciliation poll on this helper: ```bash if omarchy-hw-laptop && omarchy-hyprland-monitor-external-active; then ``` so the backstop that recovers clamshell state (e.g. across suspend/resume) never starts on affected hardware. ### Suggested fix Drop the redirect, or use a form that keeps working with it: ```bash case $(cat /sys/class/dmi/id/chassis_type 2>/dev/null) in ``` `$(< file)` on a missing file is already silent under `set +e`, so the redirect was not buying anything. Worth a grep for the same pattern elsewhere in the tree. ### Environment - Omarchy 4.0.2-mac.1 (`omarchy-dev 4.0.2.r6875.g2afd2ef-1`, built from github.com/maralcbr/omarchy-mx-mac) - MacBookPro18,3, Asahi, kernel 7.1.6-1-1-ARCH aarch64 - The bash behaviour itself is not platform-specific. ### Related #8418 reports that Asahi lid handling can never fire (wrong switch name, and `/proc/acpi` absent). This is a third, independent reason clamshell stays broken on that hardware, and unlike the other two it is not Apple-specific: it disables the `omarchy-hyprland-monitor-watch` reconciliation poll, which is the backstop that would otherwise recover clamshell state on its own.
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.