| name | moderator-open-mic |
| description | Ordered multi-agent collaboration on shared channels using gated mode. Prevents fan-out storms by suppressing inbox delivery; the moderator grants speaking turns via syscall.ask and agents read history explicitly. Acquire this skill when you coordinate 3+ agents on a shared channel.
|
Moderator Open-Mic
Problem
A shared channel with N agent members delivers every message to N-1 inboxes.
Each delivery can wake an agent, which posts again, triggering another N-2
deliveries — an exponential fan-out storm. Even when ghost whisper suppresses
most wakes, agents that do activate see stale or partial context because
activations race with each other.
Solution: Gated Channels + syscall.ask Turns
A gated channel stores messages in history and pushes them to external
subscribers (dashboard / WebSocket) but does not deliver to agent inboxes.
The moderator orchestrates participation by asking agents one at a time via
syscall.ask. Each agent reads the channel history to get full context before
posting.
Creating a gated channel
At runtime:
syscall.chat.create name="discussion" members=["agent-a","agent-b","agent-c"] gated=true
Or in world-config.yaml (boot-time):
shared_chat:
startup:
- name: Townfolks
creator_id: moderator
gated: true
members: [moderator, agent-a, agent-b, agent-c]
Turn-Taking Workflows
Round-robin
Ask each agent in a fixed order. Every agent sees the full accumulated history.
- Post context to the channel:
syscall.chat.send channel="discussion" message="Topic: X. I will call on each of you in turn."
- For each agent in order:
syscall.ask agent_id="agent-a" message="Your turn. Read #discussion history, post your thoughts there, then reply 'done' to me."
- Wait for reply.
- After all agents have spoken, post a summary or move to the next phase.
Selective
Address only specific agents relevant to the topic.
syscall.ask agent_id="agent-b" message="Agent-A raised concern X. Read #discussion history and respond in the channel, then reply 'done'."
Batch round (open discussion)
Ask all agents in one pass (still serialized per syscall.ask). Each agent
accumulates context from those who spoke before them via syscall.chat.history.
- Post the opening:
syscall.chat.send channel="discussion" message="Day discussion is open. I will call on each of you."
- Call each agent sequentially with
syscall.ask.
- Close:
syscall.chat.send channel="discussion" message="Discussion closed."
Contracts
Moderator-side
- Open the floor — post phase labels or context to the gated channel before
granting turns.
- Grant turns — use
syscall.ask for each speaker. The ask message should
tell the agent to read history, post to the channel, and reply when done.
- Close the floor — post a closing message when the round is complete.
- Binding actions — for votes or decisions, use
syscall.ask replies
directly (not channel posts) so the moderator captures them deterministically.
Agent-side (participants)
- No unsolicited posts — on a gated channel you will never receive inbox
traffic from it. Only participate when the moderator asks you via
syscall.ask.
- Read before writing — always call
syscall.chat.history on the channel
before posting so you have full context including what others said.
- One message per turn — post exactly one substantive message to the channel
per turn. Keep it concise.
- Reply to the moderator — after posting to the channel, reply to the
syscall.ask to signal you are done (e.g. "done" or a summary of your post).
When NOT to Use
- Two-agent conversations — use
syscall.ask directly; no channel needed.
- Broadcast-only announcements — if no agent needs to reply in the channel,
a non-gated channel or
syscall.broadcast (where available) is simpler.
- High-frequency real-time chat — gated mode is designed for structured,
turn-based discussion, not free-form rapid-fire messaging.