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

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.

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

Bluetooth panel starts adapter discovery and never stops it, breaking A2DP audio until shell restartrevision 1 · captured 2026-10-04 12:03 UTC via poll

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

// 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.
  1. 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

Omarchy4.0.0rc2-1
HardwareMacBookPro15,1 (T2), Intel i9-9980HK
GPUIntel UHD 630 + AMD Radeon Pro 555X
Kernel7.1.6-arch1-Watanare-T2-1-t2
quickshellquickshell-git 0.3.0.r20.g28771c7-1
BlueZ5.87-2 (bluez-utils 5.87-2)
PipeWire1.6.8-1, WirePlumber 0.5.15-1
AdapterBCM4364B0, hci_uart_bcm
Audio deviceSony 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.