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.
perf(bar): stop spawning hyprctl every 10s, gate tray layer, cache workspace model
Reported by markbus-ai · filed Aug 12, 2026Closed upstream on 2026-08-12 by the merge of PR #6727 (closed by dhh). GitHub close reason: completed.
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
Problem: the bar wastes idle CPU and spawns subprocesses on a fixed schedule even when nothing changed:
KeyboardLayoutpollshyprctl -j devicesevery 10s per bar surface, although it already listens to theactivelayoutraw event, which fires exactly on the transitions that matter. On a 3-monitor setup that's ~18 useless subprocesses/minute. The poll can also die silently (theif (!queryProc.running)guard sticks when a query hangs), killing the refresh forever until a restart.- The tray drawer rows keep
layer.enabled: truepermanently for a 600ms reveal animation — a permanent offscreen buffer while idle. Workspacesrebuilds the whole workspace row on every workspace signal: the Repeater model is a freshly allocated JS array, so any toplevel arriving or focus change tears down and recreates all delegates.
Solution:
1. Remove the 10s poll; keep the activelayout event path and the 600ms post-cycle refresh.
2. Gate the tray row layer to revealProgress > 0 (buffer exists only while the reveal animates).
3. Cache the workspace id list in a Qt-free JS module (WorkspaceModel.js) and hand back the same array reference while the id set is unchanged, so delegates stay alive.
Measured (60s idle, single monitor): hyprctl -j devices spawns 4 → 0 per minute; quickshell idle CPU 0.05% → ~0.03%. The spawn elimination is the deterministic win (~240 subprocesses/hour on one monitor, more on multi-monitor), and removing the poll removes its silent-death failure mode.
Tests: node unit test covering the new WorkspaceModel.sync cache semantics was added (test/shell.d/workspace-model-test.sh); shell restarted and loaded cleanly with the new code.
View raw text
**Problem**: the bar wastes idle CPU and spawns subprocesses on a fixed schedule even when nothing changed: - `KeyboardLayout` polls `hyprctl -j devices` every 10s **per bar surface**, although it already listens to the `activelayout` raw event, which fires exactly on the transitions that matter. On a 3-monitor setup that's ~18 useless subprocesses/minute. The poll can also die silently (the `if (!queryProc.running)` guard sticks when a query hangs), killing the refresh forever until a restart. - The tray drawer rows keep `layer.enabled: true` permanently for a 600ms reveal animation — a permanent offscreen buffer while idle. - `Workspaces` rebuilds the whole workspace row on *every* workspace signal: the Repeater model is a freshly allocated JS array, so any toplevel arriving or focus change tears down and recreates all delegates. **Solution**: 1. Remove the 10s poll; keep the `activelayout` event path and the 600ms post-cycle refresh. 2. Gate the tray row layer to `revealProgress > 0` (buffer exists only while the reveal animates). 3. Cache the workspace id list in a Qt-free JS module (`WorkspaceModel.js`) and hand back the same array reference while the id set is unchanged, so delegates stay alive. **Measured** (60s idle, single monitor): `hyprctl -j devices` spawns 4 → 0 per minute; quickshell idle CPU 0.05% → ~0.03%. The spawn elimination is the deterministic win (~240 subprocesses/hour on one monitor, more on multi-monitor), and removing the poll removes its silent-death failure mode. Tests: node unit test covering the new `WorkspaceModel.sync` cache semantics was added (`test/shell.d/workspace-model-test.sh`); shell restarted and loaded cleanly with the new code.
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.