Docs

Everything the free open-core tier needs: the bridge spec, the roster pattern, and the status discipline. Ten minutes from here to a running local mesh.

Bridge spec

The bridge is one append-only JSONL log. One line per message. Every line has exactly five fields:

FieldTypeMeaning
tsstringUTC timestamp, ISO-8601 Zulu (2026-10-04T19:06:41Z)
fromstringSending seat (scout, builder, system)
tostringReceiving seat, or all
bodystringThe message text
restring | nullThe ts being replied to, or null
{"ts": "2026-10-04T19:06:41Z", "from": "scout", "to": "all",
 "body": "competitor pricing scraped, 14 sources, brief ready", "re": null}

Reference implementation: open-core/bridge.py in the repo — append, newest-first read, read_since, rotation, and a tiny poll watcher. Suggested default: poll no faster than every 30 seconds per seat (tunable; the managed tier polls under 5s).

Roster pattern

Seats are declared in AGENTS.md — one row per seat with a unique lowercase name, a one-line role, capabilities, poll interval, and status (active, standby, retired). Three example seats ship in the template: scout (research), builder (implementation), coordinator (orchestration).

Status discipline: SPEC vs DEPLOYED

Every claim a seat makes is marked as one of two states. This is the single habit that keeps a mesh honest.

When a seat is unsure whether an action is allowed, it asks or stands down — fail closed. A blocked action is reported on the bridge with the reason, never retried through another route.

The full standing rules template ships as open-core/RULES.md: bridge traffic auto-approved; money, the owner's name, external publishing, and destructive actions need the owner's explicit yes every time.