Install
openclaw skills install claw-bondLets two OpenClaw agents negotiate, coordinate, and commit to tasks in real time — peer-to-peer task negotiation, commitment tracking, and deadline reminders. Uses a relay for connection setup; all messages are end-to-end encrypted.
openclaw skills install claw-bondAn OpenClaw skill that connects your agent to other OpenClaw agents for real-time task negotiation, commitment tracking, and collaboration. Uses a relay for connection setup — all messages are encrypted end-to-end (Noise_XX / AES-256-GCM). Keys and task data stay on your machine.
clawhub install claw-bond
Then install Python dependencies (once):
pip3 install PyNaCl noiseprotocol websockets
Manual install:
git clone https://github.com/techtanush/claw-connector.git ~/.openclaw/workspace/skills/claw-bond
pip3 install PyNaCl noiseprotocol websockets
If OpenClaw doesn't pick up the skill automatically, you can run every command directly in terminal:
# Generate your address
python3 ~/.openclaw/workspace/skills/claw-bond/negotiate.py generate-address
# Connect to a peer
python3 ~/.openclaw/workspace/skills/claw-bond/negotiate.py connect <token>
# Propose a task
python3 ~/.openclaw/workspace/skills/claw-bond/negotiate.py propose <peer>
# Check status
python3 ~/.openclaw/workspace/skills/claw-bond/negotiate.py status
# See connected peers
python3 ~/.openclaw/workspace/skills/claw-bond/negotiate.py peers
You are equipped with the
claw-connectorskill. This document is your operating manual. Read it fully. Follow every rule precisely. The spec is law.
You negotiate tasks between two OpenClaw agents — yours and a peer's — and record binding commitments in both agents' memory. You are the protocol layer. The human is the decision-maker. You never accept, commit, or renegotiate without explicit human approval.
You activate on:
/claw-diplomatFor natural language triggers, always confirm before acting:
Sounds like you want to start a negotiation with {inferred_peer}. Is that right? (yes / no)
If the peer name is ambiguous:
I think you mean one of these:
- {peer_alias_1}
- {peer_alias_2}
Which one? (1 / 2 / cancel)
You execute negotiation logic through two Python scripts located at skills/claw-bond/:
negotiate.py — all command handling, key management, relay HTTP, Noise_XX channels, memory writeslistener.py — background inbound relay listener. Started manually by the user or agent (python3 listener.py & in terminal). The diplomat-gateway hook only checks whether it is already running (reads PID file, sends signal 0) and prompts you to start it if it isn't — it does not spawn it automatically.Never implement negotiation logic in hook handlers. Never implement protocol logic inline. Always delegate to the Python scripts.
Every command works two ways — say it to your OpenClaw agent, or paste the terminal version directly.
| OpenClaw agent | Terminal (copy-paste) | What it does |
|---|---|---|
/claw-diplomat generate-address | python3 ~/.openclaw/workspace/skills/claw-bond/negotiate.py generate-address | Create your shareable Diplomat Address token |
/claw-diplomat connect <token> | python3 ~/.openclaw/workspace/skills/claw-bond/negotiate.py connect <token> | Connect with a peer using their token |
/claw-diplomat propose <peer_alias> | python3 ~/.openclaw/workspace/skills/claw-bond/negotiate.py propose <peer_alias> | Start a negotiation with a connected peer |
/claw-diplomat list | python3 ~/.openclaw/workspace/skills/claw-bond/negotiate.py list | Show all active and recent sessions |
/claw-diplomat checkin <id> done|overdue|partial | python3 ~/.openclaw/workspace/skills/claw-bond/negotiate.py checkin <id> done | Report a commitment's status |
/claw-diplomat cancel <id> | python3 ~/.openclaw/workspace/skills/claw-bond/negotiate.py cancel <id> | Cancel a pending proposal |
/claw-diplomat peers | python3 ~/.openclaw/workspace/skills/claw-bond/negotiate.py peers | Show known peers and their status |
/claw-diplomat status | python3 ~/.openclaw/workspace/skills/claw-bond/negotiate.py status | Show pending check-ins and overdue commitments |
/claw-diplomat key | python3 ~/.openclaw/workspace/skills/claw-bond/negotiate.py key | Print your public key |
/claw-diplomat revoke | python3 ~/.openclaw/workspace/skills/claw-bond/negotiate.py revoke | Revoke your current Diplomat Address token |
/claw-diplomat handoff <peer_alias> | python3 ~/.openclaw/workspace/skills/claw-bond/negotiate.py handoff <peer_alias> | Hand off completed work and context to a peer |
/claw-diplomat retry-commit <id> | python3 ~/.openclaw/workspace/skills/claw-bond/negotiate.py retry-commit <id> | Retry a failed MEMORY.md write |
/claw-diplomat help security | python3 ~/.openclaw/workspace/skills/claw-bond/negotiate.py help security | Show security information |
/claw-diplomat setup-cron | python3 ~/.openclaw/workspace/skills/claw-bond/negotiate.py setup-cron | Register proactive deadline alerts cron (Path A) |
Tip: If OpenClaw doesn't recognize
/claw-diplomat, paste the terminal command — it does exactly the same thing.
Unknown command:
I don't recognize that. Here's what I can do:
/claw-diplomat generate-address — Create your shareable address
/claw-diplomat connect <address> — Connect with a peer
/claw-diplomat propose <peer> — Start a negotiation
/claw-diplomat status — See your commitments
/claw-diplomat checkin <id> — Report on a commitment
/claw-diplomat peers — See your connected peers
/claw-diplomat help security — Security information
When skills/claw-bond/diplomat.key does NOT exist:
skills/claw-bond/diplomat.key → chmod 600skills/claw-bond/diplomat.pub → chmod 644peers.json as {"peers":[]} and ledger.json as {"sessions":[]}## Diplomat Deadline Check block to HEARTBEAT.md (idempotent — check for duplicate first)👋 Setting up Claw Connector for the first time...
Generating your secure identity key... ✓
Your agent is now ready to negotiate tasks with other OpenClaw agents.
Next step: share your Diplomat Address with anyone you want to work with.
Run /claw-diplomat generate-address to create your shareable address.
If Python or a required package is missing:
⚠️ Claw Connector needs a few things before it can run.
Missing: {missing_item}
Run this to fix it:
pip install PyNaCl noiseprotocol websockets
Then try again.
/claw-diplomat generate-address)Show during generation:
Creating your Diplomat Address... (connecting to relay to reserve your slot)
Steps:
diplomat.key exists (run first-time setup if not)SOUL.md (fallback: "My OpenClaw")GET https://claw-diplomat-relay-production.up.railway.app/myip — timeout 5s; on timeout use nat_hint="unknown"POST https://claw-diplomat-relay-production.up.railway.app/reserve — timeout 10s{"v":1,"alias":"...","pubkey":"<hex>","relay":"<DIPLOMAT_RELAY_URL>","relay_token":"rt_...","nat_hint":"<ip>","issued_at":"<ISO8601>","expires_at":"<ISO8601>"}skills/claw-bond/my-address.tokenSuccess:
Your Diplomat Address is ready. Share this with {peer_alias_if_known | "anyone you want to work with"}:
{base64url_token}
This address is valid for {ttl_days} days (until {expires_at_local}).
Anyone with this address can propose tasks to your agent.
To connect with someone, ask them to run:
/claw-diplomat connect {base64url_token}
Relay unreachable:
⚠️ Couldn't reach the relay server to generate a full address.
Your local key is ready, but peers won't be able to connect until the relay is available.
Try again in a few minutes, or set up your own relay:
DIPLOMAT_RELAY_URL=wss://your-relay.example.com:443
If you just want to connect on the same local network, that's fine — run /claw-diplomat generate-address again when you have internet access.
/claw-diplomat connect <token>)Steps:
v==1, all required fields; check expires_at > now()peers.json for matching pubkey; if found: reconnect; if alias changed: warnConnecting to {peer_alias}'s agent...Verifying {peer_alias}'s identity... ✓peers.json entrySuccess:
✅ You're connected to {peer_alias}'s agent.
You can now propose tasks: /claw-diplomat propose {peer_alias}
Or wait for them to propose to you.
Token expired:
This address has expired (it was valid until {expires_at_local}).
Ask {peer_alias_or_"your contact"} to run /claw-diplomat generate-address and share their new address.
Noise key mismatch:
⛔ Something doesn't look right.
The agent that responded has a different identity than the address token specified. This could mean:
• {peer_alias} generated a new key and you have an old token (most likely)
• Someone is intercepting the connection (unlikely but possible)
To be safe, ask {peer_alias} to share a fresh Diplomat Address and connect again.
This connection has been closed.
/claw-diplomat propose <peer_alias>)Steps:
peers.json — if not found: "I don't have a connection to {alias}. Run /claw-diplomat connect <address> first."What will you take on? (describe your tasks)
> {user types their tasks}
What are you asking {peer_alias} to do?
> {user types peer's tasks}
What's the deadline? (e.g. "Friday 5pm" or "2026-03-27 17:00")
> {user types deadline}
Check-in time? (optional — leave blank to use the deadline)
> {user types or presses Enter}
Here's what you're proposing to {peer_alias}:
You'll do: {my_tasks_formatted}
They'll do: {peer_tasks_formatted}
Deadline: {deadline_local}
{check_in_line_if_set}
Send this proposal? (yes / no)
session_id (UUID4), build and send encrypted PROPOSE message, write PROPOSED to ledger.json, append to memory/YYYY-MM-DD.mdProposal sent to {peer_alias}. Waiting for their response... (I'll let you know when they reply. This session will stay open for {timeout_hours} hours.)Relay unreachable during send:
Couldn't reach the relay right now. Your proposal has been saved and I'll retry the next time you open your agent.
To retry now: /claw-diplomat propose {peer_alias}
When a counter arrives:
↩️ {peer_alias} has a counter-proposal:
They'll do: {peer_new_my_tasks}
You'll do: {peer_new_your_tasks}
Deadline: {peer_new_deadline_local}
(Changes from your original: {diff_summary})
What do you want to do?
[accept] — Agree to these terms
[counter] — Propose different terms
[reject] — Decline and end the negotiation
terms_version in ledger on each round.When the user counters:
What changes do you want to make?
Your tasks (currently: {current_my_tasks}):
> {user types or presses Enter to keep}
Their tasks (currently: {current_peer_tasks}):
> {user types or presses Enter to keep}
Deadline (currently: {current_deadline_local}):
> {user types or presses Enter to keep}
Sending counter-proposal to {peer_alias}...
terms_version and terms_hash = sha256(json.dumps(sorted(final_terms), sort_keys=True))terms_version and identical terms_hash — on mismatch abort per DATA_FLOWS.md F10- **[ACTIVE]** Peer: {alias} | My: {my_tasks_500chars} | Their: {peer_tasks} | Due: {deadline_utc} | ID: \{session_id_short}``memory/YYYY-MM-DD.mdCOMMIT_ACK { memory_hash: sha256(entry_written) }; verify peer's hash matchesledger.json: state=COMMITTED, memory_hash, peer_memory_hash, committed_at✅ Deal locked in with {peer_alias}.
You'll do: {my_tasks_formatted}
They'll do: {peer_tasks_formatted}
Deadline: {deadline_local}
I've logged this in your memory. I'll remind you before the deadline.
MEMORY.md write failure:
⚠️ I accepted the deal but couldn't write it to your memory.
Error: {error_message}
Please check your disk space and file permissions, then run:
/claw-diplomat retry-commit {session_id_short}
Your commitment is safely recorded in the skill's ledger (ledger.json) until this is resolved.
20-entry limit reached:
You already have 20 active commitments logged. Complete or cancel one before taking on another.
To see your current commitments: /claw-diplomat status
/claw-diplomat checkin <id> done|overdue|partial)MEMORY.md by session_id_short; find full record in ledger.json[ACTIVE] with [DONE] / [OVERDUE] / [PARTIAL]memory/YYYY-MM-DD.md: {ts} — {session_id_short}: {STATUS} (reported by self)ledger.json: state = STATUS, checkin_at_actual = now()Done:
✅ Marked complete. {peer_alias}'s agent has been notified.
Great work.
Partial:
Noted. I've logged this as partially complete.
Want to renegotiate the remaining tasks with {peer_alias}? (yes / no)
Overdue (no renegotiation):
Logged as overdue. {peer_alias}'s agent has been notified.
You can renegotiate when you're ready: /claw-diplomat propose {peer_alias}
Overdue (with new deadline — only if human explicitly requested):
Logged as overdue. Opening a renegotiation with {peer_alias}...
When the diplomat-heartbeat hook surfaces an INBOUND_PENDING session, translate it into plain language and address the human directly. Do not send, accept, or log anything until the human explicitly says so.
📨 {peer_alias}'s agent is proposing a task split:
They'll handle: {peer_my_tasks}
They want you to handle: {your_tasks}
Deadline: {deadline_local}
Check-in: {checkin_local}
Any changes, or should I accept?
Wait for the human's response. Three paths:
Path 1 — Human says accept (or "looks good", "yes", "go ahead"):
Confirm before sending anything:
I'll accept {peer_alias}'s proposal. Once I send this, it becomes a logged commitment for both of you. Confirm? (yes / no)
On yes: send ACCEPT message. Only then write to MEMORY.md and ledger.json.
Path 2 — Human describes changes in natural language ("move check-in to 8:30", "change deadline to Tuesday"):
Parse the changes. Reconstruct the full terms. Show the human exactly what you will send before sending it:
Got it. I'll send {peer_alias}'s agent a counter-proposal:
You'll handle: {your_tasks} — unchanged
They'll handle: {peer_tasks} — unchanged
Deadline: {deadline_local} — unchanged
Check-in: {new_checkin_local} ← changed
Should I send that? (yes / no)
On yes: send COUNTER message. Never send a counter-proposal without this explicit confirmation step. Increment terms_version on every round.
Path 3 — Human says reject ("no", "decline", "pass on this"):
Confirm before sending:
I'll decline {peer_alias}'s proposal and close this negotiation. Confirm? (yes / no)
On yes: send REJECT. Update ledger state to REJECTED.
Unknown peer:
📨 An agent you haven't connected with before wants to propose something.
Agent key: {pubkey_short} (from {peer_ip})
Do you want to add them as a peer to see what they're proposing?
yes — I'll add them as "{suggested_alias}" and show you the full proposal
no — I'll decline and close the connection
If yes: add to peers.json, then surface the proposal using the standard flow above. If no: send REJECT, do not store any peer data.
Peer missed check-in alert:
⚠️ {peer_alias} missed their check-in.
Their tasks: {peer_tasks_summary}
Was due: {deadline_local}
They haven't reported their status yet. You can:
• Wait — they may just be running late
• Renegotiate: /claw-diplomat propose {peer_alias}
• Log it officially: /claw-diplomat checkin {session_id_short} overdue
Peer went offline mid-negotiation:
Lost connection to {peer_alias} mid-negotiation. No deal was recorded.
Your last proposed terms are saved. I'll try to reconnect the next time you open your agent.
/claw-diplomat peers:
Your connected peers:
{peer_alias_1} · last seen {relative_time_1} · {connection_status_1}
{peer_alias_2} · last seen {relative_time_2} · {connection_status_2}
{n} peer{s} total. To add a new peer: /claw-diplomat connect <address>
No peers:
You haven't connected with anyone yet.
Share your address to get started: /claw-diplomat generate-address
/claw-diplomat status:
claw-connector status:
Active commitments ({n}):
{per_commitment_one_liner}
Pending proposals ({n}):
{per_proposal_one_liner}
Overdue ({n}):
{per_overdue_one_liner}
{nothing_to_show_message_if_all_zero}
Nothing active:
All clear — no active commitments or pending proposals.
On install, negotiate.py install registers a crontab entry:
*/15 * * * * python3 {skill_dir}/cron_deadline_check.py >> {skill_dir}/cron.log 2>&1
cron_deadline_check.py runs every 15 minutes and:
[ACTIVE] commitmentsskills/claw-bond/cron_alerts.jsonopenclaw notify "<message>" if the OpenClaw CLI is in PATH — this delivers a real message through whatever channel the human uses (WhatsApp, Telegram, etc.)Alert message format:
⏰ Heads up — {my_tasks} is due in {hours} hours and {peer_alias} hasn't confirmed completion yet. Want me to check in with their agent?
The diplomat-heartbeat hook reads cron_alerts.json on every human message and surfaces any unshown alerts immediately. It also performs its own deadline scan so users without cron still get reminders — they just arrive reactively (when they next open their agent) rather than proactively on a schedule.
If cron registration fails on install, the skill continues to work via Path B and logs a warning.
memory_hash (a SHA-256 hash) is transmitted.diplomat.key anywhere other than skills/claw-bond/diplomat.key. Not in env vars, logs, MEMORY.md, or any peer message.session_id.final_terms and memory_hash cannot be changed.peers.json is quarantined; surface to human for authorization before any proposal data is shown.Append this exactly once to HEARTBEAT.md during install (idempotent — check for ## Diplomat Deadline Check before writing):
## Diplomat Deadline Check
On every heartbeat: scan `## Diplomat Commitments` in MEMORY.md. For any entry marked [ACTIVE] where the Due date has passed, reply with the alias and ID. For any entry where Due is within 2 hours, flag as upcoming.
After install, verify:
diplomat.key exists and has mode 0600diplomat.pub exists and has mode 0644peers.json contains {"peers":[]}ledger.json contains {"sessions":[]}HEARTBEAT.md contains exactly one ## Diplomat Deadline Check blocklistener.py is running (check listener.pid)GET https://claw-diplomat-relay-production.up.railway.app/myip returns 200Claw Connector v1.0.5 — Your agent. Their agent. One deal.