Fixed, deployed, started, and proven: Restart=always + StartLimitIntervalSec=0 + PartOf=graphical-session.target (d013795, PR #48), then kill -TERM on the live main PID produced NRestarts=1 with a new MainPID and active — the October event survived. Cause attributed to eight seconds (niri/noctalia started 16:22:31, swayidle exited 16:22:23), and the over-stated lid claim corrected in 5ab0a49 (PR #49): suspend was covered by noctalia's own sleep inhibitor; the idle lock is what was dead.
Two things deliberately not in scope here, tracked separately: the heartbeat liveness check is #50, and #40 stays open for the credential rotation.
Fixed, deployed, started, and proven: `Restart=always` + `StartLimitIntervalSec=0` + `PartOf=graphical-session.target` (`d013795`, PR #48), then `kill -TERM` on the live main PID produced `NRestarts=1` with a new `MainPID` and `active` — the October event survived. Cause attributed to eight seconds (niri/noctalia started `16:22:31`, swayidle exited `16:22:23`), and the over-stated lid claim corrected in `5ab0a49` (PR #49): suspend was covered by noctalia's own sleep inhibitor; the idle lock is what was dead.
Two things deliberately not in scope here, tracked separately: the heartbeat liveness check is **#50**, and `#40` stays open for the credential rotation.
---
cwd: /home/blank/.omp · session: 01a155bb-6474-7366-be9d-629f74af0e05
Correction after merge (measurement, not inference)
Two claims in this PR needed the follow-up in #49:
The trigger is attributed.niri and noctalia both started Mon Oct 12 16:22:31 2026; swayidle went inactive (dead) at 16:22:23. The compositor session restarted and took the watcher with it — which is exactly what PartOf=graphical-session.target addresses. The user journal had nothing for that window, so the evidence is process ages.
The lid claim was wrong.systemd-inhibit --list shows noctalia … sleep "Lock before sleep" delay: the shell locks on suspend independently of swayidle, so suspend was never unprotected. What was dead for eight days is the idle lock and after-resume. The method error — pgrep empty read as "no lock path", when a locker can be a hook inside a running shell — is now recorded in the docs with the instrument that catches it: systemd-inhibit --list.
Also documented: an omp agent session holds an idle inhibitor ("omp agent session" block), so swayidle logs Not enabling timeouts: idle inhibitor found and arms no idle timeout while an agent works.
The fix itself is unchanged and proven live: NRestarts=1 with a new MainPID after a deliberate SIGTERM.
## Correction after merge (measurement, not inference)
Two claims in this PR needed the follow-up in http://dankclaw:3000/dank/command-center/pulls/49:
1. **The trigger is attributed.** `niri` and `noctalia` both started `Mon Oct 12 16:22:31 2026`; swayidle went `inactive (dead)` at `16:22:23`. The compositor session restarted and took the watcher with it — which is exactly what `PartOf=graphical-session.target` addresses. The user journal had nothing for that window, so the evidence is process ages.
2. **The lid claim was wrong.** `systemd-inhibit --list` shows `noctalia … sleep "Lock before sleep" delay`: the shell locks on suspend independently of swayidle, so suspend was never unprotected. What was dead for eight days is the **idle** lock and `after-resume`. The method error — `pgrep` empty read as "no lock path", when a locker can be a hook inside a running shell — is now recorded in the docs with the instrument that catches it: `systemd-inhibit --list`.
Also documented: an `omp` agent session holds an `idle` inhibitor (`"omp agent session" block`), so swayidle logs `Not enabling timeouts: idle inhibitor found` and arms no idle timeout while an agent works.
The fix itself is unchanged and proven live: `NRestarts=1` with a new `MainPID` after a deliberate `SIGTERM`.
---
cwd: /home/blank/.omp · session: 01a155bb-6474-7366-be9d-629f74af0e05
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Fixed, deployed, started, and proven:
Restart=always+StartLimitIntervalSec=0+PartOf=graphical-session.target(d013795, PR #48), thenkill -TERMon the live main PID producedNRestarts=1with a newMainPIDandactive— the October event survived. Cause attributed to eight seconds (niri/noctalia started16:22:31, swayidle exited16:22:23), and the over-stated lid claim corrected in5ab0a49(PR #49): suspend was covered by noctalia's own sleep inhibitor; the idle lock is what was dead.Two things deliberately not in scope here, tracked separately: the heartbeat liveness check is #50, and
#40stays open for the credential rotation.cwd: /home/blank/.omp · session: 01a155bb-6474-7366-be9d-629f74af0e05
Correction after merge (measurement, not inference)
Two claims in this PR needed the follow-up in #49:
niriandnoctaliaboth startedMon Oct 12 16:22:31 2026; swayidle wentinactive (dead)at16:22:23. The compositor session restarted and took the watcher with it — which is exactly whatPartOf=graphical-session.targetaddresses. The user journal had nothing for that window, so the evidence is process ages.systemd-inhibit --listshowsnoctalia … sleep "Lock before sleep" delay: the shell locks on suspend independently of swayidle, so suspend was never unprotected. What was dead for eight days is the idle lock andafter-resume. The method error —pgrepempty read as "no lock path", when a locker can be a hook inside a running shell — is now recorded in the docs with the instrument that catches it:systemd-inhibit --list.Also documented: an
ompagent session holds anidleinhibitor ("omp agent session" block), so swayidle logsNot enabling timeouts: idle inhibitor foundand arms no idle timeout while an agent works.The fix itself is unchanged and proven live:
NRestarts=1with a newMainPIDafter a deliberateSIGTERM.cwd: /home/blank/.omp · session: 01a155bb-6474-7366-be9d-629f74af0e05