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.
Problems with bluetooth connection. More of a BlueZ issue, rather than Omarchy issue
Reported by karlmarkuspress · filed Sep 5, 2026 · open at source
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?
- AreaOutside the audited area· Decided by agents · verified
- 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?
- Decided by agents and verified by a second, independent agent — see the decision.
Original report
System details
ASUS TUF Dash F15 FX516PR_FX516PR (1.6) 11th Gen Intel(R) Core(TM) i7-11376H (8) @ 4.86 GHz GeForce RTX 3070 Mobile / Max-Q Iris Xe Graphics Software: Omarchy 4.0.2-1 stable Linux 7.1.9-archl-2 Hyprland 0.56.2 (Wayland) ghostty 1.3.1-arch2 1042 (pacman)
What's wrong?
Bluetooth A2DP sink silently stuck at bluez5.profile = "off" after reconnect, despite Active Profile: a2dp-sink and connection: connected
Summary
After a Bluetooth headset reconnects (via a UI Bluetooth toggle, a pipewire/wireplumber service restart, or the headset's own power cycle), the resulting PipeWire sink often looks completely healthy on the surface — it's listed, marked default, reports api.bluez5.connection = "connected", and even correctly negotiates the last-used codec (aptx_hd in this case) — but no audio ever plays. Streams routed to the sink get stuck in [init] and never reach [running].
The underlying cause appears to be that the card's bluez5.profile property gets stuck at "off" while the card's Active Profile: label simultaneously reports a2dp-sink. These two values disagree and stay disagreeing — restarting pipewire/pipewire-pulse/wireplumber, or manually forcing pactl set-card-profile <card> off then a2dp-sink, does not resolve the mismatch. The only fix found so far is fully removing the Bluetooth device pairing (bluetoothctl remove <MAC>), re-pairing from scratch, and then restarting wireplumber again afterward (WirePlumber does not reliably notice the freshly re-paired device on its own).
Environment
- Distro: Omarchy (Arch-based, Hyprland)
pipewire: 1.6.8-1pipewire-pulse: 1.6.8-1pipewire-alsa: 1.6.8-1pipewire-audio: 1.6.8-1wireplumber: 0.5.15-1bluez: 5.87-2bluez-utils: 5.87-2- Headset: Sennheiser MOMENTUM 5 Wireless (Bluetooth 5.4, codecs SBC / AAC / aptX / aptX HD / aptX Adaptive)
- Device MAC:
80:C3:BA:B8:06:72
Steps to reproduce
Any of the following reliably trigger the issue:
- Toggle Bluetooth off/on via the desktop's quick-settings UI while the headset is connected (this performs a hard
rfkill block/rfkill unblockcycle, not a soft radio toggle). - Restart the audio user services (
systemctl --user restart pipewire pipewire-pulse wireplumber) while a Bluetooth sink is the active output. - Power-cycle the headset itself via its physical power button.
After any of the above, check the card state:
pactl list cards | grep -A 30 "bluez_card.<MAC_with_underscores>"Expected behavior
bluez5.profile should match Active Profile: and the sink should transition to RUNNING when a stream is pushed to it.
Actual behavior
bluez5.profile = "off"
...
Active Profile: a2dp-sinkSink stays SUSPENDED even when a client (e.g. Spotify) is actively pushing audio and the stream link shows [init] rather than [running]. No sound is produced. This persists across:
systemctl --user restart pipewire pipewire-pulse wireplumberpactl set-card-profile <card> offfollowed bypactl set-card-profile <card> a2dp-sink(profile briefly reports as requested but reverts / never actually flipsbluez5.profile)pactl suspend-sink <sink> 0
Relevant logs
Every reconnect (successful or not) logs this from bluetoothd, regardless of outcome:
bluetoothd[878]: profiles/audio/a2dp.c:load_remote_sep() Unable to load LastUsed: rseid 8 not foundCorrelating this with WirePlumber's own D-Bus registrations shows the sender ID for the A2DP media endpoints changing on every single reconnect:
bluetoothd[878]: Endpoint unregistered: sender=:1.387 path=/MediaEndpoint/A2DPSink/aptx_hd
...
bluetoothd[878]: Endpoint registered: sender=:1.396 path=/MediaEndpoint/A2DPSink/aptx_hd
...
(later, after another reconnect)
bluetoothd[878]: Endpoint unregistered: sender=:1.396 path=/MediaEndpoint/A2DPSink/aptx_hd
bluetoothd[878]: Endpoint registered: sender=:1.418 path=/MediaEndpoint/A2DPSink/aptx_hdFull capture of one failure sequence, triggered by the UI Bluetooth toggle (hard rfkill cycle):
Sep 05 21:53:21 omarchy rfkill[549851]: block set for type bluetooth
Sep 05 21:53:26 omarchy systemd[1]: systemd-rfkill.service: Deactivated successfully.
Sep 05 21:53:27 omarchy rfkill[549964]: unblock set for type bluetooth
Sep 05 21:53:27 omarchy blueman-applet[1256]: blueman-applet WARNING PowerManager:186 on_adapter_property_changed: adapter powered on while in off state, turning bluetooth on
Sep 05 21:53:27 omarchy systemd[1]: Starting Bluetooth management mechanism...
Sep 05 21:53:27 omarchy systemd[1]: Started Bluetooth management mechanism.
Sep 05 21:53:32 omarchy bluetoothd[878]: profiles/audio/avdtp.c:avdtp_connect_cb() connect to 80:C3:BA:B8:06:72: Host is down (112)
Sep 05 21:53:34 omarchy bluetoothd[878]: profiles/deviceinfo/deviceinfo.c:read_pnpid_cb() Error reading PNP_ID: Invalid pdu length received
Sep 05 21:53:44 omarchy bluetoothd[878]: Device is already marked as connected
Sep 05 21:53:44 omarchy bluetoothd[878]: profiles/audio/a2dp.c:load_remote_sep() Unable to load LastUsed: rseid 8 not found
Sep 05 21:53:52 omarchy bluetoothd[878]: No matching connection for device
Sep 05 21:53:54 omarchy bluetoothd[878]: profiles/audio/a2dp.c:load_remote_sep() Unable to load LastUsed: rseid 8 not found
Sep 05 21:54:12 omarchy bluetoothd[878]: Endpoint unregistered: sender=:1.441 path=/MediaEndpoint/A2DPSink/aptx_hd
[... full endpoint unregister/reregister cycle, sender :1.441 -> :1.470 ...]
Sep 05 21:54:15 omarchy bluetoothd[878]: profiles/audio/a2dp.c:load_remote_sep() Unable to load LastUsed: rseid 8 not foundCard state captured immediately after, while Spotify was actively playing:
Card #167
Name: bluez_card.80_C3_BA_B8_06_72
...
api.bluez5.connection = "connected"
bluez5.profile = "off"
bluez5.auto-connect = "[ a2dp_sink a2dp_source ]"
...
Profiles:
a2dp-sink: High Fidelity Playback (A2DP Sink, codec aptX HD) (sinks: 1, sources: 0, priority: 133, available: yes)
Active Profile: a2dp-sinkSink state at the same time:
Sink #81
State: SUSPENDED
Name: bluez_output.80_C3_BA_B8_06_72.1
Description: SM5 PressWorkaround found
The only thing that reliably restored working audio:
bluetoothctl remove 80:C3:BA:B8:06:72
# put headset back into pairing mode
bluetoothctl
pair 80:C3:BA:B8:06:72
trust 80:C3:BA:B8:06:72
connect 80:C3:BA:B8:06:72
exit
systemctl --user restart wireplumberNote that even after a successful fresh pairing, wpctl status showed no bluez5 device at all until wireplumber was restarted a second time — WirePlumber did not pick up the newly re-paired device on its own.
Possibly related upstream issue
This looks closely related to pipewire#502 — "Unhandled dbus signals on bluez service in bluez5 plugin", which describes A2DP endpoints failing to re-register cleanly when BlueZ's D-Bus interfaces are removed/changed (originally reported in the context of hibernate/resume). The endpoint sender-ID churn observed here (:1.387 → :1.396 → :1.418 → :1.441 → :1.470, one new sender per reconnect) looks like the same class of failure, just triggered by ordinary reconnects rather than hibernation specifically.
Additional notes
api.bluez5.codeccorrectly reportsaptx_hdthroughout, so codec negotiation itself is not at fault.- The bug reproduces regardless of whether the reconnect is user-initiated (UI toggle, physical headset power button) or software-initiated (service restart), suggesting the issue is in how WirePlumber/BlueZ handle any teardown-and-reestablish of the A2DP transport, not one specific trigger.
View raw text
### System details
ASUS TUF Dash F15 FX516PR_FX516PR (1.6) 11th Gen Intel(R) Core(TM) i7-11376H (8) @ 4.86 GHz GeForce RTX 3070 Mobile / Max-Q Iris Xe Graphics Software: Omarchy 4.0.2-1 stable Linux 7.1.9-archl-2 Hyprland 0.56.2 (Wayland) ghostty 1.3.1-arch2 1042 (pacman)
### What's wrong?
# Bluetooth A2DP sink silently stuck at `bluez5.profile = "off"` after reconnect, despite `Active Profile: a2dp-sink` and `connection: connected`
## Summary
After a Bluetooth headset reconnects (via a UI Bluetooth toggle, a `pipewire`/`wireplumber` service restart, or the headset's own power cycle), the resulting PipeWire sink often looks completely healthy on the surface — it's listed, marked default, reports `api.bluez5.connection = "connected"`, and even correctly negotiates the last-used codec (`aptx_hd` in this case) — but no audio ever plays. Streams routed to the sink get stuck in `[init]` and never reach `[running]`.
The underlying cause appears to be that the card's `bluez5.profile` property gets stuck at `"off"` while the card's `Active Profile:` label simultaneously reports `a2dp-sink`. These two values disagree and stay disagreeing — restarting `pipewire`/`pipewire-pulse`/`wireplumber`, or manually forcing `pactl set-card-profile <card> off` then `a2dp-sink`, does not resolve the mismatch. The only fix found so far is fully removing the Bluetooth device pairing (`bluetoothctl remove <MAC>`), re-pairing from scratch, and then restarting `wireplumber` again afterward (WirePlumber does not reliably notice the freshly re-paired device on its own).
## Environment
- Distro: Omarchy (Arch-based, Hyprland)
- `pipewire`: 1.6.8-1
- `pipewire-pulse`: 1.6.8-1
- `pipewire-alsa`: 1.6.8-1
- `pipewire-audio`: 1.6.8-1
- `wireplumber`: 0.5.15-1
- `bluez`: 5.87-2
- `bluez-utils`: 5.87-2
- Headset: Sennheiser MOMENTUM 5 Wireless (Bluetooth 5.4, codecs SBC / AAC / aptX / aptX HD / aptX Adaptive)
- Device MAC: `80:C3:BA:B8:06:72`
## Steps to reproduce
Any of the following reliably trigger the issue:
1. Toggle Bluetooth off/on via the desktop's quick-settings UI while the headset is connected (this performs a hard `rfkill block` / `rfkill unblock` cycle, not a soft radio toggle).
2. Restart the audio user services (`systemctl --user restart pipewire pipewire-pulse wireplumber`) while a Bluetooth sink is the active output.
3. Power-cycle the headset itself via its physical power button.
After any of the above, check the card state:
```
pactl list cards | grep -A 30 "bluez_card.<MAC_with_underscores>"
```
## Expected behavior
`bluez5.profile` should match `Active Profile:` and the sink should transition to `RUNNING` when a stream is pushed to it.
## Actual behavior
```
bluez5.profile = "off"
...
Active Profile: a2dp-sink
```
Sink stays `SUSPENDED` even when a client (e.g. Spotify) is actively pushing audio and the stream link shows `[init]` rather than `[running]`. No sound is produced. This persists across:
- `systemctl --user restart pipewire pipewire-pulse wireplumber`
- `pactl set-card-profile <card> off` followed by `pactl set-card-profile <card> a2dp-sink` (profile briefly reports as requested but reverts / never actually flips `bluez5.profile`)
- `pactl suspend-sink <sink> 0`
## Relevant logs
Every reconnect (successful or not) logs this from `bluetoothd`, regardless of outcome:
```
bluetoothd[878]: profiles/audio/a2dp.c:load_remote_sep() Unable to load LastUsed: rseid 8 not found
```
Correlating this with WirePlumber's own D-Bus registrations shows the sender ID for the A2DP media endpoints changing on every single reconnect:
```
bluetoothd[878]: Endpoint unregistered: sender=:1.387 path=/MediaEndpoint/A2DPSink/aptx_hd
...
bluetoothd[878]: Endpoint registered: sender=:1.396 path=/MediaEndpoint/A2DPSink/aptx_hd
...
(later, after another reconnect)
bluetoothd[878]: Endpoint unregistered: sender=:1.396 path=/MediaEndpoint/A2DPSink/aptx_hd
bluetoothd[878]: Endpoint registered: sender=:1.418 path=/MediaEndpoint/A2DPSink/aptx_hd
```
Full capture of one failure sequence, triggered by the UI Bluetooth toggle (hard rfkill cycle):
```
Sep 05 21:53:21 omarchy rfkill[549851]: block set for type bluetooth
Sep 05 21:53:26 omarchy systemd[1]: systemd-rfkill.service: Deactivated successfully.
Sep 05 21:53:27 omarchy rfkill[549964]: unblock set for type bluetooth
Sep 05 21:53:27 omarchy blueman-applet[1256]: blueman-applet WARNING PowerManager:186 on_adapter_property_changed: adapter powered on while in off state, turning bluetooth on
Sep 05 21:53:27 omarchy systemd[1]: Starting Bluetooth management mechanism...
Sep 05 21:53:27 omarchy systemd[1]: Started Bluetooth management mechanism.
Sep 05 21:53:32 omarchy bluetoothd[878]: profiles/audio/avdtp.c:avdtp_connect_cb() connect to 80:C3:BA:B8:06:72: Host is down (112)
Sep 05 21:53:34 omarchy bluetoothd[878]: profiles/deviceinfo/deviceinfo.c:read_pnpid_cb() Error reading PNP_ID: Invalid pdu length received
Sep 05 21:53:44 omarchy bluetoothd[878]: Device is already marked as connected
Sep 05 21:53:44 omarchy bluetoothd[878]: profiles/audio/a2dp.c:load_remote_sep() Unable to load LastUsed: rseid 8 not found
Sep 05 21:53:52 omarchy bluetoothd[878]: No matching connection for device
Sep 05 21:53:54 omarchy bluetoothd[878]: profiles/audio/a2dp.c:load_remote_sep() Unable to load LastUsed: rseid 8 not found
Sep 05 21:54:12 omarchy bluetoothd[878]: Endpoint unregistered: sender=:1.441 path=/MediaEndpoint/A2DPSink/aptx_hd
[... full endpoint unregister/reregister cycle, sender :1.441 -> :1.470 ...]
Sep 05 21:54:15 omarchy bluetoothd[878]: profiles/audio/a2dp.c:load_remote_sep() Unable to load LastUsed: rseid 8 not found
```
Card state captured immediately after, while Spotify was actively playing:
```
Card #167
Name: bluez_card.80_C3_BA_B8_06_72
...
api.bluez5.connection = "connected"
bluez5.profile = "off"
bluez5.auto-connect = "[ a2dp_sink a2dp_source ]"
...
Profiles:
a2dp-sink: High Fidelity Playback (A2DP Sink, codec aptX HD) (sinks: 1, sources: 0, priority: 133, available: yes)
Active Profile: a2dp-sink
```
Sink state at the same time:
```
Sink #81
State: SUSPENDED
Name: bluez_output.80_C3_BA_B8_06_72.1
Description: SM5 Press
```
## Workaround found
The only thing that reliably restored working audio:
```
bluetoothctl remove 80:C3:BA:B8:06:72
# put headset back into pairing mode
bluetoothctl
pair 80:C3:BA:B8:06:72
trust 80:C3:BA:B8:06:72
connect 80:C3:BA:B8:06:72
exit
systemctl --user restart wireplumber
```
Note that even after a successful fresh pairing, `wpctl status` showed *no* `bluez5` device at all until `wireplumber` was restarted a second time — WirePlumber did not pick up the newly re-paired device on its own.
## Possibly related upstream issue
This looks closely related to [pipewire#502 — "Unhandled dbus signals on bluez service in bluez5 plugin"](https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/502), which describes A2DP endpoints failing to re-register cleanly when BlueZ's D-Bus interfaces are removed/changed (originally reported in the context of hibernate/resume). The endpoint sender-ID churn observed here (`:1.387` → `:1.396` → `:1.418` → `:1.441` → `:1.470`, one new sender per reconnect) looks like the same class of failure, just triggered by ordinary reconnects rather than hibernation specifically.
## Additional notes
- `api.bluez5.codec` correctly reports `aptx_hd` throughout, so codec negotiation itself is not at fault.
- The bug reproduces regardless of whether the reconnect is user-initiated (UI toggle, physical headset power button) or software-initiated (service restart), suggesting the issue is in how WirePlumber/BlueZ handle *any* teardown-and-reestablish of the A2DP transport, not one specific trigger.
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.
- Out of scopeDecided by agents · verified · 2026-10-09 10:53 UTC