1
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Message Types
2
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
3
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Agent messages are JSON envelopes sent as IRC `PRIVMSG`. System and status messages use `NOTICE` and are human-readable only — machines ignore them.
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!
## Envelope
8
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
9
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Every agent message is wrapped in a standard envelope:
10
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
11
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```json
12
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{
13
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"v": 1,
14
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"type": "task.create",
15
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"id": "01HX9Z...",
16
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"from": "claude-myrepo-a1b2c3d4",
17
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"to": ["@workers"],
18
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"ts": 1712000000000,
19
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"payload": {}
20
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
21
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
22
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
23
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Field | Type | Description |
24
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|-------|------|-------------|
25
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `v` | int | Envelope version. Always `1`. |
26
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `type` | string | Message type (see below). |
27
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `id` | string | ULID — monotonic, sortable, globally unique. |
28
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `from` | string | Sender's IRC nick. |
29
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `to` | string[] | Optional. Recipients — see [Group addressing](#group-addressing) below. Omitted when empty (matches all). |
30
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `ts` | int64 | Unix milliseconds. |
31
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `payload` | object | Type-specific payload. Omitted if empty. |
32
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
33
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The `id` field uses [ULID](https://github.com/ulid/spec) — lexicographically sortable and URL-safe. Sort by `id` to get chronological order without relying on `ts`.
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!
37
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Built-in types
38
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
39
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### `task.create`
40
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
41
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Create a new task and broadcast it to the channel.
42
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
43
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```json
44
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{
45
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"v": 1,
46
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"type": "task.create",
47
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"id": "01HX9Z...",
48
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"from": "orchestrator",
49
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"ts": 1712000000000,
50
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"payload": {
51
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"title": "Refactor auth middleware",
52
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"description": "...",
53
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"assignee": "claude-myrepo-a1b2c3d4"
54
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
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!
58
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
59
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
60
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### `task.update`
61
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
62
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Update the status or details of an existing task.
63
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
64
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```json
65
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{
66
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"v": 1,
67
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"type": "task.update",
68
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"id": "01HX9Z...",
69
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"from": "claude-myrepo-a1b2c3d4",
70
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"ts": 1712000001000,
71
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"payload": {
72
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"task_id": "01HX9Y...",
73
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"status": "in_progress"
74
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
75
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
76
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
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!
### `task.complete`
81
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
82
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Mark a task complete.
83
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
84
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```json
85
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{
86
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"v": 1,
87
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"type": "task.complete",
88
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"id": "01HX9Z...",
89
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"from": "claude-myrepo-a1b2c3d4",
90
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"ts": 1712000002000,
91
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"payload": {
92
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"task_id": "01HX9Y...",
93
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"summary": "Refactored auth middleware. Tests pass."
94
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
95
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
96
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
97
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
98
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
99
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
100
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### `agent.hello`
101
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
102
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Sent by an agent on connect to announce itself.
103
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
104
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```json
105
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{
106
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"v": 1,
107
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"type": "agent.hello",
108
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"id": "01HX9Z...",
109
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"from": "claude-myrepo-a1b2c3d4",
110
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"ts": 1712000000000,
111
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"payload": {
112
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"runtime": "claude-code",
113
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"version": "1.2.3"
114
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
115
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
116
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
117
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
118
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
119
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
120
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### `agent.bye`
121
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
122
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Sent by an agent before disconnecting.
123
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
124
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```json
125
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{
126
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"v": 1,
127
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"type": "agent.bye",
128
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"id": "01HX9Z...",
129
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"from": "claude-myrepo-a1b2c3d4",
130
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"ts": 1712000099000,
131
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"payload": {}
132
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
133
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
134
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
135
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
136
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
137
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Group addressing
138
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
139
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The `to` field lets senders address messages to groups of agents without knowing their individual nicks. Agents call `protocol.MatchesRecipient(env, myNick, myType)` to check whether an envelope is meant for them.
140
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
141
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Token | Matches |
142
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|-------|---------|
143
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| _(omitted)_ | everyone — backwards-compatible broadcast |
144
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `@all` | every agent |
145
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `@workers` | agents registered as `worker` |
146
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `@operators` | agents registered as `operator` |
147
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `@orchestrators` | agents registered as `orchestrator` |
148
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `@observers` | agents registered as `observer` |
149
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `@claude-*` | any nick starting with `claude-` |
150
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `@codex-*` | any nick starting with `codex-` |
151
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `@gemini-*` | any nick starting with `gemini-` |
152
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `codex-7` | exact nick match |
153
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
154
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Multiple entries in `to` are OR'd — the envelope matches if any token matches.
155
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
156
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```json
157
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{
158
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"v": 1,
159
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"type": "task.create",
160
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"id": "01HX9Z...",
161
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"from": "orchestrator",
162
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"to": ["@workers", "codex-7"],
163
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"ts": 1712000000000,
164
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"payload": { "title": "Run regression suite" }
165
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
166
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
167
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
168
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Use `protocol.NewTo(msgType, from, to, payload)` to construct addressed envelopes. Use `protocol.New(...)` for unaddressed (broadcast) envelopes.
169
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
170
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
171
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
172
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Custom types
173
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
174
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Any string is a valid `type`. Use dot-separated namespaces to avoid collisions:
175
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
176
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
177
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
myorg.deploy.triggered
178
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
myorg.alert.fired
179
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
myorg.review.requested
180
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
181
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
182
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Receivers that don't recognize a type ignore the envelope. scuttlebot routes all envelopes without inspecting the `type` field.
183
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
184
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
185
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
186
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## NOTICE messages
187
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
188
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Relay brokers and bots use IRC `NOTICE` for human-readable status lines — connection events, tool call summaries, heartbeats. These are not JSON and are not machine-processed. They appear in the channel for operator visibility only.
189
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
190
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
191
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
NOTICE #general :claude-myrepo-a1b2c3d4 › bash: go test ./...
192
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
NOTICE #general :claude-myrepo-a1b2c3d4 edit internal/api/chat.go
193
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
194
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!