← Schema index / Config Reference

nodes schema (1-150)

Canonical generated docsThis section is generated from caco config schema --json. The table below preserves the runtime field path, type, required/default markers, and canonical description for every value in this slice.

Node definitions — machines in the cluster.

Field pathTypeRequiredDefaultCanonical description
nodessectionrequiredNode definitions — machines in the cluster.
└ nodes.namestringrequiredUnique node identifier.
└ nodes.short_namestringoptionalOptional short display name for space-constrained TUI elements.
└ nodes.hoststringrequiredHostname or IP address.
└ nodes.public_hoststringoptionalhostExternally advertised cluster host for public/dynamic callers when it differs from private host.
└ nodes.sshmapoptionalSSH connection config.
└ nodes.ssh.modestringoptionalopensshSSH transport mode: openssh/default or tailscale.
└ nodes.ssh.usernamestringoptionalSSH username.
└ nodes.ssh.portu16optionalSSH port (OpenSSH mode).
└ nodes.ssh.keystring | mapoptionalSSH key path (string or { path: ... }) for OpenSSH mode.
└ nodes.github_ssh_routingstringoptionalautoGitHub SSH routing for daemon-managed git on this node: auto (respect configured host/port), ssh_over_443, or default_port.
└ nodes.scpmapoptionalSCP configuration.
└ nodes.scp.legacybooloptionalfalsePass -O for legacy SCP protocol mode.
└ nodes.distribute_commandmapoptionalPer-node config distribution command override.
└ nodes.distribute_command.fetchstringoptionalShell command to fetch current remote config to stdout.
└ nodes.distribute_command.writestringrequiredShell command to write config content from stdin.
└ nodes.distribute_command.restartstringoptionalShell command to restart the daemon.
└ nodes.config_strategymapoptionalOperator-managed config strategy.
└ nodes.config_strategy.kindstringrequiredStrategy kind: 'aca_share' or 'kubernetes_configmap'.
└ nodes.config_strategy.artifact_idstringrequiredIdentifies the underlying deployment artifact. Nodes sharing the same artifact must use the same artifact_id.
└ nodes.config_strategy.acamapoptionalACA-specific config (required when kind is aca_share).
└ nodes.config_strategy.aca.resource_groupstringrequiredAzure resource group.
└ nodes.config_strategy.aca.storage_accountstringrequiredAzure Storage account.
└ nodes.config_strategy.aca.share_namestringrequiredAzure Files share name.
└ nodes.config_strategy.aca.pathstringrequiredPath within the share for the config file.
└ nodes.config_strategy.aca.app_name_templatestringoptionalTemplate for ACA app names (supports {node} placeholder).
└ nodes.config_strategy.kubernetesmapoptionalKubernetes-specific config (required when kind is kubernetes_configmap).
└ nodes.config_strategy.kubernetes.namespacestringrequiredKubernetes namespace.
└ nodes.config_strategy.kubernetes.configmapstringrequiredConfigMap name.
└ nodes.config_strategy.kubernetes.keystringrequiredKey within the ConfigMap.
└ nodes.config_strategy.kubernetes.workload_kindstringoptionalWorkload kind to restart (e.g. statefulset, deployment).
└ nodes.config_strategy.kubernetes.workload_namestringoptionalWorkload name to restart.
└ nodes.tlsmapoptionalTLS cert/key paths for mTLS.
└ nodes.tls.certstringrequiredTLS certificate path.
└ nodes.tls.keystringrequiredTLS private key path.
└ nodes.relay_eligiblebooloptionalfalseWhether this static node is eligible to serve as a relay peer for relay-mode dynamic nodes.
└ nodes.rolestringoptionalworkerCapability role: worker or daemon_only.
└ nodes.concurrencymapoptionalAgent spawn concurrency ceilings for this node.
└ nodes.concurrency.globalmapoptionalGlobal ceiling across all profiles.
└ nodes.concurrency.global.max_parallelu32requiredMaximum live non-terminal agents.
└ nodes.concurrency.profilemap[string, map]optionalPer-profile ceilings keyed by profile name.
└ nodes.concurrency.profile.max_parallelu32requiredMaximum live non-terminal agents for this profile.
└ nodes.testsmapoptionalQueued test ceilings for this node.
└ nodes.tests.max_parallelu32optional1Maximum concurrent test jobs.
└ nodes.buildsmapoptionalQueued build ceilings and managed-worker validation policy for this node.
└ nodes.builds.max_parallelu32optional1Maximum concurrent build jobs.
└ nodes.builds.node_heavy_max_parallelu32optional2Shared per-node ceiling on concurrent heavy (cargo/nix) builds across the test AND build queues, incl. queued release/darwin self-builds. Env CACO_NODE_HEAVY_MAX_PARALLEL overrides; 0 disables.
└ nodes.builds.node_heavy_min_available_memory_mbu32optional0Host available-memory floor (MiB) below which new heavy ops are refused admission even if a count slot is free (memory-aware admission; covers cross-project load via MemAvailable). Env CACO_NODE_HEAVY_MIN_AVAILABLE_MB overrides; 0 (default) disables -- opt-in, since no fixed MiB default is fleet-safe. Recommended per-node: ~2-3G cargo-only nodes, ~4-6G darwin/swift nodes like ms-mac.
└ nodes.builds.node_heavy_min_available_memory_pctu32optional0Host available-memory floor as a PERCENT of total RAM (0-100); when >0 the floor is max(2048 MiB, pct% total RAM), composing with the fixed *_mb floor (larger wins) -- auto-scaling so one setting is safe across small+big nodes. Env CACO_NODE_HEAVY_MIN_AVAILABLE_PCT overrides; 0 (default) disables (opt-in; ~15 a reasonable auto-enable value).
└ nodes.builds.source_only_workersbooloptionalfalseRefuse compiler/build work from managed-agent direct shells and daemon queues on this node; node/operator calls remain available.
└ nodes.builds.source_only_exceptionslist[map]optionalExact expiring managed-agent exceptions to source-only mode.
└ nodes.builds.source_only_exceptions.agentstringrequiredExact agent ID or stable persistent name.
└ nodes.builds.source_only_exceptions.command_classeslist[string]requiredAllowed classes: cargo, rustc, nix, caco_test, caco_build, just, make, gradle, emulator, test_runner, platform_build.
└ nodes.builds.source_only_exceptions.expires_atRFC3339 timestamprequiredException expiry.
└ nodes.builds.source_only_exceptions.max_timeout_secsu64requiredMaximum required timeout wrapper in seconds.
└ nodes.builds.source_only_exceptions.reasonstringrequiredNon-empty operator/controller audit reason.
└ nodes.agentsmapoptionalNode-scoped declarative persistent agents.
└ nodes.agents.persistent.<name>mapoptionalPersistent agent declaration keyed by stable name.
└ nodes.agents.persistent.<name>.namestringoptionalStable human-readable agent name (alphanumeric + hyphens, max 32 chars).
└ nodes.agents.persistent.<name>.profilestring | list[string]requiredProfile name or ordered list for composite composition.
└ nodes.agents.persistent.<name>.presetstringoptionalPreset ID to launch with.
└ nodes.agents.persistent.<name>.ahp_hoststringoptionalFor `ahp` agents: the AHP host (agents.ahp_hosts) the session lives on; optional when the node has exactly one.
└ nodes.agents.persistent.<name>.typestringoptionalExplicit agent type when not implied by preset.
└ nodes.agents.persistent.<name>.environmentmap[string, string]optionalNon-secret declaration overrides applied after project, preset, and profile env.
└ nodes.agents.persistent.<name>.auto_startbooloptionaltrueWhether daemon auto-converges toward a live instance.
└ nodes.agents.persistent.<name>.restartstringoptionalfailureRestart policy: 'failure' (default), 'always', or 'never'.
└ nodes.agents.persistent.<name>.restart_backoff_secsu32optional30Minimum backoff between failed restart attempts.
└ nodes.agents.persistent.<name>.nodeslist[string]optionalNode allowlist (project-scoped only). Omit for all nodes.
└ nodes.agents.persistent.<name>.cadencemapoptionalController idle polling timers.
└ nodes.agents.persistent.<name>.cadence.reconcile_interval_secsu64optional120Idle reconciliation cadence.
└ nodes.agents.persistent.<name>.cadence.inbox_poll_interval_secsu64optional120Inbox poll cadence.
└ nodes.agents.persistent.<name>.cadence.jitter_secsu64optional30Max random jitter to prevent thundering herd.
└ nodes.agents.persistent.<name>.cadence.claimed_heartbeat_interval_secsu64optional1800Claimed-bead heartbeat cadence (PostToolUse hook reminds agents of active claims + goal; 0 disables)..
└ nodes.agents.persistent.<name>.waitmapoptionalController wait mode configuration.
└ nodes.agents.persistent.<name>.wait.inbox_delay_secsu64optional60Minimum delay before inbox wait reads state.
└ nodes.agents.persistent.<name>.wait.choice_timeout_secsu64optionalTimeout for choice wait mode (null = indefinite).
└ nodes.agents.persistent.<name>.modelstringoptionalModel to use for this persistent agent (e.g. 'opus', 'sonnet'). Passed as --model.
└ nodes.agents.persistent.<name>.providerstringoptionalProvider to use for this persistent agent (e.g. 'openai', 'anthropic', 'google').
└ nodes.agents.persistent.<name>.mcp_policystringoptionalprofileFinal declaration-scoped MCP policy: profile (default) or disabled.
└ nodes.agents.persistent.<name>.short_name_strategymapoptionalStrategy for generating a short human-friendly display name at agent creation time.
└ nodes.agents.persistent.<name>.short_name_strategy.strategystringrequiredShort-name strategy: adj_noun, template or llm.
└ nodes.agents.persistent.<name>.short_name_strategy.templatestringoptionalBounded display template for strategy = template. Placeholders: {adj}, {noun}, {profile}, {bead}, {node}, {n}. Names remain aliases, not identities.
└ nodes.agents.persistent.<name>.short_name_strategy.llmstringoptionalTop-level llm alias used when strategy = llm.
└ nodes.agents.persistent.<name>.checkout_typestringoptionalworktreeHow the agent's working checkout is materialized: worktree (default; a git worktree sharing the canonical.git, fastest startup), clone (a shared clone), full (a 1st-party clone of the real remote), read_only_symlink (observers), or pr_branch (a full-clone whose working branch is an existing GitHub PR head; requires github_integration.enabled,). made worktree the default.
└ nodes.agents.persistent.<name>.confirm_before_spawnbooloptionalfalseRequire operator approval through caco choices before spawning this persistent agent.
└ nodes.agents.persistent.<name>.confirm_before_spawn_timeout_secsu64optional300Timeout in seconds for the operator confirmation prompt.
└ nodes.agents.persistent.<name>.confirm_before_spawn_auto_approvebooloptionalfalseAuto-approve the spawn when the confirmation timeout expires.
└ nodes.agents.persistent.<name>.all_projectsbooloptionalfalseAllow this persistent agent to access all configured projects instead of only its bound project.
└ nodes.agents.persistent.<name>.goalstringoptionalDefault goal/task description for managed launches via this declaration; used when --goal is not passed.
└ nodes.agents.persistent.<name>.schedulemapoptionalSchedule configuration for periodic persistent agent launches.
└ nodes.agents.persistent.<name>.schedule.cronstringrequiredStandard 5-field cron expression.
└ nodes.agents.persistent.<name>.schedule.launch_modestringoptionalrestart-or-recreateLaunch mode: recreate, restart, or restart-or-recreate.
└ nodes.agents.persistent.<name>.pane_error_detectionbooloptionalfalseEnable tmux pane content scanning for fatal error detection. Overrides agent_defaults. Default false.
└ nodes.agents.persistent.<name>.projectstringoptionalExplicit project binding for node-scoped persistent agents. When set, this project is used for checkout, bead visibility, and profile resolution instead of the first configured project.
└ nodes.agents.persistent.<name>.depends_on_nodestringoptionalCross-node reachability dependency: defer launch until the named remote node is reachable per PeerReachabilityMap. When omitted, no gate is applied.
└ nodes.agents.persistent.<name>.friend_projectslist[friend_project]optionalPer-declaration friend project overlay; entries can narrow or disable inherited friends.
└ nodes.agents.persistent.<name>.friend_projects.projectstringrequiredTarget project name.
└ nodes.agents.persistent.<name>.friend_projects.branchstringoptionalTarget branch; omitted means the friend project's default_branch. Mutually exclusive with revision.
└ nodes.agents.persistent.<name>.friend_projects.revisionstringoptionalPinned git revision. Mutually exclusive with branch.
└ nodes.agents.persistent.<name>.friend_projects.permissionslist[string]optional[checkout_read]Granted operations: checkout_read, checkout_write, beads_read, beads_create, beads_update, beads_claim, beads_close, beads_dispatch.
└ nodes.agents.persistent.<name>.friend_projects.materializebooloptionalfalseMaterialize a real friend checkout cloned from the friend project's remote; omitted means a virtual friend with no checkout.
└ nodes.agents.persistent.<name>.friend_projects.enabledbooloptionaltrueSet false in a narrower layer to disable an inherited friend.
└ nodes.agents.heartbeatmapoptionalNode-local managed-agent heartbeat defaults and per-agent overrides.
└ nodes.agents.heartbeat.enabledbooloptionalfalseEnable local daemon-owned managed-agent heartbeat delivery for this scope. Defaults to false for safe rollout.
└ nodes.agents.heartbeat.selectorstringoptionalpersistentAgent selector for this scope: all, persistent, workers, or none.
└ nodes.agents.heartbeat.interval_secsu64optional300Base heartbeat cadence in seconds.
└ nodes.agents.heartbeat.jitter_secsu64optional0Optional jitter in seconds; must not exceed interval_secs.
└ nodes.agents.heartbeat.max_backoff_secsu64optional300Optional delivery-failure backoff ceiling in seconds; must be at least interval_secs.
└ nodes.agents.heartbeat.allow_runtime_opt_outbooloptionaltrueAllow runtime/profile code to decline heartbeats even when config enables them.
└ nodes.agents.heartbeat.conditionslist[string]optionalOptional OR timer gates: claimed_beads (owned unfinished claims), unmerged_prs (linked open PRs), pending_inbox (visible unread messages). Inherits when omitted; [] is unconditional. Runtime on never bypasses conditions.
└ nodes.agents.heartbeat.overridesmap[string, map]optionalPer-agent overrides keyed by persistent declaration name, composed profile, or concrete agent id.
└ nodes.agents.heartbeat.overrides.<agent>mapoptionalOne per-agent heartbeat override; inherits unspecified fields from the surrounding scope.
└ nodes.agents.heartbeat.overrides.<agent>.enabledbooloptionalEnable or disable heartbeat for this agent.
└ nodes.agents.heartbeat.overrides.<agent>.selectorstringoptionalOptional selector override: all, persistent, workers, or none.
└ nodes.agents.heartbeat.overrides.<agent>.interval_secsu64optionalOverride base heartbeat cadence in seconds.
└ nodes.agents.heartbeat.overrides.<agent>.jitter_secsu64optionalOverride jitter in seconds; must not exceed interval_secs when both are set.
└ nodes.agents.heartbeat.overrides.<agent>.max_backoff_secsu64optionalOverride delivery-failure backoff ceiling in seconds.
└ nodes.agents.heartbeat.overrides.<agent>.allow_runtime_opt_outbooloptionalOverride runtime opt-out permission for this agent.
└ nodes.agents.heartbeat.overrides.<agent>.conditionslist[string]optionalReplace inherited OR timer gates (claimed_beads, unmerged_prs, pending_inbox); [] restores unconditional delivery.
└ nodes.agents.message_deliverymapoptionalNode-local managed-agent message-delivery cadence defaults and per-agent overrides (wake vs batch).
└ nodes.agents.message_delivery.enabledbooloptionalfalseEnable local daemon-owned managed-agent message-delivery batching for this scope. Defaults to false (immediate wake) for safe rollout.
└ nodes.agents.message_delivery.selectorstringoptionalallAgent selector for this scope: all, persistent, workers, or none.
└ nodes.agents.message_delivery.default_modestringoptionalimmediateWake mode for a message with no explicit wake flag: immediate (wake now) or batch (defer to next heartbeat).
└ nodes.agents.message_delivery.always_wake_kindslist[string]optionalMessage kinds that always wake regardless of mode (e.g. lifecycle, system).
└ nodes.agents.message_delivery.allow_runtime_opt_outbooloptionaltrueAllow runtime/profile code to decline batching even when config enables it.
└ nodes.agents.message_delivery.batch_flush_interval_secsu64optionalOptional shorter dedicated cadence in seconds for surfacing deferred (batched) messages via a coalesced summary wake, instead of waiting for the full heartbeat. A flush with no pending messages costs zero model turns.
└ nodes.agents.message_delivery.direct_message_wakebooloptionaltrueOperator- or agent-authored direct messages the batch policy would defer instead force one coalesced wake carrying them inline, including for idle, dormant and queue-parked recipients; paused or starting recipients are held until live. Automated notices, broadcast batching and heartbeat intervals are unchanged. false restores pure batching of direct messages.
└ nodes.agents.message_delivery.overridesmap[string, map]optionalPer-agent overrides keyed by persistent declaration name or concrete agent id.
└ nodes.agents.message_delivery.overrides.<agent>mapoptionalOne per-agent message-delivery override; inherits unspecified fields from the surrounding scope.
└ nodes.agents.message_delivery.overrides.<agent>.enabledbooloptionalEnable or disable message-delivery batching for this agent.
└ nodes.agents.message_delivery.overrides.<agent>.selectorstringoptionalOptional selector override: all, persistent, workers, or none.
└ nodes.agents.message_delivery.overrides.<agent>.default_modestringoptionalOverride wake mode: immediate or batch.
└ nodes.agents.message_delivery.overrides.<agent>.always_wake_kindslist[string]optionalOverride always-wake message kinds.
└ nodes.agents.message_delivery.overrides.<agent>.allow_runtime_opt_outbooloptionalOverride runtime opt-out permission for this agent.
└ nodes.agents.message_delivery.overrides.<agent>.batch_flush_interval_secsu64optionalOverride the dedicated batch-flush cadence in seconds.
└ nodes.agents.message_delivery.overrides.<agent>.direct_message_wakebooloptionalOverride the direct-message wake for this agent.
└ nodes.agents.paratenicmapoptionalNode-local Paratenic AHP client settings for pi-paratenic agents.
└ nodes.agents.paratenic.apply_to_pibooloptionalfalseRoute ordinary managed Pi delivery through an exact schema-v2 Paratenic binding first, with normal Pi fallback when evidence is absent or stale.
└ nodes.agents.paratenic.urlstringrequiredws://127.0.0.1:7788/ahpParatenic AHP WebSocket endpoint including /ahp.
└ nodes.agents.paratenic.token_filestringrequired~/.config/paratenic/tokenOwner-private Paratenic bearer-token file.
└ nodes.agents.paratenic.backend_socketstringrequired~/.local/state/paratenic/backend.sockOwner-private Paratenic backend registration socket.
└ nodes.agents.paratenic.extension_pathstringrequiredReviewed Paratenic Pi extension loaded by managed Pi.
└ nodes.agents.paratenic.registration_timeout_secsu64optional30Legacy registration timeout exported for runtime compatibility; not a launch or resume gate.
└ nodes.agents.paratenic.dispatch_timeout_secsu64optional30Maximum AHP dispatch/acceptance wait.
└ nodes.agents.pi_daemonmapoptionalNode-local standalone Pi SDK host client settings for pi-daemon logical agents (pico-daemon is a migration alias).
└ nodes.agents.pi_daemon.socket_pathstringrequiredOwner-local Unix socket exposed by the separately supervised standalone pi-daemon host.
└ nodes.agents.pi_daemon.binarystringoptionalpi-daemonStandalone pi-daemon executable path/name.
└ nodes.agents.pi_daemon.state_dirstringoptional$CACOPHONY_DIR/pi-daemonStandalone host state directory.
└ nodes.agents.pi_daemon.agent_dirstringoptionalPi auth/model directory; omitted uses Pi's default.
└ nodes.agents.pi_daemon.allow_rootstringoptional$CACOPHONY_DIR/agentsCanonical workload root allowed by the standalone host.