Extended CLI Reference

This companion page keeps the main CLI Reference focused on common operator families while preserving the less-common command families, fleet helpers, diagnostics, transport helpers, and onboarding commands in the same reference style.

caco action — Configured Actions

CommandPurpose
ACTION="status"; caco action run "$ACTION"Run a configured action (supports passthrough args after --); --node <node> routes execution through the same authoritative remote path as caco @<node> action run, including from MCP
caco action listList available actions

Actions are operator-defined commands declared under projects.<name>.actions or global/node scopes. Args after -- are shell-escaped and appended. With resolved node/project context, action commands receive CACO_NODE, CACOPHONY_NODE, CACO_PROJECT, and CACOPHONY_PROJECT.

caco audio — Speech & Transcription

CommandPurpose
caco audio speakSynthesize text to speech via the daemon audio proxy
caco audio transcribeTranscribe audio from file or live microphone via the daemon audio proxy; explicit --model values are validated against daemon-advertised STT capabilities, including configured command-template labels
caco audio live start|status|stopStart, inspect, or gracefully stop a non-blocking live transcription session for agent/MCP use
caco audio capabilitiesShow available audio models, voices, and provider status
caco audio prewarmDownload/prewarm a local STT model (e.g. scribble whisper variants)
caco audio mcp stdioExpose audio/STT commands, including live transcription control, as MCP tools

caco image — Image Generation

CommandPurpose
caco image generateGenerate an image from a text prompt or configured preset

caco changelog — Release Changelog

CommandPurpose
caco changelog showShow beads grouped by versioned release

caco log — Service Logs

CommandPurpose
caco log tailShow recent log lines for a service
caco log streamStream log output from a service in real time
caco log errorReport a structured project error into the Cacophony feed
caco log exceptionsList structured process exceptions
caco log perfReport a structured performance event
caco log perf-listPerf query; --top

For scripting, caco log exceptions --json returns the canonical {ok,data,meta} envelope: exception rows live under data.exceptions, while meta carries node, totals, component filter, and returned-count metadata.

caco event — Command Audit Log

CommandPurpose
caco event logShow the command audit event log

caco notify — Notifications

CommandPurpose
caco notify sendCreate a notification
caco notify listList recent notifications
NOTIFICATION_ID="notification-id"; caco notify get "$NOTIFICATION_ID"Get a notification by ID
NOTIFICATION_ID="notification-id"; caco notify ack "$NOTIFICATION_ID"Acknowledge a notification
caco notify ack --allAcknowledge every notification on this node in one request (--project narrows it; --id a,b,c acknowledges several)

caco notify send --json reports missing or whitespace-only titles as structured stdout errors with ok=false and error.code set to missing_argument or invalid_argument.

caco outbox — Cross-Node Write Outbox

CommandPurpose
caco outbox listList outbox entries (pending, delivered, failed)
OUTBOX_ID="outbox-id"; caco outbox show "$OUTBOX_ID"Show details of a single outbox entry
OUTBOX_ID="outbox-id"; caco outbox retry "$OUTBOX_ID"Retry a specific outbox entry
caco outbox flushRetry all pending and failed outbox entries now
OUTBOX_ID="outbox-id"; caco outbox drop "$OUTBOX_ID"Permanently discard an outbox entry

caco decision-point — Decision-Point Rewind Previews

CommandPurpose
caco decision-point rewind --agent-id agent-id --decision-point-id dp-id --dry-runRender a read-only rewind plan from an existing decision-point snapshot; --preview is an alias, --bead-id can assert the expected bead, JSON output includes dry_run:true / would_spawn:false, and non-preview execution is rejected until successor spawning lands

caco secret — Encrypted Secrets

caco secret

Manage encrypted secrets through the local daemon.

caco relay — Relay & Gateway

CommandPurpose
caco relay serveRun the relay/gateway daemon surface in the foreground without resolving hosted-project credentials

Useful for credential-light deploy shapes where a mesh bridge node forwards cluster traffic without needing full hosted-project secrets.

caco service — Native Lifecycle Supervisor

CommandPurpose
caco service statusShow normalized native lifecycle supervisor status (systemd/launchd/supervisord)
caco service showShow canonical native identity and configuration detail
caco service startStart the native lifecycle supervisor entry
caco service stopStop the native lifecycle supervisor entry
caco service disableDisable/unload the native lifecycle supervisor for deliberate manual-startup policy
caco service restartRestart the native lifecycle supervisor entry
caco service loadIdempotently reload/bootstrap an installed-but-not-loaded native lifecycle supervisor entry
caco service logsShow logs from the native lifecycle supervisor

