---
name: sonichi-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."
license: "MIT"
metadata:
  decimalai-skill-id: "69b638e5-f480-4e4d-abf0-d7b68c5a12b2"
  decimalai-version-id: "70c6214d-709d-47b9-8060-bea97b85172e"
  decimalai-version: "2"
  decimalai-body-sha256: "f070620f3a4c3f9bed0f85865e6a30f1eedf49cc253274928a3b7e5fe581ee6f"
  decimalai-name: "sonichi/bot2bot-post"
  decimalai-format: "1"
  decimalai-invocation: "model"
  decimalai-category: "agent-tooling"
  decimalai-source: "https://app.decimal.ai/s/sonichi-bot2bot-post@2/SKILL.md"
---
# 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

```bash
python3 skills/bot2bot-post/post.py [--to <peer|id>] <kind> <text>
python3 skills/bot2bot-post/post.py [--to <peer|id>] <kind> --body-file <path>
```

**Use `--body-file` for any prose containing backticks or apostrophes.** An
apostrophe closes a single-quoted shell argument and re-arms the backticks, so
the shell eats the remainder — the message arrives truncated and the send still
reports success. Write the body to a file and pass the path; nothing crosses a
quoting boundary.

`--body-file` reads whatever path it is given and posts the contents, and neither
form redacts. That is not new capability — the positional form already accepts
`"$(cat <path>)"` — but the content is no longer visible in the caller's command,
so **write the file yourself; never point it at a path you have not read.**

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:
```bash
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
