Files
computer-playbook/roles/svc-ai-robot/meta/services.yml
kevinveenbirkenbachandClaude Opus 4.8 08a6dd157c feat(svc-ai-robot): embody an agent on a dedicated device
Requirement 034 inverts the isolation model of the other agent roles: the
boundary is the whole machine rather than a kernel boundary inside it.
Adding this role to a device switches the agent from isolated to
embodied.

The agent then runs privileged with exactly the devices from
ROBOT_DEVICE_ALLOWLIST bound into its container, and the kernel-isolating
runtime is dropped, because a microVM between the agent and the hardware
it is meant to drive defeats the purpose. The allowlist lives in
group_vars so the agent templates can read it; a role variable is not
visible across roles.

The admission checks run inside the agent role before it deploys rather
than in this role afterwards. The agent is declared shared, so the
service loader brings it up during the constructor stage while svc-ai
roles only run at the following step; a check placed here would sit
behind the deployment it exists to prevent.

The dedicated-device check now compares against something group_names
actually carries: any other web-app role on the host. The previous list
held Docker node labels, which are a different namespace from Ansible
inventory groups, so that intersection could never match and the failure
message always blamed a multi-node swarm.

Which agent embodies the device follows from the topology: both agent
flags take the dynamic in-group_names form, Hermes Agent wins when both
are present, and the matrix pins one per round so neither path rots.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-25 22:16:17 +02:00

28 lines
773 B
YAML

---
robot:
modes:
host:
enabled: true
compose:
enabled: false
swarm:
enabled: false
min_storage: "100MB"
cpus: "0.2"
mem_reservation: "64m"
mem_limit: "256m"
pids_limit: 256
lifecycle: pre-alpha
# nocheck: playwright-service-flag the embodied agent is the deployed workload of this role
hermes:
bond: 1
enabled: "{{ 'web-app-hermes' in group_names }}"
shared: true # nocheck: dynamic-flag the selected agent is always the shared workload of the device
# nocheck: playwright-service-flag the embodied agent is the deployed workload of this role
openclaw:
bond: 0.1
enabled: "{{ 'web-app-openclaw' in group_names }}"
shared: true # nocheck: dynamic-flag the selected agent is always the shared workload of the device