This is for inspecting the native service manager, not for routine daemon convergence. Use caco up/caco down/caco restart for that. caco service status --json reports healthy, health_state, and a repair hint/command when the supervisor is installed but not loaded, inactive, or failed; caco ops check surfaces the same condition for controller alerting. On launchd, caco service load enables the canonical label before bootstrap; bootstrap itself is the load/start operation, so load no longer follows with an immediate kickstart -k that could restart a just-launched supervisor during daemon/TTS/STT adoption. Disabled-label state and bootstrap failures still produce plist/domain-specific diagnostics instead of a generic native-command failure. Use caco service disable instead of raw launchctl/systemctl when the operator intentionally wants manual startup: it disables/unloads the supervisor, treats already-unloaded launchd bootout as success, and prints follow-up guidance to verify status and run caco up --skip-update if daemon/web/TTS services should remain running outside native supervision.

caco prune — Artifact Cleanup

CommandPurpose
caco prune listEnumerate prunable agents and estimated reclaimable space, including legacy logs/session.log capture bytes when present
caco prune runExecute pruning for matching agents (--delete to remove whole directories; automatic and retention pruning ignore agents whose project is absent from the current valid config; --tui-logs --dry-run previews TUI log trimming; --direct-integration-tempdirs --dry-run previews stale caco-direct-integration-* temp checkout cleanup)

caco cron — Scheduled Tasks

CommandPurpose
caco cron listList configured cron entries
caco cron show --name hourly-reviewShow one full cron declaration
caco cron status --name hourly-reviewShow the latest execution receipt, expected cadence, and schedule-derived driver staleness
caco cron logs --name hourly-review --tail 200Tail the bounded durable daemon log without dispatching work
CRON_NAME="hourly-review"; caco cron run --name "$CRON_NAME"Trigger a cron entry on all configured nodes
caco cron check --name hourly-reviewRun the cron's side-effect-free check: command on its target nodes; omit --name to check every cron
caco action check --name deploy-previewRun one action's check: command on the local daemon

Use caco @<node> cron status --name <name> for a node-scoped scheduled driver. Status distinguishes healthy, running, failed, never_observed, and stalled; staleness is derived from the configured cron expression and the latest scheduled execution receipt or durable log activity.

A cron or action may declare check:, a shell command that exercises its prerequisites (identity, SSH key, pinned gh account, secret paths, tools) without side effects. Checks run in the real command's environment with CACO_CRON_CHECK=1 and write no cron receipt. Each daemon re-runs its own cron checks after every served config change and at least hourly, and reports only new failures to the errors feed.

A cron that declares project:, and every project-scoped action, runs as that project: it gets the project's environment (for example SOPS_AGE_KEY_FILE), the same GitHub routing an agent spawn gets, and the configured account's gh credential for the routed host. Inherited gh tokens are cleared and there is no fallback to the node's active account; the check fails when that environment does not resolve.

caco summary — Activity Summary

caco summary --since 3h

Print a high-level activity summary for a time period. Shows bead throughput, agent completions, and notable events. This singular command only accepts --since; recorded session summaries live under the plural caco summaries list / caco summaries show commands.

caco stats — Unified Fleet Stats

caco stats --window 7d --bucket day --json

Show the unified fleet stats aggregate from /api/v1/stats: the compute/storage rollup, per-node sysinfo, token usage by project, and bead throughput (closed-rate plus a closed-bead time-series for charts). Token usage preserves input/output/cache-read/cache-write totals and also reports cached versus fresh input and output. --project / --all-projects scope the throughput section (fleet-wide by default), --node narrows the per-node rows while the compute rollup stays whole, and --window (24h/7d/2w or a bare hour count, default 24h) with --bucket (hour/day) tune the throughput series. --json emits machine output and --gfx renders kitty graphics; the underlying endpoint is read-only and readable at worker and project-controller scope.

caco context-budget — Injected-Context Budget

caco context-budget --project cacophony

Show the per-declaration injected-context budget for a project: the shared AGENTS.md bytes plus each persistent-agent declaration's composed profile-stack bytes, so context-mass growth is visible. Because AGENTS.md is injected into every managed agent it dominates the budget; this read-only view is the companion to the caco ops AGENTS.md soft-budget watch (env CACO_OPS_AGENTS_MD_BUDGET_BYTES). --project defaults to CACO_PROJECT / CACOPHONY_PROJECT / the first configured project; --json emits machine output. Pass --record to also emit each declaration's total as a caco log perf event (component context-budget, metric injected_context_bytes, label = declaration) so injected-context growth is board-visible on a cadence. With --record, add --threshold <bytes> to record declarations whose total exceeds the budget at severity regression (and mark them [OVER BUDGET] in the text view) so context bloat surfaces as a regression rather than plain info.

caco ps — Process Listing

