# nh3-svos: the hermes seat runtime becomes task-capable (Prime 2026-10-14 via svos-dev, thread 01M4X1ZE8RDF63NARVT4CFJBT2). # Merged into the EXISTING [[seats.runtimes]] name="hermes" entry: svos-dev's argv/process/task_argv replace its old argv # (venv python + hermes-agent/hermes). Needs kernel 0.0.12 (0.0.11's check-config refuses `process`). No --yolo (Prime's call). steps: - name: back up instance.toml sudo: true shell: runuser -u svc-svos -- cp -p /var/lib/svos/config/instance.toml /var/lib/svos/config/instance.toml.pre-hermes-task creates: /var/lib/svos/config/instance.toml.pre-hermes-task - name: merge the task runtime keys into the hermes entry sudo: true shell: | runuser -u svc-svos -- python3 - <<'PY' import os p = "/var/lib/svos/config/instance.toml"; s = open(p).read() old = ('[[seats.runtimes]]\nname = "hermes"\nprogram = "hermes"\n' 'argv = ["/home/lkraven/.hermes/hermes-agent/venv/bin/python", "/home/lkraven/.hermes/hermes-agent/hermes"]\n' 'credential_env = "SVOS_CREDENTIAL"\n') assert s.count(old) == 1, s.count(old) new = ('[[seats.runtimes]] # U15 task runtime (Prime 2026-10-14 via svos-dev): hermes one-off, no --yolo\n' 'name = "hermes"\n' 'argv = ["/home/lkraven/.local/bin/hermes", "chat"]\n' 'program = "hermes"\n' 'process = "python3" # the launcher execs python3; the live process never shows hermes\n' 'credential_env = "SVOS_CREDENTIAL"\n' 'task_argv = ["/home/lkraven/.local/bin/hermes", "-z", "Your brief is the file {brief}. Do what it asks. Write every deliverable into {result}. Print a one-line summary first, then the details.", "-m", "{model}", "--accept-hooks"]\n') s = s.replace(old, new) s = s.replace("# [seat_host].tasks_root); every ceiling at its default. No runtime declares task_argv yet, so a task-spawn is\n# refused routing_unavailable: runtime_not_task_capable until Prime names the command.\n", "# [seat_host].tasks_root); every ceiling at its default. Since 2026-10-14 the hermes runtime declares task_argv\n# (the only task-capable runtime).\n") t = p + ".tmp"; fd = os.open(t, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, 0o600) with os.fdopen(fd, "w") as f: f.write(s) os.replace(t, p); print("edited") PY - name: the kernel accepts it (else restore) sudo: true shell: | if runuser -u svc-svos -- /opt/svos/current/kernel-env/bin/svos-kernel check-config --data-root /var/lib/svos; then exit 0; fi runuser -u svc-svos -- cp -p /var/lib/svos/config/instance.toml.pre-hermes-task /var/lib/svos/config/instance.toml; echo RESTORED; exit 1 - name: reload sudo: true shell: | systemctl reload svos-kernel; sleep 6 curl -s http://127.0.0.1:8400/health; echo journalctl -u svos-kernel --since "-20s" --no-pager -o cat | grep -i -E "refus|invalid|error|config" | tail -5 | cut -c1-200 verify: - name: the hermes runtime reads task-capable sudo: true shell: runuser -u svc-svos -- python3 -c "import tomllib; d=tomllib.load(open('/var/lib/svos/config/instance.toml','rb')); h=[r for r in d['seats']['runtimes'] if r['name']=='hermes']; assert len(h)==1 and h[0]['process']=='python3' and h[0]['task_argv'][1]=='-z'; print(h[0]['argv'], h[0]['process'], len(h[0]['task_argv']))" changed_when: "false"