- 31 new managed skills (anubis/arr/authentik/hermes/freetoken/podman/llm-swap runbooks etc.) now tracked. - Removed superseded skills: omp_harness_config, peon_ping_integration (replaced by user-authored peon-ping-* managed skills), rocmfp4-strix-benchmark-orchestration. - New memory-root skills: niri_compositor_ops, omp_git_workflow, omp_model_config, quadlet-media-migration, homelab-service-triage, hermes-dankclaw-ops, frank-default-large-ops, caddy-auth-dns-playbook.
2.4 KiB
2.4 KiB
name, description
| name | description |
|---|---|
| gui-hang-remote-diagnosis | Diagnose a frozen GUI/VT-switch failure over SSH by reading kernel hung-task evidence, decoding the lock-holder stack, and deciding recoverability |
GUI Hang Remote Diagnosis
Use when the desktop is frozen, VT switches do nothing, but SSH still works.
Sequence
- Find the smoking gun — kernel hung-task reporter already logged it:
Look for
journalctl -b -p err --since "-2 hours" --no-pager | tail -80INFO: task X blocked for more than N secondsandblocked on a semaphore likely last held by task Y:PID(modern kernels name the lock holder outright). - Get full stacks for victim and holder:
journalctl -b -k --since "<hang minute -5>" --no-pager | tail -120 cat /proc/<holder_pid>/status | head -5 # State: R (spinning) vs D (blocked) cat /proc/<victim_pid>/status | head -5- Victim
D+ holderR= livelock/deadlock with lock held. voluntary_ctxt_switchesin the millions on anRkthread = spinning, not progressing.
- Victim
- Prove whether hardware or software — GPU/CPU still alive? No Xid errors?
If those answer instantly with no Xid, it's a driver lock issue, not hardware.
nvidia-smi --query-gpu=driver_version,pstate,temperature.gpu,clocks_event_reasons.active --format=csv journalctl -b -k --no-pager | grep -i xid - Find the trigger window: block start = (first hung message timestamp − reported seconds). Then inspect user-session events:
journalctl -b --since "<start-2m>" --until "<start+1m>" --no-pager | grep -v audit - Enumerate collateral: any other
Dtasks (ps -eo pid,stat,comm | awk '$2 ~ /D/'), USB workers, etc.
Recoverability verdict
- Compositor in
Dstate → unkillable; spinning kernel thread holding the lock → cannot be poked. Only exit is reboot:sync && systemctl reboot --force --force(double-force skips stop-jobs that wait forever on D-state PIDs). - If holder is
D(sleeping on something that can complete, e.g. storage), recovery may be possible by clearing that dependency first.
After diagnosing
- Map stack symbols to driver internals to name the exact subsystem (e.g.
DifrPrefetchEventDeferredWork→ NVKMS DIFR prefetch). - Check upstream: search the exact symbol names + driver version; propose targeted off-switches (
NVreg_RegistryDwords, module params from/proc/driver/nvidia/params) rather than blanket driver swaps.