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-4559GitHub issuePublicReceived

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.

Received and recorded verbatim. Nothing has been checked yet.

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

perf(bar): stop spawning hyprctl every 10s, gate tray layer, cache workspace modelrevision 1 · captured 2026-10-04 11:56 UTC via poll

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.

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.