PROJECT="cacophony"
NODE="primary-node"
caco ps --project "$PROJECT" --kind agent --state running --node "$NODE"

List services, sidecars, and agents, with PID/uptime when known. Terminal agents are hidden unless --state is set.

caco ls — Runtime Directories

PROJECT="cacophony"
AGENT_ID="agent-id"
caco ls --project "$PROJECT" --kind agents --agent "$AGENT_ID"

List owned runtime directories and checkout roots. Useful for understanding the on-disk layout of a running Cacophony installation.

caco bd daemon — Standalone Beads Service

CommandPurpose
caco bd daemon serveRun the standalone caco-bd-daemon service in the foreground
caco bd daemon restartRestart only the standalone beads service (independent of main daemon)

caco mcp — MCP Gateway

caco mcp stdio

Start the aggregate MCP stdio server. See MCP Integration for details.

caco update — Self-Update and Companion Updates

CommandPurpose
caco updateInstall CLI; @nodes works after --restart
caco update statusShow current version and available updates; draft matches are labeled (draft). Stable status also reports the selected host platform artifact, platform-gap warnings when a newer release lacks that artifact, and commit-level JSON/text posture for ambiguous semver: current commit, release tag/commit, main commit, compare relations, and same-semver drift warnings.
caco update androidCheck or install the latest configured Android companion APK on explicit updates.android.targets; dry-run/status is the default, --install installs only missing or older packages, --target narrows by configured target name or adb serial, --force permits same-version/reinstall cases, remote-host installs copy the APK to the configured adb host before adb install, and the command never starts emulators or installs to arbitrary attached devices

caco launcher — Launcher Archive

Manage the launcher binary archive for multi-version rollback. When a launcher is promoted from pending to active, the outgoing binary is archived. If health checks fail after a restart, the rollback path walks the archive from newest to oldest until a healthy daemon is restored. The default retention cap is one previous rollback generation; live archived launcher binaries are retained beyond that cap and reported until their process exits.

CommandPurpose
caco launcher listList archived launcher binaries (version, fingerprint, timestamp, and live-process marker; newest first)
caco launcher rollbackRollback to an archived binary (for example VERSION="1.2.3"; FINGERPRINT="abc123"; caco launcher rollback --version "$VERSION" --fingerprint "$FINGERPRINT", or omit both flags for the most recent archive)

caco node — Node Inspection

CommandPurpose
caco node listList configured nodes and their liveness
NODE="example-node"; caco node show "$NODE"Show detailed information for a single node
caco node statusShow node runtime status including services and agents
caco node drain --reason "fleet switch"Before a fleet switch: hold new work on this node, stop each GitHub runner listener once its in-flight job finishes, and park local agents (stop with an off-node WIP checkpoint; pause logical sessions); prints one line, exits 75 while not fully drained, safe to re-run (--dry-run previews)
caco node undrainAfter the switch: start the drained runner listeners, resume exactly the agents the drain parked (once each), then release new work
caco node drain-status --jsonShow this node's drain record and whether it still holds new work
caco node disk --jsonShow local Cacophony-managed disk categories; partial deadline-limited walks keep total_bytes at least as large as the counted top-level category sum, while runtime hot spots such as daemon_checkouts, build_artifacts, test_artifacts, daemon_build_target, tui_logs, and state_branches are split out from generic other

caco foreach — Fleet-Wide Commands

CommandPurpose
caco foreach node statusRun a caco command on every configured node

caco doctor — Diagnostics

caco doctor

Diagnose local and mesh health: daemon, sidecar, beads host/listener reachability, config hash parity, peers, PKI, lifecycle test fake-daemons, stale agents, release-capable GitHub Actions runner health when gh works, and more. Supports --json.

caco doctor feed checks the feed ledger: it scans the active feed JSONL (or --path), reports malformed or non-UTF-8 lines (bounded by --max-findings), and rewrites a damaged ledger only with --repair --yes.

Deep-doctor findings (stale tmux sessions, agent directories, lifecycle locks, config hashes, feed and index counters, performance) are read-only and never run cleanup or restarts. Each finding has a severity, a subject, up to six evidence lines and, where one is safe, a repair command:

caco bisect — Bead-aware Regression Bisect

CommandPurpose
caco bisect start --bead-id <bd> --test-command <cmd> --candidates-file <json>Create bisect state for a bead from a JSON array of candidate commits
caco bisect run --bead-id <bd>Run the next candidate in an isolated worktree and record its good/bad outcome
caco bisect status --bead-id <bd>Show the bisect plan, remaining candidate counts, and guilty-bead links
caco bisect reset --bead-id <bd>Clear bisect state for a bead

