Agent Profiles

Profiles define agent behavior: prompts, hooks, environment defaults, and reintegration policy. The canonical format is Markdown with YAML frontmatter. Profiles are runtime-agnostic by default; runtime-specific limitations are enforced through explicit feature compatibility checks, not profile-level allowlists.

Profile Format

---
name: worker
description: Implement the next ready bead.
skills: []
mcp_servers: []
permission_mode: bypassPermissions
memory: project
hooks:
  on_start:
    - type: command
      command: caco agent status set "starting"
      timeout: 10
  post_tool_use:
    - matcher: "Bash|Edit|Write"
      hooks:
        - type: command
          command: caco msg speak "Continuing work"
          timeout: 5
reintegration:
  mode: direct
---

Implement the assigned bead, validate it, and report completion.

Profile Fields

Frontmatter

FieldTypeDescription
namestringProfile identifier (e.g., worker)
descriptionstringHuman-readable description
agent_typesstring[]Deprecated legacy metadata. It is shown for inspectability only and does not restrict which first-party runtime may spawn the profile.
skillsstring[]Skill references
mcp_serversstring[]MCP server references
permission_modestringPermission model
memorystringMemory scope (project, global)
hooksobjectHook definitions by phase. Matchers are pipe-separated exact tool names such as Bash|Edit|Write|NotebookEdit; absent tool context does not match. Hook timeout values are enforced by terminating timed-out commands. Codex-backed profiles that declare hooks are bridged with Codex hook features enabled so the runtime exposes /hooks, lists untrusted or modified hooks, and blocks untrusted hooks until reviewed.
reintegrationobjectReintegration policy. Fields: mode (one of direct, pr_auto_merge, pr_review, pr_submit, artifact_only, none), optional allowed_modes (string[]) restricting which modes the agent may pass at completion time, optional push_tags, optional auto_rebase_retry_limit, and optional dry_run_gate. Modes can carry the ,recorded suffix to require a session-recording summary artefact.
reintegration.dry_run_gateobjectPure configuration for future dry-run-preview hook gates. require_clean defaults to false; stage accepts before_reintegration or before_complete; on_missing accepts block or warn. Validation warns when the gate is a no-op and errors when a strict missing-preview gate is paired with auto_rebase_retry_limit: 0.
disallowedToolsstring[]Claude-runtime tool blocklist. Bridge layer adds these to the runtime's allow/deny configuration so read-only profiles (e.g. bead-drafter, narrator) cannot invoke mutating tools (Edit, Write, Bash). Composes additively with the entries the bridge derives from banned_modes.
typestringRuntime hint (e.g. pi, claude, codex). When set, the daemon prefers the matching runtime when launching this profile; omitted profiles are runtime-agnostic and dispatched per the project default.
environmentmap<string, string>Alias for env retained for compatibility with older inline-config profiles. Prefer env for new profiles.
restartstringPersistent-agent restart policy: failure (default), always, or never. See Persistent Agent Restart Policy.
stop_hook_delayintegerSeconds the daemon waits after firing on_stop hooks before forcibly terminating the agent process. Lets nudge / save / unclaim hooks finish cleanly.
persistentboolWhether the agent runs indefinitely (default: false). Persistent agents typically use reintegration: { mode: none } and live across reboots; the daemon reuses the same checkout instead of completing the agent.
banned_modesstring[]Modes the agent must not enter (e.g., plan)
authorizationobjectAuthorization scope ceiling. Field scope takes one of worker (default: own lifecycle and bound-project surfaces only), project_controller (per-project orchestration: spawn/stop/coordinate agents within bound project), or cluster_controller (cluster-wide: cross-project bead filing, fleet-wide remediation). Daemon-enforced; profiles cannot escalate beyond their declared scope. See Authorization Scopes.
watchdogobjectWatchdog timeout configuration
stop_nudge_textstringText shown when a stop-hook nudges a non-terminal agent
git_remotesmap<string, string>Named git remotes to configure in agent checkouts (e.g. github: ssh://git@github.com/org/repo.git). Added via git remote add after checkout creation so agents can push directly.
shell_rcstringInline shell init content sourced into agent sessions. Layered by concatenation: global → project → profile. Must be shell-agnostic (bash and zsh).
include_caco_instructionsboolWhether to embed canonical role-appropriate Cacophony instructions (default: true): common guidance plus the resolved one-shot worker or persistent-worker layer, while controller scopes receive common guidance only. Set to false only for a fully custom profile that owns every required tool, safety, and lifecycle instruction.
stale_timeout_secsintegerPer-profile override for how long a live agent can go without tool activity before a no-tool-activity advisory is recorded. It does not by itself transition a live tmux/runtime session to stale. Falls back to the global agents.stall_timeout_secs when omitted.
reintegration_checksobjectAutomated pre-reintegration validation gate. Fields: rebase_check (bool), test_command (string), check_command (string, e.g. cargo check --workspace --tests), clippy (bool), abort_on_failure (bool). Env overrides: CACO_REINTEGRATION_TEST_CMD, CACO_REINTEGRATION_CHECK_CMD, CACO_REINTEGRATION_CLIPPY.
hook_mixinsstring[]Named hook mixin scripts to compose into the profile's hook pipeline (e.g. fast-test-gate).
envmap<string, string>Extra environment variables exported into the agent process. Layered after global and project env.
message_subscriptionsobject[]Per-profile inbox subscription rules (kinds, project filters) used by caco msg delivery.
commsobjectPer-profile messaging defaults (e.g. allowed broadcast scope, narration verbosity).
model / provider / effortstringOverride the agent runtime's model selection, provider, and effort/quality knob. Used by Claude/Codex/Pi bridges.
lifecycleobjectWorker-lifecycle policy: claim mode, completion behaviour, restart policy. See WorkerLifecycle.
composesstring[]Profiles loaded before this one, transitively and once each (a cycle is an error). The stack then merges by field type: prompts and hook lists concatenate, lists deduplicate, env lets later profiles win, and policy singletons must agree.
composes_well_withstring[]Advisory metadata: profiles known to compose cleanly with this one. Resolver does not enforce; informs operators and profile-creator suggestions.
completionobjectCustom completion criteria (e.g. exit codes, file presence) consumed by the lifecycle layer.
nudgesmap<string, object>Named nudge specs the watchdog can post into the agent pane on idle / stale conditions.
permitted_actionsstring[]Whitelist of high-level operator-action verbs the agent is allowed to invoke (subset of the full action catalog).
allowed_lifecycle_operationsstring[]Lifecycle verbs (complete, discard, reintegrate, restart) the profile may run on itself or other agents.
cross_project_bead_permissionsobject[]Per-other-project bead-mutation grants (e.g. controller agents updating beads in projects they don't own).
background_imageobjectBackground image source for surfaces that render an agent backdrop (TUI badge, web detail, android).
voicestringPer-profile TTS voice override (e.g. nova, sage); narration and message-speak default to this when set.
initial_promptstringInline first user-turn message injected after agent setup, before main work.
pi_extra_config_dirsstring[]Additional Pi config directories to include when launching a Pi-backed agent (skills, prompts, themes).
override_pi_agent_dirstringRead-only operator-owned Pi agent directory passed directly to Pi instead of materializing managed .pi-agent configuration.
warmup_cache_injectionobjectDisabled-by-default advisory warmup-cache prompt policy. Optional fields are exactly enabled, max_age_seconds, and max_chars; unknown keys are rejected, default policy values are false, 86400, and 2048, and age/character budgets are clamped to at least 1 when materialized. The map merges as a singleton after composed profiles; later profiles override earlier profiles, and profile values overlay project defaults per subfield. This policy can permit bounded, labeled startup hints from matching cache artifacts but does not authorize live session extraction or arbitrary prompt injection.
short_name_strategystringControls how short / spoken names are derived for agents using this profile. Defaults to adj_noun when omitted.

Cross-project bead permission mixins are intentionally explicit. cacophony-bead-scope grants least-privilege Cacophony-only mutation for orchestration/runtime follow-up work, while global-bead-scope grants create/update/claim/close permissions across all currently configured projects for dedicated global board triage or repair roles. Composing multiple bead-scope mixins intersects their grants rather than unioning them, so use one scope mixin at a time unless the intersection is intentional.

Release skew. Daemons resolve shipped profiles from the default branch, which can be newer than the release they run. At runtime, a value outside that release's closed vocabularies (reintegration modes, MCP servers, permission modes, hook mixins, authorization capabilities, message subscriptions, lifecycle operations, bead actions, and inbox sender classes) is ignored with a one-line daemon warning instead of failing the profile, and an allowlist left empty denies everything. Scalars whose default would be broader, such as authorization.scope, stay strict. caco config validate stays strict too, and repository validation rejects a shipped profile that uses a value caco_profile::vocabulary::VOCABULARY_INTRODUCTIONS records as newer than the workspace release: land the code first and change the profile after the next release ships.

Body

The Markdown body after the frontmatter contains prompt material and instructions for the agent.

Spawning with --profile dev expands dev's composes list first: base, pi-model-selection and github are loaded before dev, each once, in dependency-first order, and a cycle is an error. The resulting stack base, pi-model-selection, github, dev is merged by field type: prompts are concatenated in order with a header naming each profile, hook lists are concatenated per phase, lists such as args, skills and MCP servers are concatenated without exact duplicates, environment maps let later profiles win, and singleton policy fields must agree or composition fails. caco profile compose --dry-run shows the result and where each field came from.
Compositioncomposes is expanded dependency-first, then each field type merges by its own rule; caco profile compose --dry-run shows the outcome.

Hook Phases

PhaseWhen It Runs
on_startAfter agent setup, before main work
on_stopWhen the agent is being stopped (can nudge non-terminal agents back to work via stop_nudge_text; respects stop_hook_delay)
on_session_endWhen the agent session ends (can block premature exits by emitting a non-zero hook decision)
on_notificationWhen the agent receives a notification (inbox arrival, watchdog wake, choice resolution)
post_tool_useAfter each tool invocation (supports matcher filters)
before_toolBefore each tool invocation
after_toolAfter each tool invocation
before_completeBefore completion is recorded
before_reintegrationAfter before_complete succeeds but before git merge/PR operations. Intended for pre-merge validation (config validate, template linting). Failures block reintegration.
on_merge_commitAfter successful merge commit (non-fatal)
on_completeAfter successful completion
on_failureAfter a failure

Hook Entry Structure

hooks:
  on_start:
    - type: command                 # Required: action type
      command: caco bd claim        # For type=command
      timeout: 10                   # Optional: timeout in seconds
  post_tool_use:
    - matcher: "Bash|Edit|Write"    # Optional: limit to matching tools
      hooks:                        # Nested hooks
        - type: command
          command: caco msg speak "Continuing"
          timeout: 5

Hook Action Types

Currently supported:

Unknown action types are rejected at validation time, not silently dropped. Tool matchers use pipe-separated exact names; nested matcher groups skip all child hooks when the current tool is absent or does not match. Codex-managed profiles use Codex’s own trust surfaces: operators may persist [hooks.state."<hook-key>"].trusted_hash in config or define managed hooks in requirements.toml with [features].hooks = true and [hooks].managed_dir; Cacophony does not silently forge trust for non-managed hooks.

Reintegration Modes

ModeBehavior
directLand without review: a squash merge into the target with backend: local_merge, or a PR with GitHub native auto-merge armed with backend: pull_request
pr_auto_mergeOpen PR, merge when allowed
pr_reviewOpen PR, stop after reporting
pr_submitPublish one ready PR on a stable per-bead head, record it on the beads, and stop
artifact_onlyRecord branch/commits without merging
noneNo reintegration (read-only agents like controllers and analyzers)

Modes can be composed with the recorded suffix (e.g. direct,recorded) to require a session-recording summary artefact at .cacophony/agent/<id>/summary/<NNNN>/summary.md before the merge proceeds. See the session-recording mixin.

Project config can also set projects[].integration.default_intent and projects[].integration.backend. For example, a profile whose default mode is pr_review opens a review PR by default, while backend: pull_request lets even direct/review intents use the declared fork/upstream topology rather than ad hoc checkout remotes.

Agent Compatibility

The canonical profile format is Claude-style (Markdown + YAML frontmatter). Agent types that don't natively consume this format are supported through bridges:

TierDescriptionAgent Types
Tier 1Direct profile consumptionClaude-compatible agents
Tier 2Bridge layer adapts profileCodex, Pi
Single Source The canonical profile remains one Markdown-plus-frontmatter artifact. Bridges adapt the canonical package into agent-specific launch args. Profiles are not forked per agent type, and spawn is not gated by profile-level runtime allowlists.

Example: Default Agent Profile

---
name: agent
description: General-purpose Cacophony agent.
hooks:
  on_start:
    - type: command
      command: caco agent status set "starting"
      timeout: 10
  on_complete: []
reintegration:
  mode: direct
---

You are a Cacophony agent. Follow the project conventions,
implement assigned work, validate with tests, and report completion.

Example: Bead Implementer Profile

---
name: worker
description: Claim and implement the next ready bead.
hooks:
  on_start:
    - type: command
      command: caco bd claim
      timeout: 10
  on_complete:
    - type: command
      command: 'caco bd close "${CACO_BEAD_ID:?set bead id}"'
      timeout: 10
reintegration:
  mode: direct
---

Claim the next ready bead, implement it following the project spec,
run tests, commit with the bead ID, and report completion.

Validation belongs to branch protection and CI: there is no daemon reintegration gate, and a PR merges only once its required checks pass. See the delivery model.

Embedded Profiles, Flows and Pi Overlays

The caco binary embeds the checked-in .cacophony/profiles catalog, the Cacophony project flows and the .cacophony/pi overlays at build time, so an agent needs no Cacophony canonical checkout to compose its profile. A profile's pi_extra_config_dirs entry that names a canonical-checkout overlay is materialized from the binary into <agent>/pi-overlays/<name> at spawn, relaunch and refresh, replacing stale files; any other entry, such as a developer's own worktree overlay, is used as written. caco profile list and caco profile show report which repository, user or embedded source each profile came from.

Config-Based Profiles

Profiles can also be defined inline in config.yaml:

profiles:
  - name: agent
    hooks:
      on_start:
        - type: command
          command: caco agent status set "starting"
          timeout: 10
      on_complete: []
    reintegration:
      mode: direct

Persistent Agent Restart Policy

Persistent agents support a granular restart policy that controls when the daemon auto-restarts the agent after it exits:

PolicyBehavior
failure (default)Restart only on failure/crash. Does not restart after operator stop or pause.
alwaysRestart on any non-running state (failure, stop, pause, daemon restart).
neverNever auto-restart.

The restart policy is set on the persistent agent declaration itself, often inside a projects.yaml entry (for this repository, in the separate cacophony-config repository) under projects.<project>.agents.persistent:

projects:
  cacophony:
    agents:
      persistent:
        my-agent:
          imports:
            - agents/persistent.yaml
          profile:
            - technical-writer
          restart: failure         # failure | always | never
          restart_backoff_secs: 30 # minimum backoff between restart attempts

Composed reintegration policy carries mode, allowed_modes, push_tags, auto_rebase_retry_limit and dry_run_gate, each taken from the most specific profile that sets it.

To see how a stack resolves without launching anything, run caco profile compose --dry-run <profile>… (or --agent <declaration>). Each field shows its value, the profiles that contributed and the merge rule used: concatenation, union or intersection for lists such as skills and MCP servers, last-wins for maps and scalars, and must-agree fields flagged when profiles conflict. --summary-only shows just the counts; --show-prompt adds the composed prompt.

Shared agent snippets under agents/ in the config repository are role-scoped rather than one universal persistent stack.

SnippetCompose it for
pi-common.yamlPi runtime mixins
base.yamlworkers that inherit reintegration, session-recording and lifecycle guidance
persistent.yamlendless dev workers that keep generic worker-pool behaviour
persistent-specialist.yamllong-lived specialists whose role profile owns their work selection; adds the persistent-specialist guard, so surface owners such as caco-vm reintegrate scoped work without draining the generic queue
persistent-observer.yamlobservers and controller-style agents that may have no bead; adds the persistent-observer guard and must not import base.yaml or persistent.yaml, so they never get worker-only completion instructions
log-monitor.yaml and other role snippetsthe final composition of that role
default-codex.yaml, codex-dev.yamlpersistent dev declarations on the Codex runtime with the shared dev, auto-claim and session-recording stack

Git Remotes

Profiles can declare named git remotes that the daemon automatically configures in agent checkouts after creation:

---
name: update-helper
git_remotes:
  github: ssh://git@github.com/org/repo.git
---

This eliminates the need for agents to manually run git remote add. The agent can immediately push via git push github main. When multiple profiles are composed, remote maps are merged with later profiles winning on key conflict.

Shell RC

Profiles can include inline shell initialization content that is sourced into every agent shell session before the runtime launches:

---
name: worker
shell_rc: |
  gh() { if command -v gh >/dev/null 2>&1; then command gh "$@"; else echo "gh not available"; fi; }
  export EDITOR=vim
---

Shell RC content is layered by concatenation across config levels: global shell_rc → project shell_rc → profile shell_rc. Later layers can override earlier functions. Content must work in both bash and zsh.

Persistent, One-Shot, Composite, and Mixin Profiles

Profile lifecycle and runtime-stack guidance has moved to Profile Lifecycle and Runtime Stacks to keep lifecycle guidance separate from routine field and shipped-profile reference updates. In short: one-shot workers claim and finish one bead, interactive composites wait for operator direction, persistent specialists/observers run indefinitely under role-scoped snippets, and mixins add behavior through composes without becoming standalone launch targets.

The companion page covers compact autonomous role guidance, daemon-native heartbeat/direct delivery, retired compatibility mixins, intentional pi-home-override, and supported prompt/resource refresh without disturbing operator sessions.

Shipped Profiles

ambient-modeAmbient-mode persistent agent profile for managed Cacophony runtimesYesdirect auto-claimLet idle implementation workers take ready work in their authorized lane, including small related batches, without waiting for an operator…Nonone baseShared guidance for every managed agent: judgment, first-party tools, ownership, validation, delivery, communication, and securityNonone bead-drafterBead drafter profile for first-party Cacophony runtimesNonone bead-dreamerPersistent bead dreamer profile for managed Cacophony runtimesYesnone bead-filerPersistent operator-driven bead-filing assistant: a conversational observer the operator talks to (via caco msg / chat) to file specific beads in any projectYesnone caco-androidPersistent Android companion build/drive/improve agentYesdirect caco-doctorDiagnostic-and-repair agent paired with caco doctor for local and peer health issuesYesdirect caco-iosPersistent iOS + Apple Watch companion build/drive/improve agentYesdirect caco-ios-releaserDedicated iOS + Apple Watch TestFlight release-cadence agent on the ms-mac macOS builderYesdirect caco-macosPersistent macOS worker profile for end-to-end Tendril-driven Cacophony improvement work on a configured macOS hostYesdirect caco-macos-releaserDedicated macOS desktop-app GitHub-release-cadence agent on the ms-mac macOS builderYesdirect caco-mobileLow-power/mobile-host mixin for managed Cacophony workersNonone caco-profileSpecialist that authors and updates high-quality profiles from the current profile schema and conventionsYesdirect caco-releaseLegacy one-shot patch release agentNodirect caco-surfacesComposable mixin that reminds agents to consider all three Cacophony user-facing surfaces (TUI, web dashboard, Android companion app) when implementing new features or fixing bugsNonone caco-transcriptionPersistent transcription-quality improvement agent for Cacophony speech surfacesYesdirect caco-tuiPersistent, Tendril-driven Cacophony TUI improvement profile for a configured UI-capable hostYesdirect caco-vmPersistent virtualization and dynamic-compute rollout owner for the cacophony projectYesdirect caco-wearableCompanion app domain expertYesdirect caco-webPersistent caco-web improvement agent for browser-dashboard UX, Playwright observation, focused bead filing, validation, and reintegrationYesdirect cacophony-bead-scopePersistent-agent mixin granting least-privilege cross-project bead filing into the Cacophony project for orchestration/runtime follow-up…Nonone cacophony-fast-testsCacophony-specific reintegration-policy markerNonone cacophony-queue-workerCacophony worker handoff follows typed project integration, not a profile-selected provider or manual receipt procedureNonone changelog-managerMaintains CHANGELOG.md with human-readable release-tag summariesYesdirect choicesComposable mixin profile that adds interactive multi-choice capabilitiesNonone chutzpahCommunicate directly, think independently, and prefer useful action over performative caution or agent-to-agent ceremonyNonone cluster-debuggerCluster-level debugger for cross-node command execution, logs, replication, and service issuesYesdirect collab-modeIdle-mode mixin for dev workers to discuss, hunt bugs, improve tests/perf, or prototype safelyNonone config-helperPersistent config-helper agent profile for managed Cacophony runtimesYesdirect controllerCluster health and recovery coordinator; act on current evidence and route repairs autonomously within the configured scopeYesdirect corpus-compactorPersistent corpus maintainer that keeps AGENTS.md and the wider doc corpus lean — archiving accreted incident lore to…Yesdirect ctxFleet ctx context for Cacophony agents: read the Cacophony inventory mirror and keep reusable agent, project, and machine state currentNonone devMulti-task implementation worker: deliver directed work autonomously and use composed work-selection and project delivery policy between…Nodirect endlessKeep a persistent runtime alive between tasks; the host role selects work and the effective project policy selects publicationYesdirect filerBead filer profileYesnone flow-integratorReviewed run-scoped integrator that serially follows each published PR to its native auto-merge outcome, performs lease-fenced conflict…Nonone flow-residentPersistent lifecycle marker for resident typed-Flow participants whose concrete role owns its work and tool permissionsYesnone generalistGeneral-purpose interactive agent for operator-directed implementation, coordination, and reintegrationYesdirect gh-pagesGitHub Pages site maintainerYesdirect git-checkRetired compatibility name; update the working base when the task needs it, not after tool callsNonone githubCapability-only self-owned GitHub recovery contract; ordinary owner PR maintenance and audited recovery without a separate manual approval…Nonone github-read-budgetConserve shared GitHub quota without mistaking cached observations or failed reads for current provider stateNonone global-bead-scopePersistent-agent mixin granting bead-only access across all current and future projects without elevating the agent to cluster_controller…Nonone imagesComposable mixin that adds image generation capabilities via the caco image generate toolNonone interactiveDefault persistent Pi workspace profile for operator-driven interactive workNonone ios-devGeneric iOS/watchOS developer profile for arbitrary projects on a macOS/Xcode hostNodirect light-devLightweight persistent development profile for low-power Pi/mobile nodesYesnone log-monitorPersistent per-node log monitor for recent daemon, TTS, and agent-session anomaliesYesdirect maintenance-auditorFresh-checkout native and Nix validation sweep with policy-owned repairsNonone maintenance-fixerFlow-owned project maintenance fixer using ordinary project reintegrationNonone merge-queuePush, open one PR that GitHub native auto-merge lands behind the required check, and move on; there is no queue engine or second merge…Nonone narratorNarrator profile for managed Cacophony runtimesYesnone observer-global-bead-scopeCross-project bead evidence scope for persistent observers: read, file, and update findings without implementation ownership or arbitrary…Nonone operatorFleet operator-proxyYesdirect pebbleOperator-directed voice controller; resolve context, act, and carry requested work through completionYesdirect persistent-observerObserver-role guard for persistent agents that should observe, file, and report without inheriting worker…Nonone persistent-specialistGuard for long-lived specialist workers whose concrete role profile owns work-selection and lifecycle wording, so generic worker-pool…Nonone personalizationMinimal operator personalization mixinNonone personalization-privateExpanded operator personalization mixin for roles that explicitly need full operator metadata or private notesNonone pi-caco-commandsPi-only mixin that overlays repo-owned operator slash-command helpers for common first-party Cacophony command familiesNonone pi-checkout-guardRetired compatibility name; no shell wrapper, tool restrictions, or promptNonone pi-heartbeatRuntime-agnostic mixin that injects a repo-owned Pi heartbeat receiverNonone pi-homeManaged Pi mixin that imports the operator's user-level Pi settings, MCP config, MCP OAuth token store, plugins/packages, auth symlink, and shared package cache while preserving Cacophony-controlled provider/model selectionNonone pi-home-overrideManaged Pi mixin that uses the operator's user-level Pi dirNonone pi-image-guardRetired compatibility name; no read-tool image guard overlayNonone pi-inboxRetired compatibility name; daemon-native delivery owns incoming messagesNonone pi-inbox-disabledRetired compatibility name; no independent inbox poller remains to disableNonone pi-loopRuntime-agnostic mixin that injects a repo-owned Pi /loop command into managed agent workspaces so Pi can schedule repeating prompts without relying on the operator's ~/.pi or collective-specific configNonone pi-model-selectionManaged Pi active/idle model-selection mixinNonone pi-self-compactRetired compatibility name; Pi's own compaction keeps context boundedNonone pi-self-nudgeRetired compatibility name; daemon heartbeats and direct messages own automatic wakeupsNonone pi-self-opsRetired compatibility name; use ordinary Cacophony CLI tools and role guidanceNonone pi-sudo-runnerRetired compatibility name; managed Pi agents get no privileged-command toolNonone pi-tool-emit-guardRetired compatibility name; adds no extension or promptNonone planningAsks agents to author design and planning documents as durable markdown plans under .cacophony/plans/ with title/bead YAML frontmatter, analogous to the session-recording summary mixinNonone pr-monitorPersistent per-project pull-request monitor with bounded verified handoffsYesdirect pr-queue-fixerRoot-Flow-owned project-scoped PR fixer with retained session contextNonone pr-queue-mergerRoot-Flow-owned project-scoped merger with retained session contextNonone project-bootstrapInteractive project bootstrapper profileYesdirect project-controllerProject health and recovery coordinator; keep assigned work moving through current ownership, supported recovery, and autonomous repair…Yesdirect project-creatorFinite capability-scoped agent for one typed project-creation Flow invocationNonone project-healthProject-health persistent agent for managed Cacophony runtimesYesdirect realtimePi mixin that selects the OpenAI realtime provider/model for agents that need low-latency voice or streaming interaction through the…Nonone reflect-sessionPre-reintegration mixin that captures workflow friction as draft beadsNonone release-patchCapability-only mixin for the typed release patch transaction preflight, project lease, status, and resume ledgerNonone repo-healthRepo-health agent profile for managed Cacophony runtimesNodirect routerCluster-level persistent router profile for Pi runtimesYesnone self-improvementMixin profile that enables agents to improve their own profile and tooling in realtimeNonone session-recordingAsks reintegrating agents to write a structured session summary before landing work; summaries publish through the first-party…Nonone slack-watcherPersistent observer profile: an ms-mac-only, global-scope agent that continuously watches Slack via the existing first-party Slack MCP tools (slack_*), detects items important to the operator (DMs, @mentions, docs/canvases, a configurable watched-channel list), informs the operator via speech/notification, and files actionable items as beads in the appropriate projectYesdirect speakOptional concise audible progress updates; never blocks tools or lifecycleNonone spec-builderInteractive specification builder for complete, well-structured project specsYesdirect spec-gap-fixerAmbient spec gap fixer profile for all agent runtimesNonone stale-checkMixin that verifies origin/main freshness before claim and periodically during workNonone technical-writerPersistent documentation maintainer for in-repo docs and the GitHub Pages siteYesdirect tendril-mcpRuntime-agnostic mixin that injects Tendril (cross-platform agent UI automation) as an MCP tool surfaceNonone test-userPersistent stress-test agent that continuously exercises the project from an end-user perspective, pushes at edge cases, and files beads…Yesdirect tmux-cliRuntime-agnostic interactive TTY access using the current terminal hostNonone transcript-bead-filerPersistent observer profile that polls caco-stt-daemon transcript diffs and files draft beads when ambient speech contains a clear idea, request, bug report, or call to actionYesnone transcript-narratorPersistent observer profile that watches configured caco-stt-daemon transcript diffs across the fleet and speaks concise, useful contextual narration back to the operatorYesnone tui-animation-optimiserSpecialized profile for iterative TUI animation FPS optimizationNodirect tui-optimizerGeneral-purpose TUI performance optimization profileNodirect update-helperPersistent update-helper agent profile for fleet-wide caco binary updatesYesdirect visitingGuidance handed to a visiting agent when it registersNonone workerOne-shot implementation worker: deliver an assigned bead and finish through the effective project lifecycleNonone workiq-watcherPersistent observer profile: an ms-mac-only, global-scope agent that continuously watches workiq via the existing first-party workiq MCP tools (workiq_*), detects items important to the operator (DMs, @mentions, docs/canvases, a configurable watched-channel list), informs the operator via speech/notification, and files actionable items as beads in the appropriate projectYesdirect

The canonical controller and project-controller profiles carry the narrow agent_spawn_overrides capability. Other agent callers retain mandatory project spawn defaults and may only add an allowed profile specialization.

The persistent test-user declaration uses a lightweight agent-default snippet instead of the generic dev-worker base. It composes Pi runtime, narration, Tendril, image, tmux, and git-check helpers, but deliberately omits implementation/reintegration mixins such as self-improvement, merge-queue, session-recording, and reflect-session. The role is read-only from a source-code perspective: exercise product surfaces, keep scratch state, speak findings, and file beads for observed issues.

The canonical cluster controller profile treats major remediation as operator-gated work: before mass revival, destructive recovery, or other cluster-wide corrective action, it should narrate the issue and block on caco choices. Only a narrow emergency fallback is allowed when the system is too degraded to present choices, capped at one caco restart attempt and then at most one caco update attempt. It also treats brief daemon unreachable and hook/request failures immediately after restart, update, or config rollout as transient restart-window symptoms that should be retried and rehydrated before being escalated into a new incident. It may also use mid-flight caco agent reintegrate for operator-directed controller-profile, documentation, or control-plane maintenance changes without stopping.

The canonical project-controller profile requires explicit startup wake-path handling for Pi-managed persistent runs. It should inspect the first-party /loop state, create profile-required runtime loops when absent, and report newly armed loops as armed / verification pending until a real loop prompt fires. When the pi-loop mixin is composed, /loop is the preferred runtime-native per-agent wake path; do not create daemon-global caco cron entries for self-check or burndown loops unless the host profile or operator explicitly asks for daemon cron. The repo-owned /loop extension suppresses duplicate prompt deliveries for the same prompt/delivery mode when catch-up or duplicate ticks fire within the bounded duplicate-delivery window, while still allowing the next normal interval delivery. Report degraded autonomy only when no runtime-native wake path can be established or verified in-session. Unmanaged shell-loop or cron-like workarounds that bypass first-party control-surface policy are forbidden.