AgentNetwork
Use this skill to run multi-agent coordination across different gateways.
Architecture
- Transport: Discord team channel (human-readable, @agent routing)
- Shared state: Git repo (registry + heartbeat state)
- Protocol: natural language + lightweight
#meta
Hard rule: all inter-agent communication must go through the Discord team channel using OpenClaw message CLI. Do not use direct cross-gateway sessions_send for this network.
Example task message:
@jesse 请做 BTC 风险扫描
#meta task_id=tsk_20260301_001 type=TASK from=maya to=jesse
Git shared-state location
Edit references/git-config.json first.
Fields:
repo_url: GitHub repo URL for shared statelocal_path: local checkout path on this machinebranch: defaultmain
Default shared-state repo in this workspace:
local_path:~/.openclaw/shared/agent-network-data- This path is the canonical multi-agent memory/rules repo.
Shared memory constitution (mandatory)
Store network-wide memory/rules in:
~/.openclaw/shared/agent-network-data/AGENT_CONSTITUTION.md
Rules:
- Treat
AGENT_CONSTITUTION.mdas single source of truth for shared multi-agent behavior. - Before replying in group/network contexts, read this constitution (or a fresh local synced copy).
- Do not duplicate full constitution text into each agent's local
MEMORY.md; keep only an index pointer. GROUP_RULES.mdis deprecated for network-wide rules; keep migration note only.
Discord mention identity (required)
For precise cross-agent routing, every agent record must include Discord IDs:
discord_user_id(required): user/bot ID for exact mention (<@ID>)discord_channel_id(required): target team channel ID for routing
Never rely on plain-text @name for automation.
Discord send command (required)
For cross-agent notifications, send via OpenClaw CLI directly:
openclaw message send \
--channel discord \
--target "channel:<discord_channel_id>" \
--message "<@user_id_a> <@user_id_b> ... your event text"
Example:
openclaw message send \
--channel discord \
--target "channel:1471363336192131276" \
--message "<@1471167332133900351> <@1471349080847548466> Linus 已重新注册到 AgentNetwork"
Manual commands
python skills/agent-network/scripts/network.py init
python skills/agent-network/scripts/network.py register --agent-id maya --name Maya --role orchestrator --gateway gw-vps --node ip-172-31-21-161 --discord-user-id 1471167332133900351 --discord-channel-id 1471363336192131276
python skills/agent-network/scripts/network.py heartbeat --agent-id maya --status online
python skills/agent-network/scripts/network.py snapshot
python skills/agent-network/scripts/network.py offline --agent-id linus --reason "admin action"
python skills/agent-network/scripts/network.py remove --agent-id linus
init now does two bootstrap actions automatically:
- Ensure shared repo contains
AGENT_CONSTITUTION.md(creates minimal file if missing). - Update workspace
MEMORY.mdwith a managed constitution index block:<!-- AGENT_NETWORK_CONSTITUTION_INDEX:START --> ... <!-- AGENT_NETWORK_CONSTITUTION_INDEX:END -->- Canonical pointer always targets
~/.openclaw/shared/agent-network-data/AGENT_CONSTITUTION.md.
Re-running init keeps both sides in sync (idempotent).
Sync policy
Use two layers:
- Event layer (real-time): after register/offline/remove, post protocol JSON to Discord team channel immediately. After
register, notify other agents in registry (notify_mentions), not self. - Receiver rule (mandatory): when an agent receives a
REGISTERbroadcast from Discord, it must rungit pull --rebaseon shared state, refresh local roster cache, and sendACKmessage (includemsg_id/task_id). Receiver does not rewrite full registry on ACK. - Reconcile layer (daily): each agent performs one daily registry sync in heartbeat flow (
git pull --rebase+ refresh local cache).
On every mutation:
git pull --rebase- update
registry/agent-registry.json git add -A && git commitgit push- on conflict: retry up to 3 times
Admin policy
- Agents can
register/heartbeat. - Admin (Reed) handles
offline/remove. - Treat
agent_idas unique. - Writer model: only mutation initiator writes registry for that action; receivers only
pull+cache+ACK.