fix(idle): #127 — input wakes the screen compositor-side; revert the clamshell skip
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:
2026-07-16 18:48:22 +01:00
parent c32b51897e
commit a2151f424b
7 changed files with 187 additions and 238 deletions

View File

@@ -19,6 +19,39 @@ Template:
---
## 2026-07-16 — #127 SOLVED: the brick was never DPMS, and TEST B's first run lied
- **Task:** #127 TEST B (Bernardo ran it), then the whole sweep his result forced.
- **Read this if nothing else — the test measured nothing, and said so.** His run
reported "input never wakes it" **docked *and* undocked alike**, and that tie is
the tell: the theory demanded those differ. It ran `dpms off` **by hand**, which
no wake path watches, so "input didn't wake it" was guaranteed on any hardware
in any dock state. Re-run *through* hypridle so `on-resume` is actually armed:
input woke it in all 3 configs, **including clamshell on the sole live output**
(`done enabled=1 first=DP-2`) — the incident's exact geometry. Put the mechanism
under test inside the circuit, or you are measuring your own scaffolding.
- **Real cause:** Hyprland ships `misc:{key_press,mouse_move}_enables_dpms` **off**,
so hypridle's `on-resume` was the ONLY caller of `dpms on` anywhere in the session
— and hypridle deadlocks (hyprwm/hypridle#171, open since 2025-09, in neither
0.1.7 nor main) **without exiting**, so `Restart=always` never fires and systemd
still reports it active. Blank + deadlock = a black seat no key escapes. **19× in
11 days** on his box, incl. the incident day. Two mundane bugs, not one exotic one.
- **Did:** both options on — structural: the wake moves into the compositor where no
daemon can lose it, so a dead hypridle costs auto-lock, not the machine. Reverted
the clamshell skip; **#135 retired unbuilt**; ROADMAP § "#127 solved"; filed #146
(hypridle mortality) + #147 (relogin leaves session units dead) → PROPOSED.
- **Verified: V3 on the incident hardware.** Clamshell, hypridle **deliberately
stopped** (brick condition on purpose), `dpms off` → keypress woke it in **6s**;
the identical test before the options stayed black the full 45s. V1: `flake check`
+ `option-docs`/`clamshell-logind`/`docking-ux`/`display-profiles` pass, and I read
the **emitted** configs, not the source (`key_press_enables_dpms=true`;
`on-timeout=hyprctl dispatch dpms off`, skip script gone).
- **Pending:** V3 — proven via runtime `hyprctl keyword`, NOT from our Nix yet;
HARDWARE-QUEUE entry re-checks after `nomarchy-home` + relogin. Ctrl+Alt+F3 dead
during the incident is still unexplained (upstream co-symptom, hypridle#145).
- **Next suggestion:** #147 before #146 — a guard that restarts hypridle into a dead
compositor just fail-loops into `start-limit-hit` exactly like cliphist does. Both
are PROPOSED; Bernardo triages.
## 2026-07-16 — #129/#130 buttons; #133; #132; branding; and a latch bug from TEST A
- **Task:** Bernardo triaged the queue (#136 settled, #130 decided, #143 → wait,
#120 → PROPOSED), then #133, #132, the codename drop, and #129+#130.