Proof Portal
Omarchy
ProbeLabs65 findings · 95 requirementsA 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.
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.
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
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:
- Adjust system volume (OSD open/close for
omarchy-osd). - PipeWire tears down the default sink/source and related nodes in the same second.
- Shell crashes;
coredumpctlrecords 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_TKILLafter 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 ← faultAnalysis
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.