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.
Brightness: a monitor found by ddcutil detect but with no readable brightness is rescanned on every open, blanking it
Reported by dotnetemmanuel · filed Aug 14, 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
What happens
I have three screens: a laptop panel (eDP-1), a Samsung U32R59x on the HDMI port (HDMI-A-1), and a Lenovo T25d in portrait driven from a laptop USB-C port into the monitor HDMI input, over a USB-C to HDMI cable. DRM and Hyprland name that third one DP-1, since the USB-C side is DisplayPort alt mode.
Every time I open the display module in the bar, or run omarchy brightness display --monitor DP-1, the Lenovo goes completely black for two to three seconds and then comes back on its own. Nothing is changed on it: something in that chain, the monitor or the converter in the cable, drops the signal and re-trains the link when it is probed.
It happens on every single open, not only the first one.
A side effect: the blanking looks like an unplug and replug, so omarchy-hyprland-monitor-clamshell fires twice right after each time.
Why
omarchy-brightness-display-ddc caches the I2C bus per connector in $XDG_RUNTIME_DIR/omarchy-brightness-display-ddc/<connector>.bus, so that the expensive ddcutil --skip-ddc-checks detect --brief (which walks every attached display's control channel) only runs when the bus is not known yet.
There is an "unavailable" negative cache with a 60 second window, but it is only written when detect_bus finds nothing at all:
bus="$(detect_bus)" || return 1
if [[ ! $bus =~ ^[0-9]+$ ]]; then
cache_unavailable
return 1
fiThe Lenovo is not that case. It is found by detect, so a bus number is cached, and then it does not answer the brightness read. That path deletes the cache file instead of remembering the failure:
bus="$(find_bus)" || return 1
values="$(read_vcp "$bus")" || {
rm -f "$cache_file"
return 1
}So nothing is remembered, and the next open runs the full detect scan again, which disturbs the monitor again. A screen that is visible to DDC but has no readable brightness gets rescanned forever.
For contrast, the Samsung works fine and keeps its cache entry (4 100 <timestamp>), so it is only the monitor without readable brightness that pays this, repeatedly.
Expected
A monitor that has been found once to have no readable DDC brightness should be remembered as unavailable, the same as one that is not found at all, so it is probed once rather than on every open.
Steps to reproduce
- Attach a monitor that answers
ddcutil detectbut notgetvcp 10. - Open the display module in the bar, or run
omarchy brightness display --monitor <that connector>. - The monitor blanks and re-syncs. Repeat and it blanks again every time.
ls $XDG_RUNTIME_DIR/omarchy-brightness-display-ddc/shows no entry for that connector, so the next call rescans.
Possible fix
In read_brightness, call cache_unavailable instead of rm -f "$cache_file" when read_vcp fails, or keep the detected bus and record that VCP 10 is unsupported on it. Either way the full detect scan stops running on every open.
System
- Omarchy 4.0.0rc4-1 (rc / edge)
- Hyprland v0.56.2, kernel 7.1.8-arch1-3
- AMD Radeon 880M/890M (Strix), amdgpu
- ddcutil 2.2.7
- Affected monitor: Lenovo LEN T25d-10, portrait, laptop USB-C to monitor HDMI input, named DP-1
- Working monitor: Samsung U32R59x on the laptop HDMI port, named HDMI-A-1
I also tried the ddcutil-side workaround of excluding just that model with --ignore-mmid in ~/.config/ddcutil/ddcutilrc, but I could not get ddcutil 2.2.7 to accept the syntax for a model name containing a space, so that route did not help.
View raw text
## What happens
I have three screens: a laptop panel (eDP-1), a Samsung U32R59x on the HDMI port (HDMI-A-1), and a Lenovo T25d in portrait driven from a laptop USB-C port into the monitor HDMI input, over a USB-C to HDMI cable. DRM and Hyprland name that third one DP-1, since the USB-C side is DisplayPort alt mode.
Every time I open the display module in the bar, or run `omarchy brightness display --monitor DP-1`, the Lenovo goes completely black for two to three seconds and then comes back on its own. Nothing is changed on it: something in that chain, the monitor or the converter in the cable, drops the signal and re-trains the link when it is probed.
It happens on every single open, not only the first one.
A side effect: the blanking looks like an unplug and replug, so `omarchy-hyprland-monitor-clamshell` fires twice right after each time.
## Why
`omarchy-brightness-display-ddc` caches the I2C bus per connector in `$XDG_RUNTIME_DIR/omarchy-brightness-display-ddc/<connector>.bus`, so that the expensive `ddcutil --skip-ddc-checks detect --brief` (which walks every attached display's control channel) only runs when the bus is not known yet.
There is an "unavailable" negative cache with a 60 second window, but it is only written when `detect_bus` finds nothing at all:
```bash
bus="$(detect_bus)" || return 1
if [[ ! $bus =~ ^[0-9]+$ ]]; then
cache_unavailable
return 1
fi
```
The Lenovo is not that case. It is found by `detect`, so a bus number is cached, and then it does not answer the brightness read. That path deletes the cache file instead of remembering the failure:
```bash
bus="$(find_bus)" || return 1
values="$(read_vcp "$bus")" || {
rm -f "$cache_file"
return 1
}
```
So nothing is remembered, and the next open runs the full `detect` scan again, which disturbs the monitor again. A screen that is visible to DDC but has no readable brightness gets rescanned forever.
For contrast, the Samsung works fine and keeps its cache entry (`4 100 <timestamp>`), so it is only the monitor without readable brightness that pays this, repeatedly.
## Expected
A monitor that has been found once to have no readable DDC brightness should be remembered as unavailable, the same as one that is not found at all, so it is probed once rather than on every open.
## Steps to reproduce
1. Attach a monitor that answers `ddcutil detect` but not `getvcp 10`.
2. Open the display module in the bar, or run `omarchy brightness display --monitor <that connector>`.
3. The monitor blanks and re-syncs. Repeat and it blanks again every time.
4. `ls $XDG_RUNTIME_DIR/omarchy-brightness-display-ddc/` shows no entry for that connector, so the next call rescans.
## Possible fix
In `read_brightness`, call `cache_unavailable` instead of `rm -f "$cache_file"` when `read_vcp` fails, or keep the detected bus and record that VCP 10 is unsupported on it. Either way the full `detect` scan stops running on every open.
## System
- Omarchy 4.0.0rc4-1 (rc / edge)
- Hyprland v0.56.2, kernel 7.1.8-arch1-3
- AMD Radeon 880M/890M (Strix), amdgpu
- ddcutil 2.2.7
- Affected monitor: Lenovo LEN T25d-10, portrait, laptop USB-C to monitor HDMI input, named DP-1
- Working monitor: Samsung U32R59x on the laptop HDMI port, named HDMI-A-1
I also tried the ddcutil-side workaround of excluding just that model with `--ignore-mmid` in `~/.config/ddcutil/ddcutilrc`, but I could not get ddcutil 2.2.7 to accept the syntax for a model name containing a space, so that route did not help.
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 04:03 UTC