fix(idle): #127 — input wakes the screen compositor-side; revert the clamshell skip
All checks were successful
Check / eval (push) Successful in 3m33s
All checks were successful
Check / eval (push) Successful in 3m33s
The idle brick was never DPMS. Hyprland ships misc:key_press_enables_dpms
and misc:mouse_move_enables_dpms OFF, so hypridle's on-resume was the ONLY
caller of `dpms on` in the session — an idle daemon with the display held
hostage behind it. hypridle then deadlocks on an unfixed upstream bug
(hyprwm/hypridle#171, "Disconnected from pollfd id 1", open since 2025-09,
absent from 0.1.7 and main) and hangs WITHOUT exiting, so Restart=always
never fires and systemd still reports it active (running). Blank + deadlock
= a black seat no keypress can escape. That was the brick: two mundane bugs,
not one exotic DRM state. 19 disconnects in 11 days on the dev box, incl.
the incident day; the compositor is healthy through all of them.
Both options on, so the wake lives in the compositor where no daemon can
lose it — a dead hypridle now costs auto-lock, not the machine. The #127
clamshell DPMS-off skip (060bf52) is therefore reverted: idle blanks again
in every dock/lid state, and the 27" panels stop being held lit all night
under a static lock screen. #135 (an option to opt back in) is retired
unbuilt — there is nothing left to opt into.
TEST B's first run was invalid and nearly bought the wrong answer: it ran
`hyprctl dispatch dpms off` by hand, which no wake path watches, so "input
did not wake it" was guaranteed on any hardware. The undocked control
returning the SAME result — where the theory demanded a difference — is what
exposed it. Driven through hypridle instead, input wakes it in all three
configurations, including clamshell-docked on the sole live output.
Filed from the diagnosis: #146 (hypridle dies silently, systemd calls it
healthy — the surviving bug) and #147 (a re-login leaves session units dead;
graphical-session.target never re-enters, which is why Waybar already runs
from exec-once).
V3 on the incident hardware (AMD dev box, clamshell): hypridle deliberately
stopped, `dpms off` -> keypress woke it in 6s; the identical test before the
options stayed black the full 45s. V1: nix flake check, checks.option-docs,
checks.clamshell-logind, checks.docking-ux, checks.display-profiles; read the
emitted hyprland.conf/hypridle.conf rather than the source.
V3 pending: the fix is proven via runtime `hyprctl keyword`, not yet from our
own Nix — HARDWARE-QUEUE re-checks it after nomarchy-home + relogin.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -16,7 +16,7 @@ Run these first when you have a laptop session (AMD dev box unless noted):
|
||||
| # | Item | Why first |
|
||||
|---|------|-----------|
|
||||
| 1 | **#115** suspend-then-hibernate | Just shipped; quick path is minutes (battery vs AC + `nomarchy-suspend`) |
|
||||
| 2 | **#127** docked idle blackout | Real incident; capture path before it bit-rots |
|
||||
| 2 | **#127** fix from config (not runtime keyword) | Cause found + fixed 2026-07-16; confirm our Nix emits it and it survives a relogin |
|
||||
| 3 | **Docking recovery round 8** + headphone jack-follow | Same dock session; relogin once, then undock ×5 + jack |
|
||||
| 4 | **#104** airplane mode | Fast radio smoke after `nomarchy-home` |
|
||||
| 5 | **#101** charge-limit USB-C burst | Dock plug/unplug storm; pairs with #3 |
|
||||
@@ -49,36 +49,36 @@ Everything else below stays open; order is convenience, not a gate.
|
||||
restores **only** the radios that were on before. If Wi-Fi was already
|
||||
off, it must stay off after disengage. Glyph must **not** appear when
|
||||
airplane is off.
|
||||
- [ ] **#127 clamshell idle — TEST A, the mitigation holds (AMD dev box)** —
|
||||
**Context:** original brick = clamshell-docked idle → black, no input
|
||||
wake, undock no eDP, Caps Lock alive; Ctrl+Alt+F3 gave no usable TTY.
|
||||
**Shipped mitigation:** skip DPMS-off while clamshell (internal
|
||||
present-but-disabled); lock at 5m still.
|
||||
**After `nomarchy-home` + relogin:**
|
||||
1. Dock, **lid closed** (eDP in `hyprctl monitors all -j`, absent from
|
||||
`hyprctl monitors`).
|
||||
2. Leave it entirely alone past 10+ min.
|
||||
3. **Pass:** external still shows hyprlock (not black power-save);
|
||||
`journalctl --user -t nomarchy-idle --since '-20 min'` has
|
||||
`dpms-off skipped: clamshell`.
|
||||
4. Undocked control: eDP only → at 10 min it *does* blank; input wakes.
|
||||
Optional: `nomarchy-display-dump` / SUPER+SHIFT+D for other display faults.
|
||||
- [ ] **#127 TEST B — was DPMS-off the trigger at all? (AMD dev box)** —
|
||||
**This one outranks #135**: the mitigation is a cure for an *inferred*
|
||||
cause, and if the inference is wrong we are paying for it forever while
|
||||
the brick stays live. Bounded and self-recovering (there is no sshd on
|
||||
that box). Full protocol + how to read each outcome: **BACKLOG #127 §
|
||||
"The two tests, exactly"**. In short — docked, lid closed:
|
||||
```sh
|
||||
( sleep 45; hyprctl dispatch dpms on; hyprctl reload ) &
|
||||
hyprctl dispatch dpms off
|
||||
```
|
||||
then (1) try to wake it with input in the first ~40s, (2) let the 45s
|
||||
recovery run, (3) open the lid if still dark. **Input wakes it** → the
|
||||
mitigation is pointless, revert it and #135 never exists. **Dark until
|
||||
recovery** → mitigation confirmed, #135 is the opt-in. **Dark after
|
||||
recovery** → the brick, now reproducible on demand, which is the best
|
||||
outcome available.
|
||||
- [x] **#127 TESTS A + B — ANSWERED 2026-07-16 (AMD dev box), both closed.**
|
||||
TEST B ran and DPMS-off is **not** the trigger: with hypridle driving the
|
||||
blank, input woke it in all three configurations including clamshell-docked
|
||||
on the sole live output. The mitigation was reverted and #135 retired
|
||||
unbuilt, which also voids TEST A (its premise — the skip — no longer
|
||||
exists). Real cause: Hyprland's input→DPMS options ship off, so hypridle's
|
||||
`on-resume` was the only caller of `dpms on`, and hypridle deadlocks
|
||||
(hyprwm/hypridle#171) without exiting. Full record: ROADMAP § "#127
|
||||
solved"; the surviving bug is BACKLOG #146. **Method note worth keeping:**
|
||||
the *first* TEST B was invalid — it ran `dpms off` by hand, which no wake
|
||||
path watches, so its "input did not wake it" was guaranteed regardless of
|
||||
hardware. Drive the real code path or measure nothing.
|
||||
- [ ] **#127 fix from config, not a runtime keyword (AMD dev box)** —
|
||||
the fix was proven with `hyprctl keyword` (runtime-only); this checks our
|
||||
Nix actually emits it and that it survives a session. **After
|
||||
`nomarchy-home` + relogin:**
|
||||
1. `hyprctl getoption misc:key_press_enables_dpms` and
|
||||
`misc:mouse_move_enables_dpms` → both `int: 1` with **no** manual
|
||||
keyword set.
|
||||
2. Docked, **lid closed**, idle 10+ min → the external **blanks** (it no
|
||||
longer stays lit; that is the revert working).
|
||||
3. Press a key → it comes back. `journalctl --user -t
|
||||
nomarchy-display-wake --since '-15 min'` shows a `done enabled=…` line
|
||||
(hypridle's on-resume also ran).
|
||||
4. The one that matters — the brick condition on purpose:
|
||||
`systemctl --user stop hypridle`, then
|
||||
`( sleep 45; hyprctl dispatch dpms on ) &` and
|
||||
`hyprctl dispatch dpms off`. **Pass:** a keypress wakes it with
|
||||
hypridle stopped (it did in 6s on 2026-07-16 via runtime keyword).
|
||||
Then `systemctl --user start hypridle`.
|
||||
- [ ] **#96 battery-limit row on threshold-less firmware (Acer M5-481T)** —
|
||||
on the Acer (live or installed session with the commit carrying this
|
||||
entry): open System (`SUPER+CTRL+I`). **Pass:** a "Battery limit" row
|
||||
|
||||
Reference in New Issue
Block a user