fix(docking): retry the undock; a lost keyword left the panel black
Some checks failed
Check / eval (push) Has been cancelled
Some checks failed
Check / eval (push) Has been cancelled
Round 6 passed on the plug side but unplugging the cable left the laptop
panel black until it was re-docked. The journal named it: across three
undocks, two logged result=enable-timeout and one result=ok — a race, not
a logic error.
Two halves, both needed:
- `hyprctl keyword monitor eDP-1,preferred,auto,1` is accepted (exit 0)
while Hyprland is still tearing down the departing external, then
silently dropped. Re-issue it on every poll for 5s and keep `monitors`
listing the panel — not hyprctl's exit code — as the only proof.
- The watcher fired the undock once off the removal event and marked the
departure handled regardless (`|| true` + awaiting_lid_open=1). Since
known_outputs had already moved, the set-changed guard never reopened
and nothing retried, so one lost keyword cost the panel until re-dock.
The undock is now a queued invariant driven on the 1s tick, bounded at
6 attempts so a genuinely unenableable panel can't pin the inhibitor.
The VM harness cannot reach this race: QEMU's headless backend aborts
Hyprland if the last active output is deleted while the DRM output is
disabled, so the test must undock before removing DP-1 and never collides
the two. Noted there, and V3 queued as round 7 — unplug 5+ times, since
the old failure only hit ~2 in 3.
Verified: V2 — nix flake check --no-build; monitor-fallback.nix exit 0 in
57s; shellcheck clean. The fix itself is V3 pending.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -19,6 +19,34 @@ Template:
|
||||
|
||||
---
|
||||
|
||||
## 2026-07-14 — docking round 6: undock left the laptop panel black (this commit)
|
||||
- **Task:** HARDWARE-QUEUE docking round 6 result (Bernardo, AMD dev box).
|
||||
Plug side all passed (auto-dock, audio to the monitor, wallpaper on the
|
||||
external); unplugging left the panel black until re-docked.
|
||||
- **Did:** Bernardo's journal was decisive — 3 undocks, 2×
|
||||
`result=enable-timeout` + 1× `result=ok`, so an intermittent race. Two
|
||||
fixes in modules/home/hyprland.nix: (1) the undock `hyprctl keyword monitor
|
||||
eDP-1,preferred,auto,1` exits 0 but is dropped when it lands mid-teardown
|
||||
of the departing external — now re-issued every poll for 5s, with
|
||||
`monitors` listing the panel as the only proof; (2) the watcher marked the
|
||||
departure handled via `"$TRANSITION" undock … || true` + `awaiting_lid_open=1`
|
||||
and `known_outputs` had already moved, so nothing ever retried — one lost
|
||||
keyword = a dark panel. The undock is now a queued invariant driven on the
|
||||
1s tick (6 attempts, then `result=gave-up`).
|
||||
- **Verified:** V2 — `nix flake check --no-build` all checks passed;
|
||||
`nix build --impure -f tools/monitor-fallback.nix` exit 0 in 57s (reaches
|
||||
the final `lid-open transition` checkpoint); shellcheck clean on both
|
||||
generated scripts (the lone SC2125 is pre-existing + intentional).
|
||||
**Honest limit:** the harness CANNOT reach this race — QEMU's headless
|
||||
backend aborts Hyprland if the last active output is deleted while the DRM
|
||||
output is disabled, so it must undock before removing DP-1 and never
|
||||
collides the two. The fix itself is **V3 pending**; comment added at
|
||||
tools/monitor-fallback.nix so a reader doesn't mistake a pass for coverage.
|
||||
- **Pending:** V3 → HARDWARE-QUEUE round 7 (unplug ≥5×; old failure was only
|
||||
~2 in 3). Round 5/6's keyboard-prompt + headphone-jack counts were never
|
||||
reported either way — split into their own entry, still unverified.
|
||||
- **Next suggestion:** wait on round 7 before touching the dock path again.
|
||||
|
||||
## 2026-07-13 — #99 live-seed git-init; theme-switch failure filed as #113 (this commit)
|
||||
- **Task:** BACKLOG #99 — false "theme-state.json NOT git-tracked" doctor/
|
||||
Waybar warning in the live session; resolve the held question from Fable.
|
||||
|
||||
Reference in New Issue
Block a user