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.
More locale-dependent output parsing without LC_ALL=C: cryptsetup / free / aplay
Reported by 77-223255 · filed Oct 8, 2026Closed upstream on 2026-10-08 by its own reporter 77-223255. GitHub close reason: completed. Closed by its own reporter — not by itself evidence of a fix.
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
Same class as the omarchy-update-stay-awake stat %F bug (#13320, #13376, #13385, #13892, #14087 — fixes pending in #13352 / #14023), but in three other files. Each parses localized command output against English literals without pinning LC_ALL=C.
Verified still present on master today (2026-10-08) and in omarchy-dev 4.0.0.r6720.g8e02fc8-1 / omarchy 4.0.4-1.
1. bin/omarchy-provision-owner:902 — cryptsetup "Key slot" — high
new_slot=$(cryptsetup open --test-passphrase --verbose --key-file <(printf '%s' "$password") "$device" 2>&1 |
grep -o 'Key slot [0-9]* unlocked' | grep -o '[0-9]*' | head -1)cryptsetup is gettext-localized. zh_CN ships:
msgid "Key slot %i unlocked."
msgstr "密钥槽 %i 已解锁。"so the grep matches nothing, new_slot is empty, and rekey_luks() takes the [[ -z $new_slot ]] branch:
could not identify the user's LUKS slot after re-key; keeping the staged key for retry→ the LUKS re-key in first-boot deferred provisioning / factory reset never completes; it keeps the staged throwaway key and retries forever.
Fix: LC_ALL=C cryptsetup open --test-passphrase ...
2. bin/omarchy-hibernation-setup:80 — free — medium
MEM_TOTAL_HUMAN=$(free --human | awk '/Mem/ {print $2}')free (procps-ng) is localized. Under zh_CN.UTF-8 the rows are 内存: / 交换:, so awk '/Mem/' matches nothing and the confirmation reads "Use on boot drive to make hibernation available?" (missing the size).
$ LC_ALL=zh_CN.UTF-8 free --human | awk '/Mem/ {print $2}'
# empty
$ LC_ALL=C free --human | awk '/Mem/ {print $2}'
31GiFix: MEM_TOTAL_HUMAN=$(LC_ALL=C free --human | awk '/Mem/ {print $2}')
3. install/user/hardware/asus/fix-audio-mixer.sh:9 — aplay — medium
card=$(aplay -l 2>/dev/null | grep -i "ALC285" | head -1 | sed 's/card \([0-9]*\).*/\1/')aplay is localized; alsa-utils ships translations for de, eu, fr, ja, ka, ko, sk (de: Karte %i: %s ..., fr: Carte : ...). Under those locales the sed leaves the whole line in $card, so amixer -c "$card" fails and the ALC285 Master-unmute silently no-ops.
$ LC_ALL=de_DE.UTF-8 aplay -l | head -1
Karte 0: ...(Not zh_CN — there is no alsa-utils.mo for Chinese — but it does hit de/fr/ja/ko/eu/ka/sk users.)
Fix: card=$(LC_ALL=C aplay -l 2>/dev/null | ...)
Why these are oversights, not intentional
The project already pins the locale whenever it parses command output — 21 call sites, e.g.:
omarchy-network-band:54—LC_ALL=C nmcli ...(with a comment explaining why)omarchy-update-pacman:19— "LC_ALL passes through so callers that parse ... can pin the locale."omarchy-update-system-pkgs:26—LC_ALL=C omarchy-update-pacman -Syu ...omarchy-upgrade-to-quattro:968—LC_ALL=C pacman -Qi ... | awk '/^Required By/'omarchy-security-functions:63—LC_ALL=C /usr/bin/sudo -homarchy-update-stay-awake:143and:464—local LC_ALL=C,LC_ALL=C /usr/bin/od
The stay-awake helper already pins the locale twice; only its stat call was missed. These three are the same omission.
Suggested general fix
A small lint/test that flags locale-sensitive command output parsed against English literals without LC_ALL=C (e.g. stat %F, pacman -Qi field names, free row labels, aplay/cryptsetup messages) would catch this whole class at once.
View raw text
Same class as the `omarchy-update-stay-awake` `stat %F` bug (#13320, #13376, #13385, #13892, #14087 — fixes pending in #13352 / #14023), but in three other files. Each parses localized command output against English literals without pinning `LC_ALL=C`.
Verified still present on `master` today (2026-10-08) and in `omarchy-dev 4.0.0.r6720.g8e02fc8-1` / `omarchy 4.0.4-1`.
---
## 1. `bin/omarchy-provision-owner:902` — cryptsetup "Key slot" — **high**
```bash
new_slot=$(cryptsetup open --test-passphrase --verbose --key-file <(printf '%s' "$password") "$device" 2>&1 |
grep -o 'Key slot [0-9]* unlocked' | grep -o '[0-9]*' | head -1)
```
`cryptsetup` is gettext-localized. `zh_CN` ships:
```
msgid "Key slot %i unlocked."
msgstr "密钥槽 %i 已解锁。"
```
so the `grep` matches nothing, `new_slot` is empty, and `rekey_luks()` takes the `[[ -z $new_slot ]]` branch:
```
could not identify the user's LUKS slot after re-key; keeping the staged key for retry
```
→ the LUKS re-key in first-boot deferred provisioning / factory reset never completes; it keeps the staged throwaway key and retries forever.
Fix: `LC_ALL=C cryptsetup open --test-passphrase ...`
---
## 2. `bin/omarchy-hibernation-setup:80` — `free` — **medium**
```bash
MEM_TOTAL_HUMAN=$(free --human | awk '/Mem/ {print $2}')
```
`free` (procps-ng) is localized. Under `zh_CN.UTF-8` the rows are `内存:` / `交换:`, so `awk '/Mem/'` matches nothing and the confirmation reads *"Use on boot drive to make hibernation available?"* (missing the size).
```console
$ LC_ALL=zh_CN.UTF-8 free --human | awk '/Mem/ {print $2}'
# empty
$ LC_ALL=C free --human | awk '/Mem/ {print $2}'
31Gi
```
Fix: `MEM_TOTAL_HUMAN=$(LC_ALL=C free --human | awk '/Mem/ {print $2}')`
---
## 3. `install/user/hardware/asus/fix-audio-mixer.sh:9` — `aplay` — **medium**
```bash
card=$(aplay -l 2>/dev/null | grep -i "ALC285" | head -1 | sed 's/card \([0-9]*\).*/\1/')
```
`aplay` is localized; alsa-utils ships translations for `de`, `eu`, `fr`, `ja`, `ka`, `ko`, `sk` (de: `Karte %i: %s ...`, fr: `Carte : ...`). Under those locales the `sed` leaves the whole line in `$card`, so `amixer -c "$card"` fails and the ALC285 Master-unmute silently no-ops.
```console
$ LC_ALL=de_DE.UTF-8 aplay -l | head -1
Karte 0: ...
```
(Not `zh_CN` — there is no `alsa-utils.mo` for Chinese — but it does hit de/fr/ja/ko/eu/ka/sk users.)
Fix: `card=$(LC_ALL=C aplay -l 2>/dev/null | ...)`
---
## Why these are oversights, not intentional
The project already pins the locale whenever it parses command output — 21 call sites, e.g.:
- `omarchy-network-band:54` — `LC_ALL=C nmcli ...` (with a comment explaining why)
- `omarchy-update-pacman:19` — *"LC_ALL passes through so callers that parse ... can pin the locale."*
- `omarchy-update-system-pkgs:26` — `LC_ALL=C omarchy-update-pacman -Syu ...`
- `omarchy-upgrade-to-quattro:968` — `LC_ALL=C pacman -Qi ... | awk '/^Required By/'`
- `omarchy-security-functions:63` — `LC_ALL=C /usr/bin/sudo -h`
- `omarchy-update-stay-awake:143` and `:464` — `local LC_ALL=C`, `LC_ALL=C /usr/bin/od`
The `stay-awake` helper already pins the locale twice; only its `stat` call was missed. These three are the same omission.
## Suggested general fix
A small lint/test that flags locale-sensitive command output parsed against English literals without `LC_ALL=C` (e.g. `stat %F`, `pacman -Qi` field names, `free` row labels, `aplay`/`cryptsetup` messages) would catch this whole class at once.
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.