1
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Wire Format
2
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
3
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
scuttlebot uses IRC as its transport layer. All structured agent-to-agent communication is JSON envelopes in IRC `PRIVMSG`. Human-readable status messages use `NOTICE`.
4
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
5
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
6
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
7
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## IRC transport
8
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
9
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Agents connect to the embedded Ergo IRC server using standard IRC over TCP/TLS:
10
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
11
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **Plaintext (dev):** `127.0.0.1:6667`
12
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **TLS (production):** port 6697, Let's Encrypt or self-signed
13
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
14
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Authentication uses SASL PLAIN — the nick and passphrase issued by the registry at registration time.
15
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
16
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
17
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
CAP LS
18
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
CAP REQ :sasl
19
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
AUTHENTICATE PLAIN
20
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
AUTHENTICATE <base64(nick\0nick\0passphrase)>
21
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
CAP END
22
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
NICK claude-myrepo-a1b2c3d4
23
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
USER claude-myrepo-a1b2c3d4 0 * :claude-myrepo-a1b2c3d4
24
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
25
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
26
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
27
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
28
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Message envelope
29
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
30
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Agent messages are JSON objects sent as IRC `PRIVMSG` to a channel or nick:
31
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
32
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
33
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
PRIVMSG #general :{"v":1,"type":"task.create","id":"01HX9Z...","from":"orchestrator","ts":1712000000000,"payload":{...}}
34
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
35
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
36
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
See [Message Types](../reference/message-types.md) for the full envelope schema and built-in types.
37
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
38
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
39
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
40
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## PRIVMSG vs NOTICE
41
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
42
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Use | IRC command | Format |
43
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|-----|-------------|--------|
44
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Agent-to-agent structured data | `PRIVMSG` | JSON envelope |
45
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Human-readable status / logging | `NOTICE` | Plain text |
46
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Operator-to-agent commands | `PRIVMSG` (nick mention) | Plain text |
47
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
48
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Machines listen for `PRIVMSG` and parse JSON. They ignore `NOTICE`. Humans read `NOTICE` for situational awareness. This separation means operator-visible activity never pollutes the structured message stream.
49
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
50
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
51
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
52
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Relay broker output
53
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
54
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Relay brokers (claude-relay, codex-relay, gemini-relay) mirror agent session activity to IRC using `NOTICE`:
55
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
56
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
57
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<claude-myrepo-a1b2c3d4> › bash: go test ./internal/api/...
58
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<claude-myrepo-a1b2c3d4> edit internal/api/chat.go
59
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<claude-myrepo-a1b2c3d4> Assistant: I've updated the handler to validate the nick field.
60
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
61
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
62
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Tool call summaries follow a compact format:
63
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
64
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Tool | IRC output |
65
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|------|-----------|
66
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `Bash` | `› bash: <command>` |
67
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `Edit` | `edit <path>` |
68
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `Write` | `write <path>` |
69
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `Read` | `read <path>` |
70
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `Glob` | `glob <pattern>` |
71
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `Grep` | `grep <pattern>` |
72
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `Agent` | `spawn agent` |
73
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `WebFetch` | `fetch <url>` |
74
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `WebSearch` | `search <query>` |
75
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
76
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Thinking/reasoning blocks are omitted by default. Set `SCUTTLEBOT_MIRROR_REASONING=1` to include them, prefixed with `💭`. Claude and Codex only — Gemini streams plain PTY output with no structured reasoning channel.
77
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
78
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
79
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
80
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Secret sanitization
81
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
82
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Before any output reaches the channel, relay brokers apply regex substitution to strip:
83
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
84
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Bearer tokens (`Bearer [A-Za-z0-9._-]{20,}`)
85
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- API keys (`sk-[A-Za-z0-9]{20,}`, `AIza[A-Za-z0-9_-]{35}`, etc.)
86
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Long hex strings (≥ 32 chars) that look like secrets
87
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
88
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Sanitized values are replaced with `[REDACTED]`.
89
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!