← Schema index / Config Reference

projects schema (151-300)

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.

Project definitions — repositories managed by Cacophony. Accepts both a list of projects (with 'name' field) and a map keyed by project name.

Field pathTypeRequiredDefaultCanonical description
└ projects.agents.flow.default.override_pi_agent_dirstringoptionalRead-only operator-owned Pi agent directory passed directly to managed Pi launches instead of materializing .pi-agent config.
└ projects.agents.flow.default.warmup_cache_injectionmapoptionalDisabled-by-default advisory warmup-cache prompt injection settings for spawned agents.
└ projects.agents.flow.default.warmup_cache_injection.enabledbooloptionalfalseEnable advisory warmup-cache prompt injection.
└ projects.agents.flow.default.warmup_cache_injection.max_age_secondsi64optional86400Maximum accepted warmup summary age before skipping injection.
└ projects.agents.flow.default.warmup_cache_injection.max_charsusizeoptional2048Maximum characters injected from the warmup summary.
└ projects.agents.flow.default.pane_error_detectionbooloptionalfalseEnable tmux pane content scanning for Pi agent fatal error detection.
└ projects.agents.flow.default.eligible_nodeslist[string]optionalAllowlist of node names for round_robin/least_overloaded placement. Manual --node overrides bypass this.
└ projects.agents.flow.default.friend_projectslist[friend_project]optionalAgent-default friend project overlays inherited by agents in this project.
└ projects.agents.flow.default.friend_projects.projectstringrequiredTarget project name.
└ projects.agents.flow.default.friend_projects.branchstringoptionalTarget branch; omitted means the friend project's default_branch. Mutually exclusive with revision.
└ projects.agents.flow.default.friend_projects.revisionstringoptionalPinned git revision. Mutually exclusive with branch.
└ projects.agents.flow.default.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.
└ projects.agents.flow.default.friend_projects.materializebooloptionalfalseMaterialize a real friend checkout cloned from the friend project's remote; omitted means a virtual friend with no checkout.
└ projects.agents.flow.default.friend_projects.enabledbooloptionaltrueSet false in a narrower layer to disable an inherited friend.
└ projects.agents.heartbeatmapoptionalProject-scoped managed-agent heartbeat defaults and per-agent overrides, overlaying the cluster default.
└ projects.agents.heartbeat.enabledbooloptionalfalseEnable local daemon-owned managed-agent heartbeat delivery for this scope. Defaults to false for safe rollout.
└ projects.agents.heartbeat.selectorstringoptionalpersistentAgent selector for this scope: all, persistent, workers, or none.
└ projects.agents.heartbeat.interval_secsu64optional300Base heartbeat cadence in seconds.
└ projects.agents.heartbeat.jitter_secsu64optional0Optional jitter in seconds; must not exceed interval_secs.
└ projects.agents.heartbeat.max_backoff_secsu64optional300Optional delivery-failure backoff ceiling in seconds; must be at least interval_secs.
└ projects.agents.heartbeat.allow_runtime_opt_outbooloptionaltrueAllow runtime/profile code to decline heartbeats even when config enables them.
└ projects.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.
└ projects.agents.heartbeat.overridesmap[string, map]optionalPer-agent overrides keyed by persistent declaration name, composed profile, or concrete agent id.
└ projects.agents.heartbeat.overrides.<agent>mapoptionalOne per-agent heartbeat override; inherits unspecified fields from the surrounding scope.
└ projects.agents.heartbeat.overrides.<agent>.enabledbooloptionalEnable or disable heartbeat for this agent.
└ projects.agents.heartbeat.overrides.<agent>.selectorstringoptionalOptional selector override: all, persistent, workers, or none.
└ projects.agents.heartbeat.overrides.<agent>.interval_secsu64optionalOverride base heartbeat cadence in seconds.
└ projects.agents.heartbeat.overrides.<agent>.jitter_secsu64optionalOverride jitter in seconds; must not exceed interval_secs when both are set.
└ projects.agents.heartbeat.overrides.<agent>.max_backoff_secsu64optionalOverride delivery-failure backoff ceiling in seconds.
└ projects.agents.heartbeat.overrides.<agent>.allow_runtime_opt_outbooloptionalOverride runtime opt-out permission for this agent.
└ projects.agents.heartbeat.overrides.<agent>.conditionslist[string]optionalReplace inherited OR timer gates (claimed_beads, unmerged_prs, pending_inbox); [] restores unconditional delivery.
└ projects.agents.message_deliverymapoptionalProject-scoped message-delivery cadence defaults and per-agent overrides, overlaying the cluster default before node defaults.
└ projects.agents.message_delivery.enabledbooloptionalfalseEnable local daemon-owned managed-agent message-delivery batching for this scope. Defaults to false (immediate wake) for safe rollout.
└ projects.agents.message_delivery.selectorstringoptionalallAgent selector for this scope: all, persistent, workers, or none.
└ projects.agents.message_delivery.default_modestringoptionalimmediateWake mode for a message with no explicit wake flag: immediate (wake now) or batch (defer to next heartbeat).
└ projects.agents.message_delivery.always_wake_kindslist[string]optionalMessage kinds that always wake regardless of mode (e.g. lifecycle, system).
└ projects.agents.message_delivery.allow_runtime_opt_outbooloptionaltrueAllow runtime/profile code to decline batching even when config enables it.
└ projects.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.
└ projects.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.
└ projects.agents.message_delivery.overridesmap[string, map]optionalPer-agent overrides keyed by persistent declaration name or concrete agent id.
└ projects.agents.message_delivery.overrides.<agent>mapoptionalOne per-agent message-delivery override; inherits unspecified fields from the surrounding scope.
└ projects.agents.message_delivery.overrides.<agent>.enabledbooloptionalEnable or disable message-delivery batching for this agent.
└ projects.agents.message_delivery.overrides.<agent>.selectorstringoptionalOptional selector override: all, persistent, workers, or none.
└ projects.agents.message_delivery.overrides.<agent>.default_modestringoptionalOverride wake mode: immediate or batch.
└ projects.agents.message_delivery.overrides.<agent>.always_wake_kindslist[string]optionalOverride always-wake message kinds.
└ projects.agents.message_delivery.overrides.<agent>.allow_runtime_opt_outbooloptionalOverride runtime opt-out permission for this agent.
└ projects.agents.message_delivery.overrides.<agent>.batch_flush_interval_secsu64optionalOverride the dedicated batch-flush cadence in seconds.
└ projects.agents.message_delivery.overrides.<agent>.direct_message_wakebooloptionalOverride the direct-message wake for this agent.
└ projects.agents.persistent.<name>mapoptionalPersistent agent declaration keyed by stable name.
└ projects.agents.persistent.<name>.namestringoptionalStable human-readable agent name (alphanumeric + hyphens, max 32 chars).
└ projects.agents.persistent.<name>.profilestring | list[string]requiredProfile name or ordered list for composite composition.
└ projects.agents.persistent.<name>.presetstringoptionalPreset ID to launch with.
└ projects.agents.persistent.<name>.ahp_hoststringoptionalFor `ahp` agents: the AHP host (agents.ahp_hosts) the session lives on; optional when the node has exactly one.
└ projects.agents.persistent.<name>.typestringoptionalExplicit agent type when not implied by preset.
└ projects.agents.persistent.<name>.environmentmap[string, string]optionalNon-secret declaration overrides applied after project, preset, and profile env.
└ projects.agents.persistent.<name>.auto_startbooloptionaltrueWhether daemon auto-converges toward a live instance.
└ projects.agents.persistent.<name>.restartstringoptionalfailureRestart policy: 'failure' (default), 'always', or 'never'.
└ projects.agents.persistent.<name>.restart_backoff_secsu32optional30Minimum backoff between failed restart attempts.
└ projects.agents.persistent.<name>.nodeslist[string]optionalNode allowlist (project-scoped only). Omit for all nodes.
└ projects.agents.persistent.<name>.cadencemapoptionalController idle polling timers.
└ projects.agents.persistent.<name>.cadence.reconcile_interval_secsu64optional120Idle reconciliation cadence.
└ projects.agents.persistent.<name>.cadence.inbox_poll_interval_secsu64optional120Inbox poll cadence.
└ projects.agents.persistent.<name>.cadence.jitter_secsu64optional30Max random jitter to prevent thundering herd.
└ projects.agents.persistent.<name>.cadence.claimed_heartbeat_interval_secsu64optional1800Claimed-bead heartbeat cadence (PostToolUse hook reminds agents of active claims + goal; 0 disables)..
└ projects.agents.persistent.<name>.waitmapoptionalController wait mode configuration.
└ projects.agents.persistent.<name>.wait.inbox_delay_secsu64optional60Minimum delay before inbox wait reads state.
└ projects.agents.persistent.<name>.wait.choice_timeout_secsu64optionalTimeout for choice wait mode (null = indefinite).
└ projects.agents.persistent.<name>.modelstringoptionalModel to use for this persistent agent (e.g. 'opus', 'sonnet'). Passed as --model.
└ projects.agents.persistent.<name>.providerstringoptionalProvider to use for this persistent agent (e.g. 'openai', 'anthropic', 'google').
└ projects.agents.persistent.<name>.mcp_policystringoptionalprofileFinal declaration-scoped MCP policy: profile (default) or disabled.
└ projects.agents.persistent.<name>.short_name_strategymapoptionalStrategy for generating a short human-friendly display name at agent creation time.
└ projects.agents.persistent.<name>.short_name_strategy.strategystringrequiredShort-name strategy: adj_noun, template or llm.
└ projects.agents.persistent.<name>.short_name_strategy.templatestringoptionalBounded display template for strategy = template. Placeholders: {adj}, {noun}, {profile}, {bead}, {node}, {n}. Names remain aliases, not identities.
└ projects.agents.persistent.<name>.short_name_strategy.llmstringoptionalTop-level llm alias used when strategy = llm.
└ projects.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.
└ projects.agents.persistent.<name>.confirm_before_spawnbooloptionalfalseRequire operator approval through caco choices before spawning this persistent agent.
└ projects.agents.persistent.<name>.confirm_before_spawn_timeout_secsu64optional300Timeout in seconds for the operator confirmation prompt.
└ projects.agents.persistent.<name>.confirm_before_spawn_auto_approvebooloptionalfalseAuto-approve the spawn when the confirmation timeout expires.
└ projects.agents.persistent.<name>.all_projectsbooloptionalfalseAllow this persistent agent to access all configured projects instead of only its bound project.
└ projects.agents.persistent.<name>.goalstringoptionalDefault goal/task description for managed launches via this declaration; used when --goal is not passed.
└ projects.agents.persistent.<name>.schedulemapoptionalSchedule configuration for periodic persistent agent launches.
└ projects.agents.persistent.<name>.schedule.cronstringrequiredStandard 5-field cron expression.
└ projects.agents.persistent.<name>.schedule.launch_modestringoptionalrestart-or-recreateLaunch mode: recreate, restart, or restart-or-recreate.
└ projects.agents.persistent.<name>.pane_error_detectionbooloptionalfalseEnable tmux pane content scanning for fatal error detection. Overrides agent_defaults. Default false.
└ projects.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.
└ projects.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.
└ projects.agents.persistent.<name>.friend_projectslist[friend_project]optionalPer-declaration friend project overlay; entries can narrow or disable inherited friends.
└ projects.agents.persistent.<name>.friend_projects.projectstringrequiredTarget project name.
└ projects.agents.persistent.<name>.friend_projects.branchstringoptionalTarget branch; omitted means the friend project's default_branch. Mutually exclusive with revision.
└ projects.agents.persistent.<name>.friend_projects.revisionstringoptionalPinned git revision. Mutually exclusive with branch.
└ projects.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.
└ projects.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.
└ projects.agents.persistent.<name>.friend_projects.enabledbooloptionaltrueSet false in a narrower layer to disable an inherited friend.
└ projects.agents.groups.<name>list[string]optionalProject-scoped agent group mapping from group name to agent IDs.
└ projects.submodulesmapoptionalSubmodule handling settings.
└ projects.submodules.enabledbooloptionalfalseWhether submodule handling is active.
└ projects.submodules.recursivebooloptionalfalseWhether nested submodules are initialized recursively.
└ projects.submodules.enabled_pathslist[string]optionalRestrict submodule init/update to these paths only.
└ projects.sparsemapoptionalSparse-checkout spec.
└ projects.sparse.modestringoptionalconeSparse-checkout mode: cone (default) or no-cone.
└ projects.sparse.includelist[string]optionalPaths to materialize in the checkout.
└ projects.sparse.excludelist[string]optionalNegated patterns (no-cone mode only; ignored in cone mode).
└ projects.actionsmap[string, map]optionalProject-scoped actions keyed by action name.
└ projects.actions.<action-name>mapoptionalProject action entry.
└ projects.actions.<action-name>.typestringrequiredAction type (currently only 'command').
└ projects.actions.<action-name>.commandstringrequiredShell command to execute.
└ projects.actions.<action-name>.descriptionstringoptionalHuman-readable description.
└ projects.actions.<action-name>.roles_permittedlist[string]optionalRoles/profiles allowed to invoke (e.g. 'operator', 'profile:<name>').
└ projects.actions.<action-name>.cwdstringoptionalWorking directory for command execution.
└ projects.actions.<action-name>.timeout_secsu64optional300Timeout in seconds for command execution.
└ projects.actions.<action-name>.idempotentbooloptionalfalseWhether exact replay is safe after restart.
└ projects.actions.<action-name>.checkstringoptionalSide-effect-free shell command that exercises the action's prerequisites; run by 'caco action check'.
└ projects.hooksmapoptionalProject-level lifecycle hooks.
└ projects.hooks.checkout_updatedlist[action]optionalActions to fire when the canonical checkout moves to a new commit.
└ projects.hooks.checkout_updated.actionstringrequiredAction type: notify_agent, shell, broadcast, speak.
└ projects.hooks.checkout_updated.agentstringoptionalTarget persistent agent name (for notify_agent).
└ projects.hooks.checkout_updated.messagestringoptionalMessage to deliver (for notify_agent). Supports $var templates.
└ projects.hooks.checkout_updated.commandstringoptionalShell command (for shell action). Hook variables injected as $CACO_HOOK_VAR env vars.
└ projects.hooks.checkout_updated.bodystringoptionalBody text (for broadcast/speak). Supports $var templates.
└ projects.hooks.checkout_updated.voicestringoptionalTTS voice override (for speak action).
└ projects.hooks.tag_pushedlist[action]optionalActions to fire when a new git tag is detected.
└ projects.hooks.tag_pushed.actionstringrequiredAction type: notify_agent, shell, broadcast, speak.
└ projects.hooks.tag_pushed.agentstringoptionalTarget persistent agent name (for notify_agent).
└ projects.hooks.tag_pushed.messagestringoptionalMessage to deliver (for notify_agent). Supports $var templates.
└ projects.hooks.tag_pushed.commandstringoptionalShell command (for shell action). Hook variables injected as $CACO_HOOK_VAR env vars.
└ projects.hooks.tag_pushed.bodystringoptionalBody text (for broadcast/speak). Supports $var templates.
└ projects.hooks.tag_pushed.voicestringoptionalTTS voice override (for speak action).
└ projects.hooks.daemon_upgradedlist[action]optionalActions to fire after a daemon upgrade.
└ projects.hooks.daemon_upgraded.actionstringrequiredAction type: notify_agent, shell, broadcast, speak.
└ projects.hooks.daemon_upgraded.agentstringoptionalTarget persistent agent name (for notify_agent).
└ projects.hooks.daemon_upgraded.messagestringoptionalMessage to deliver (for notify_agent). Supports $var templates.
└ projects.hooks.daemon_upgraded.commandstringoptionalShell command (for shell action). Hook variables injected as $CACO_HOOK_VAR env vars.
└ projects.hooks.daemon_upgraded.bodystringoptionalBody text (for broadcast/speak). Supports $var templates.
└ projects.hooks.daemon_upgraded.voicestringoptionalTTS voice override (for speak action).
└ projects.webhooksmapoptionalWebhook ingress: POST /hooks/<project>/<hook-id> -> bead/bash/action/agent handler.
└ projects.webhooks.enabledbooloptionalWhether hook ingress is enabled (default true when entries present).
└ projects.webhooks.tokenstringoptionalGlobal bearer token (inline) accepted for any hook in this section. Mutually exclusive with token_env/token_file.
└ projects.webhooks.token_envstringoptionalSection bearer token read from this env var at auth time (rotation-robust). Mutually exclusive with token/token_file.
└ projects.webhooks.token_filestringoptionalSection bearer token read from this file at auth time, tilde-expanded (rotation-robust). Mutually exclusive with token/token_env.
└ projects.webhooks.nodeslist[string]optionalDefault node filter: which daemons serve/funnel this section's hooks.
└ projects.webhooks.bind_hoststringoptionalWebhook listener bind host (default 127.0.0.1).
└ projects.webhooks.bind_portintoptionalDedicated webhook listener port (the Tailscale Funnel target).
└ projects.webhooks.funnelbooloptionalOpt-in Tailscale Funnel exposure on the filtered nodes (default false).
└ projects.webhooks.max_body_bytesintoptionalMaximum request body size in bytes (default 1 MiB).
└ projects.webhooks.entriesmap[string, map]optionalHooks keyed by <hook-id> (the URL path segment).
└ projects.webhooks.entries.<hook-id>mapoptionalA single webhook served at /hooks/<scope>/<hook-id>.
└ projects.webhooks.entries.<hook-id>.typestringrequiredHandler type: bead | bash | action | agent.
└ projects.webhooks.entries.<hook-id>.tokenstringoptionalPer-hook bearer token (inline; accepted in addition to the section token). Mutually exclusive with token_env/token_file.
└ projects.webhooks.entries.<hook-id>.token_envstringoptionalPer-hook bearer token read from this env var at auth time (rotation-robust). Mutually exclusive with token/token_file.
└ projects.webhooks.entries.<hook-id>.token_filestringoptionalPer-hook bearer token read from this file at auth time, tilde-expanded (rotation-robust). Mutually exclusive with token/token_env.