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

omarchy-shell SIGSEGV: QQuickRepeater regenerates during PipeWire default-sink teardown

Reported by wilhewonthe · filed Sep 17, 2026Closed upstream on 2026-10-04 by the merge of PR #7783 (closed by omarchybot, a bot). 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-shell SIGSEGV: QQuickRepeater regenerates during PipeWire default-sink teardownrevision 1 · captured 2026-09-28 21:23 UTC via poll

What happened

omarchy-shell (quickshell) segfaulted while the audio graph was tearing down. Volume/OSD activity was in progress; PipeWire then destroyed the default sink/source and unbound nodes; the main thread crashed inside a QQmlTimer-driven QQuickRepeater::setModel / regenerate path.

The shell auto-restarted. No user documents were involved.

Expected

The shell should survive PipeWire default-sink/source destruction (device disconnect, profile switch, route churn) without SIGSEGV — especially given the existing deferred-snapshot mitigation in the audio panel.

Steps to reproduce

Not fully deterministic from this one core, but the correlated sequence was:

  1. Adjust system volume (OSD open/close for omarchy-osd).
  2. PipeWire tears down the default sink/source and related nodes in the same second.
  3. Shell crashes; coredumpctl records PID of the quickshell child.

Likely higher chance with the audio panel open (its audioModelRefreshTimer is the closest match to the stack).

System

  • Omarchy: 4.0.3-1
  • quickshell: 0.3.1-1
  • qt6-declarative: 6.11.2-1
  • pipewire: 1:1.6.8-1 / wireplumber: 0.5.17-1
  • Kernel: 7.2.3-arch1-3
  • Machine: HP Victus 15-fa0xxx (i7-12650H, i915 + NVIDIA RTX 3050 Ti Mobile)
  • Audio: sof-audio-pci-intel-tgl + NVIDIA HDA; PipeWire active

omarchy-debug --no-sudo --print written to /tmp/omarchy-debug.log on the reporting machine.

Diagnostics

  • Time: 2026-09-17 14:54:54 PDT
  • PID: 1613116
  • Command: quickshell -n -p /usr/share/omarchy/shell
  • Signal: SIGSEGV (SI_TKILL after Quickshell’s crash handler)
  • Quickshell crash report: ~/.cache/quickshell/crashes/kvkf2spthlt/
  • Not an OOM kill; first quickshell core on this machine

Log tail (same second as the crash)

Default configured sink destroyed.
Default sink destroyed.
… Unbinding / Destroying PwNode / PwDevice …
Default configured source destroyed.
Default source destroyed.

Preceded by volume updates and openlayer / closelayer for omarchy-osd.

Stack (trimmed; from Quickshell’s report.txt)

#… QQmlTimer::event
#… QQmlBoundSignalExpression::evaluate
#… QV4::Runtime::StoreNameSloppy::call
#… QQmlBinding::update / QQmlPropertyPrivate::write
#… QQuickRepeater::setModel
#… QQuickRepeater::regenerate
#… QQmlIncubatorPrivate::incubate / QQmlObjectCreator::createInstance
#… QV4::Runtime::TypeofName::call
#… QV4::QObjectWrapper::getQmlProperty
#… libQt6QmlModels.so.6   ← fault

Analysis

In plugins/panels/audio/Panel.qml, Repeaters are fed panel-local arrays via a 75 ms audioModelRefreshTimer because rebuilding from the live PipeWire removal path has already crashed (comment on site). Model.listSnapshot is only list.slice() — shallow references to PwNode objects.

When rawAudioSinks becomes empty, audioSinks falls back to cachedAudioSinks, which is only updated while rawAudioSinks.length > 0. After a full default-sink teardown that can leave the Repeater regenerating delegates against destroyed QObjects, which matches this stack.

Related

Separate later Hyprland core under SDDM (uid 961) during EGL/DRM teardown looks unrelated.

Filed by Composer via Cursor.

View raw text
## What happened

`omarchy-shell` (quickshell) segfaulted while the audio graph was tearing down. Volume/OSD activity was in progress; PipeWire then destroyed the default sink/source and unbound nodes; the main thread crashed inside a `QQmlTimer`-driven `QQuickRepeater::setModel` / `regenerate` path.

The shell auto-restarted. No user documents were involved.

## Expected

The shell should survive PipeWire default-sink/source destruction (device disconnect, profile switch, route churn) without SIGSEGV — especially given the existing deferred-snapshot mitigation in the audio panel.

## Steps to reproduce

Not fully deterministic from this one core, but the correlated sequence was:

1. Adjust system volume (OSD open/close for `omarchy-osd`).
2. PipeWire tears down the default sink/source and related nodes in the same second.
3. Shell crashes; `coredumpctl` records PID of the quickshell child.

Likely higher chance with the audio panel open (its `audioModelRefreshTimer` is the closest match to the stack).

## System

- Omarchy: `4.0.3-1`
- quickshell: `0.3.1-1`
- qt6-declarative: `6.11.2-1`
- pipewire: `1:1.6.8-1` / wireplumber: `0.5.17-1`
- Kernel: `7.2.3-arch1-3`
- Machine: HP Victus 15-fa0xxx (i7-12650H, i915 + NVIDIA RTX 3050 Ti Mobile)
- Audio: sof-audio-pci-intel-tgl + NVIDIA HDA; PipeWire active

`omarchy-debug --no-sudo --print` written to `/tmp/omarchy-debug.log` on the reporting machine.

## Diagnostics

- Time: `2026-09-17 14:54:54 PDT`
- PID: `1613116`
- Command: `quickshell -n -p /usr/share/omarchy/shell`
- Signal: `SIGSEGV` (`SI_TKILL` after Quickshell’s crash handler)
- Quickshell crash report: `~/.cache/quickshell/crashes/kvkf2spthlt/`
- Not an OOM kill; first quickshell core on this machine

### Log tail (same second as the crash)

```
Default configured sink destroyed.
Default sink destroyed.
… Unbinding / Destroying PwNode / PwDevice …
Default configured source destroyed.
Default source destroyed.
```

Preceded by volume updates and `openlayer` / `closelayer` for `omarchy-osd`.

### Stack (trimmed; from Quickshell’s `report.txt`)

```
#… QQmlTimer::event
#… QQmlBoundSignalExpression::evaluate
#… QV4::Runtime::StoreNameSloppy::call
#… QQmlBinding::update / QQmlPropertyPrivate::write
#… QQuickRepeater::setModel
#… QQuickRepeater::regenerate
#… QQmlIncubatorPrivate::incubate / QQmlObjectCreator::createInstance
#… QV4::Runtime::TypeofName::call
#… QV4::QObjectWrapper::getQmlProperty
#… libQt6QmlModels.so.6   ← fault
```

## Analysis

In `plugins/panels/audio/Panel.qml`, Repeaters are fed panel-local arrays via a 75 ms `audioModelRefreshTimer` because rebuilding from the live PipeWire removal path has already crashed (comment on site). `Model.listSnapshot` is only `list.slice()` — shallow references to `PwNode` objects.

When `rawAudioSinks` becomes empty, `audioSinks` falls back to `cachedAudioSinks`, which is only updated while `rawAudioSinks.length > 0`. After a full default-sink teardown that can leave the Repeater regenerating delegates against destroyed QObjects, which matches this stack.

## Related

Separate later Hyprland core under SDDM (uid 961) during EGL/DRM teardown looks unrelated.

Filed by Composer via Cursor.

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.