Minimal multi-agent coordination broker for Claude Code sessions. Provides task management, messaging, file locking, and shared memory for coordinating architect and worker agents.
Control Tower Lite has 11 tools with complete input schemas and descriptions, but quality is uneven. Naming follows verb_noun convention (join, send, check, create_task, claim_task, complete_task, lock_file, unlock_file, set_memory, get_memory, list_tasks), good. Descriptions are present (avg ~120 chars) and explain WHAT and WHEN, meeting baseline. However, output schemas are entirely undocumented, no tool specifies what fields it returns, forcing LLMs to guess. Parameters lack depth: 'role' in join has enum but no guidance on architect vs worker trade-offs; 'blocked_by' in create_task accepts comma-separated IDs but no validation rules; 'category' in send has enum but no explanation of routing behavior. Error handling is absent, no guidance on retryability, user-fixable vs fatal errors, or recovery paths. Security concerns: no mention of token handling, rate limits stated (10 msg/min) but not enforced in schema. Composition is reasonable, tools chain logically (join → create_task → claim_task → complete_task), but missing batch operations and pagination for list_tasks.
Read your unread messages. Returns all pending messages addressed to you.
Claim a pending task. Atomic — fails if already taken or blocked. Returns full task details including description for context.
Mark a task as completed. Requires an artifact summary describing what was done. Automatically unblocks dependent tasks.
Create a task for workers to claim. Architect only. Use blocked_by to create dependency chains (comma-separated task IDs).
Read a shared memory value by key. Returns the value or null if not found.
Register with the broker and discover peers. Call this FIRST before using any other tool. Returns your auth token and list of active peers.
No output schemas documented for any tool. LLMs cannot plan downstream calls or extract required fields (e.g., task_id from create_task, token from join, peer list structure). Forces guessing and mid-chain failures.
list_tasks lacks pagination (limit, offset, page_size, next_cursor). No total count returned. If task list grows large, response bloats context window or truncates silently, breaking agent reasoning.
No error handling guidance. Tools do not document retryability, user-fixable errors, or recovery paths. E.g., claim_task fails if 'already taken or blocked', but LLM has no guidance on what to do next (retry? list_tasks? ask user?).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | 2026-07-28+ | v2 |
List all tasks. Optionally filter by status.
Reserve a file path to prevent conflicts. Fails if already locked by another peer.
Send a message to a peer or broadcast to all. Use recipient='*' for broadcast. Category 'blocker' routes as a blocker alert. Rate limited to 10 messages per minute.
Set a shared memory key-value pair. Architect only. Use for decisions, config, and shared state that all peers can read.
Release a file lock you hold.
Parameter descriptions lack actionable constraints. 'blocked_by' accepts 'comma-separated task IDs' but no validation rules, format examples, or error guidance. 'artifacts' in complete_task has no length/format constraints. LLMs may pass invalid values.
Rate limit (10 msg/min on send) stated in description but not enforced in schema. No 429 error handling or backoff guidance. Agent may hit limit and fail silently.