wrote /home/user/Projects/overdeck/.worktrees/fleet-s1/fleet/inventory.yml: 3 buildbox(es) from registry — ['debian1', 'debian2', 'debian3'] PLAY [fleet — path bins] ******************************************************* PLAY [fleet — seat settings template] ****************************************** PLAY [fleet — systemd user units (laptop only this pass — see README)] ********* TASK [Gathering Facts] ********************************************************* ok: [laptop] TASK [systemd_units : converge resource-control slice unit files] ************** [WARNING]: Deprecation warnings can be disabled by setting `deprecation_warnings=False` in ansible.cfg. [DEPRECATION WARNING]: INJECT_FACTS_AS_VARS default to `True` is deprecated, top-level facts will not be auto injected after the change. This feature will be removed from ansible-core version 2.24. Origin: /home/user/Projects/overdeck/.worktrees/fleet-s1/fleet/roles/systemd_units/tasks/main.yml:5:11 3 ansible.builtin.copy: 4 src: "{{ playbook_dir }}/../modules/monitor/systemd/user/{{ item }}" 5 dest: "{{ ansible_env.HOME }}/.config/systemd/user/{{ item }}" ^ column 11 Use `ansible_facts["fact_name"]` (no `ansible_` prefix) instead. --- before: /home/user/.config/systemd/user/agent.slice +++ after: /home/user/Projects/overdeck/.worktrees/fleet-s1/modules/monitor/systemd/user/agent.slice @@ -2,8 +2,14 @@ Description=Interactive AI agent runtimes (codex/claude/cursor-agent) [Slice] -CPUQuota=150% -CPUWeight=1 +# No CPUQuota: a hard quota starved every agent tool shell under contention +# (nr_throttled=2.88M, ~300h stalled, 2026-08-15). CPUWeight is proportional +# and cannot starve — desktop (weight 100) still outranks agents, agents +# split what remains. This was a runtime drop-in override +# (agent.slice.d/50-no-starvation.conf) before 2026-08-15; folded into the +# base declaration here so the correct value cannot regress if the drop-in +# is ever lost. +CPUWeight=50 TasksMax=3072 # No MemoryHigh/MemoryMax/MemorySwapMax: agent work is legitimately heavy, and a fixed # number cannot tell a 35G build from a runaway. Memory pressure is handled by changed: [laptop] => (item=agent.slice) changed: [laptop] => (item=build.slice) changed: [laptop] => (item=ci.slice) changed: [laptop] => (item=guard.slice) changed: [laptop] => (item=human.slice) changed: [laptop] => (item=interactive.slice) changed: [laptop] => (item=unsafe.slice) changed: [laptop] => (item=app-org.gnome.Terminal.slice) TASK [systemd_units : reload systemd user daemon if any slice changed (apply mode only)] *** skipping: [laptop] PLAY RECAP ********************************************************************* laptop : ok=2 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0