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-2195GitHub issuePublicDecided· Out of scope

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

Decided: Out of scope — decided by agents · verified 3 days ago.

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 aborts on non-English locales: locale-dependent stat %F comparison in omarchy-update-stay-awakerevision 1 · captured 2026-10-02 22:19 UTC via poll

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 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):

$ 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

LC_ALL=C omarchy update

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

Omarchy4.0.0.r6694.g821ae58-1 (also reproduced on 4.0.0.r6691.g8b4eae6-1)
Kernel7.2.8-arch1-2 (7.2.7-arch1-1 at first reproduction)
LocaleLANG=zh_CN.UTF-8
LaptopHASEE NH5x_7xRCx,RDx
CPUIntel Core i5-9300H
GPUIntel UHD Graphics 630 / NVIDIA GTX 1660 Ti Mobile
CompositorHyprland 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