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.
Bluetooth panel starts adapter discovery and never stops it, breaking A2DP audio until shell restart
Reported by sholden · filed Aug 13, 2026Closed upstream on 2026-08-13 by the merge of PR #6794 (closed by dhh). 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
Summary
Opening the Bluetooth panel puts the adapter into continuous discovery and never stops it. Any connected A2DP device stutters badly for as long as the discovery session lives — which is until the shell restarts or crashes, not until the panel closes.
Bluetooth inquiry makes the controller hop across the whole 2.4 GHz band, which starves the airtime of an active A2DP stream on the same radio. Closing the panel does not help, so the degradation persists indefinitely from the user's point of view.
Steps to reproduce
- Connect an A2DP device (Sony WH-1000XM5 here) and start playing audio.
- Open the Bluetooth panel in the bar.
- Audio begins skipping within a second or two.
- Close the panel. Audio keeps skipping.
bluetoothctl showstill reportsDiscovering: yeswith the panel closed.omarchy restart shell(or any event that drops quickshell's D-Bus connection) →Discovering: no, audio immediately clean.
Reproduced multiple times.
Expected
Opening the panel should not degrade an active audio stream, and discovery should stop when the panel closes.
Actual
Discovery is asserted every second while the panel is open, and is never set back to false.
Root cause
shell/plugins/panels/bluetooth/Panel.qml:483-490
// BlueZ rejects StartDiscovery while the adapter is still powering up, and
// discovery can also time out on its own. While the panel is open, keep
// nudging it back on so an enabled adapter is always scanning.
Timer {
id: discoveryRetry
interval: 1000
repeat: true
triggeredOnStart: true
running: root.opened && root.adapter !== null && root.adapter.enabled && !root.adapter.discovering
onTriggered: root.adapter.discovering = true
}Two separate problems:
- Discovery runs regardless of active audio. Scanning while streaming A2DP is the classic cause of Bluetooth audio stutter; the two contend for the same radio.
- Nothing ever stops discovery.
discovering = trueon line 489 is the only write to that property in the entire plugin:
$ grep -rn "discovering" shell/plugins/panels/bluetooth/
Model.js:141: function visibleSections(lists, discovering) {
Model.js:145: if (discovering && lists && lists.discovered ...
Panel.qml:116: if (section === "discovered") return adapter && adapter.discovering && ...
Panel.qml:121: return Model.visibleSections(deviceGroups, adapter && adapter.discovering)
Panel.qml:488: running: root.opened && ... && !root.adapter.discovering
Panel.qml:489: onTriggered: root.adapter.discovering = true Closing the panel only stops the retry timer via the running: binding. The already-started BlueZ discovery session is untouched. BlueZ scopes a discovery session to the requesting D-Bus client, so it only ends when quickshell's connection drops.
This is why a shell restart fixes it and closing the panel does not.
Evidence
With the panel closed, during active playback:
$ bluetoothctl show | grep -E "Powered|Discovering"
Powered: yes
Discovering: yes
$ pactl list sinks short | grep bluez
4217 bluez_output.AC_80_0A_2D_0D_57.1 PipeWire s16le 2ch 48000Hz RUNNINGAfter omarchy restart shell:
Powered: yes
Discovering: noWorth noting: pw-top reports zero xruns throughout (ERR 0), and the sink is RUNNING the whole time. The audio pipeline is healthy — packets are lost over the air, not underrun in software. This makes the symptom easy to misattribute to PipeWire, the codec, or the adapter.
Suggested fix
- Stop discovery when the panel closes (set
discovering = falseon theroot.openedtransition, or bind it toroot.openedrather than one-way asserting it). - Consider suppressing or pausing discovery while an A2DP device is connected and streaming, or at least stop the 1 s re-assert loop once the device list has populated.
System details
| Omarchy | 4.0.0rc2-1 |
| Hardware | MacBookPro15,1 (T2), Intel i9-9980HK |
| GPU | Intel UHD 630 + AMD Radeon Pro 555X |
| Kernel | 7.1.6-arch1-Watanare-T2-1-t2 |
| quickshell | quickshell-git 0.3.0.r20.g28771c7-1 |
| BlueZ | 5.87-2 (bluez-utils 5.87-2) |
| PipeWire | 1.6.8-1, WirePlumber 0.5.15-1 |
| Adapter | BCM4364B0, hci_uart_bcm |
| Audio device | Sony WH-1000XM5 (A2DP, reproduced on both LDAC and AAC) |
Note: omarchy debug --no-sudo --print is documented for bug reports but the debug command does not exist in 4.0.0rc2 (Unknown Omarchy command: omarchy debug), so the above was collected manually.
View raw text
## Summary
Opening the Bluetooth panel puts the adapter into continuous discovery and **never stops it**. Any connected A2DP device stutters badly for as long as the discovery session lives — which is until the shell restarts or crashes, not until the panel closes.
Bluetooth inquiry makes the controller hop across the whole 2.4 GHz band, which starves the airtime of an active A2DP stream on the same radio. Closing the panel does not help, so the degradation persists indefinitely from the user's point of view.
## Steps to reproduce
1. Connect an A2DP device (Sony WH-1000XM5 here) and start playing audio.
2. Open the Bluetooth panel in the bar.
3. Audio begins skipping within a second or two.
4. **Close the panel.** Audio keeps skipping.
5. `bluetoothctl show` still reports `Discovering: yes` with the panel closed.
6. `omarchy restart shell` (or any event that drops quickshell's D-Bus connection) → `Discovering: no`, audio immediately clean.
Reproduced multiple times.
## Expected
Opening the panel should not degrade an active audio stream, and discovery should stop when the panel closes.
## Actual
Discovery is asserted every second while the panel is open, and is never set back to `false`.
## Root cause
`shell/plugins/panels/bluetooth/Panel.qml:483-490`
```qml
// BlueZ rejects StartDiscovery while the adapter is still powering up, and
// discovery can also time out on its own. While the panel is open, keep
// nudging it back on so an enabled adapter is always scanning.
Timer {
id: discoveryRetry
interval: 1000
repeat: true
triggeredOnStart: true
running: root.opened && root.adapter !== null && root.adapter.enabled && !root.adapter.discovering
onTriggered: root.adapter.discovering = true
}
```
Two separate problems:
1. **Discovery runs regardless of active audio.** Scanning while streaming A2DP is the classic cause of Bluetooth audio stutter; the two contend for the same radio.
2. **Nothing ever stops discovery.** `discovering = true` on line 489 is the *only* write to that property in the entire plugin:
```
$ grep -rn "discovering" shell/plugins/panels/bluetooth/
Model.js:141: function visibleSections(lists, discovering) {
Model.js:145: if (discovering && lists && lists.discovered ...
Panel.qml:116: if (section === "discovered") return adapter && adapter.discovering && ...
Panel.qml:121: return Model.visibleSections(deviceGroups, adapter && adapter.discovering)
Panel.qml:488: running: root.opened && ... && !root.adapter.discovering
Panel.qml:489: onTriggered: root.adapter.discovering = true
```
Closing the panel only stops the retry timer via the `running:` binding. The already-started BlueZ discovery session is untouched. BlueZ scopes a discovery session to the requesting D-Bus client, so it only ends when quickshell's connection drops.
This is why a shell restart fixes it and closing the panel does not.
## Evidence
With the panel closed, during active playback:
```
$ bluetoothctl show | grep -E "Powered|Discovering"
Powered: yes
Discovering: yes
$ pactl list sinks short | grep bluez
4217 bluez_output.AC_80_0A_2D_0D_57.1 PipeWire s16le 2ch 48000Hz RUNNING
```
After `omarchy restart shell`:
```
Powered: yes
Discovering: no
```
Worth noting: `pw-top` reports **zero xruns** throughout (`ERR 0`), and the sink is `RUNNING` the whole time. The audio pipeline is healthy — packets are lost over the air, not underrun in software. This makes the symptom easy to misattribute to PipeWire, the codec, or the adapter.
## Suggested fix
- Stop discovery when the panel closes (set `discovering = false` on the `root.opened` transition, or bind it to `root.opened` rather than one-way asserting it).
- Consider suppressing or pausing discovery while an A2DP device is connected and streaming, or at least stop the 1 s re-assert loop once the device list has populated.
## System details
| | |
|---|---|
| Omarchy | 4.0.0rc2-1 |
| Hardware | MacBookPro15,1 (T2), Intel i9-9980HK |
| GPU | Intel UHD 630 + AMD Radeon Pro 555X |
| Kernel | 7.1.6-arch1-Watanare-T2-1-t2 |
| quickshell | quickshell-git 0.3.0.r20.g28771c7-1 |
| BlueZ | 5.87-2 (bluez-utils 5.87-2) |
| PipeWire | 1.6.8-1, WirePlumber 0.5.15-1 |
| Adapter | BCM4364B0, `hci_uart_bcm` |
| Audio device | Sony WH-1000XM5 (A2DP, reproduced on both LDAC and AAC) |
Note: `omarchy debug --no-sudo --print` is documented for bug reports but the `debug` command does not exist in 4.0.0rc2 (`Unknown Omarchy command: omarchy debug`), so the above was collected manually.
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.