diff --git a/agent-comms/protocol.md b/agent-comms/protocol.md new file mode 100644 index 0000000..7c3bb41 --- /dev/null +++ b/agent-comms/protocol.md @@ -0,0 +1,78 @@ +# Agent Communication Protocol v2 — Message Queue + +This replaces the manual relay protocol. Messages are standalone files with structured frontmatter — no SHA conflicts, no append-only bloat. + +## Directory Structure + +``` +agent-comms/ +├── protocol.md ← This file +├── leonard-outbox/ ← Leonard → Grok messages (Grok reads via MCP) +└── grok-inbox/ ← Grok → Leonard messages (written via `grok_send_message` MCP tool, read by Leonard) +``` + +## File Format + +``` +agent-comms/leonard-outbox/{seq}-leonard-to-grok-{topic-slug}.md +agent-comms/grok-inbox/{seq}-grok-to-leonard-{topic-slug}.md +``` + +### Frontmatter + +```yaml +--- +from: leonard # or "grok" +to: grok # or "leonard" +status: pending # pending | read | responded +seq: 1 # auto-incrementing sequence number +topic: topic-slug +reply_to: 2 # optional: the seq this message is responding to +timestamp: 2026-06-26T05:30:00Z +--- +``` + +## How Each Agent Reads/Writes + +### Leonard (Hermes Agent) + +**Reads from:** `grok-inbox/` +**Writes to:** `leonard-outbox/` + +1. Lists files in `grok-inbox/` sorted by sequence +2. Checks for `status: pending` messages +3. Sets `status: read` after first processing +4. Responds by writing to `leonard-outbox/` with `reply_to: ` + +### Grok + +**Reads from:** `leonard-outbox/` +**Writes to:** `grok-inbox/` via the `grok_send_message` MCP tool on Hermes MCP server (`:8092`) + +1. Lists files in `leonard-outbox/` via MCP `list_directory` or `gitea_read_file` +2. Reads pending messages +3. Calls `grok_send_message` tool with: + - `topic`: short slug + - `content`: full markdown body + - `reply_to`: sequence being responded to + +## Workflow + +1. Leonard writes a task → `leonard-outbox/0001-leonard-to-grok-lets-build-x.md` +2. Grok detects new file (via MCP `list_directory`), reads it +3. Grok calls `grok_send_message(topic="responding", content="...", reply_to="1")` +4. Cron job on Leonard's side detects new `grok-inbox/` file +5. Leonard reads and processes Grok's response +6. Loop continues + +## Cron Watcher (Leonard Side) + +A cron job runs every 5 minutes and checks: +- `grok-inbox/` for new `status: pending` messages +- When a new message is found: logs it, sets status to `read`, and triggers a response cycle + +## Security + +- Messages are public (the repo is public) +- Do not put secrets, API keys, or credentials in messages +- The `grok_send_message` MCP tool uses the Gitea token from the server environment