fix(session): recover user services after a broken logout teardown
2026-07-18 dev-box incident: on a warm relogin (user manager kept alive by the tty1 greetd session — no linger involved) the previous logout's graphical-session.target stop had been rejected as a destructive transaction (easyeffects held a queued start job), so the target stayed active across the logout. Its WantedBy services (cliphist, swaync, xdg-desktop-portal-*, swayosd, …) crash-looped against the dead Wayland socket into start-limit-hit, and the next login's plain 'start hyprland-session.target' was a no-op — every session service stayed failed, doctor red, until a reboot. Session bring-up (HM's systemd.extraCommands, rendered into the first exec-once) now stops both hyprland-session.target and a possibly-stale graphical-session.target, clears failed/start-limit state with reset-failed, then starts fresh. All three commands are no-ops after a clean logout or cold boot. Verified V1: home generation built against this tree renders the new command chain into hyprland.conf line 1 (nix build of homeConfigurations.bernardo with the nomarchy input overridden). V3 pending: warm relogin on hardware — queued in HARDWARE-QUEUE with exact steps; BACKLOG #149 updated with the incident evidence (the exec-once posture it watches is defending against a real race). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -970,6 +970,24 @@ in
|
||||
# (Hyprland then boots into emergency mode with no binds).
|
||||
configType = "hyprlang";
|
||||
|
||||
# Session bring-up (HM renders these into the first exec-once, after
|
||||
# its dbus-update-activation-environment). The default is just
|
||||
# stop/start of hyprland-session.target — not enough after a broken
|
||||
# logout: if the graphical-session.target *stop* transaction was
|
||||
# rejected mid-teardown (seen 2026-07-18: "transaction is destructive"
|
||||
# while easyeffects had a queued start job), the target stays active
|
||||
# across the logout, its services crash-loop against the dead Wayland
|
||||
# socket into start-limit-hit, and the next login's plain `start` is a
|
||||
# no-op — cliphist/swaync/portals stay failed for the whole session
|
||||
# (doctor all red). So: tear the stale targets down, clear
|
||||
# failed/start-limit state, then start fresh. All three are no-ops
|
||||
# after a clean logout or cold boot.
|
||||
systemd.extraCommands = [
|
||||
"systemctl --user stop hyprland-session.target graphical-session.target"
|
||||
"systemctl --user reset-failed"
|
||||
"systemctl --user start hyprland-session.target"
|
||||
];
|
||||
|
||||
settings = {
|
||||
"$mod" = "SUPER";
|
||||
"$terminal" = config.nomarchy.terminal;
|
||||
|
||||
Reference in New Issue
Block a user