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

herdr: prompt drawn at row 1 with the previous screen left below it after an SSH session exits

Reported by rubberneck · filed Aug 15, 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

herdr: prompt drawn at row 1 with the previous screen left below it after an SSH session exitsrevision 1 · captured 2026-09-28 21:29 UTC via poll

System details

Omarchy: 4.0.0-1 (stable) Kernel: 7.1.8-arch1-3 CPU: Intel Core i7-10700K GPU: AMD Navi 10 [Radeon RX 5700 XT] herdr: 0.8.0.r13-1 (upstream 0.8.0, stable channel) foot: 1.27.0-2 Hyprland: 0.56.2 TERM: xterm-256color Pane: 322x88 (dual 2560x1600)

herdr: prompt drawn at row 1 with the previous screen left below it after an SSH session exits

What happens

Inside a herdr pane, SSH to any host and log out. The next shell prompt is drawn
at the top of the pane, while the entire pre-logout screen (the SSH session's
output) remains on screen below it. The pane stays in this state until clear.

Expected: the prompt is drawn on the line after Connection to <host> closed.,
as it is in a plain terminal.

Steps to reproduce

  1. Open a herdr pane
  2. ssh <any-host>
  3. exit
  4. The new prompt appears at row 1; the old screen is still below it

Reproduced against an Ubuntu 24.04 host over a LAN connection; nothing unusual on
the remote side (default bash, standard MOTD).

The corruption is in herdr's screen model, not the rendering

This is the part I think matters most, because it rules out a repaint fix.
herdr's own API returns the same broken layout that is on screen:

herdr pane read <pane-id> --source visible --format text

returns, top to bottom:

Projects/lamebox/omarchy
❯                                   <- post-logout prompt, at row 1
Projects/lamebox/omarchy
❯ ls
<ls output>
Projects/lamebox/omarchy
❯ ssh m90q-01
<ssh session output>
$ exit
logout
Connection to m90q-01 closed.       <- model ends here, no trailing prompt

So the pane's model genuinely holds the prompt at row 1 with the old content
beneath it. Consequently no repaint (zoom toggle, focus change, resize) corrects
it — they faithfully redraw the bad model. Only clear helps, because it erases.

What was ruled out

TestResult
Same steps in plain foot (no herdr)correct — not a terminal bug
atuin pty-proxy disabled (a third PTY layer)still broken — not atuin
seq 200; clear in herdr, no SSHclears correctly — erase-display is fine generally
clear after the breakagefixes it
ctrl+space z zoom toggle / focus change / resizeno effect

Likely cause

Cursor tracking drifts across the SSH session. SSH sessions set scroll regions
(remote prompt, pager, MOTD), and by logout herdr's cursor model reports row 1,
so the local shell's prompt is written there without the intervening content
being erased.

This matches a root cause already diagnosed upstream in herdrdev/herdr:
src/protocol/render_ansi.rs::write_changed_cells() performs coordinate-based
cell diffing with no scroll-region or insert-line awareness.

frames: every visible pane jumps to an older viewport position and snaps back"
(closed, not planned) — names the function above
- https://github.com/herdrdev/herdr/issues/2521 — "Interactive agent output
(menu/prompt) causes viewport to scroll up then snap back — coordinate-based
diff, not scroll-region aware" (closed, not planned)
- https://github.com/herdrdev/herdr/issues/283 — "Reduce visible wave effect when
scrolling pane scrollback" (closed, completed) — the earlier repaint issue the
other two are follow-ups to

Those two follow-ups describe idle/agent-output symptoms rather than this SSH
one, but the diagnosed mechanism is the same, and both were declined upstream.

Filing here because Omarchy ships omacom-io/herdr as the default terminal
workspace and that fork has issue creation disabled, so there is no other route
to report it against the version users actually run. Every Omarchy user who uses
SSH from a herdr pane will hit this.

Workaround (for anyone finding this issue)

The wrapper below runs after ssh exits but before bash draws its prompt — at
that moment the screen contents are still correct and only the cursor row is
wrong. It asks herdr where its content ends and parks the cursor one row below,
so nothing is scrolled or erased and the SSH output stays on screen:

ssh() {
  command ssh "$@"
  local rc=$? pane row lines
  if [[ -n ${HERDR_SOCKET_PATH:-} ]]; then
    pane=$(herdr pane current 2>/dev/null | sed -n 's/.*"pane_id":"\([^"]*\)".*/\1/p')
    if [[ -n $pane ]]; then
      row=$(herdr pane read "$pane" --source visible --format text 2>/dev/null \
              | awk 'NF{n=NR} END{print n+0}')
      lines=${LINES:-$(tput lines)}
      if (( row > 0 )); then
        if (( row >= lines )); then
          printf '\033[%d;1H\n' "$lines"
        else
          printf '\033[%d;1H' $(( row + 1 ))
        fi
      fi
    fi
  fi
  return $rc
}

System

Omarchy:  4.0.0-1 (stable)
Kernel:   7.1.8-arch1-3
CPU:      Intel Core i7-10700K
GPU:      AMD Navi 10 [Radeon RX 5700 XT]
herdr:    0.8.0.r13-1 (upstream 0.8.0, stable channel)
foot:     1.27.0-2
Hyprland: 0.56.2
TERM:     xterm-256color
Pane:     322x88 (dual 2560x1600)

Note: contributing.md in the shipped omarchy agent skill still tells you to
run omarchy debug --no-sudo --print for diagnostics, but that command no longer
exists in 4.0.0 (Unknown Omarchy command: omarchy debug). Details above were
collected by hand.

View raw text
### System details

