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

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.

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

More locale-dependent output parsing without LC_ALL=C: cryptsetup / free / aplayrevision 1 · captured 2026-10-08 01:51 UTC via poll

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}'
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

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 -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.

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.