This document specifies solver permission levels for dispute resolution.
Mostro supports two solver permission levels:
read: solver can take a dispute, receive dispute context, and communicate with usersread-write: solver can do everything above and can also executeadmin-settleandadmin-cancel
This split is intended to support automated dispute assistants, including AI-based agents, without giving them authority to move funds.
- allow non-human dispute assistants to participate safely
- enforce authorization at the daemon level, not in prompts or UI
- preserve backward compatibility for existing solver registration flows
The users.category field is used to represent solver permissions:
0: regular user / no solver permissions1: solver withreadpermission only2: solver withread-writepermission
The legacy is_solver flag still indicates whether the user is a solver at all.
Allowed for:
- Mostro daemon admin key while dispute status is
initiatedorin-progress - solvers with
is_solver = truewhile dispute status isinitiated
Both read and read-write solvers may take a dispute.
Allowed only when:
- the caller is the solver assigned to the dispute
- and the assigned solver has
category = 2
If the caller is assigned but only has read permission, Mostro returns:
CantDoReason::NotAuthorized
Allowed only when:
- the caller is the solver assigned to the dispute
- and the assigned solver has
category = 2
If the caller is assigned but only has read permission, Mostro returns:
CantDoReason::NotAuthorized
admin-add-solver continues using Payload::TextMessage, but now supports an optional permission suffix.
Formats:
npub1...→ defaults toread-writenpub1...:read→ registers solver as read-onlynpub1...:read-write→ registers solver as read-writenpub1...:write→ alias for read-write
Invalid suffixes must be rejected with CantDoReason::InvalidParameters.
The current RPC AddSolverRequest still only exposes solver_pubkey.
That means RPC registration remains backward compatible and defaults to read-write until the protobuf/API is extended.
This feature requires mostro-core >= 0.8.4 because it uses CantDoReason::NotAuthorized.
The key security property is that read-only solvers can never execute dispute-closing actions, even if:
- a UI exposes the wrong button
- an operator misconfigures an agent prompt
- a remote tool attempts to call
admin-settleoradmin-canceldirectly
The daemon enforces the permission boundary.