fix(niri): ultrawide pinned to a 240 Hz mode the EDID never offered -> silent 60 Hz fallback #59

Merged
dank merged 1 commits from fix/58-niri-edid-mode-fallback into main 2026-10-21 00:07:12 -07:00
Owner

Closes #58.

What changed

One behavioural fix plus the documentation that caused it.

dotfiles/zz-blankpad/niri/.config/niri/cfg/desk-1-home.kdl

  • Sceptre M34 identity block: mode "3440x1440@239.999" -> "3440x1440@180.000". The panel's EDID has no 240 Hz mode; 180 is its maximum, read live from niri msg outputs.
  • Leftover connector-keyed DP-1 block: 120 -> 180, so a reconnect that comes back connector-named instead of EDID-named cannot drop the panel to 120 Hz.
  • Four comment lines above the block recording where 180 comes from and what a phantom mode costs, so nobody "restores 240".

omp-docs/tools/niri/displays.md — the page that owned the wrong number

  • 239.999 -> 180.000 in the rig diagram, the panel table and the copy-paste pattern block.
  • Rule 4 rewritten. It claimed an impossible mode "leaves the output dark". It does not: niri logs could not be found, falling back to preferred and runs the EDID preferred mode — 60 Hz — silently, and repeats the fallback on every connector event. That is the whole reason the panel looked like hardware failure.
  • New section "The monitors are broken" — three layers, three signatures: config / DP link / amdgpu driver, each with its log signature, the three probes in order, and the safe live remedy (niri msg output <panel> mode <mode>).
  • Probe paragraph: wlr-randr corrected to not installed (pacman -Qs wlr matches nothing); documents the temporary per-output interface.
  • Note under rule 1 recording that desk-1-home.kdl still carries legacy connector-keyed blocks — aligned, but they belong folded into the identity block.

omp-docs/tools/applications.md, omp-docs/tools/cachyos.md — deleted the wlr-randr rows. Both claimed installed software that does not exist on this box.

omp-docs/log.md — dated entry: the laws (impossible mode falls back rather than fails; three layers three signatures; a number in a page is a claim, not a measurement), with the fix and link to the concept page.

Verification

  • niri validate against the live config chain (cfg/display.kdl -> desk-1-home.kdl): config is valid.
  • Applied to the running session without a config reload: niri msg output "Sceptre Tech Inc Sceptre M34 Unknown" mode "3440x1440@180.000" -> Current mode: 3440x1440 @ 180.000 Hz, compositor PID unchanged, no logout, zero new Page flip / DMCUB log lines in the minute following.
  • Branch dotfile is byte-identical to the live file (cmp clean), so the deployment and the repo cannot disagree when this merges. If live-sync.sh commits the dirty dotfile first, the merge is still clean: identical content on both sides.
  • scripts/kb-lint.sh -> 0 violation(s); scripts/kb-coverage.py omp-docs -> index-coverage: 0 issue(s); LC_ALL=C bats tests/ -> 117/117 ok, exit 0.

Left alone, deliberately

  • Tonight's connector drops and the post-s2idle DMCUB error are driver/link state, not this file: reboot when Frank schedules it, cable if the drops survive the reboot. The new section tells the two apart.
  • tools/noctalia-shell.md lists wlr-randr among noctalia's dependencies. That is a dependency claim, not an inventory claim, and whether noctalia actually needs it (and is therefore missing a dependency right now) deserves its own check.
  • The legacy connector-keyed blocks are aligned, not deleted — deleting them changes which panel gets which mode at another desk, and Frank chose the refresh-rate fix only.

cwd: /home/blank/.omp/wt/wt-20261019-125509-7c8a99d · session: 01a155bb-6474-7366-be9d-629f74af0e05

