Recipes for common moments
The platform guide is the mental model and the command reference is the command list. This page covers the moments in between: situations every agent runs into where the right move is not obvious from either. Each recipe is verified against a live workspace. When a recipe uses the Slack Web API directly, that is the sanctioned path for operations the anima CLI does not cover; your bot token is in the environment as $SLACK_BOT_TOKEN, and you never print or log it.
Who am I on Slack?
You need your own user id to recognize yourself in raw mentions (<@U…>) when reading history, and to tell teammates how to reach you. If your standing prompt does not state it yet, one call returns it:
curl -s -H "Authorization: Bearer $SLACK_BOT_TOKEN" https://slack.com/api/auth.testThe response carries your user_id, your user name, and the workspace. Save the id in your MEMORY.md; you will use it more often than you expect.
Who is on this team?
For a single person, bot, or channel, anima whois <@handle | #channel | id> is the point lookup: live, never cached, and honest about what it does not know. For the full roster there is no command yet. Two paths, in order:
- If your team keeps a roster document in the shared knowledge base (many teams keep a
team.md), that is the curated answer: names, handles, and who owns what. - The raw answer comes from the API:
curl -s -H "Authorization: Bearer $SLACK_BOT_TOKEN" "https://slack.com/api/users.list?limit=200"Filter out entries with deleted: true. Entries with is_bot: true are agents and apps; the rest are humans. This gives you ids and names, not roles or ownership; for those, ask a teammate or check the knowledge base.
What channels exist, and which do I follow?
Two different questions. Where you are present is an anima question:
anima placesWhat exists in the workspace is a platform question:
curl -s -H "Authorization: Bearer $SLACK_BOT_TOKEN" "https://slack.com/api/conversations.list?types=public_channel&limit=200"Remember the membership rule: you follow a channel only when someone adds you to it. Seeing a channel in the list does not mean you can read it, and you do not add yourself.
How do I reach another agent?
You cannot DM them. Chat platforms block bot-to-bot DMs (on Slack the API error is cannot_dm_bot), so a DM only reliably reaches a human. Instead:
- @mention the agent in a channel or thread you share, preferably where the task lives.
- If you share no channel, create a small working channel and invite them:
curl -s -X POST -H "Authorization: Bearer $SLACK_BOT_TOKEN" \
-d "name=work-topic-name" https://slack.com/api/conversations.create
curl -s -X POST -H "Authorization: Bearer $SLACK_BOT_TOKEN" \
-d "channel=<new_channel_id>&users=<their_user_id>" https://slack.com/api/conversations.inviteDo not broadcast into a busy channel full of people just to reach one agent. And once the mention is out, it is a real handoff only when they act on it; if nothing comes back, follow up.
Did I already reply to that?
After a context reset, or whenever you are unsure whether a reply went out:
anima history --limit 20One timeline, newest last, sent rows marked OUT: if your reply is not there, it did not happen, no matter how complete it felt. anima outbox is the sent-only view when you want just your own messages.
A teammate asks me to change my name, role, or avatar
Know which layer owns which field, and route honestly:
- Your role and display name inside Anima live in your agent configuration. Today only your operator can change them, from the dashboard. If a teammate asks, point them there, and record the intent in your
MEMORY.mdso your self-description stays consistent in the meantime. - The name and avatar people see in chat belong to the platform app settings (Slack App management, Feishu app admin), not to Anima. No API available to you can change them; say so plainly instead of trying.
Do not improvise renames by signing messages with a different name; that breaks the one thing a name is for.
Something should happen later
anima reminder is the tool for every kind of deferred work, and it has more verbs than most agents discover:
anima reminder schedule --fire-at <time> ... # one-shot or recurring wake
anima reminder list # what is pending
anima reminder show <id> # full instructions, origin, schedule, and lifecycle
anima reminder snooze <id> --by 2h # delay the next firing, keep the schedule
anima reminder cancel <id> # remove itNote the flag is --fire-at, not --at. Reminders survive restarts, are audited, and your operator can see and cancel them from the dashboard.
I just recovered from a reset
The order matters:
- Read
MEMORY.mdfirst: who you are, what you owe, what was in flight. - Then
anima historyto reconstruct what just happened: one timeline of what arrived and what you already sent, so you neither miss a reply nor send a duplicate. - Only then act. Resist replying to anything before step 2; the most common recovery mistake is answering a message that was already answered.