Omarchy:  4.0.0-1 (stable) Kernel:   7.1.8-arch1-3 CPU:      Intel Core i7-10700K GPU:      AMD Navi 10 [Radeon RX 5700 XT] herdr:    0.8.0.r13-1 (upstream 0.8.0, stable channel) foot:     1.27.0-2 Hyprland: 0.56.2 TERM:     xterm-256color Pane:     322x88 (dual 2560x1600)

herdr: prompt drawn at row 1 with the previous screen left below it after an SSH session exits

## What happens

Inside a herdr pane, SSH to any host and log out. The next shell prompt is drawn
at the **top** of the pane, while the entire pre-logout screen (the SSH session's
output) remains on screen below it. The pane stays in this state until `clear`.

Expected: the prompt is drawn on the line after `Connection to <host> closed.`,
as it is in a plain terminal.

## Steps to reproduce

1. Open a herdr pane
2. `ssh <any-host>`
3. `exit`
4. The new prompt appears at row 1; the old screen is still below it

Reproduced against an Ubuntu 24.04 host over a LAN connection; nothing unusual on
the remote side (default bash, standard MOTD).

## The corruption is in herdr's screen model, not the rendering

This is the part I think matters most, because it rules out a repaint fix.
herdr's own API returns the same broken layout that is on screen:

```
herdr pane read <pane-id> --source visible --format text
```

returns, top to bottom:

```
Projects/lamebox/omarchy
❯                                   <- post-logout prompt, at row 1
Projects/lamebox/omarchy
❯ ls
<ls output>
Projects/lamebox/omarchy
❯ ssh m90q-01
<ssh session output>
$ exit
logout
Connection to m90q-01 closed.       <- model ends here, no trailing prompt
```

So the pane's model genuinely holds the prompt at row 1 with the old content
beneath it. Consequently no repaint (zoom toggle, focus change, resize) corrects
it — they faithfully redraw the bad model. Only `clear` helps, because it erases.

## What was ruled out

| Test | Result |
|---|---|
| Same steps in plain `foot` (no herdr) | correct — not a terminal bug |
| `atuin pty-proxy` disabled (a third PTY layer) | still broken — not atuin |
| `seq 200; clear` in herdr, no SSH | clears correctly — erase-display is fine generally |
| `clear` after the breakage | fixes it |
| `ctrl+space z` zoom toggle / focus change / resize | no effect |

## Likely cause

Cursor tracking drifts across the SSH session. SSH sessions set scroll regions
(remote prompt, pager, MOTD), and by logout herdr's cursor model reports row 1,
so the local shell's prompt is written there without the intervening content
being erased.

This matches a root cause already diagnosed upstream in `herdrdev/herdr`:
`src/protocol/render_ansi.rs::write_changed_cells()` performs coordinate-based
cell diffing with no scroll-region or insert-line awareness.

- https://github.com/herdrdev/herdr/issues/2793 — "Client re-presents stale pane
  frames: every visible pane jumps to an older viewport position and snaps back"
  (closed, **not planned**) — names the function above
- https://github.com/herdrdev/herdr/issues/2521 — "Interactive agent output
  (menu/prompt) causes viewport to scroll up then snap back — coordinate-based
  diff, not scroll-region aware" (closed, **not planned**)
- https://github.com/herdrdev/herdr/issues/283 — "Reduce visible wave effect when
  scrolling pane scrollback" (closed, completed) — the earlier repaint issue the
  other two are follow-ups to

Those two follow-ups describe idle/agent-output symptoms rather than this SSH
one, but the diagnosed mechanism is the same, and both were declined upstream.

Filing here because Omarchy ships `omacom-io/herdr` as the default terminal
workspace and that fork has issue creation disabled, so there is no other route
to report it against the version users actually run. Every Omarchy user who uses
SSH from a herdr pane will hit this.

## Workaround (for anyone finding this issue)

The wrapper below runs after `ssh` exits but *before* bash draws its prompt — at
that moment the screen contents are still correct and only the cursor row is
wrong. It asks herdr where its content ends and parks the cursor one row below,
so nothing is scrolled or erased and the SSH output stays on screen:

```bash
ssh() {
  command ssh "$@"
  local rc=$? pane row lines
  if [[ -n ${HERDR_SOCKET_PATH:-} ]]; then
    pane=$(herdr pane current 2>/dev/null | sed -n 's/.*"pane_id":"\([^"]*\)".*/\1/p')
    if [[ -n $pane ]]; then
      row=$(herdr pane read "$pane" --source visible --format text 2>/dev/null \
              | awk 'NF{n=NR} END{print n+0}')
      lines=${LINES:-$(tput lines)}
      if (( row > 0 )); then
        if (( row >= lines )); then
          printf '\033[%d;1H\n' "$lines"
        else
          printf '\033[%d;1H' $(( row + 1 ))
        fi
      fi
    fi
  fi
  return $rc
}
```

## System

```
Omarchy:  4.0.0-1 (stable)
Kernel:   7.1.8-arch1-3
CPU:      Intel Core i7-10700K
GPU:      AMD Navi 10 [Radeon RX 5700 XT]
herdr:    0.8.0.r13-1 (upstream 0.8.0, stable channel)
foot:     1.27.0-2
Hyprland: 0.56.2
TERM:     xterm-256color
Pane:     322x88 (dual 2560x1600)
```

Note: `contributing.md` in the shipped `omarchy` agent skill still tells you to
run `omarchy debug --no-sudo --print` for diagnostics, but that command no longer
exists in 4.0.0 (`Unknown Omarchy command: omarchy debug`). Details above were
collected by hand.

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 04:14 UTC