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

Omarchy update failed due to non-English locale

Reported by luannbertaud · filed Sep 26, 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 failed due to non-English localerevision 1 · captured 2026-09-28 21:23 UTC via poll

System details

Omarchy: dev (7b336b1b), Locale: fr_FR

What's wrong?

TLDR

omarchy-update-stay-awake fails on every non-English locale: root_owned_parent_chain compares stat -Lc '%F' output to the hardcoded English string "directory"

System details

  • Omarchy 4, dev checkout to branch quattro
  • System locale: French (fr_FR.UTF-8 — LC_ALL/LANG not forced to C)
  • XDG_RUNTIME_DIR=/run/user/1000, owned by user, mode 700

What's wrong

omarchy update fails at the "Create system snapshot" / stay-awake step with:

Refusing to use an unsafe Omarchy update inhibitor state path.
Something went wrong during the update!

Root cause

In bin/omarchy-update-stay-awake, root_owned_parent_chain() walks the parent directory chain of $XDG_RUNTIME_DIR and calls:

read -r owner mode type < <(/usr/bin/stat -Lc '%u %a %F' -- "$parent") || return 1
[[ $owner == 0 && $type == "directory" ]] || return 1

stat's %F format is locale-dependent: it prints the translated file-type name (e.g. répertoire in French), not the literal English word directory. This comparison always fails even though the directory is root-owned, 755.

This function does not force LC_ALL=C before calling stat, unlike other functions in the same file (e.g. read_state_record).

Reproduction

for d in /run/user/1000 /run/user /run /; do
  stat -Lc 'owner=%u mode=%a type=%F' -- "$d"
done

On a French-locale system this prints type=répertoire for every directory, which root_owned_parent_chain rejects.

Full trace :

++ /usr/bin/stat -Lc '%u %a %F' -- /run/user
+ [[ 0 == 0 ]]
+ [[ répertoire == directory ]]
+ return 1
+ fail_state_boundary
+ echo 'Refusing to use an unsafe Omarchy update inhibitor state path.'

Expected behavior

root_owned_parent_chain should force LC_ALL=C.

Workaround

Use LC_ALL=C omarchy update.

View raw text
### System details

Omarchy: dev (7b336b1b), Locale: fr_FR

### What's wrong?

## TLDR

`omarchy-update-stay-awake` fails on every non-English locale: `root_owned_parent_chain` compares `stat -Lc '%F'` output to the hardcoded English string `"directory"`

## System details

- Omarchy 4, dev checkout to branch `quattro`
- System locale: French (`fr_FR.UTF-8` — `LC_ALL`/`LANG` not forced to `C`)
- `XDG_RUNTIME_DIR=/run/user/1000`, owned by user, mode `700`

## What's wrong

`omarchy update` fails at the "Create system snapshot" / stay-awake step with:

```
Refusing to use an unsafe Omarchy update inhibitor state path.
Something went wrong during the update!
```

## Root cause

In `bin/omarchy-update-stay-awake`, `root_owned_parent_chain()` walks the parent directory chain of `$XDG_RUNTIME_DIR` and calls:

```bash
read -r owner mode type < <(/usr/bin/stat -Lc '%u %a %F' -- "$parent") || return 1
[[ $owner == 0 && $type == "directory" ]] || return 1
```

`stat`'s `%F` format is locale-dependent: it prints the *translated* file-type name (e.g. `répertoire` in French), not the literal English word `directory`. This comparison always fails even though the directory is root-owned, `755`.

This function does **not** force `LC_ALL=C` before calling `stat`, unlike other functions in the same file (e.g. `read_state_record`).

## Reproduction

```bash
for d in /run/user/1000 /run/user /run /; do
  stat -Lc 'owner=%u mode=%a type=%F' -- "$d"
done
```

On a French-locale system this prints `type=répertoire` for every directory, which `root_owned_parent_chain` rejects.

Full trace :

```
++ /usr/bin/stat -Lc '%u %a %F' -- /run/user
+ [[ 0 == 0 ]]
+ [[ répertoire == directory ]]
+ return 1
+ fail_state_boundary
+ echo 'Refusing to use an unsafe Omarchy update inhibitor state path.'
```

## Expected behavior

`root_owned_parent_chain` should force `LC_ALL=C`.

## Workaround

Use `LC_ALL=C omarchy update`.

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 18:38 UTC