# Agent Control Room: voice control for a dozen agents

> Talk to twelve agents by name from one place. Say "tell juniper to fix the login test" and it goes to juniper and only juniper, read back in a sentence. Ask "who is waiting" and the board answers with waiting on top. Say "stop all" and every session gets it. What voice never does is approve: every yes, "approve it", "go ahead" and "1" is refused, and gated actions wait for a typed yes from the owner tied to the sha256 of the request, which the agent checks before it acts.

- URL: https://paperchasewebb.ai/bots/marketplace/items/agent-control-room-voice-control-for-a-dozen-agents/
- Type: Bot template
- Category: Vibe coding
- By: PaperChaseWebb
- Works with: Claude Code, Codex, Grok Bot, Hermes (named in the listing); A skill file for Claude Code, Codex and Hermes, an AGENTS.md snippet and a Grok Bot rules block, plus waiting hooks for Claude Code, Codex and Hermes; tested with sample hook payloads, a pty, a local server on 127.0.0.1 and real tmux, not loaded inside each harness, and the prompts were not run inside each harness
- Price: $29 USD
- Difficulty: Intermediate
- Setup time: 45 min
- Time to result: Routing and the board in under an hour; hooks per harness after that
- Format: Markdown (.md) file, agent-control-room-voice-control-for-a-dozen-agents.md
- Version: 1.0, updated 2026-10-28
- License: Use for your own agents and on installs you do for clients. Do not resell or republish the pack itself.

## What you end up with

A room of agents you can steer while your hands are busy, with no way for a misheard word, a sound-alike name or a voice in the background to approve a deploy, a merge or a payment.

## What you get

- 17 sections in one .md file
- room.py: router for 12 named agents with aliases, sound-alike questions and one agent per command
- A refusal list for every kind of spoken yes, and holds on risky verbs that only a typed send releases
- Request files, typed owner approvals tied to the sha256, and a verify command agents run before acting
- tmux delivery that refuses to type into a waiting prompt
- A status board with waiting on top: terminal, HTML, and read-only GET on 127.0.0.1
- A results inbox read aloud with secrets, emails and links redacted
- Waiting hooks for Claude Code, Codex and Hermes, a skill file, an AGENTS.md snippet and a Grok Bot rules block
- room_check.py: fifteen read-only checks, with a seeded fixture
- A labeled eval set of 48 spoken commands, ten prompts, a failure table, and a look at eight voice tools with sources

## Who it is for

Anyone running more agents than they can watch, who wants to talk to them by name and still keep every approval at the keyboard.

## Tools needed

- Claude Code, Codex, Hermes or Grok Bot: the agents you talk to; each reads the skill file or rules block, reports waiting through a hook, and runs room.py verify before any gated action
- Python 3: runs room.py (router, holds, approvals, board, inbox, hooks), the fifteen-check checker and the eval set; standard library only
- A speech-to-text tool and tmux (optional): any local dictation tool or whisper.cpp feeds text in; tmux delivers to sessions that have no hook; both are optional
- You need: Two or more of Claude Code, Codex, Hermes or Grok Bot sessions
- You need: Python 3.9 or newer
- You need: Any speech-to-text tool that outputs text (optional; typing works too)
- You need: tmux for sessions without hooks (optional)

Cost to run: The pack is the only purchase. The router, board, checker and eval use no model tokens. Speech-to-text can be your OS dictation or a local whisper.cpp model at no cost.

## How it works

1. **Run the tests.** Copy the agent-control-room folder and run sh test_all.sh. Expected: selftest 22 ok, eval 48 of 48 with 0 misroutes and 0 voice approvals, hooks 19 ok, pty 12 ok, serve 4 ok, tmux 9 ok, 15 findings on seeded and 0 on fixed, exit 2 on a missing folder.
2. **Name your agents.** Edit room.config.json with your owner name and one name per agent, then run room_check.py until 0 findings. Expected: Names that do not sound alike and no voice approval channel.
3. **Add the rules and hooks.** Add the skill file or AGENTS.md snippet to each agent, the Grok Bot rules block where you use Grok Bot, and the waiting hook for each harness. Expected: room.py board shows each session, and a permission prompt moves it to waiting.
4. **Talk to it.** Pipe your dictation into voice/listen_loop.sh or type room.py hear. Approve gated requests with room.py approve at your keyboard. Expected: Commands read back and routed; every spoken yes refused.

