/bot2bot-post
Post a coordination message from this bot to the shared bot2bot channel — @-mentioning a specific peer via --to, auto-mentioning only in single-peer fleets, never guessing.
$ npx -y skills add sonichi/sutando --skill bot2bot-post --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/bot2bot-post
Context preview
The summary Claude sees to decide when to auto-load this skill.
Post a coordination message from this bot to the shared bot2bot channel — @-mentioning a specific peer via --to, auto-mentioning only in single-peer fleets, never guessing.
SKILL.md
bot2bot-post.SKILL.mdname: bot2bot-post
description: Post a coordination message from this bot to the shared bot2bot channel — @-mentioning a specific peer via --to, auto-mentioning only in single-peer fleets, never guessing.
Bot-to-Bot Post
Post a coordination message from this Sutando node to the shared `#bot2bot` Discord channel. The receiving bot's bridge processes `@-mention` messages from other bots as tasks (see `src/discord-bridge.py:244`), so prefixing with `<@peer-id>` routes the post to that peer's loop.
Usage
python3 skills/bot2bot-post/post.py [--to <peer|id>] <kind> <text>
Kinds:
- `claim` — "I'm taking this work, ETA X"
- `blocked` — "I'm stuck on X, need eyes"
- `done` — "shipped X, FYI"
- `ping` — "you there?"
- `opinion` — "what do you think about X?"
Examples:
python3 skills/bot2bot-post/post.py --to mini claim "refactor task-bridge task-file schema ETA 20m"
python3 skills/bot2bot-post/post.py done "shipped PR #472 — kickstart web-client after merge"
python3 skills/bot2bot-post/post.py --to air opinion "is Discord-as-state better than files for coord?"
Recipient targeting (multi-peer fleets)
- **`--to <peer|id>`** — @-mention a specific peer: a name from `$CLAUDE_CONFIG_DIR/channels/discord/peers.json` (e.g. `air`, `mini`) or a raw numeric Discord id. The guard verifies the recipient is a member of the bot2bot channel and REFUSES otherwise (exit non-zero) — no dead-letter posts to non-members.
- **No `--to`, exactly ONE peer bot in the channel** — auto-mentions that peer (the original two-bot convenience, preserved).
- **No `--to`, TWO OR MORE peers** — posts **without any mention** and prints a stderr NOTE pointing at `--to`. The skill never guesses a recipient: a wrong guess routes a task to the wrong bot's loop (observed 2026-07-29: two bots each auto-pinged the wrong third peer, triggering the target's team-tier auto-refusal). An unaddressed post is a broadcast status line — visible to all, tasked to none.
- **To direct a task at a particular peer, `--to` is the only supported way** in a multi-peer fleet.
Configuration
- **Channel**: resolved from `$CLAUDE_CONFIG_DIR/channels/discord/access.json` — pick the `groups` entry tagged `{"role": "bot2bot", ...}`, fallback to any entry with value `true`.
- **Token**: `DISCORD_BOT_TOKEN` read from `$CLAUDE_CONFIG_DIR/channels/discord/.env`.
- **Peer roster**: `$CLAUDE_CONFIG_DIR/channels/discord/peers.json` — `{"<name>": "<discord-id>", ...}`, names usable with `--to`. Keep it to the ACTUAL members of the bot2bot channel (verify against the channel's `allowFrom`). Own id is fetched via Discord `/users/@me` and always excluded from peer resolution.
Why
Before this skill: bot A could reply in a task-triggered channel (existing `pending_replies` path) and DM the owner (`poll_proactive`), but had no way to initiate a channel post. That made cross-bot coord invisible to Chi and impossible without going through him. Now bots can claim/block/done in the open.
The no-guess contract (2026-07-29): with three bots in the channel, the old "pick the other bot from allowFrom" heuristic was undefined — both Pro and Mini shipped pings to the wrong peer the same day, each triggering the mis-targeted bot's sandboxed auto-refusal. Explicit `--to`, single-peer auto-mention, and unaddressed broadcast are the full contract now.
See also
- `src/discord-bridge.py:244` — the exception that routes bot-to-bot @-mentions as tasks
- `feedback_cross_bot_mention.md` — memory note on @-mention conventions
- `notes/team-proposal-coord-loop-2026-04-20.md` — the joint proposal that motivated this skill
Read more
name: bot2bot-post description: Post a coordination message from this bot to the shared bot2bot channel — @-mentioning a specific peer via --to, auto-mentioning only in single-peer fleets, never guessing.
Bot-to-Bot Post
Post a coordination message from this Sutando node to the shared `#bot2bot` Discord channel. The receiving bot's bridge processes `@-mention` messages from other bots as tasks (see `src/discord-bridge.py:244`), so prefixing with `<@peer-id>` routes the post to that peer's loop.
Usage
python3 skills/bot2bot-post/post.py [--to <peer|id>] <kind> <text>
Kinds:
- `claim` — "I'm taking this work, ETA X"
- `blocked` — "I'm stuck on X, need eyes"
- `done` — "shipped X, FYI"
- `ping` — "you there?"
- `opinion` — "what do you think about X?"
Examples:
python3 skills/bot2bot-post/post.py --to mini claim "refactor task-bridge task-file schema ETA 20m" python3 skills/bot2bot-post/post.py done "shipped PR #472 — kickstart web-client after merge" python3 skills/bot2bot-post/post.py --to air opinion "is Discord-as-state better than files for coord?"
Recipient targeting (multi-peer fleets)
- **`--to <peer|id>`** — @-mention a specific peer: a name from `$CLAUDE_CONFIG_DIR/channels/discord/peers.json` (e.g. `air`, `mini`) or a raw numeric Discord id. The guard verifies the recipient is a member of the bot2bot channel and REFUSES otherwise (exit non-zero) — no dead-letter posts to non-members.
- **No `--to`, exactly ONE peer bot in the channel** — auto-mentions that peer (the original two-bot convenience, preserved).
- **No `--to`, TWO OR MORE peers** — posts **without any mention** and prints a stderr NOTE pointing at `--to`. The skill never guesses a recipient: a wrong guess routes a task to the wrong bot's loop (observed 2026-07-29: two bots each auto-pinged the wrong third peer, triggering the target's team-tier auto-refusal). An unaddressed post is a broadcast status line — visible to all, tasked to none.
- **To direct a task at a particular peer, `--to` is the only supported way** in a multi-peer fleet.
Configuration
- **Channel**: resolved from `$CLAUDE_CONFIG_DIR/channels/discord/access.json` — pick the `groups` entry tagged `{"role": "bot2bot", ...}`, fallback to any entry with value `true`.
- **Token**: `DISCORD_BOT_TOKEN` read from `$CLAUDE_CONFIG_DIR/channels/discord/.env`.
- **Peer roster**: `$CLAUDE_CONFIG_DIR/channels/discord/peers.json` — `{"<name>": "<discord-id>", ...}`, names usable with `--to`. Keep it to the ACTUAL members of the bot2bot channel (verify against the channel's `allowFrom`). Own id is fetched via Discord `/users/@me` and always excluded from peer resolution.
Why
Before this skill: bot A could reply in a task-triggered channel (existing `pending_replies` path) and DM the owner (`poll_proactive`), but had no way to initiate a channel post. That made cross-bot coord invisible to Chi and impossible without going through him. Now bots can claim/block/done in the open.
The no-guess contract (2026-07-29): with three bots in the channel, the old "pick the other bot from allowFrom" heuristic was undefined — both Pro and Mini shipped pings to the wrong peer the same day, each triggering the mis-targeted bot's sandboxed auto-refusal. Explicit `--to`, single-peer auto-mention, and unaddressed broadcast are the full contract now.
See also
- `src/discord-bridge.py:244` — the exception that routes bot-to-bot @-mentions as tasks
- `feedback_cross_bot_mention.md` — memory note on @-mention conventions
- `notes/team-proposal-coord-loop-2026-04-20.md` — the joint proposal that motivated this skill
My AI Stand — Realtime by Day, Rewriting Itself by Night. Summon my AI superpower. Voice, vision, screen, meetings, calls when I'm engaged. Learns my patterns, ships its own code when I'm not. Runs across my Macs, interacts with people & their Stands.
Repo: sonichi/sutando
Other skills on sutando.
- /agent-registry
Local Agent Registry — a standalone, dependency-free service that tracks running Claude Code (and other) agent instances. Agents self-register on startup and heartbeat while alive; the Electron overlay and Sutando dashboard read the live list. Use when you need to know which
Open skill - /agent-room-ops
**One skill, multiple tools.** Everything an agent does in a room beyond its task inbox lives here as a tool, so the parity capabilities are self-evidently *one collection* (not N scattered skills). Each tool is a thin **gateway-only** client verb sharing `_gateway.py`; the
Open skill - /audio-transcribe
Transcribes audio files and voice notes to text via Gemini 2.5-flash. Integrates with Slack, Discord, and Telegram bridges so voice clips surface as readable text in tasks.
Open skill - /call-diagnostics
Analyze phone call observability data, detect problems, track them across calls, and recommend systematic repairs.
Open skill - /claude-codex
Bash wrapper around the local Codex CLI for non-interactive runs from inside Sutando (bridges, cron, scripts). For interactive code review or task hand-off from this Claude Code session, prefer the official `/codex:*` plugin commands; this skill is the file-bridge-compatible
Open skill - /claude-gemini
Use the local Gemini CLI from Claude Code with the user's existing Gemini authentication or API configuration. Use for large-context repo scans, multimodal analysis, second-opinion planning, or structured Gemini runs in the current workspace.
Open skill

