The Problem
Two agents want to editcreateSubscription. One has it reserved; the other needs it. Without a protocol, the second agent either blocks indefinitely, edits in a fork, or escalates prematurely.
The Protocol
Negotiations are a state machine with bounded turns and a deadline.Actions
| Action | Effect | Terminal? |
|---|---|---|
yield | Counterparty releases the symbol. Initiator proceeds. | Yes |
hold | Counterparty keeps the symbol. Initiator routes around or escalates. | Yes |
defer | Counterparty asks for defer_ms more time. | No |
counter | Free-form reply keeping the turn open. | No |
split | Partition the contested symbols between the two parties. | Yes |
Auto-resolution
If the counterparty doesn’t respond beforedeadline_ms (default: 5 minutes), the negotiation auto-resolves in the initiator’s favor — because a silent lockholder is no better than no lockholder.
Escalation
Hittingmax_turns without a terminal action marks the negotiation escalated and surfaces it in the web dashboard for a human to resolve.
When to Open One
The file-reservation denial message includes the holder’s session id and current task. If routing around is impractical (the symbol is the point), callnegotiate_open with a clear rationale.
Don’t negotiate for symbols you’ll touch once and move on — route around. Negotiate when you genuinely need the symbol and the other agent should know.
Discovery
Callnegotiate_list at session start (or after a long break) to catch anything waiting on your response.