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

Shipped herdr config binds prefix+shift+k to close_workspace, silently shadowing herdr's default swap_pane_up

Reported by t1nk333r · filed Sep 3, 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

Shipped herdr config binds prefix+shift+k to close_workspace, silently shadowing herdr's default swap_pane_uprevision 1 · captured 2026-09-28 21:24 UTC via poll

Summary

omarchy-settings ships /usr/share/omarchy/config/herdr/config.toml as the user's herdr config. It binds close_workspace = "prefix+shift+k", which is also herdr's own default for swap_pane_up. herdr resolves the chord to the config's action and never warns, so swap_pane_up is unreachable on a stock Omarchy install — no other chord is bound to it anywhere in the shipped file.

Because the same file sets confirm_close = false ("kill-window and kill-session never asked"), the chord that wins is an immediate, unconfirmed workspace kill.

Environment

  • Omarchy 4.0.2-1, omarchy-settings 4.0.2-1, herdr 0.8.2-1
  • Reproduced on a clean 4.0.2 VM install from the official ISO (unattended cidata install), with no user customization at all — not specific to my machine.
  • md5sum /usr/share/omarchy/config/herdr/config.toml → ea3c7a4726c27ed8ef93e8e527662d07, identical to the ~/.config/herdr/config.toml a fresh install lands with.

The collision

Shipped config:

# line 18
prefix = "ctrl+space"
# line 66
close_workspace = "prefix+shift+k"
# line 81
confirm_close = false

herdr 0.8.2's canonical key reference (docs/next/website/src/data/config-reference.json) gives:

{ "key": "keys.swap_pane_up", "type": "keybinding", "default": "\"prefix+shift+k\"" }

swap_pane_up is not overridden in the shipped config — the file sets no swap_pane_* key at all — so the default stays live and collides with close_workspace.

Note that herdr config check does not catch this. It reports config: ok for the shipped file, and in fact accepts a nonexistent key (bogus_key_xyz) and an invalid chord (prefix+totally_not_a_key) with the same output, so it cannot be relied on to detect the conflict.

Steps to reproduce

  1. Install Omarchy 4.0.2 (or omarchy refresh config herdr/config.toml to restore the shipped file).
  2. Launch herdr, create a workspace with two stacked panes, and create a second workspace so the effect is visible.
  3. Focus the top pane and press Ctrl+Space then Shift+K.

Expected

Either swap_pane_up swaps the two panes, or — if close_workspace is intended to own that chord, mirroring tmux's bind K kill-session — swap_pane_up is explicitly rebound so it remains reachable.

Actual

The focused workspace and every pane in it are destroyed immediately, with no confirmation. The panes never swap. swap_pane_up cannot be triggered by any key in the shipped configuration.

Verified twice in the VM, deterministically. Before: workspace ~ with panes PANE-ONE-TOP / PANE-TWO-BOTTOM, plus workspace SECOND in the sidebar. After the chord: ~ is gone from the sidebar entirely, only SECOND remains with its single pane. Server log for the same instant:

INFO herdr::logging: workspace closed event="workspace.close" subsystem="workspace" outcome="ok" workspace_id="w1"
INFO herdr::logging: pane child exited event="pane.exit" ... signal: Some("Hangup")
INFO herdr::logging: pane child exited event="pane.exit" ... signal: Some("Hangup")
WARN herdr::app::actions: PaneDied for unknown pane pane=3
WARN herdr::app::actions: PaneDied for unknown pane pane=1

No conflict, duplicate-binding or shadowing warning is logged by herdr at any point (grep -niE 'conflict|duplicat|unknown key|shadow' on both herdr-client.log and herdr-server.log returns nothing), which is why this is easy to miss.

Suggested fix

Keep close_workspace where it is — it mirrors tmux's bind K and matches the rest of the file's tmux-derived mapping — and give the swap_pane_* family explicit bindings off the prefix+shift+h/j/k/l defaults. prefix+shift+{left,down,up,right} is free in the shipped config and keeps the directional grouping:

swap_pane_left = "prefix+shift+left"
swap_pane_down = "prefix+shift+down"
swap_pane_up = "prefix+shift+up"
swap_pane_right = "prefix+shift+right"

Only swap_pane_up strictly collides; moving all four keeps them consistent rather than splitting the family across two chord styles.

Worth noting separately: prefix+shift+k destroying a multi-pane workspace with confirm_close = false is a harsh default for a chord one key away from close_tab (prefix+k). That may be deliberate tmux parity, but it is a second reason not to leave a second action fighting for the same chord.

