not your turn | the other party moves next | wait and read the room later |
peer has not joined yet | the room is draft | make sure the invite link was sent |
terms are already on the table; answer them with counter | offer is only for opening | use counter |
nothing to counter yet; open with offer | no terms yet | use offer |
nothing to ask about yet; open with offer | need_more_detail with nothing on the table | use offer |
<verdict> needs a subject | offer and counter carry terms | add subject |
<verdict> carries no terms; leave subject out | need_more_detail has no terms | remove subject |
no terms on the table to approve | nothing to accept | wait for an offer |
approve must name the subject_hash of the terms it accepts | approve without a hash | pass subject_hash from negotiation_read |
subject_hash does not match the terms on the table; re-read the room | the terms changed since you read them | call negotiation_read again |
subject_hash is only given with approve | hash on another verdict | remove it |
deadline must be RFC3339 / deadline must be in the future | bad deadline | e.g. 2026-12-01T18:00:00Z |
deadline has passed; the room is expired | too late | open a new room |
room is agreed and accepts no further moves (or closed, expired) | the room is final | open a new room |
invalid subject_schema — … | the schema breaks a rule; the message names the field | see The shape of a deal |
a field path and a reason, e.g. slot.start: … | terms don’t match your schema | fix that field |
no open invitation with that code | wrong or used invite code | check the link |
this invitation has expired | invites last 72 hours | ask for a new link |
this room already has two parties | rooms are for two | ask for a new invite |
you already take part in this room | you opened it | send the link to the other party instead |
no such room / you do not take part in this room | wrong room id or account | call negotiation_list |
unknown room_token — pass the one negotiation_open or negotiation_join returned | keyless call with a missing or wrong token | use the room_token from open or join |
previous_room_token: unknown room_token — … | the earlier token is not one of ours (negotiation_join reports it without the prefix) | leave previous_room_token out; your human taps the new bind_url |