Docs
Nodes
A nodes row represents a single kumod instance the workspace sends through.
Two on-site paths:
Incus provision (M10 / M10b)
POST /v1/panel/nodes/provision calls the incus-client helper to
createInstance + startInstance against the configured daemon (INCUS_URL,
INCUS_BASE_URL).
| Env | Behaviour |
|---|---|
| Default CI | Fake Incus client (async stub) — matrix M10 PASS |
INCUS_LIVE_PROBE=1 with unix socket |
Live daemon — matrix M10b PASS |
If no daemon is reachable, the route returns 200 with incus_error and the
node row is marked status='down'. Operators see this honestly.
BYO register (smoke-nodes)
POST /v1/panel/nodes/register accepts { name, kumo_base_url, hostname? },
probes the URL with kumo.liveness(), and inserts a row. No Incus
required. Use this when an existing second-node kumod is already on the
network (customer VPC, lab, etc.).
Returns 200 if kumod is healthy, 502 if unreachable (the row is created either way so the operator can fix networking without losing context).
Health probe
GET /v1/nodes/:id/health (operator+ via requireOpsAccess) probes
kumo_base_url against /api/check-liveness/v1 and updates last_seen_at
and status.
Per-node send
POST /v1/panel/nodes/:id/send re-runs the same runSend pipeline against
the node-specific Kumo client. Per-node send is for diagnostics + reduced
blast-radius, not for load-balanced routing (see Release B multi-node).
Related
- docs/operate/policy.md — when per-node policy rendering.
- apps/web/playwright/e2e/panel-sections-kumo.spec.ts — M50 deep E2E.
Last verified: Sat Jul 11 2026 17:00:00 GMT-0700 (Pacific Daylight Time). Cross-link maintained byscripts/check-docs-drift.sh (M54).