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-audio-output-sink fails to resolve through EasyEffects DSP sink — volume keys change nothing audible
Reported by hermeticvm · filed Oct 8, 2026Closed upstream on 2026-10-08 by its own reporter hermeticvm. GitHub close reason: completed. Closed by its own reporter — not by itself evidence of a fix.
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
omarchy-audio-output-sink fails to resolve through EasyEffects' virtual sink to the physical device, because EasyEffects feeds its output device through native PipeWire links, which never appear as PulseAudio sink-inputs. The resolver's only downstream detection (pactl list sink-inputs) finds nothing and falls back to the DSP sink itself (per its own fallback comment), so volume keys / audio panel change the DSP input volume: the OSD moves, loudness does not.
Environment
- Omarchy 4.0.4-1, Arch, Hyprland
- EasyEffects 8.2.9-1, PipeWire 1:1.6.8-1, WirePlumber 0.5.17-1
- Hardware: HONOR MagicBook Art 14 2024 (Core Ultra 7 155H, Meteor Lake)
- Default sink:
easyeffects_sink→ physicalalsa_output.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__Speaker__sink
Steps to reproduce
- Install EasyEffects, enable any effect chain, let it own the output (default sink becomes
easyeffects_sink). - Play audio (e.g. a YouTube video).
- Press the volume keys (bound to
omarchy-audio-output-volume raise|lower, which callsomarchy-audio-output-sink).
What happens
- OSD shows a percentage that steps ±5.
pactl get-sink-volume easyeffects_sinkchanges; the physical speaker sink volume does not.- Loudness is unchanged — captured the Speaker monitor while toggling the DSP sink between 40% and 90%: RMS bit-identical, no observable signal change anywhere in the chain.
Root cause in omarchy-audio-output-sink: the downstream lookup only parses pactl list sink-inputs for a stream whose node.name starts with the virtual sink or whose application.name is "EasyEffects". During EasyEffects playback:
$ pactl list sink-inputs
Sink Input #6120
Sink: 6004 # the playing app -> easyeffects_sink
application.name = "Brave"The app's stream into easyeffects_sink is the only sink-input. EasyEffects → physical device is connected via native PipeWire links (visible in pw-cli ls Link / pw-dump: easyeffects_sink (node 146) → EE chain nodes → alsa_output...HiFi__Speaker__sink (node 58)) — invisible to pactl list sink-inputs. So downstream stays empty and the script hits its fallback: "Nothing resolvable downstream — fall back to the sink itself."
What I expected
The resolver to find alsa_output...HiFi__Speaker__sink and the keys to move real loudness — the behavior its header documents ("Resolve through it to the physical sink it feeds").
Suggested fix
Resolve the downstream via the PipeWire graph instead of pulse sink-inputs: from the default sink's node, BFS pw-dump link objects (link.output.node → link.input.node) downstream until reaching a node named alsa_output.*. Links exist whenever audio flows through the chain. (For idle keypresses with links torn down, caching the last resolved physical sink — or falling back to the sole non-HDMI alsa_output.* — covers it.)
I implemented this as a user-side wrapper (~/.local/bin/omarchy-user-audio-volume + keybind overrides in ~/.config/hypr/bindings.lua) rather than patching /usr/share, per Omarchy policy. Measured: Speaker volume steps 70→75→70 with EE sink untouched, and toggling the Speaker gain scales the monitored output as expected. Happy to turn it into a PR against omarchy-audio-output-sink if the approach sounds right.
Diagnostics
omarchy-debug --no-sudo --print log: https://logs.omarchy.org/mszh9c (auto-expires in 24 h).
Repro is purely config-level (EasyEffects default output) — no special hardware steps needed.
View raw text
# Summary
`omarchy-audio-output-sink` fails to resolve through EasyEffects' virtual sink to the physical device, because EasyEffects feeds its output device through **native PipeWire links**, which never appear as PulseAudio sink-inputs. The resolver's only downstream detection (`pactl list sink-inputs`) finds nothing and falls back to the DSP sink itself (per its own fallback comment), so volume keys / audio panel change the DSP input volume: the OSD moves, loudness does not.
# Environment
- Omarchy 4.0.4-1, Arch, Hyprland
- EasyEffects 8.2.9-1, PipeWire 1:1.6.8-1, WirePlumber 0.5.17-1
- Hardware: HONOR MagicBook Art 14 2024 (Core Ultra 7 155H, Meteor Lake)
- Default sink: `easyeffects_sink` → physical `alsa_output.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__Speaker__sink`
# Steps to reproduce
1. Install EasyEffects, enable any effect chain, let it own the output (default sink becomes `easyeffects_sink`).
2. Play audio (e.g. a YouTube video).
3. Press the volume keys (bound to `omarchy-audio-output-volume raise|lower`, which calls `omarchy-audio-output-sink`).
# What happens
- OSD shows a percentage that steps ±5.
- `pactl get-sink-volume easyeffects_sink` changes; the physical speaker sink volume does not.
- Loudness is unchanged — captured the Speaker monitor while toggling the DSP sink between 40% and 90%: RMS bit-identical, no observable signal change anywhere in the chain.
Root cause in `omarchy-audio-output-sink`: the downstream lookup only parses `pactl list sink-inputs` for a stream whose `node.name` starts with the virtual sink or whose `application.name` is "EasyEffects". During EasyEffects playback:
```
$ pactl list sink-inputs
Sink Input #6120
Sink: 6004 # the playing app -> easyeffects_sink
application.name = "Brave"
```
The app's stream into `easyeffects_sink` is the only sink-input. EasyEffects → physical device is connected via native PipeWire links (visible in `pw-cli ls Link` / `pw-dump`: `easyeffects_sink` (node 146) → EE chain nodes → `alsa_output...HiFi__Speaker__sink` (node 58)) — invisible to `pactl list sink-inputs`. So `downstream` stays empty and the script hits its fallback: "Nothing resolvable downstream — fall back to the sink itself."
# What I expected
The resolver to find `alsa_output...HiFi__Speaker__sink` and the keys to move real loudness — the behavior its header documents ("Resolve through it to the physical sink it feeds").
# Suggested fix
Resolve the downstream via the PipeWire graph instead of pulse sink-inputs: from the default sink's node, BFS `pw-dump` link objects (`link.output.node` → `link.input.node`) downstream until reaching a node named `alsa_output.*`. Links exist whenever audio flows through the chain. (For idle keypresses with links torn down, caching the last resolved physical sink — or falling back to the sole non-HDMI `alsa_output.*` — covers it.)
I implemented this as a user-side wrapper (`~/.local/bin/omarchy-user-audio-volume` + keybind overrides in `~/.config/hypr/bindings.lua`) rather than patching /usr/share, per Omarchy policy. Measured: Speaker volume steps 70→75→70 with EE sink untouched, and toggling the Speaker gain scales the monitored output as expected. Happy to turn it into a PR against `omarchy-audio-output-sink` if the approach sounds right.
# Diagnostics
`omarchy-debug --no-sudo --print` log: https://logs.omarchy.org/mszh9c (auto-expires in 24 h).
Repro is purely config-level (EasyEffects default output) — no special hardware steps needed.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.