Bead-aware regression bisect drives a good/bad search over a supplied set of candidate commits to find the change that introduced a regression for a bead. start takes a required --test-command (exit 0 = good, non-zero = bad) and a --candidates-file (a JSON array of {commit, bead_ids, summary} objects); each run checks out the next candidate in an isolated worktree, runs the test, and records the outcome, narrowing toward the guilty commit and surfacing the bead IDs its message references. status reports progress and guilty-bead links; reset clears the state. Supports --json.

caco microvm — MicroVM Worker Capability

CommandPurpose
CACHE_DIR="$CACOPHONY_DIR/microvm/cache"; caco microvm preflight --cache-dir "$CACHE_DIR"Check whether the local worker node can admit microVM-wrapped transient agents
REPORT="microvm-validation.json"; caco microvm validate --report "$REPORT"Validate recorded microVM agent-isolation evidence for rollout gates
caco microvm node status --name micro-0Report declared persistent full-node microVM launcher state without booting or mutating a VM
caco microvm node up --name micro-0 --variant isolated --dry-runRun full-node launch preparation, variant validation, preflight gating, and boot-harness planning without building or booting
caco microvm node up --name micro-0 --variant isolatedOn a ready Linux/KVM host, launch the persistent node through the boot-proof harness in detached keep-running mode and write launcher state
caco microvm node down --name micro-0Stop a registered persistent full-node microVM without deleting state; safe no-op when nothing is running
caco microvm node destroy --name micro-0 --forceStop any registered runner best-effort and delete the persistent node state directory; without --force it previews only
just microvm-dispatch-integration --execute --json-report /tmp/caco-microvm-dispatch.jsonRun the Docker-free multinode dispatch-lane scaffold on a Linux/KVM host

caco microvm preflight is read-only and provider-neutral. It checks KVM, tun/tap, vsock, cgroup v2, nftables, supported hypervisor binaries such as cloud-hypervisor, and the microVM cache root. Treat ready=false as a placement blocker until the reported remediation hints are resolved.

For the reusable secret-free guest, build .#caco-microvm-agent-image-info and follow its kernel/initrd/rootfs env values. caco microvm node status reports state-dir, preflight, and cert contract without booting. caco microvm node up --dry-run runs launch preparation and tells you whether a real boot would be refused. On a ready Linux/KVM host, caco microvm node up wraps the repo-owned boot-proof harness in detached keep-running mode, records launcher.json, and leaves live boot/readiness details in the boot report; caco microvm node down stops the registered tmux session, runs runner shutdown when present, clears the launcher marker, and leaves state for the next launch; caco microvm node destroy previews by default and deletes that state only with --force. See micro-0 full-node microVM rollout for the current KVM host, boot-proof, and validation steps.

caco microvm validate checks a caco.microvm.validation.v1 JSON or YAML report from a microVM runner. It passes only when:

Reports share one format across Cloud Hypervisor, Firecracker and Kata (RuntimeClass) runs: benchmark phases, denial probes, pass/fail/skip counts and short log excerpts, never secrets. For Kata, one managed agent maps to one pod labelled with its project, node, agent, bead and isolation; secrets stay as projected files or named environment handles; and a fallback reports both the requested kata and the backend actually used. The validator only classifies evidence; it never launches or changes Kubernetes resources.

--template prints a sample report, --report "$REPORT" --output microvm-validation-summary.json writes the summary, and --json prints JSON. A missing --report under --json returns a missing_argument envelope; validation failures exit with code 2.

just microvm-dispatch-integration is the first-party Docker-free two-node dispatch-lane scaffold. It prepares hermetic local git/profile inputs, records Linux/KVM/preflight skip evidence unless --require is used, writes alpha/beta configs and runtime projections, and produces a bounded evidence directory with VM network, asset, execution-plan, and runbook receipts. In --execute mode the current lane reaches daemon-status checks, beads-routing checks, and a hermetic dispatch-enqueue check before stopping explicitly at the remaining worker-pickup/completion boundary; it must not fall back to production ports or external credentials.

caco release — Release Management

CommandPurpose
caco release triggerTrigger a release build
caco release statusShow current release queue status
caco release listList release jobs
RUN_ID="release-run-id"; caco release logs "$RUN_ID"View release job logs
RUN_ID="release-run-id"; caco release cancel "$RUN_ID"Cancel a release job
caco release refreshRefresh release state from upstream
caco release configShow release configuration

Release jobs are reconciled with their real execution after a daemon restart rather than blindly restarted.

caco project — Project Management

