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.
system-update widget: concurrent checkupdates races on multi-monitor, so the update icon shows on only one bar
Reported by EJ-Monkey · filed Sep 10, 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
What happens
On a multi-monitor setup, the omarchy.system-update bar widget shows the
"update available" icon on only one monitor's bar. Which monitor wins is
non-deterministic — forcing a re-check withomarchy-shell omarchy.system-update refresh reliably moves the icon to the
other bar rather than showing it on both.
What I expected
The update icon appears on every monitor's bar, since the update state is a
property of the system, not of a monitor.
Root cause
SystemUpdate.qml is instantiated per bar, and each instance runs its own
check with triggeredOnStart: true:
Process {
id: updateProc
command: ["omarchy-update-available"]
onExited: function(exitCode) { root.updateAvailable = exitCode === 0 }
}
Timer { interval: 21600000; running: true; repeat: true; triggeredOnStart: true }
visible: updateAvailableomarchy-update-available calls checkupdates, which uses a single shared
temporary pacman database per user:
CHECKUPDATES_DB="${TMPDIR:-/tmp}/checkup-db-${UID}/"
trap 'rm -f $CHECKUPDATES_DB/db.lck' INT TERM EXIT
fakeroot -- pacman -Sy --disable-sandbox-filesystem --dbpath "$CHECKUPDATES_DB" ... &> /dev/nullWith two monitors the two instances invoke this simultaneously and contend on
the pacman lock. The loser's pacman -Sy fails, the failure is swallowed by&> /dev/null, its pacman -Qu therefore returns nothing, andomarchy-update-available prints "Omarchy is up to date" and exits 1 — so that
bar sets visible: false. The trap compounds it: whichever invocation exits
first deletes db.lck out from under the one still running.
Steps to reproduce
- Two or more monitors, each with a bar.
- Have a pending Omarchy package update.
- Restart the shell (or run
omarchy-shell omarchy.system-update refresh). - The icon appears on exactly one bar.
Reproducible directly, without the shell, by running two checks concurrently:
$ omarchy-update-available & omarchy-update-available & wait
omarchy 4.0.2-1 -> 4.0.3-1 # exit 0
Omarchy is up to date # exit 1 <-- wrongRun sequentially, the same command is consistently correct (3/3 exit 0), which
confirms contention rather than a flaky check.
Suggested fix
Serialize the check — e.g. wrap the checkupdates call inomarchy-update-available with flock on a per-user lock file so concurrent
callers queue instead of racing. That fixes every caller at once rather than
only the widget. Alternatively, have a single shared poller publish one result
to all bar instances, which would also drop N redundant pacman -Sy calls per
refresh on multi-monitor systems.
A related smaller issue: omarchy-update-available cannot distinguish
"no updates" from "the check failed", because checkupdates failures are
discarded. Treating a failed check as "up to date" is what makes this
user-visible.
System details
| Omarchy | 4.0.2-1 |
| Kernel | 7.1.9-arch1-2 |
| Hyprland | 0.56.2 |
| CPU | Intel Core i5-7400 |
| GPU | NVIDIA GP104 [GeForce GTX 1070] |
| Monitors | 2 |
| pacman-contrib | 1.13.1-1 |
View raw text
### What happens
On a multi-monitor setup, the `omarchy.system-update` bar widget shows the
"update available" icon on **only one** monitor's bar. Which monitor wins is
non-deterministic — forcing a re-check with
`omarchy-shell omarchy.system-update refresh` reliably moves the icon to the
*other* bar rather than showing it on both.
### What I expected
The update icon appears on every monitor's bar, since the update state is a
property of the system, not of a monitor.
### Root cause
`SystemUpdate.qml` is instantiated per bar, and each instance runs its own
check with `triggeredOnStart: true`:
```qml
Process {
id: updateProc
command: ["omarchy-update-available"]
onExited: function(exitCode) { root.updateAvailable = exitCode === 0 }
}
Timer { interval: 21600000; running: true; repeat: true; triggeredOnStart: true }
visible: updateAvailable
```
`omarchy-update-available` calls `checkupdates`, which uses a single shared
temporary pacman database per user:
```bash
CHECKUPDATES_DB="${TMPDIR:-/tmp}/checkup-db-${UID}/"
trap 'rm -f $CHECKUPDATES_DB/db.lck' INT TERM EXIT
fakeroot -- pacman -Sy --disable-sandbox-filesystem --dbpath "$CHECKUPDATES_DB" ... &> /dev/null
```
With two monitors the two instances invoke this simultaneously and contend on
the pacman lock. The loser's `pacman -Sy` fails, the failure is swallowed by
`&> /dev/null`, its `pacman -Qu` therefore returns nothing, and
`omarchy-update-available` prints "Omarchy is up to date" and exits 1 — so that
bar sets `visible: false`. The `trap` compounds it: whichever invocation exits
first deletes `db.lck` out from under the one still running.
### Steps to reproduce
1. Two or more monitors, each with a bar.
2. Have a pending Omarchy package update.
3. Restart the shell (or run `omarchy-shell omarchy.system-update refresh`).
4. The icon appears on exactly one bar.
Reproducible directly, without the shell, by running two checks concurrently:
```console
$ omarchy-update-available & omarchy-update-available & wait
omarchy 4.0.2-1 -> 4.0.3-1 # exit 0
Omarchy is up to date # exit 1 <-- wrong
```
Run sequentially, the same command is consistently correct (3/3 exit 0), which
confirms contention rather than a flaky check.
### Suggested fix
Serialize the check — e.g. wrap the `checkupdates` call in
`omarchy-update-available` with `flock` on a per-user lock file so concurrent
callers queue instead of racing. That fixes every caller at once rather than
only the widget. Alternatively, have a single shared poller publish one result
to all bar instances, which would also drop N redundant `pacman -Sy` calls per
refresh on multi-monitor systems.
A related smaller issue: `omarchy-update-available` cannot distinguish
"no updates" from "the check failed", because `checkupdates` failures are
discarded. Treating a failed check as "up to date" is what makes this
user-visible.
### System details
| | |
|---|---|
| Omarchy | 4.0.2-1 |
| Kernel | 7.1.9-arch1-2 |
| Hyprland | 0.56.2 |
| CPU | Intel Core i5-7400 |
| GPU | NVIDIA GP104 [GeForce GTX 1070] |
| Monitors | 2 |
| pacman-contrib | 1.13.1-1 |
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 11:22 UTC