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 update aborts on non-English locales: locale-dependent stat %F comparison in omarchy-update-stay-awake
Reported by orionline · filed Oct 2, 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
omarchy update is completely broken on any non-English locale: the update aborts right after the snapshot step and never upgrades anything. LC_ALL=C omarchy update works.
What happens
Prune package cache
Create system snapshot
Snapshots can be selected during boot.
Refusing to use an unsafe Omarchy update inhibitor state path.
Something went wrong during the update!
...
[COMMAND_EXIT_CODE="1"]The message is printed twice (once from omarchy-update-stay-awake start, once from the cleanup stop), and /var/log/pacman.log shows no starting full system upgrade for the failed run — the updater dies at omarchy-update:118 (omarchy-update-stay-awake start) because omarchy-update runs under set -e.
Root cause
/usr/bin/omarchy-update-stay-awake lines 71-72:
read -r owner mode type < <(/usr/bin/stat -Lc '%u %a %F' -- "$parent") || return 1
[[ $owner == 0 && $type == "directory" ]] || return 1stat -c %F output is translated by coreutils according to the locale. With LANG=zh_CN.UTF-8 it prints 目录, which can never equal the English literal directory. So root_owned_parent_chain() always fails → runtime_directory_is_private() fails → fail_state_boundary() prints "Refusing to use an unsafe Omarchy update inhibitor state path." and the update aborts before pacman runs.
This is the only place in /usr/bin/omarchy-* that compares a translated stat %F (the other two %F hits are date +%F).
Steps to reproduce
With a locale that translates coreutils messages (e.g. LANG=zh_CN.UTF-8):
$ stat -c '%F' /run/user
目录
$ /usr/bin/omarchy-update-stay-awake stop ; echo "rc=$?"
Refusing to use an unsafe Omarchy update inhibitor state path.
rc=1
$ LC_ALL=C /usr/bin/omarchy-update-stay-awake stop ; echo "rc=$?"
rc=0
$ LC_ALL=C /usr/bin/omarchy-update-stay-awake start ; echo "rc=$?"
rc=0omarchy update aborts on start every time; LC_ALL=C omarchy update completes normally (only the 2026-10-03 upgrade I ran that way succeeded; the previous attempt changed nothing, and my machine had gone without a full upgrade since 2026-10-01).
Workaround
LC_ALL=C omarchy updateSuggested fix
Force the C locale for that single stat call:
read -r owner mode type < <(LC_ALL=C /usr/bin/stat -Lc '%u %a %F' -- "$parent") || return 1or compare the raw type bits with %f, which are never translated (a directory always ends in 41ed).
Affected
Every user whose locale translates coreutils' %F (zh_CN, ja_JP, de_DE, …). For them omarchy update cannot complete at all.
System
| Omarchy | 4.0.0.r6694.g821ae58-1 (also reproduced on 4.0.0.r6691.g8b4eae6-1) |
| Kernel | 7.2.8-arch1-2 (7.2.7-arch1-1 at first reproduction) |
| Locale | LANG=zh_CN.UTF-8 |
| Laptop | HASEE NH5x_7xRCx,RDx |
| CPU | Intel Core i5-9300H |
| GPU | Intel UHD Graphics 630 / NVIDIA GTX 1660 Ti Mobile |
| Compositor | Hyprland 0.56.2 |
View raw text
`omarchy update` is completely broken on any non-English locale: the update aborts right after the snapshot step and never upgrades anything. `LC_ALL=C omarchy update` works. ## What happens ``` Prune package cache Create system snapshot Snapshots can be selected during boot. Refusing to use an unsafe Omarchy update inhibitor state path. Something went wrong during the update! ... [COMMAND_EXIT_CODE="1"] ``` The message is printed twice (once from `omarchy-update-stay-awake start`, once from the cleanup `stop`), and `/var/log/pacman.log` shows no `starting full system upgrade` for the failed run — the updater dies at `omarchy-update:118` (`omarchy-update-stay-awake start`) because `omarchy-update` runs under `set -e`. ## Root cause `/usr/bin/omarchy-update-stay-awake` lines 71-72: ```bash read -r owner mode type < <(/usr/bin/stat -Lc '%u %a %F' -- "$parent") || return 1 [[ $owner == 0 && $type == "directory" ]] || return 1 ``` `stat -c %F` output is **translated by coreutils according to the locale**. With `LANG=zh_CN.UTF-8` it prints `目录`, which can never equal the English literal `directory`. So `root_owned_parent_chain()` always fails → `runtime_directory_is_private()` fails → `fail_state_boundary()` prints *"Refusing to use an unsafe Omarchy update inhibitor state path."* and the update aborts before pacman runs. This is the only place in `/usr/bin/omarchy-*` that compares a translated `stat %F` (the other two `%F` hits are `date +%F`). ## Steps to reproduce With a locale that translates coreutils messages (e.g. `LANG=zh_CN.UTF-8`): ```console $ stat -c '%F' /run/user 目录 $ /usr/bin/omarchy-update-stay-awake stop ; echo "rc=$?" Refusing to use an unsafe Omarchy update inhibitor state path. rc=1 $ LC_ALL=C /usr/bin/omarchy-update-stay-awake stop ; echo "rc=$?" rc=0 $ LC_ALL=C /usr/bin/omarchy-update-stay-awake start ; echo "rc=$?" rc=0 ``` `omarchy update` aborts on `start` every time; `LC_ALL=C omarchy update` completes normally (only the 2026-10-03 upgrade I ran that way succeeded; the previous attempt changed nothing, and my machine had gone without a full upgrade since 2026-10-01). ## Workaround ```bash LC_ALL=C omarchy update ``` ## Suggested fix Force the C locale for that single `stat` call: ```bash read -r owner mode type < <(LC_ALL=C /usr/bin/stat -Lc '%u %a %F' -- "$parent") || return 1 ``` or compare the raw type bits with `%f`, which are never translated (a directory always ends in `41ed`). ## Affected Every user whose locale translates coreutils' `%F` (`zh_CN`, `ja_JP`, `de_DE`, …). For them `omarchy update` cannot complete at all. ## System | | | |---|---| | Omarchy | 4.0.0.r6694.g821ae58-1 (also reproduced on 4.0.0.r6691.g8b4eae6-1) | | Kernel | 7.2.8-arch1-2 (7.2.7-arch1-1 at first reproduction) | | Locale | `LANG=zh_CN.UTF-8` | | Laptop | HASEE NH5x_7xRCx,RDx | | CPU | Intel Core i5-9300H | | GPU | Intel UHD Graphics 630 / NVIDIA GTX 1660 Ti Mobile | | Compositor | Hyprland 0.56.2 |
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 20:50 UTC