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

Text size slider in Display panel snaps back instead of applying the new value

Reported by stadia · filed Aug 23, 2026 · open at source

Decided: Out of scope — decided by agents · verified 4 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

Text size slider in Display panel snaps back instead of applying the new valuerevision 1 · captured 2026-09-28 21:24 UTC via poll

Version

v4.0.0 (commit f0020448ca87329199de7cb12f2015ebc4a3e5e7)

Where

shell/plugins/panels/monitor/Panel.qml — the "TEXT SIZE" slider in the Display bar widget.

Steps to reproduce

  1. Open the Display widget on the bar.
  2. Drag the "TEXT SIZE" slider to a larger value (e.g. from 12px toward 16px).
  3. Release the mouse button.

Expected

The text size changes to the new value (shell base font + GTK text scaling).

Actual

The slider snaps back to its previous position and the text size does not change.

Root cause

PanelSlider.onReleased (PanelSlider.qml) resets liveValue back to the bound
value immediately after emitting the released signal:

onReleased: function(mouse) {
...
root.dragging = false
root.released(root.liveValue)
root.liveValue = root.value // <-- resets before value has a chance to update
}

For the brightness slider, onMoved calls previewBrightness(), which updates
the bound root.brightnessPercent synchronously, so value already reflects
the drag when this reset happens.

For the text-size slider, onReleased only calls setTextSize(), which shells
out to omarchy-display-text-size asynchronously and doesn't update
textSizePreviewIndex. So value (bound to root.currentTextIndex()) is still
the old index at the moment liveValue gets reset, causing the visible snap-back.

Keyboard adjustment (h/l via adjustTextSize()) doesn't have this problem
because it sets textSizePreviewIndex before calling setTextSize() — only the
mouse-drag path is missing that step.

Suggested fix

In the text-size slider's onReleased handler, set textSizePreviewIndex
(and call markReflowing()) before invoking setTextSize(), mirroring
adjustTextSize():

onReleased: function(v) {
var idx = Math.round(v)
root.markReflowing()
root.textSizePreviewIndex = idx
root.setTextSize(root.textSizeStops[idx])
}

View raw text
### Version
v4.0.0 (commit f0020448ca87329199de7cb12f2015ebc4a3e5e7)

### Where
shell/plugins/panels/monitor/Panel.qml — the "TEXT SIZE" slider in the Display bar widget.

### Steps to reproduce
1. Open the Display widget on the bar.
2. Drag the "TEXT SIZE" slider to a larger value (e.g. from 12px toward 16px).
3. Release the mouse button.

### Expected
The text size changes to the new value (shell base font + GTK text scaling).

### Actual
The slider snaps back to its previous position and the text size does not change.

### Root cause
`PanelSlider.onReleased` (PanelSlider.qml) resets `liveValue` back to the bound
`value` immediately after emitting the `released` signal:

    onReleased: function(mouse) {
      ...
      root.dragging = false
      root.released(root.liveValue)
      root.liveValue = root.value   // <-- resets before value has a chance to update
    }

For the brightness slider, `onMoved` calls `previewBrightness()`, which updates
the bound `root.brightnessPercent` synchronously, so `value` already reflects
the drag when this reset happens.

For the text-size slider, `onReleased` only calls `setTextSize()`, which shells
out to `omarchy-display-text-size` asynchronously and doesn't update
`textSizePreviewIndex`. So `value` (bound to `root.currentTextIndex()`) is still
the old index at the moment `liveValue` gets reset, causing the visible snap-back.

Keyboard adjustment (h/l via `adjustTextSize()`) doesn't have this problem
because it sets `textSizePreviewIndex` before calling `setTextSize()` — only the
mouse-drag path is missing that step.

### Suggested fix
In the text-size slider's `onReleased` handler, set `textSizePreviewIndex`
(and call `markReflowing()`) before invoking `setTextSize()`, mirroring
`adjustTextSize()`:

    onReleased: function(v) {
      var idx = Math.round(v)
      root.markReflowing()
      root.textSizePreviewIndex = idx
      root.setTextSize(root.textSizeStops[idx])
    }

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 08:27 UTC