Strong foundation with 12 well-defined tools, all with descriptions and input schemas. Naming follows verb_noun convention (whoami, dm, inbox_peek, broadcast, etc.). Most parameters are typed and constrained. However, several parameter descriptions lack actionable detail (e.g., 'to' in dm lacks format guidance for cross-project syntax), and output schemas are not documented. Error handling guidance is minimal. Tool composition is sound, each tool has a single responsibility and chains naturally (inbox_peek → inbox_read → dm). Security posture is good: no credentials exposed as parameters, permission gates present (reply_to_user restricted to managers), and path traversal prevented in read_attachment.
Post a message to a channel in the caller's project. Caller must be a channel member and have the channel listed in can_broadcast.
Send a `/compact` slash command to the caller's own tmux pane. Used to trigger session compaction (e.g., to clear the scrollback or reset the pane state). Requires the caller to be running in a tmux session.
Send a direct message to another agent (same project). Returns the new message id.
Mark the listed message ids as acknowledged without reading the body — use to dismiss messages you've decided not to handle. To handle (read + resolve), use `inbox_read` instead.
Return up to `limit` unacked messages addressed to the caller. Non-destructive — peek does not mark anything resolved. Use this to browse the queue; use `inbox_read` to commit to handling specific ids (which fetches + auto-acks).
Fetch full bodies for the listed message ids and mark them resolved in the same call (T-104: read-is-resolve). The default channel notification is a stub; call `inbox_read` with the stub's `meta.id` to drill in. Ids the caller can't see, or already-acked ids, are silently skipped.
Output schemas not documented. Tools return data but LLMs cannot plan downstream calls without knowing field names and types. E.g., inbox_peek returns 'unacked messages' but structure is not specified.
Parameter descriptions lack actionable format guidance. 'to' in dm says 'Target agent id' but does not explain the <project>:<agent> syntax or bare <agent> resolution rules clearly enough for LLM to infer correct format.
Error handling lacks recovery guidance. Tools do not document what errors are retryable, what user-fixable errors look like, or what the LLM should do next on failure.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 65 | <=2025-11-25 | v2 |
Block up to `timeout_ms` milliseconds waiting for a new message. Returns immediately if any are pending.
List every agent in the caller's project (project-scoped; never returns other projects).
Return the project's org chart: managers (top tier) and workers with their `reports_to` links. Use to introspect who is above you.
Read a file from the compose root (the directory containing `team-compose.yaml`). Paths are relative to the compose root and must not escape it (no `..` traversal). Returns the file's raw bytes as a base64-encoded string. Useful for agents that need to read configuration, templates, or reference data bundled with the team.
Send a message to the human operator. Available only to managers (`is_manager: true`); the configured interface adapter (Telegram, Discord, …) forwards it. This is the ONLY channel back to the human — anything you write outside this tool is invisible to them. Use it to answer their DMs, surface progress on long-running work, escalate blockers, or proactively share something they should know. Do NOT use `dm` for human traffic (it is project-scoped inter-agent). For work that takes more than a minute, send a brief acknowledgement first (e.g. "on it — checking the build") and then a separate reply when done; do not leave the operator wondering whether you started. Attach an `image` (jpg/png/webp/gif, ≤50MB) or `file` (any type, ≤50MB) by passing `{source: "path"|"url", value: "<path or URL>", caption?: "<short caption>"}`. Each of `text`, `image`, `file` lands as its own chat message; combine them in one call to send a screenshot with a follow-up sentence in a single tool invocation. At least one of `text`, `image`, `file` is required.
Return the caller's fully-qualified agent id.
compact_self tool name is vague. 'compact' does not clearly signal 'send tmux pane compaction command'. Consider rename to 'send_tmux_compact_command' or 'compact_tmux_pane' for clarity.
reply_to_user markdown rendering rules are complex and context-dependent (headings/tables only on fresh messages, not threaded replies). This complexity is documented but may confuse LLMs into formatting errors.