CommandPurpose
caco project listList configured projects
PROJECT="cacophony"; caco project show "$PROJECT"Show project details
caco project statusShow project checkout and agent status
PROJECT="example-project"; caco project create "$PROJECT"Create a new project configuration
caco project reintegrate --checkout <path> --reason <r>Land a human/config-only edit made directly in a manual project checkout (manual/project_checkout/*) through the same publish-or-refuse direct-reintegration machinery; gated on a clean worktree, a non-agent branch, and an audited --reason . An operator on a managed agent/... branch is routed to caco agent reintegrate instead.
caco project landAlias for caco project reintegrate.

caco pr — Product Pull Request Worktrees

CommandPurpose
caco pr list [--project project] [--needs-review]List open PRs with explicit ready, draft, conflict, behind-base, check, and review attention states; a blocked PR with zero review requests is reported as review_never_requested rather than generic BLOCKED
caco pr checkout <N> --project projectCreate a managed in-project agent checkout that tracks the existing live PR head (GitHub integration + effective PR backend required)
caco pr adopt --pr <N> --bead-id bd-XXXXXXPlan an isolated exact PR checkout while preserving clean ambient ahead/diverged generations; dry-run emits the required --adoption-receipt, clone records bounded phase/PID/error with exact resume, sync merges main, and push is verified same-PR/non-force only. Repair acquisition may remove a failed ordinary partial only after auditing an exact empty-index/all-HEAD-deleted checkout with no extra bytes or live process; its proof receipt binds the historical operation, old/current base, head, tree digest, no-provider-mutation result, and rollback while operation and registry evidence remain preserved.
caco pr init --repo owner/repo --base main --name slug [--resume]Create or resume a bounded product PR worktree initialization; sibling metadata records phase/PID/error before clone and status prints the safe recovery command
caco pr statusShow managed-checkout/product-worktree branch roles plus forbidden operational-file diagnostics
caco pr apply --path src/file.rs --dry-runCopy allowed product paths into the PR worktree while denying Cacophony runtime/state artefacts by default
caco pr push --title "..." --body-file body.mdPush the product branch and open or reuse a ready-for-review GitHub PR through gh

Publish ready-for-review by default. Drafts are only for source that must not merge yet: explicit operator-requested review/RFC, experiments, or projects whose integration.default_intent is upstream_draft_pr. Pending parent/umbrella acceptance, unrelated CI, or live acceptance are not reasons to draft.

For a deliberate draft, use caco pr push --draft --draft-reason "Operator-requested RFC; do not merge yet" --title "..." --body-file body.md. A non-empty, single-line --draft-reason is required unless upstream_draft_pr supplies the project-intent reason. The reason is recorded in the PR body and publication receipt; caco pr list shows drafts separately, including missing or unavailable reasons. Existing PR readiness is preserved; changing draft state is a separate owner decision.

caco profile — Profile Inspection

CommandPurpose
caco profile listList discovered repo, user, and embedded profiles
PROFILE="worker"; caco profile show "$PROFILE"Show full metadata for one profile
caco profile compose --dry-run worker merge-queuePreview an ordered composed profile stack with provenance rows and composition errors without launching anything; --agent <decl> resolves a declaration's full profile stack instead of hand-listing names
caco profile mcp stdioExpose profile inspection over MCP

caco checkout — Canonical Checkout Maintenance

caco checkout manages disposable canonical project caches. caco checkout status --project <name> distinguishes absent, empty, placeholder, partial, preservation-sensitive, policy-excluded, and valid shapes and prints the exact next action. A controller/operator uses caco checkout refresh --project <name> to atomically materialize a proven-clean shape. Use caco checkout regenerate --project <name> only after inspecting preserved dirty/local-only evidence; it is the first-party repair path instead of raw rm -rf, remote edits, manual reclone, or hand-written live-config repair. In agent contexts mutating subcommands may be hidden; use caco ls --kind checkout for read-only checkout inspection.

caco warmup-cache — Advisory Warmup Cache Inspection

CommandPurpose
caco warmup-cache list --root "$CACOPHONY_DIR" --preview-chars 96Scan warmup-cache/*.json, list valid project/profile/model summaries, and report invalid artifacts or read errors
caco warmup-cache show --key cacophony:worker:gpt-5Filter the scanned inventory to one stable key and report missing-key details when absent
caco warmup-cache list --jsonReturn the normalized request and output envelope for scripts or MCP callers

Warmup-cache helpers normalize generate/list/show/clear requests and can explicitly delete selected cache artifacts through clear plans, but the shipped public CLI branch currently exposes read-only list and show. Treat it as advisory cache inspection, not automatic session extraction, prompt injection, or startup context reuse.

caco fleet — Fleet Snapshots

CommandPurpose
caco fleet snapshotDump nodes, agents, beads, and feed tail into one JSON envelope for postmortem analysis

caco codespace — GitHub Codespaces Nodes

Manage GitHub Codespaces enrolled as Cacophony nodes. Operator shells expose lifecycle subcommands such as new, ls, stop, resume, revoke, remove, rekey, and enroll; agent contexts may hide mutating entries. Read-only inspection adds caco codespace status (the desired-vs-real pool view) and caco codespace reconcile --dry-run (the reconcile plan), both pure inspection over declared codespace_nodes pools with no cloud mutation. caco codespace new --source-repo <url-or-owner/repo> (or CACO_CODESPACE_SOURCE_REPO) selects the Cacophony source cloned/installed during remote bootstrap, defaulting to the upstream repository. There is no shipped caco codespace secret push/list/remove surface yet; use GitHub Codespaces user secrets or the repo-owned container secret-file path documented in the Codespaces guide.

caco stt — Speech-to-Text Diagnostics and Daemon Control

CommandPurpose
caco stt doctorDiagnose local STT setup, configured model/VAD, scribble feature availability, and a self-test transcription
caco stt daemonRun the headless foreground STT daemon; it starts muted by default unless durable runtime state or an explicit startup flag says otherwise. Use --instance <name> for a named daemon (ASCII letters, digits, -, or _ only), --scratchpad-id <note> to override the default transcription:ambient:<instance> marker buffer, and --transcript-max-entries / --transcript-max-bytes to bound the local JSONL transcript buffer (defaults: 1000 entries and about 1 MiB). Startup refuses duplicate live instances or responsive leftover control ports, while stale dead PID/port files are cleaned before relaunch.
caco stt daemon status / logsInspect the headless STT daemon process/control-port liveness and recent log output; pass --instance <name> for named instances.
caco stt statusShow runtime mute/capture state, transcript cursor, transcript entry/byte counts, scratchpad, log, and transcript paths; pass --instance <name> for named instances.
caco stt mute / unmute / toggle-muteControl whether ambient capture is allowed; muted means no capture child should be running
caco stt diff --cursor <n> --limit <n>Read transcript entries after a cursor so listener/router agents can poll deltas without rereading the whole buffer; profiles must still apply their own instruction-auth policy

caco ambient-narration — Ambient Narration Controls

CommandPurpose
caco ambient-narration statusRender the current ambient narration state and compact control-panel summary; add --json for structured status/panel output.
caco ambient-narration enable --cadence-secs 30 --verbosity compactApply an enable request to the ambient narration config projection, clamping cadence to at least one second and normalizing verbosity.
caco ambient-narration disable --reason "quiet window"Disable ambient narration and include the operator-facing reason in the rendered status.

caco timeline — Activity Timeline

Aggregates commit/changelog/bead activity. Defaults to 48h or 100 commits; tune with --max-age-hours, --min-commits, --limit, and PROJECT="cacophony"; caco timeline --scope project --project "$PROJECT". --json errors return envelopes.

caco summaries — Session Summaries

CommandPurpose
caco summaries list --agent "$CACO_AGENT_ID" --limit 20List recorded summaries, newest first
caco summaries next-index --agent "$CACO_AGENT_ID"Compatibility helper to preview the next zero-padded summary/<NNNN>/ index; daemon state-branch publication assigns final indices for ordinary direct summaries
caco summaries show --agent "$CACO_AGENT_ID" --index "$SUMMARY_INDEX"Show one parsed session summary

summaries list and summaries show use a bounded CLI HTTP client (20-second request budget plus a short connect timeout) so a slow or unhealthy summaries endpoint returns a retryable summaries-specific error instead of hanging the terminal. When the daemon health probe still succeeds, startup/context-rehydration errors include a local managed-checkout fallback hint for .cacophony/agent/.../summary/*/summary.md.

caco operator-actions — Operator-Required Tasks

CommandPurpose
caco operator-actions listList open beads tagged [operator-action], sorted by age

caco tendril — Tendril-Adjacent Operator Helpers

caco tendril watch watches recorded-summary screenshot artefacts (.cacophony/agent/*/summary/*/screenshots/*) across runtime agent checkouts, supports --project and repeatable --agent filters, skips already-present images unless --include-existing is supplied, and renders new or updated screenshots inline with kitten icat when available. Actual computer-control actions still use the separate tendril CLI (tendril list --json, WINDOW_ID="window-id"; tendril capture --window "$WINDOW_ID", DSL='hold(ctrl),c,release(ctrl)'; tendril run --window "$WINDOW_ID" "$DSL") or managed Pi Tendril MCP tools (tendril_list, tendril_capture, tendril_run, tendril_listen). For visual audits, list targets immediately before acting, capture before input, run one small Tendril action with waits, then capture again to verify the result. Preserve the JSON error envelope when capture fails: a target can be listed with capture=true while Wayland xdg-desktop-portal or another platform screenshot backend still times out or denies capture.

caco bootstrap — Developer Onboarding

CommandPurpose
caco bootstrap devRun first-run developer onboarding; bare invocation chains check, config init, daemon start, sandbox creation, and demo bead unless narrowed with flags such as --check

Node-Aware Transport Helpers (cacophony-spec section 8.1.2)

Canonical wrappers around SSH-family transport that resolve node connection details from config:

CommandPurpose
NODE="example-node"; caco ssh "$NODE"SSH to a configured node using resolved host, port, user, and key with strict host-key verification
NODE="example-node"; caco ssh "$NODE" --enroll-host-keyScan and enroll a static OpenSSH host key only when it exactly matches the operator-audited ssh.host_key_fingerprint
NODE="example-node"; caco mosh "$NODE"Mosh to a configured node (uses SSH metadata for --ssh= flag)
NODE="example-node"; REMOTE_PATH="/var/log/caco.log"; LOCAL_PATH="./caco.log"; caco scp "$NODE:$REMOTE_PATH" "$LOCAL_PATH"SCP with node-aware endpoint resolution

All three commands support --print to show the resolved command without executing, and --json for structured output. Static OpenSSH commands never auto-accept unknown keys. Configure nodes[].ssh.host_key_fingerprint with an independently verified OpenSSH SHA-256 fingerprint before enrollment; a scan mismatch changes nothing. Noninteractive @node status/update/restart routing runs a bounded BatchMode=yes no-op preflight first, reports typed askpass, unknown-key, changed-key, network, authentication, or remote-command failures, and starts no requested update when preflight fails. Interactive caco ssh may still use the operator TTY for authentication but retains strict host-key checking. When these helpers or the @node shorthand run a first-party remote caco command, the remote shell string is prefixed with exec so the login shell is replaced by the managed child instead of lingering under sshd-session after the command exits.

These helpers are valid for static nodes whose config includes a host field and optional ssh metadata. They also have a first-party GitHub Codespaces exception: caco ssh cs-<hash> resolves the derived Codespace node ID through caco codespace ls and delegates to gh codespace ssh. Other dynamic/container nodes fail with a clear error unless their template declares an explicit SSH transport contract.

Operator Access for Dynamic/Container Nodes

Dynamic and container nodes (those matching a dynamic_nodes template) do not imply SSH reachability. There is no sshd or authorized_keys path on these nodes by default. SSH-based commands (caco ssh, caco mosh, caco scp, caco tui --node) fail explicitly when targeting a generic dynamic node, with an error message explaining the supported alternatives. GitHub Codespaces are the explicit exception: caco ssh cs-<hash> and caco @cs-<hash> tui use gh codespace ssh after resolving the live Codespace name from caco codespace ls.

Supported inspection and debug paths

MethodHow
Daemon HTTP APIcaco status --json or a local/secured daemon endpoint — prefer the first-party CLI and avoid exposing plaintext HTTP outside trusted loopback/debug networks
Agent logsAGENT_ID="agent-id"; caco agent logs --id "$AGENT_ID" — fetches logs via the daemon API, works for remote agents
Agent statusAGENT_ID="agent-id"; caco agent status --id "$AGENT_ID" or caco agent list — cluster-wide status via the daemon; direct status reads refresh newer persisted agent.json state before responding and can surface optional lineage_metadata plus tagged-enum placement_reason when present. Add --lineage-filters or --lineage-participant/--lineage-transition/--lineage-source/--lineage-reason to render the read-only lineage-chain summary, persisted lineage filter options, and filtered lineage records.
Agent replayAGENT_ID="agent-id"; caco agent replay --id "$AGENT_ID" --since 1h --grep test — read-only parsed structured-session-log timeline text/JSON viewer; uses log-style since/until/grep/line filters and does not attach to panes or write replay artefacts.
Reintegration previewAGENT_ID="agent-id"; caco agent reintegrate --id "$AGENT_ID" --preview — exits before hooks, merge, state publication, or ref publication; renders codeowner preflight when present, builds a bounded git dry-run artifact summary from the checkout and target ref, evaluates the deterministic hook gate, and includes preflight data in JSON output.
Explicit-checkout publicationcaco agent reintegrate --id "$AGENT_ID" --project project --checkout /managed/isolate --dry-run emits a receipt bound to first-party metadata or same-git-common-dir ownership, exact bead, allowed operational paths, actual branch/HEAD/path, and target HEAD; a blobless/promisor source must first resolve a distinct authoritative object remote, and direct integration uses a filtered remote seed plus an exact local-head promisor fetch without hydrating whole history. Real --mode direct --backend local_merge must pass that exact --checkout-receipt, and drift fails before publication. Multi-assigned metadata-less workers also pass authoritative --bead-id.
Agent placement previewcaco agent new --profile worker --node-selector least_overloaded --dry-run — renders the would-request placement metadata, endpoint, passthrough args, selected/ready/blocked node readiness rows plus deterministic readiness text, and daemon/spawn skipped flags without contacting the daemon or starting an agent; pure helpers can derive a non-persisted placement reason from the selected dry-run plan. --preview is an alias. Real spawns support --async for accepted-before-ready launch and --sync for historical readiness waiting; Pi/debug-shell starts default to async unless forced.
Dispatch placement previewcaco bd dispatch --bead-id --dry-run — renders the would-request bead dispatch and placement readiness metadata/text without claiming the bead, contacting the daemon for spawn, or starting an agent; --preview is an alias.
Container platform logsUse your platform CLI to inspect container stdout/stderr (e.g. az containerapp logs show, docker logs, kubectl logs)
Private Kubernetes execKUBE_CONTEXT="example-aks"; caco "@cluster:${KUBE_CONTEXT}" status --json, caco "@cluster:${KUBE_CONTEXT}" tui, or caco "@cluster:${KUBE_CONTEXT}/cacophony" bd list --project cacophony --status open --limit 20 run in-pod caco; tui needs a real TTY.
TUI (local node)The TUI receives replicated state from all nodes including dynamic ones — agent status, bead state, and messaging are visible without SSH
Messagingcaco msg send / caco msg broadcast — dynamic nodes participate in the cluster messaging system normally

What does not work for dynamic nodes

Future work

Generic SSH or platform-exec transport for arbitrary dynamic/container nodes remains future work. The current @cluster:<kube-context>[/namespace] target is Kubernetes-specific private exec, and the Codespace path is GitHub-specific gh codespace ssh routing; broader support should use an explicit remote-exec transport contract, not silently assume container sshd. See cacophony-spec section 8.1.2 and cacophony-spec section 6.5.9.

caco version — Version

caco version

Print the caco version. Supports --json for structured output.

caco hooks — Webhook Ingress

caco hooks list
caco hooks show <scope>/<id>
caco hooks test <scope>/<id> --body ...

Inspect configured webhook ingress handlers (tokens redacted) and invoke one locally, bypassing HTTP. Distinct from project lifecycle hooks automation; see the webhook ingress contract.

caco link — Link Artifacts

caco link add --url ...
caco link list / show / search
caco link update / delete / sync

Manage first-class URL/link artifacts with bounded metadata, bead/agent associations, and freshness. Internal cluster-API URLs are refused in user-facing url fields.

caco plans — Plans

caco plans list / show

Inspect bead-linked plans surfaced across web/macOS/Android/iOS detail views.

caco search — Search

caco search <query>

Cross-surface bead/content search backed by the daemon search index.

caco suggest — Operator Suggestions

caco suggest list / show

Read node-local suggestion sets; suggesting never runs anything and each option runs at most once. Backed by the daemon /api/v1/suggest* endpoints.

caco remediation — Remediation Status

caco remediation status --json

Show current agent/queue remediation diagnostics (idle, stuck, zombie, rate-limited, frozen).

caco pi / caco pico / caco codex — Runtime Backends

caco pi       # launch a managed Pi agent runtime
caco pico     # launch a managed Pico agent runtime
caco codex    # launch a managed Codex runtime
pico          # launch the separate unmanaged standalone Pico TUI

Runtime-backend entrypoints. caco pico --managed remains a no-op compatibility alias for caco pico; the daemon's internal --managed --host <socket> activation still starts the embedded backing host rather than recursively creating another agent. Interactive Pi-family launches open the accepted agent ID in standalone chrome immediately, show a starting placeholder while runtime and attach metadata continue asynchronously, and promote the same pane from daemon snapshot/SSE state. JSON and non-interactive callers receive the accepted result for status or later attach.

caco pi-daemon — Standalone Pi SDK Host

caco pi-daemon status

Read-only probe of the separately supervised, opt-in Pi SDK host through the local daemon. Unconfigured nodes report configured: false; configured nodes report independent bounded socket, authenticated API, and embedded Dashboard reachability, nonsecret URLs, readiness, host instance, event, and session counts or typed retryable failure without exposing bearer contents, credentials, prompts, or output. Remote-node inspection uses ordinary caco @node pi-daemon status routing. The internal caco pi-daemon serve entrypoint is lifecycle-owned and starts the optional API and Dashboard in that same supervised process, not an ad-hoc web process.

caco chat / caco inbox — TUI Shortcuts

caco chat
caco inbox

Shortcuts into the TUI runtime focused on chat or inbox, not separate frontends.

caco macos — macOS Companion

caco update macos --dry-run / --install

Pull, sha256-verify, and install the macOS companion app from the matching release.

caco supervise / caco token

caco supervise            # native lifecycle supervisor loop

Lifecycle supervisor entrypoint and node-token material (see caco service and the release docs).