docs: RETRACT the #127 cause — the diagnosis was a measurement artifact; fix stands
All checks were successful
Check / eval (push) Successful in 3m30s

The "blank + hypridle deadlock = the brick" cause published this morning is
retracted everywhere it was asserted: ROADMAP, hyprland.nix's comment, #146,
HARDWARE-QUEUE and two commit messages (a2151f4, 321ccf7). It rested on two
pieces of evidence and both were artifacts of how I measured:

- "19 disconnects in 11 days": 18 of 19 are hypridle's noisy goodbye while
  systemd DELIBERATELY stops it — each bracketed by `Stopped hypridle` /
  `Started hypridle`, healthy replacement seconds later.
- "Jul 14: CRITICAL at 13:08:17, then eleven hours of silence": an artifact of
  grepping ONE PID. systemd logged `Stopped hypridle` 13:08:17 and `Started
  hypridle` 13:09:00; PID 1678 ran fine all evening, invisible to the filter.

Decisive: at the incident (before the 12:51:34 mitigation commit) hypridle had
NO disconnect at all and had been healthy since Jul 14 13:09. It should have
fired on-resume normally. The deadlock theory never had a case.

The FIX stands on its own evidence and is untouched: the options really were
off, hypridle's on-resume really was the only caller of `dpms on`, and input now
wakes the screen with hypridle deliberately stopped (4s docked / 6s clamshell).
Removing a proven single point of failure never needed a story about why the
daemon might fail — which is exactly why it survived the story being wrong.

#127 is RESTORED to NOW (deleted this morning as "shipped"; only the fix
shipped). Its cause is open and the lead is the dead Ctrl+Alt+F3 — neither
DPMS-off nor a dead hypridle can break VT switching, so something was wedged
below the compositor holding DRM master. Every theory so far has been about the
wake path, i.e. a symptom of the screen already being black.

#146 → [watch], near-dead: one genuine zombie ever (verified by ps/ss, not
grep); upstream #171 is real but its impact path closed when #147's stray linger
went. Re-measure properly before building anything; close unbuilt if zero.

Also closes the #127 hardware-queue entry: Bernardo ran the real 10-min idle —
19:27:58 dpms off (genuine timeout, shipped config, and it BLANKED = the revert
working) -> mouse -> 19:32:14 `done enabled=1 first=DP-2`, clamshell, the
incident geometry, one healthy hypridle throughout. All 4 steps pass.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-16 19:39:27 +01:00
parent 90f0faf87b
commit bdc86d0f41
5 changed files with 214 additions and 83 deletions

View File

@@ -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** fix from config (not runtime keyword) | Cause found + fixed 2026-07-16; confirm our Nix emits it and it survives a relogin |
| 2 | **#127** the brick's *cause* (reopened) | Wake path fixed + fully verified 2026-07-16; cause unknown — start at the dead Ctrl+Alt+F3, not the wake path |
| 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 |
@@ -54,14 +54,17 @@ Everything else below stays open; order is convenience, not a gate.
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:**
exists). What that leaves: Hyprland's input→DPMS options ship off, so
hypridle's `on-resume` was the only caller of `dpms on` — a real single
point of failure, now removed. It is **not** known to be what bricked the
machine: the "hypridle deadlock" cause published on the day was retracted
the same day (hypridle had no disconnect at the incident). #127 is reopened
for its cause; ROADMAP § "#127's WAKE PATH fixed" is the full record.
**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 — steps 1+4 PASSED 2026-07-16, 2+3 open (AMD dev box)**
- [x] **#127 fix from config — ALL 4 STEPS PASSED 2026-07-16 (AMD dev box)**
— a2151f4 applied via `nomarchy-pull` + `nomarchy-home` on the dev box.
**Done, no need to redo:**
1. ✓ Both options read `int: 1` after `hyprctl reload` (which discards
@@ -83,16 +86,20 @@ Everything else below stays open; order is convenience, not a gate.
of anything: `/proc/acpi/button/lid/*/state` is, and it was never
checked. Docked-lid-open remains **untested** — moot now that the gate
is gone, but not tested. Do not read output lists as lid positions.
**Still open — needs real idle time, cannot be rushed:**
2. Docked, **lid closed**, idle 10+ min → the external **blanks**. This is
the revert working; nothing to date has watched a genuine 10-min
hypridle timeout fire, only forced blanks.
3. Then press a key → it returns, and `journalctl --user -t
nomarchy-display-wake --since '-15 min'` has a `done enabled=…` line
(i.e. hypridle's on-resume ran *as well as* the compositor waking it).
2+3. ✓ **The real idle path, no scaffolding** (Bernardo, 19:2219:32,
docked **lid closed**): `19:22:58 Executing pidof hyprlock || hyprlock`
(5 min) → `19:27:58 Executing hyprctl dispatch dpms off` — the genuine
10-min timeout firing from the shipped config, and it **blanked**, which
is the revert working → mouse move → `19:32:13 Resumed: … Executing
…/nomarchy-display-wake` → `19:32:14 done enabled=1 first=DP-2`.
`enabled=1 first=DP-2` = clamshell, the incident's exact geometry. One
healthy hypridle (PID 683145) throughout.
Note: step 1 used `hyprctl reload` rather than a full relogin — a reload
re-reads the same on-disk config a new session would, so the gap is
cosmetic, but a relogin has not literally been done.
**Entry closed. #127 itself is reopened for its CAUSE (see BACKLOG) —
the wake path is fixed and verified; what bricked the machine is not
known, and the dead Ctrl+Alt+F3 is the lead.**
- [ ] **#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