View raw text
## Summary

`omarchy-settings` ships `/usr/share/omarchy/config/herdr/config.toml` as the user's herdr config. It binds `close_workspace = "prefix+shift+k"`, which is also herdr's own default for `swap_pane_up`. herdr resolves the chord to the config's action and never warns, so `swap_pane_up` is unreachable on a stock Omarchy install — no other chord is bound to it anywhere in the shipped file.

Because the same file sets `confirm_close = false` ("kill-window and kill-session never asked"), the chord that wins is an immediate, unconfirmed workspace kill.

## Environment

- Omarchy `4.0.2-1`, `omarchy-settings 4.0.2-1`, `herdr 0.8.2-1`
- Reproduced on a **clean 4.0.2 VM install** from the official ISO (unattended `cidata` install), with no user customization at all — not specific to my machine.
- `md5sum /usr/share/omarchy/config/herdr/config.toml` → `ea3c7a4726c27ed8ef93e8e527662d07`, identical to the `~/.config/herdr/config.toml` a fresh install lands with.

## The collision

Shipped config:

```toml
# line 18
prefix = "ctrl+space"
# line 66
close_workspace = "prefix+shift+k"
# line 81
confirm_close = false
```

herdr 0.8.2's canonical key reference (`docs/next/website/src/data/config-reference.json`) gives:

```json
{ "key": "keys.swap_pane_up", "type": "keybinding", "default": "\"prefix+shift+k\"" }
```

`swap_pane_up` is not overridden in the shipped config — the file sets no `swap_pane_*` key at all — so the default stays live and collides with `close_workspace`.

Note that `herdr config check` does not catch this. It reports `config: ok` for the shipped file, and in fact accepts a nonexistent key (`bogus_key_xyz`) and an invalid chord (`prefix+totally_not_a_key`) with the same output, so it cannot be relied on to detect the conflict.

## Steps to reproduce

1. Install Omarchy 4.0.2 (or `omarchy refresh config herdr/config.toml` to restore the shipped file).
2. Launch `herdr`, create a workspace with two stacked panes, and create a second workspace so the effect is visible.
3. Focus the top pane and press `Ctrl+Space` then `Shift+K`.

## Expected

Either `swap_pane_up` swaps the two panes, or — if `close_workspace` is intended to own that chord, mirroring tmux's `bind K kill-session` — `swap_pane_up` is explicitly rebound so it remains reachable.

## Actual

The focused workspace and every pane in it are destroyed immediately, with no confirmation. The panes never swap. `swap_pane_up` cannot be triggered by any key in the shipped configuration.

Verified twice in the VM, deterministically. Before: workspace `~` with panes `PANE-ONE-TOP` / `PANE-TWO-BOTTOM`, plus workspace `SECOND` in the sidebar. After the chord: `~` is gone from the sidebar entirely, only `SECOND` remains with its single pane. Server log for the same instant:

```
INFO herdr::logging: workspace closed event="workspace.close" subsystem="workspace" outcome="ok" workspace_id="w1"
INFO herdr::logging: pane child exited event="pane.exit" ... signal: Some("Hangup")
INFO herdr::logging: pane child exited event="pane.exit" ... signal: Some("Hangup")
WARN herdr::app::actions: PaneDied for unknown pane pane=3
WARN herdr::app::actions: PaneDied for unknown pane pane=1
```

No conflict, duplicate-binding or shadowing warning is logged by herdr at any point (`grep -niE 'conflict|duplicat|unknown key|shadow'` on both `herdr-client.log` and `herdr-server.log` returns nothing), which is why this is easy to miss.

## Suggested fix

Keep `close_workspace` where it is — it mirrors tmux's `bind K` and matches the rest of the file's tmux-derived mapping — and give the `swap_pane_*` family explicit bindings off the `prefix+shift+h/j/k/l` defaults. `prefix+shift+{left,down,up,right}` is free in the shipped config and keeps the directional grouping:

```toml
swap_pane_left = "prefix+shift+left"
swap_pane_down = "prefix+shift+down"
swap_pane_up = "prefix+shift+up"
swap_pane_right = "prefix+shift+right"
```

Only `swap_pane_up` strictly collides; moving all four keeps them consistent rather than splitting the family across two chord styles.

Worth noting separately: `prefix+shift+k` destroying a multi-pane workspace with `confirm_close = false` is a harsh default for a chord one key away from `close_tab` (`prefix+k`). That may be deliberate tmux parity, but it is a second reason not to leave a second action fighting for the same chord.

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 10:42 UTC