fix(display): #148 — enforce dock intent without the auto-profiles toggle
All checks were successful
Check / eval (push) Successful in 3m37s

Every nomarchy-home re-lit eDP-1 inside the shut lid: HM activation fires
hyprctl reload, the catch-all monitor rule re-enables the panel, and the
tick invariant built for exactly this (#142, enforce_dock_intent) never
fired — it was gated on settings.displayProfileAuto, the *named-profile*
auto-switch toggle, which is unrelated to dock intent and off unless
opted into. Confirmed live on the incident machine: dockMode=true,
displayProfileAuto unset, watcher journal empty — every tick returned at
that guard.

Fix: drop the auto_on gate. settings.display.dockMode alone is the
user's recorded intent (written by the menu and the dock transition);
the profile-active check remains as the real guard (a named profile
outranks the dock heuristic). No fight with the #142 undock hammer:
undock clears the intent before its rescue reload, so the enforcer
stands down by ordering.

tools/monitor-fallback.nix grows the reload-mid-dock scenario: fake lid
closed, hyprctl reload, panel re-disabled within ~4s, action=re-dock
logged — under displayProfileAuto's default false, i.e. the exact
condition the bug shipped under.

Verification: V2 — nix flake check --no-build green, checks.docking-ux
green, monitor-fallback harness green three times (implementer twice,
reviewer once, ~71s VM). V3 pending: relogin + nomarchy-home while
docked-clamshell (HARDWARE-QUEUE; the watcher is exec-once, the fix
arms at next login). Implementation by a Sonnet subagent; diagnosis,
design and review on Fable.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-17 07:48:05 +01:00
parent e324876eb7
commit 5479ade702
6 changed files with 78 additions and 34 deletions

View File

@@ -493,6 +493,22 @@ Design/decision records and a running log of shipped work (items marked
V2 by render, both heads + the password dialog, via the new
`tools/plymouth-preview.sh`. V3 (a real docked boot/shutdown) is queued: the
fake heads exist from the start, so the rig cannot resize a canvas.
- ✓ **Reload re-lit the panel inside a shut lid (#148, 2026-07-17):** every
`nomarchy-home` (HM activation → `hyprctl reload`) re-applied the catch-all
monitor rule and left eDP-1 burning in the closed clamshell. The #142 tick
invariant `enforce_dock_intent` was built for exactly this and never fired:
it was gated on `settings.displayProfileAuto` — the *named-profile*
auto-switch toggle, unrelated to dock intent and off for most users.
Confirmed on the incident machine: `dockMode=true`, `displayProfileAuto`
unset, watcher journal empty — every tick returned at that guard. Fix:
drop the gate; `dockMode` alone is the recorded intent, the profile-active
check stays as the real guard, and undock's ordering (intent cleared
*before* its rescue reload) keeps the enforcer from fighting the #142
hammer. V2: `tools/monitor-fallback.nix` grew a reload-mid-dock scenario —
fake lid closed → `hyprctl reload` → panel re-disabled in ~4s,
`action=re-dock` logged. V3 queued: real relogin + `nomarchy-home` while
docked-clamshell (the running watcher is exec-once, so the fix arms at the
next login).
- ✓ **Machine state the flake can't see (#147, 2026-07-17):** the QA box ran
six months with `Linger=yes` from a pre-migration marker in
`/var/lib/systemd/linger` — set by nothing in the repo, visible to no flake