docsconceptschannels

Channels

A channel is a named surface where conversations open. With more than one, the same agent can be approached in more than one way.

One agent, many hats

The agent has a single identity and memory, but it is able to wear a different "hat" on each entrypoint to the agent. For example, a friends channel can be a guarded way for friends to contact your agent. A peer-query channel can be a one-shot communication endpoint for another agent. A reflection channel can be a quiet space where the agent works on itself on a schedule. Each channel has its own lifetime, tools, prompt, boundary scripts, model, and who can reach it. The three patterns below make this concrete.

A friends channel

You might want to let a friend talk to your personal agent — get help with something, ask a question — without giving them the same surface you use yourself. A separate channel with its own prompt and ACL grant does that.

Persistent lifetime keeps the chat open between messages. Full lifecycle wires in bootstrap and cleanup so context with this friend carries across sessions. The per-channel prompt sets the agent's posture (warm but guarded) and tells it when to push a question back to you.

channel: friends
# blueprint/channels/friends/channel.json
{
  "idle_timeout": 1800000,
  "lifecycle": "full"
}

# blueprint/channels/friends/prompt.md
You're talking to one of my friends, not me. Be helpful and warm.
You can share what I've marked as shareable in /memory/; otherwise
default to private — answer in general terms or politely decline.

If a question comes up you're unsure about, message me and wait for
my reply before answering.
📖 JARGON
The friend gets access once you approve them, recorded in config/acl.json. Without that grant, the channel exists but they can't reach it.
🔒 SECURITY
Soft partition, not a security boundary. The agent on the friends channel is the same agent that knows everything you know — the prompt above is a behavioral instruction the LLM follows, not enforced isolation. A persuasive friend can still talk the agent into sharing things you wouldn't want shared. For real isolation (different memory, different identity), run a separate agent.

A peer-query endpoint

Another agent might need a quick answer without opening an ongoing relationship. A peer-query channel takes one question, returns one answer, and closes. The peer accumulates no state with you, and the channel can expose a narrower tool surface than the default — answers don't need to schedule tasks or push into other conversations.

idle_timeout: null makes it single-shot, paired with disabled_tools to narrow what the peer-callable surface can reach. A short prompt.md sets the one-shot posture so the agent commits to a complete answer in its single turn.

channel: peer-query
# blueprint/channels/peer-query/channel.json
{
  "idle_timeout": null,
  "disabled_tools": ["task__*", "conversation__push_to_channel"]
}

# blueprint/channels/peer-query/prompt.md
You're answering one question from a peer agent. Give a complete
answer in your single turn — there are no follow-ups. Cite from
/memory/ where you can; be specific.
📖 JARGON
Which peers are allowed to reach this channel is set in config/acl.json, alongside the rest of the agent's access grants. The channel itself doesn't gate callers — the ACL does.

A reflection channel that runs on its own

An agent benefits from working on itself off-thread. A reflection channel is the agent talking to itself on a schedule: review the day, distill what mattered, leave a note in /memory/. No human in the loop, no ongoing chat to maintain. The conversation opens, the agent does its work in one turn, and it closes.

Three pieces carry the pattern. idle_timeout: null makes it single-shot. The per-channel prompt.md tells the agent what reflection means on this surface. And a per-channel model override pins it to Haiku, since this work doesn't need the agent's heavier default.

channel: reflection
# blueprint/channels/reflection/channel.json
{
  "idle_timeout": null
}

# blueprint/channels/reflection/prompt.md
You're doing your daily reflection. Skim recent work logs and message
threads. Append a paragraph to today's entry in /memory/journal/ —
decisions made, surprises, anything worth remembering next time.

# config/agent.json   (excerpt — per-channel model override)
{
  "modelOverrides": [
    { "channel": "reflection", "model": "claude-haiku-4-5" }
  ]
}
📖 JARGON
The schedule that fires this channel lives in blueprint/props/schedule.txt, not in the channel folder. See Scheduling & triggers for the cron grammar.

What's in a channel definition

A channel is a directory under blueprint/channels/<name>/. Most of what shapes the channel lives inside that folder; a couple of operator-set knobs sit outside it, in the agent's config.

SettingWhere it livesWhat it controls
Lifetimechannel.json idle_timeoutPersistent (positive integer = milliseconds of idle before close) or single-shot (null).
Lifecyclechannel.json lifecycleWhich boundary scripts fire: none, bootstrap-only, cleanup-only, or full.
Tool narrowingchannel.json disabled_toolsTool names or globs (e.g. task__*) removed from this channel's surface.
Loggingchannel.json log_messagesWhether turns on this channel are recorded in the message log.
Shardingchannel.json use_shardingEnables sub-conversations within the channel.
Co-participant visibilitychannel.json show_co_participantsWhether the agent is aware of other participants on this channel and can push messages to them (default on). Off hides them — for specialist or private channels.
Channel promptprompt.mdPer-channel instructions layered on the agent's identity, active only when this channel is in play.
Bootstrapbootstrap.mdRuns at conversation open (when lifecycle includes bootstrap). Output injects into opening context.
Cleanupcleanup.mdRuns at conversation close (when lifecycle includes cleanup). Output is swallowed; writes to /memory/ persist.
Modelconfig/agent.json modelOverridesOperator-set per-channel model override. The agent has a default model; individual channels can swap it.
Accessconfig/acl.jsonWhich identities can send to and receive from this channel. Operator-set.