docs: add mail protocol reference (gt-k294l)
Document inter-agent mail types: - POLECAT_DONE, MERGE_READY, MERGED - WITNESS_PING, HELP, HANDOFF 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
263
docs/mail-protocol.md
Normal file
263
docs/mail-protocol.md
Normal file
@@ -0,0 +1,263 @@
|
||||
# Gas Town Mail Protocol
|
||||
|
||||
> Reference for inter-agent mail communication in Gas Town
|
||||
|
||||
## Overview
|
||||
|
||||
Gas Town agents coordinate via mail messages routed through the beads system.
|
||||
Mail uses `type=message` beads with routing handled by `gt mail`.
|
||||
|
||||
## Message Types
|
||||
|
||||
### POLECAT_DONE
|
||||
|
||||
**Route**: Polecat → Witness
|
||||
|
||||
**Purpose**: Signal work completion, trigger cleanup flow.
|
||||
|
||||
**Subject format**: `POLECAT_DONE <polecat-name>`
|
||||
|
||||
**Body format**:
|
||||
```
|
||||
Exit: MERGED|ESCALATED|DEFERRED
|
||||
Issue: <issue-id>
|
||||
MR: <mr-id> # if exit=MERGED
|
||||
Branch: <branch>
|
||||
```
|
||||
|
||||
**Trigger**: `gt polecat done` command generates this automatically.
|
||||
|
||||
**Handler**: Witness creates a cleanup wisp for the polecat.
|
||||
|
||||
### MERGE_READY
|
||||
|
||||
**Route**: Witness → Refinery
|
||||
|
||||
**Purpose**: Signal a branch is ready for merge queue processing.
|
||||
|
||||
**Subject format**: `MERGE_READY <polecat-name>`
|
||||
|
||||
**Body format**:
|
||||
```
|
||||
Branch: <branch>
|
||||
Issue: <issue-id>
|
||||
Polecat: <polecat-name>
|
||||
Verified: clean git state, issue closed
|
||||
```
|
||||
|
||||
**Trigger**: Witness sends after verifying polecat work is complete.
|
||||
|
||||
**Handler**: Refinery adds to merge queue, processes when ready.
|
||||
|
||||
### MERGED
|
||||
|
||||
**Route**: Refinery → Witness
|
||||
|
||||
**Purpose**: Confirm branch was merged successfully, safe to nuke polecat.
|
||||
|
||||
**Subject format**: `MERGED <polecat-name>`
|
||||
|
||||
**Body format**:
|
||||
```
|
||||
Branch: <branch>
|
||||
Issue: <issue-id>
|
||||
Merged-At: <timestamp>
|
||||
```
|
||||
|
||||
**Trigger**: Refinery sends after successful merge to main.
|
||||
|
||||
**Handler**: Witness completes cleanup wisp, nukes polecat worktree.
|
||||
|
||||
### WITNESS_PING
|
||||
|
||||
**Route**: Witness → Deacon (all witnesses send)
|
||||
|
||||
**Purpose**: Second-order monitoring - ensure Deacon is alive.
|
||||
|
||||
**Subject format**: `WITNESS_PING <rig>`
|
||||
|
||||
**Body format**:
|
||||
```
|
||||
Rig: <rig>
|
||||
Timestamp: <timestamp>
|
||||
Patrol: <cycle-number>
|
||||
```
|
||||
|
||||
**Trigger**: Each witness sends periodically (every N patrol cycles).
|
||||
|
||||
**Handler**: Deacon acknowledges. If no ack, witnesses escalate to Mayor.
|
||||
|
||||
### HELP
|
||||
|
||||
**Route**: Any → escalation target (usually Mayor)
|
||||
|
||||
**Purpose**: Request intervention for stuck/blocked work.
|
||||
|
||||
**Subject format**: `HELP: <brief-description>`
|
||||
|
||||
**Body format**:
|
||||
```
|
||||
Agent: <agent-id>
|
||||
Issue: <issue-id> # if applicable
|
||||
Problem: <description>
|
||||
Tried: <what was attempted>
|
||||
```
|
||||
|
||||
**Trigger**: Agent unable to proceed, needs external help.
|
||||
|
||||
**Handler**: Escalation target assesses and intervenes.
|
||||
|
||||
### HANDOFF
|
||||
|
||||
**Route**: Agent → self (or successor)
|
||||
|
||||
**Purpose**: Session continuity across context limits/restarts.
|
||||
|
||||
**Subject format**: `🤝 HANDOFF: <brief-context>`
|
||||
|
||||
**Body format**:
|
||||
```
|
||||
attached_molecule: <molecule-id> # if work in progress
|
||||
attached_at: <timestamp>
|
||||
|
||||
## Context
|
||||
<freeform notes for successor>
|
||||
|
||||
## Status
|
||||
<where things stand>
|
||||
|
||||
## Next
|
||||
<what successor should do>
|
||||
```
|
||||
|
||||
**Trigger**: `gt handoff` command, or manual send before session end.
|
||||
|
||||
**Handler**: Next session reads handoff, continues from context.
|
||||
|
||||
## Format Conventions
|
||||
|
||||
### Subject Line
|
||||
|
||||
- **Type prefix**: Uppercase, identifies message type
|
||||
- **Colon separator**: After type for structured info
|
||||
- **Brief context**: Human-readable summary
|
||||
|
||||
Examples:
|
||||
```
|
||||
POLECAT_DONE nux
|
||||
MERGE_READY gastown/nux
|
||||
HELP: Polecat stuck on test failures
|
||||
🤝 HANDOFF: Schema work in progress
|
||||
```
|
||||
|
||||
### Body Structure
|
||||
|
||||
- **Key-value pairs**: For structured data (one per line)
|
||||
- **Blank line**: Separates structured data from freeform content
|
||||
- **Markdown sections**: For freeform content (##, lists, code blocks)
|
||||
|
||||
### Addresses
|
||||
|
||||
Format: `<rig>/<role>` or `<rig>/<type>/<name>`
|
||||
|
||||
Examples:
|
||||
```
|
||||
gastown/witness # Witness for gastown rig
|
||||
beads/refinery # Refinery for beads rig
|
||||
gastown/polecats/nux # Specific polecat
|
||||
mayor/ # Town-level Mayor
|
||||
deacon/ # Town-level Deacon
|
||||
```
|
||||
|
||||
## Protocol Flows
|
||||
|
||||
### Polecat Completion Flow
|
||||
|
||||
```
|
||||
Polecat Witness Refinery
|
||||
│ │ │
|
||||
│ POLECAT_DONE │ │
|
||||
│─────────────────────────>│ │
|
||||
│ │ │
|
||||
│ (verify clean) │
|
||||
│ │ │
|
||||
│ │ MERGE_READY │
|
||||
│ │─────────────────────────>│
|
||||
│ │ │
|
||||
│ │ (merge to main)
|
||||
│ │ │
|
||||
│ │ MERGED │
|
||||
│ │<─────────────────────────│
|
||||
│ │ │
|
||||
│ (nuke polecat) │
|
||||
│ │ │
|
||||
```
|
||||
|
||||
### Second-Order Monitoring
|
||||
|
||||
```
|
||||
Witness-1 ──┐
|
||||
│ WITNESS_PING
|
||||
Witness-2 ──┼────────────────> Deacon
|
||||
│
|
||||
Witness-N ──┘
|
||||
│
|
||||
(if no response)
|
||||
│
|
||||
<────────────────────┘
|
||||
Escalate to Mayor
|
||||
```
|
||||
|
||||
## Implementation
|
||||
|
||||
### Sending Mail
|
||||
|
||||
```bash
|
||||
# Basic send
|
||||
gt mail send <addr> -s "Subject" -m "Body"
|
||||
|
||||
# With structured body
|
||||
gt mail send gastown/witness -s "MERGE_READY nux" -m "Branch: feature-xyz
|
||||
Issue: gt-abc
|
||||
Polecat: nux
|
||||
Verified: clean"
|
||||
```
|
||||
|
||||
### Receiving Mail
|
||||
|
||||
```bash
|
||||
# Check inbox
|
||||
gt mail inbox
|
||||
|
||||
# Read specific message
|
||||
gt mail read <msg-id>
|
||||
|
||||
# Mark as read
|
||||
gt mail ack <msg-id>
|
||||
```
|
||||
|
||||
### In Patrol Formulas
|
||||
|
||||
Formulas should:
|
||||
1. Check inbox at start of each cycle
|
||||
2. Parse subject prefix to route handling
|
||||
3. Extract structured data from body
|
||||
4. Take appropriate action
|
||||
5. Mark mail as read after processing
|
||||
|
||||
## Extensibility
|
||||
|
||||
New message types follow the pattern:
|
||||
1. Define subject prefix (TYPE: or TYPE_SUBTYPE)
|
||||
2. Document body format (key-value pairs + freeform)
|
||||
3. Specify route (sender → receiver)
|
||||
4. Implement handlers in relevant patrol formulas
|
||||
|
||||
The protocol is intentionally simple - structured enough for parsing,
|
||||
flexible enough for human debugging.
|
||||
|
||||
## Related Documents
|
||||
|
||||
- `docs/agent-as-bead.md` - Agent identity and slots
|
||||
- `.beads/formulas/mol-witness-patrol.formula.toml` - Witness handling
|
||||
- `internal/mail/` - Mail routing implementation
|
||||
Reference in New Issue
Block a user