infra/scripts/workstation
Viktor Barzin de163aa6af
All checks were successful
ci/woodpecker/push/postmortem-todos Pipeline was successful
ci/woodpecker/push/default Pipeline was successful
workstation: switch devvm OOM backstop from systemd-oomd to earlyoom
The systemd-oomd backstop added in the previous commit is INERT on this box.
oomd's memory-pressure kill only acts on cgroups doing active reclaim (pgscan
rising); with MemorySwapMax=0 + anonymous agent memory there is nothing to
reclaim, so pgscan stays 0 and oomd never fires. Proven live: a cgroup held at
96-99% memory.pressure for >70s with pgscan=0 was never killed (oomctl + balloon).
The very swap=0 that kills the IO storm also neuters oomd.

Replace it with earlyoom, which watches free RAM (MemAvailable%) and is
swap-independent: SIGTERM the biggest task at 5%, SIGKILL at 3%, swap ignored
(-s 100). It --avoids sshd/systemd/dockerd/containerd/t3-dispatch/tmux (the
admin's way in always survives) and --prefers the agent/browser hogs. Verified
via --dryrun: fires on the RAM threshold and selects a chrome process, not a
protected daemon.

The per-cgroup caps (MemoryHigh=12G/MemoryMax=16G/MemorySwapMax=0 per user,
docker.slice 8G) are unchanged and remain the PRIMARY guard — earlyoom is the
aggregate net for the rare all-users-maxed case. systemd-oomd purged; its config
+ ManagedOOM drop-ins removed. Post-mortem updated with the finding.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 10:39:16 +00:00
..
claude-hooks workstation: harden memory hooks — prune dead plugin refs + homelab-CLI-only store 2026-06-22 09:24:42 +00:00
playwright workstation: per-user playwright browser MCP for all users, reproducible from git 2026-06-16 20:33:47 +00:00
skel workstation: put ~/.local/bin on PATH so the launcher finds native claude 2026-06-15 17:20:03 +00:00
.gitignore fix: restore tree dropped by 6d224861; land stem95su gdrive-sync (10m) [ci skip] 2026-06-09 08:45:33 +00:00
claude-auth-sync.sh Add per-user Claude auth renewal 2026-06-20 20:10:40 +00:00
managed-settings.json workstation: default Claude model fable-5 → opus-4-8 for all devvm users 2026-06-12 20:59:03 +00:00
packages.txt workstation: switch devvm OOM backstop from systemd-oomd to earlyoom 2026-06-22 10:39:16 +00:00
roster.yaml workstation: per-user code_layout — workspace puts project repos under ~/code (ancamilea + tripit) 2026-06-10 18:05:31 +00:00
roster_engine.py workstation: per-user playwright browser MCP for all users, reproducible from git 2026-06-16 20:33:47 +00:00
setup-devvm.sh workstation: switch devvm OOM backstop from systemd-oomd to earlyoom 2026-06-22 10:39:16 +00:00
test_roster_engine.py workstation: per-user playwright browser MCP for all users, reproducible from git 2026-06-16 20:33:47 +00:00