talk-to
/talk-to - Agent Messaging
Send messages to agents via Oracle threads. Each agent has a persistent channel thread.
Usage
/talk-to arthur "What's your status?" # one-shot message
/talk-to arthur --new "Hey, starting fresh" # skip lookup, create new thread
/talk-to arthur loop ask about their work # autonomous conversation
/talk-to #42 "follow up on this" # post to thread by ID
/talk-to --list # show channels
/talk-to arthur --maw "quick ping" # force maw transport (real-time tmux)
/talk-to arthur --thread "async question" # force MCP thread transport
/talk-to arthur --inbox "offline message" # force inbox transport (file write)
Mode 0: No arguments
If ARGUMENTS is empty, show usage help then run --list.
Step 0: Contacts Lookup
Always read contacts first. This is the source of truth for agent routing.
CONTACTS="$(pwd)/ψ/contacts.json"
if [ ! -f "$CONTACTS" ]; then
# Fallback path
CONTACTS="$(pwd)/.oracle/contacts.json"
fi
if [ -f "$CONTACTS" ]; then
MAW=$(jq -r ".contacts.\"$AGENT\".maw // empty" "$CONTACTS")
INBOX=$(jq -r ".contacts.\"$AGENT\".inbox // empty" "$CONTACTS")
THREAD=$(jq -r ".contacts.\"$AGENT\".thread // empty" "$CONTACTS")
REPO=$(jq -r ".contacts.\"$AGENT\".repo // empty" "$CONTACTS")
NOTES=$(jq -r ".contacts.\"$AGENT\".notes // empty" "$CONTACTS")
FOUND_IN_CONTACTS=true
else
FOUND_IN_CONTACTS=false
fi
If agent not found in contacts AND not found in maw ls:
I don't know "{agent}".
/contacts add {agent} — register transport info
/talk-to {agent} --thread "message" — try MCP thread anyway
Offer /contacts add first. If user insists, fall through to MCP thread.
Transport Selection
| Flag | Transport | Best For |
|---|---|---|
| (none) | auto — detect best | Default |
--maw |
maw hey (tmux sendkeys) |
Real-time, local fleet, low latency |
--thread |
MCP oracle_thread |
Async, persistent, cross-machine |
--inbox |
File write to ψ/inbox/ |
Offline, no maw/MCP needed |
Auto-detect logic (when no flag):
- Check
ψ/contacts.json→ hasmawfield? → usemaw hey - No contacts? →
maw ls 2>/dev/null | grep -q "{agent}"fallback → usemaw hey - Neither? → use MCP thread (async, persistent)
# Auto-detect: contacts-first, maw ls fallback
if [ -n "$MAW" ]; then
echo "USE_MAW (from contacts: $MAW)"
elif maw ls 2>/dev/null | grep -q "{agent}"; then
echo "USE_MAW (from maw ls)"
else
echo "USE_THREAD"
fi
When using --maw:
- Compose message from intent
- Use contacts maw name if available:
maw hey {MAW or agent-oracle} '{message}' - Optionally
maw peek {agent}to check response - Confirm:
Sent via maw to {agent}
When using --inbox:
- Compose message from intent
- Check contacts for inbox path — if empty, error:
No inbox path for {agent}. Run /contacts show {agent} - Write message file:
SELF="$(basename $(pwd) | sed 's/-oracle$//')" echo "$MESSAGE" > "$INBOX/$(date +%Y%m%d_%H%M)_from_${SELF}.md" - Confirm:
Dropped to {agent}'s inbox
When using --thread (or auto-detected thread):
Fall through to Mode 3 (one-shot) below.
Routing
| Pattern | Use |
|---|---|
channel:{agent} |
Persistent per-agent channel |
topic:{agent}:{slug} |
Topic-specific thread (with --topic) |
#{id} |
Direct thread reference by ID |
Mode 1: --list
arra_threads()(no status filter)- Filter titles starting with
channel:ortopic:, excludeclosed - Display:
channel:arthur (#42) pending — 12 msgs
Mode 2: --new (fast create)
Skip lookup. One MCP call.
- Compose message from intent
arra_thread({ title: "channel:{agent}", message, role: "human" })- Notify:
Bash maw hey {MAW or agent-oracle} 'Thread #{id} from {self}: {preview}'- If
maw heyfails → warn only, don't error (thread already sent)
- If
- Confirm:
Created channel:{agent} (thread #{id})
Mode 3: One-shot (default)
- Compose message from intent
- If first arg is
#{id}→ post directly to that thread ID - Otherwise:
arra_threads()→ findchannel:{agent}, create if missing - Post message to thread
- Notify:
Bash maw hey {MAW or agent-oracle} 'Thread #{id} from {self}: {preview}'- If
maw heyfails → warn only, don't error (thread already sent)
- If
arra_thread_read({ threadId })→ show any agent responses- Confirm:
Posted to channel:{agent} (thread #{id})
Mode 4: loop (autonomous conversation)
Like Ralph loop — AI drives the conversation autonomously. No user prompts between turns.
- Find or create thread (
channel:{agent}, or--newto skip lookup) - Compose opening message from user's intent and post it
- Autonomous loop (max 10 iterations):
a.
arra_thread_read({ threadId })— check for new messages b. If agent responded: read their response, compose a thoughtful follow-up, post it c. If no new response: compose a follow-up question or probe deeper, post it d. After each exchange, briefly note what you learned e. Stop when: enough insight gathered, conversation circling, or 10 iterations hit - Notify (once, after opening message):
Bash maw hey {MAW or agent-oracle} 'Thread #{id} from {self}: {preview}'- If
maw heyfails → warn only, don't error
- If
- Show summary:
Conversation with {agent} (thread #{id}) — {n} messages, {iterations} turns Key insights: - [insight 1] - [insight 2] - Leave thread open for future use
The goal is insight extraction. You are having a conversation on behalf of the human to learn something useful.
Parsing Rules
- First arg = agent name (lowercase),
#id(thread ref), or--list --new= skip lookup, create freshloop= autonomous conversation (AI drives, no user prompts)--topic "slug"= usetopic:{agent}:{slug}instead ofchannel:{agent}- Everything else = the message/intent
Message Composition
CRITICAL: You are the composer. The user gives intent, you write the message.
- Compose a clear, natural message from the user's intent
- Post immediately — do NOT ask the user what to say
- Do NOT use AskUserQuestion for message content
- Show what you posted after sending
If the message already reads like a direct message (e.g. "What's your status?"), post as-is.
Auto Notification (maw hey)
After posting to a thread, notify the target agent via maw hey:
maw hey {MAW or agent-oracle} 'Thread #{id} from {self}: {first 60 chars of message}'
{MAW}= contacts maw field (e.g. "mawjs-oracle") — preferred over{agent}-oracle{self}= current Oracle's name (e.g. "Mother Oracle"){preview}= first ~60 chars of the posted message- Runs once per /talk-to invocation (not per loop iteration)
- Fail-safe: if
maw heyerrors, log warning and continue — the thread is the source of truth
Important Notes
- Agent names are always lowercase
- Thread titles are the routing key — never modify existing thread titles
- One channel thread per agent (reuse, don't recreate)
#{id}lets users reference any thread directly — no lookup needed- All messages attributed with
role: "human"
ARGUMENTS: $ARGUMENTS
More from soul-brews-studio/arra-oracle-skills
recap
Session orientation and awareness — retro summaries, handoffs, git state, focus. Use when starting a session, after /jump, lost your place, switching context, or when user asks "now", "where are we", "what are we doing", "status", "recap". Do NOT trigger for "standup" or "morning check" (use /standup), or session mining "dig", "past sessions" (use /dig).
22learn
Explore a codebase with parallel Haiku agents — clone, read, and document. Modes — --fast (1 agent), default (3), --deep (5). Use when user says "learn [repo]", "explore codebase", "study this repo", or shares a GitHub URL to study. Do NOT trigger for finding projects (use /trace), session mining (use /dig), or cloning for active development (use /incubate).
21project
Clone and track external repos. Use when user shares GitHub URL to study or develop, or says "search repos", "find repo", "where is [project]". Actions - learn (clone for study), search/find (search repos), list (show tracked). For active development, use /incubate.
20rrr
Create session retrospective with AI diary and lessons learned. Use when user says "rrr", "retrospective", "wrap up session", "session summary", or at end of work session.
20forward
Create handoff + enter plan mode for next session. Use when user says "forward", "handoff", "wrap up", or before ending session.
20oracle-soul-sync-update
Sync Oracle instruments with the family. Check and update skills to latest version. Use when user says "soul-sync", "sync", "calibrate", "update", or before /awaken.
19