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

omarchy-agent-usage-claude logs one stderr line per unreadable transcript, filling $XDG_RUNTIME_DIR and killing the compositor with SIGBUS

Reported by StefanMaron · filed Sep 1, 2026Closed upstream on 2026-10-04 by the bot omarchybot; the closing comment says it was fixed by PR #14049. 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

omarchy-agent-usage-claude logs one stderr line per unreadable transcript, filling $XDG_RUNTIME_DIR and killing the compositor with SIGBUSrevision 1 · captured 2026-09-28 21:24 UTC via poll

Summary

/usr/bin/omarchy-agent-usage-claude scans ~/.claude/projects/**/*.jsonl and writes one line to stderr for every file it cannot open:

except Exception as exc:
  print(f"Ignoring unreadable Claude project file {path}: {exc}", file=sys.stderr)

(scan_projects, line 197)

There is no deduplication and no limit. The agents bar widget runs the command on a schedule (refreshIntervalSec, default 900), quickshell captures its stderr into the instance log, and the log grows without bound.

On my machine ~/.claude/projects/-app/ holds 90,105 root-owned transcripts, mode 600, left behind by Claude Code running as root inside a container with the home directory mounted. Every scan writes 90,105 lines. The instance log reached 3.35 GB across log.log and log.qslog in about 13 hours and filled /run/user/1000 (3.2 GB).

What breaks once the tmpfs is full

The next client that asks for a shm screen copy kills Hyprland. The compositor maps the client's shm buffer from $XDG_RUNTIME_DIR and writes the pixels into it. With no space left, the kernel cannot allocate a backing page, so the store raises SIGBUS.

Confirmed from the core dump. The fault address and the mapping it lands in:

$1 = (void *) 0x7f7952802010

0x00007f7952800000 0x00007f7953ae6000  /run/user/1000/.hyprpicker_uyi5bh

Signal SIGBUS, si_code: BUS_ADRERR. Stack:

#0  libnvidia-eglcore.so.610.57.04
...
#10 Render::GL::CGLFramebuffer::readPixels
#11 Screenshare::CScreenshareFrame::copyShm
#12 Screenshare::CScreenshareFrame::copy
#13 Screenshare::CScreenshareManager::onOutputCommit

The NVIDIA frames are the driver's copy loop performing the faulting write, not the cause.

This happened three times — Aug 30 21:52, Sep 1 08:57, Sep 1 22:15 — with identical stacks. The trigger each time was SUPER + PRINT (hyprpicker -a). Xwayland also fails to start in this state, because xkbcomp cannot write its keymap: Cannot close "/run/user/1000/server-0.xkm" properly (not enough space?).

Steps to reproduce

  1. Create files under ~/.claude/projects/ that the user cannot read:
   sudo mkdir -p ~/.claude/projects/-test
   sudo bash -c 'for i in $(seq 1 50000); do : > ~/.claude/projects/-test/$i.jsonl; done'
   sudo chmod 600 ~/.claude/projects/-test/*.jsonl
  1. Leave the agents bar widget enabled.
  2. Watch $XDG_RUNTIME_DIR/quickshell/by-id/*/log.log grow by one line per file per refresh.
  3. With the tmpfs full, press SUPER + PRINT. Hyprland dies with SIGBUS.

Expected

The warning should be deduplicated, counted, or dropped after the first few. A directory the user cannot read is a normal condition, not something worth one log line per file per refresh.

Separately, the quickshell instance log should have a size cap. Issue #7506 is a different cause with the same result: an uncapped instance log filling $XDG_RUNTIME_DIR. There it broke app launching; here it kills the compositor. A cap would contain both.

System

  • omarchy 4.0.2-1
  • omarchy-settings 4.0.2-1
  • quickshell 0.3.1-1
  • hyprland 0.56.2-1
  • Linux 7.1.9-arch1-2, NVIDIA 610.57.04
  • /run/user/1000 is 3.2 GB

Filed by Claude Opus 5 via Claude Code.

View raw text
## Summary

`/usr/bin/omarchy-agent-usage-claude` scans `~/.claude/projects/**/*.jsonl` and writes one line to stderr for every file it cannot open:

```python
except Exception as exc:
  print(f"Ignoring unreadable Claude project file {path}: {exc}", file=sys.stderr)
```

(`scan_projects`, line 197)

There is no deduplication and no limit. The agents bar widget runs the command on a schedule (`refreshIntervalSec`, default 900), quickshell captures its stderr into the instance log, and the log grows without bound.

On my machine `~/.claude/projects/-app/` holds 90,105 root-owned transcripts, mode 600, left behind by Claude Code running as root inside a container with the home directory mounted. Every scan writes 90,105 lines. The instance log reached 3.35 GB across `log.log` and `log.qslog` in about 13 hours and filled `/run/user/1000` (3.2 GB).

## What breaks once the tmpfs is full

The next client that asks for a shm screen copy kills Hyprland. The compositor maps the client's shm buffer from `$XDG_RUNTIME_DIR` and writes the pixels into it. With no space left, the kernel cannot allocate a backing page, so the store raises SIGBUS.

Confirmed from the core dump. The fault address and the mapping it lands in:

```
$1 = (void *) 0x7f7952802010

0x00007f7952800000 0x00007f7953ae6000  /run/user/1000/.hyprpicker_uyi5bh
```

Signal `SIGBUS`, `si_code: BUS_ADRERR`. Stack:

```
#0  libnvidia-eglcore.so.610.57.04
...
#10 Render::GL::CGLFramebuffer::readPixels
#11 Screenshare::CScreenshareFrame::copyShm
#12 Screenshare::CScreenshareFrame::copy
#13 Screenshare::CScreenshareManager::onOutputCommit
```

The NVIDIA frames are the driver's copy loop performing the faulting write, not the cause.

This happened three times — Aug 30 21:52, Sep 1 08:57, Sep 1 22:15 — with identical stacks. The trigger each time was `SUPER + PRINT` (`hyprpicker -a`). Xwayland also fails to start in this state, because xkbcomp cannot write its keymap: `Cannot close "/run/user/1000/server-0.xkm" properly (not enough space?)`.

## Steps to reproduce

1. Create files under `~/.claude/projects/` that the user cannot read:
   ```bash
   sudo mkdir -p ~/.claude/projects/-test
   sudo bash -c 'for i in $(seq 1 50000); do : > ~/.claude/projects/-test/$i.jsonl; done'
   sudo chmod 600 ~/.claude/projects/-test/*.jsonl
   ```
2. Leave the agents bar widget enabled.
3. Watch `$XDG_RUNTIME_DIR/quickshell/by-id/*/log.log` grow by one line per file per refresh.
4. With the tmpfs full, press `SUPER + PRINT`. Hyprland dies with SIGBUS.

## Expected

The warning should be deduplicated, counted, or dropped after the first few. A directory the user cannot read is a normal condition, not something worth one log line per file per refresh.

Separately, the quickshell instance log should have a size cap. Issue #7506 is a different cause with the same result: an uncapped instance log filling `$XDG_RUNTIME_DIR`. There it broke app launching; here it kills the compositor. A cap would contain both.

## System

- omarchy 4.0.2-1
- omarchy-settings 4.0.2-1
- quickshell 0.3.1-1
- hyprland 0.56.2-1
- Linux 7.1.9-arch1-2, NVIDIA 610.57.04
- `/run/user/1000` is 3.2 GB

Filed by Claude Opus 5 via Claude 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.