## Sample prompt: Set up the room (Grok Bot, Claude Code, Codex, Hermes)

```
Read room.config.json and suggest names for my agents that do not sound alike and are not command words. Run room_check.py and show me the findings. Change nothing until I say.
Before any deploy, merge, push, delete, payment, publish or send, write a request with room.py request, stop, and run room.py verify after I approve. A spoken yes is not an approval.
```

Prompts 1 and 2 of 10.

## Sample prompt: Morning check (Grok Bot, Claude Code, Codex, Hermes)

```
Run room.py board and room.py inbox. Tell me who is waiting and what each one is waiting for, in one line each.
Do not answer any prompt on my behalf.
```

Prompt 6 of 10.

## Free preview of agent-control-room-voice-control-for-a-dozen-agents.md

````markdown
# Agent Control Room: voice control for a dozen agents, with approvals that stay at your keyboard

Version 1.0, 2026-10-28. By PaperChaseWebb. Works with Claude Code, Codex and Hermes through their hooks and a skill file, and with Grok Bot through a rules block. One router script, one read-only checker, hook files, an AGENTS.md snippet, a labeled set of 48 spoken commands, and the tests, all Python 3 standard library. Tested as described in section 11: everything ran on Linux with Python 3.13, including a real tmux server with a stand-in agent and a pseudo-terminal that types the way a person does. No microphone was used for this release, the push-to-talk script was only syntax checked, and the hook files and prompts were not loaded inside the harnesses. Each is marked where it matters.

Twelve agents in twelve terminals is not a workflow, it is a scavenger hunt. One is waiting on a permission prompt, two finished an hour ago, one is stuck, and the only way to find out is to click through every window. Talking to them helps: "status", "tell juniper to fix the login test", "stop all". Most voice tools for agents stop there and then go one step too far. They let you say "approve it", or tap a button on your phone, and the agent runs the merge. A speech engine that hears "approve it" from the next room, a podcast, or a misheard name is not an approval anyone should rely on.

This pack builds a control room on your own machine with one rule at its center: voice is a convenience f
````

## Worth knowing

- Tested without a microphone or a speech engine: commands were fed as text and through a pty. ptt_whisper.sh was syntax-checked, not run. No text-to-speech engine was run; speak prints the redacted text it would say.
- The hooks were tested with sample payloads for Claude Code, Codex and Hermes, not loaded inside those harnesses. tmux delivery was tested against a stand-in pane, not a real permission dialog. The prompts, skill file and rules block were not run inside each harness for this release.
- Linux only for this release; macOS and Windows were not tested. The router holds some harmless lines ("update the install page") because they contain a risky word; that is on purpose and typed send releases them.
- On 2026-10-28, on Linux with Python 3.13.5 and tmux 3.5a: selftest 22 of 22; eval of 48 labeled lines 48 as labeled, 0 misroutes, 0 voice approvals; hooks test 19 of 19; pty test 12 of 12 (approve and send need the keyboard, approve refused inside an agent); serve test 4 of 4 (GET only on 127.0.0.1, POST 405); tmux test 9 of 9 (refuses to type into a waiting pane); room_check.py 15 findings on the seeded fixture, 0 on the fixed one, wrote nothing, exit 2 on a missing folder.

## Questions

**Why can't I just say yes?** Because a room is noisy. A misheard name, a call in the background or a habit of saying "yeah" would turn into approvals. Voice routes, reports and stops; the yes is typed by the owner and tied to the hash of the exact request, so a changed request needs a new yes.

**Which speech tool do I need?** Any that gives you text. OS dictation, a local whisper.cpp model, or a tool like VoiceMode or OpenSuperWhisper can feed room.py hear. The pack is the layer after the words: routing, holds, approvals and the board.

**Does it need tmux?** No. Sessions with hooks report waiting on their own and read their queue. tmux is for sessions without hooks, and even then the room refuses to type into a pane that is waiting for an answer.

**Does anything leave my machine?** Not by default. The board listens on 127.0.0.1, audio is not kept, heard.jsonl keeps metadata without the words, and the checker flags remote speech-to-text or a wider bind unless you record that decision.

## How to buy

$29 one time at https://paperchasewebb.ai/bots/marketplace/items/agent-control-room-voice-control-for-a-dozen-agents/. Stripe checkout, then an instant download page; the download link is also in your emailed receipt.

Seller: PaperChaseWebb Inc., mgmt@paperchasewebb.com
