A conversation is one Slack thread or direct message an Agent takes part in. Where a channel grant says which Agent may work in a channel, a conversation is the exchange itself: who addressed whom, and which Agent owns the thread now. This page covers how a message reaches an Agent, what Chickpea ignores, thread ownership and handoff, direct messages and the App Home tab, and attachments.
How a message reaches an Agent
Someone in #billing types:
@supportcan we refund order 4821?
- A handle is the address.
@supportis a Slack user group with zero members. Chickpea trusts only the user-group id Slack puts in the message. An Agent’s name typed as plain text is not an address. - The channel grant decides.
@supportanswers in#billingonly if a stored grant says it may. Without one, nothing is posted to the channel. - You have to be a full workspace member. Multi-channel and single-channel guests, and people reached through another workspace, cannot invoke an Agent.
- You have to be in the channel. Chickpea checks your membership of the channel the message came from.
When Chickpea first joins a channel it posts one notice: Chickpea is ready in this Channel., followed by how to address an Agent and the statement that it never joins unmentioned channel conversations. Setting SLACK_TAG_WELCOME_ON_JOIN to false turns that notice off.
What Chickpea ignores
In every channel, a top-level message that mentions no one is dropped before any model is involved. No reply, no private notice, no model call.
- Replies in a thread no Agent owns. A thread only carries Agent turns once an Agent has taken it. A handle mentioned inside an unowned thread does nothing.
- Messages from other apps and bots, from Slackbot, and from Slack’s system users.
- Edits and most message subtypes. Editing a message does not start a turn. A file upload does.
To bring an Agent into a thread nobody owns, mention @Chickpea there first, then mention the Agent you want in that thread.
What a refusal looks like
Three refusals reach only the person who sent the message, as an ephemeral message in the channel or a reply in a direct message.
| What happened | What you see |
|---|---|
| The Agent has no active grant here | That Agent is not available here. plus the handles that are |
| Two Agent handles in one message | Mention one Agent at a time. plus the handles available here |
| Slack could not confirm the handle | That Agent address could not be verified right now. Try again. |
Two handles are refused rather than guessed, because the two Agents hold different accounts and answer for different channels. Setting SLACK_TAG_UNASSIGNED_HINT to false silences the ambiguity notice; the other two still post.
Who owns the thread
The first Agent to reply owns that thread, and the owner is stored per channel and thread rather than inferred from the text. Anyone in the channel can follow up in the thread without mentioning the handle again, and the same Agent answers.
Adding an emoji reaction to a message in an owned thread also starts a turn. The Agent is told which reaction was added and to which message. Reactions on messages outside an owned thread do nothing.
Handing work to another Agent
Mentioning a second Agent’s handle in the thread hands the work over, in the open. The new owner needs its own active grant for that channel, and the transfer is visible to everyone reading.
What moves is the public thread and only the public thread: at most the newest 20 messages and 12,000 characters of it. The previous Agent’s memory, connections, and skills stay with the previous Agent.
What an Agent reads for context
| Turn | What is read |
|---|---|
| A reply in a thread | The thread, up to 50 messages across at most 3 pages |
| A mention at the top of a channel | Recent channel history, up to 50 messages |
| A direct message | Recent history of that conversation, up to 50 messages |
Outside a thread, the window follows the words in your message. last 3 days, since Monday, today, yesterday, this week, and last week each set it; with none of them, it is the last 24 hours. Messages posted by apps and bots are left out of context. If Slack history cannot be read, the turn runs on your message alone rather than failing.
Direct messages and App Home
Where an Agent is published decides who may message it directly. Published in a public channel, any full workspace member can. Published only in private channels, only the members of those channels. Not published anywhere, only its creator.
The Chickpea app’s Home tab lists the Agents available to you, up to 24 of them, each with a Message button. Pressing it opens a direct-message thread, posts <Agent name> is ready. under that Agent’s name and avatar, and gives it the thread.
A new direct message that names no handle goes to @Chickpea. To reach a particular Agent in a direct message, mention its handle or start from the Home tab.
Talking to the Chickpea Agent
@Chickpea is the system Agent that administers the workspace. It answers in any channel the app has joined, including one where no Agent holds a grant, as long as you are a member of that channel. Mentioning it inside a thread another Agent owns takes that thread over.
Asking it to create an Agent, publish one, install a skill, or set a schedule is covered by Manage Chickpea from Slack in this section.
Attachments
An Agent reads images (GIF, JPEG, PNG, WebP), PDFs, UTF-8 text and source files, and the PDF conversions Slack generates for documents, slides, and sheets. A message carrying a file and no text is treated as a request to inspect the file.
| Limit | Value | Scope |
|---|---|---|
| Files | 4 | per turn |
| Bytes per file | 8 MiB | per file |
| Bytes in total | 12 MiB | per turn |
| PDF pages | 100 | per file |
| Characters | 32,000 | per file |
| Characters in total | 48,000 | per turn |
Attachment turns are read-only: a file can inform an answer but cannot authorize a tool or a change. A file over a limit, or one with no safe conversion, gets a file-specific next action instead of a quiet partial read. Slack installations predating the files:read scope must reconnect once.
Why it works this way
Addressing is explicit because the alternative is an app that reads every channel and decides for itself when it is wanted. Authority comes from stored grants and saved instructions, read from stored state and re-checked at the moment of each use, never from anything produced during the turn. A thread’s owner is stored for the same reason: a follow-up must not be able to reach a different Agent’s accounts because of how it was worded.
The read-only rule on attachments follows from the same line. A file is content from outside the workspace’s authority model, so it can be evidence for an answer and never permission for an action.
What is not covered
- Handles, grants, and publishing. Creating a handle, granting a channel, and what publishing hands to that channel’s members are their own subject in this section.
- How replies look. Streaming, tables, task cards, and the under-composer status are covered separately.
- Memory is not a conversation boundary. One Agent has one memory across its direct messages and every granted channel, so a private exchange can shape a later channel answer.
- Scheduled work. A schedule delivers into a granted channel or a private thread without anyone mentioning anything.
Next steps
- How Chickpea works: the same mention from the deployment’s side, and the layers underneath.
- In Slack: handles and channel grants, replies, and managing Chickpea by asking.
- What an Agent is: what an Agent is made of, and what each one keeps to itself.
- Authority and confirmation: the authority rules behind grants, confirmations, and read-only turns.