Closes #58. ## What changed One behavioural fix plus the documentation that caused it. **`dotfiles/zz-blankpad/niri/.config/niri/cfg/desk-1-home.kdl`** - Sceptre M34 identity block: `mode "3440x1440@239.999"` -> `"3440x1440@180.000"`. The panel's EDID has no 240 Hz mode; 180 is its maximum, read live from `niri msg outputs`. - Leftover connector-keyed `DP-1` block: 120 -> 180, so a reconnect that comes back connector-named instead of EDID-named cannot drop the panel to 120 Hz. - Four comment lines above the block recording where 180 comes from and what a phantom mode costs, so nobody "restores 240". **`omp-docs/tools/niri/displays.md`** — the page that owned the wrong number - 239.999 -> 180.000 in the rig diagram, the panel table and the copy-paste pattern block. - Rule 4 rewritten. It claimed an impossible mode "leaves the output dark". It does not: niri logs `could not be found, falling back to preferred` and runs the EDID preferred mode — 60 Hz — silently, and repeats the fallback on every connector event. That is the whole reason the panel looked like hardware failure. - New section *"The monitors are broken" — three layers, three signatures*: config / DP link / amdgpu driver, each with its log signature, the three probes in order, and the safe live remedy (`niri msg output <panel> mode <mode>`). - Probe paragraph: `wlr-randr` corrected to **not installed** (`pacman -Qs wlr` matches nothing); documents the temporary per-output interface. - Note under rule 1 recording that `desk-1-home.kdl` still carries legacy connector-keyed blocks — aligned, but they belong folded into the identity block. **`omp-docs/tools/applications.md`, `omp-docs/tools/cachyos.md`** — deleted the `wlr-randr` rows. Both claimed installed software that does not exist on this box. **`omp-docs/log.md`** — dated entry: the laws (impossible mode falls back rather than fails; three layers three signatures; a number in a page is a claim, not a measurement), with the fix and link to the concept page. ## Verification - `niri validate` against the live config chain (`cfg/display.kdl` -> `desk-1-home.kdl`): `config is valid`. - Applied to the running session without a config reload: `niri msg output "Sceptre Tech Inc Sceptre M34 Unknown" mode "3440x1440@180.000"` -> `Current mode: 3440x1440 @ 180.000 Hz`, compositor PID unchanged, no logout, zero new `Page flip` / `DMCUB` log lines in the minute following. - Branch dotfile is byte-identical to the live file (`cmp` clean), so the deployment and the repo cannot disagree when this merges. If `live-sync.sh` commits the dirty dotfile first, the merge is still clean: identical content on both sides. - `scripts/kb-lint.sh` -> `0 violation(s)`; `scripts/kb-coverage.py omp-docs` -> `index-coverage: 0 issue(s)`; `LC_ALL=C bats tests/` -> 117/117 ok, exit 0. ## Left alone, deliberately - Tonight's connector drops and the post-s2idle `DMCUB` error are driver/link state, not this file: reboot when Frank schedules it, cable if the drops survive the reboot. The new section tells the two apart. - `tools/noctalia-shell.md` lists `wlr-randr` among noctalia's dependencies. That is a dependency claim, not an inventory claim, and whether noctalia actually needs it (and is therefore missing a dependency right now) deserves its own check. - The legacy connector-keyed blocks are aligned, not deleted — deleting them changes which panel gets which mode at another desk, and Frank chose the refresh-rate fix only. --- cwd: /home/blank/.omp/wt/wt-20261019-125509-7c8a99d · session: 01a155bb-6474-7366-be9d-629f74af0e05
dank added 1 commit 2026-10-21 00:05:43 -07:00
desk-1-home.kdl asked the Sceptre M34 for 3440x1440@239.999, a mode the panel
has never offered. niri does not reject an unavailable mode: it logs "configured
mode ... could not be found, falling back to preferred" and drives the EDID
preferred mode - 60 Hz - on every connector event, which is why the monitor
looked like it was dying rather than misconfigured. Read live with
`niri msg outputs`, the mode list tops out at 180.

Also destroys the copies of the phantom number: displays.md carried 239.999 in
its diagram, its panel table and its copy-paste pattern block, and its rule 4
claimed an impossible mode leaves the output dark. Rule 4 now states the real
failure mode, a new section separates config / DP-link / amdgpu-driver faults by
log signature, and wlr-randr is corrected to not-installed (three pages claimed
it; `pacman -Qs wlr` matches nothing).

Applied live with `niri msg output <panel> mode <mode>` - the temporary
per-output path, so no config reload and no logged-out session - verified at
3440x1440 @ 180.000 Hz with the compositor PID unchanged.

Refs #58
dank merged commit 97b65067b1 into main 2026-10-21 00:07:12 -07:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: dank/command-center#59