
A shared contract for commands, saved outcomes, and recovery
DASP (Durable Actor Session Protocol) is an open, working-draft server protocol for durable actors. Clients connect through a DASP server to send commands and read outcomes that are saved independently of any connection: the server records command admission before replying, stores the final outcome (completed, failed, cancelled, or uncertain) separately, and retains an ordered update history so a client can disconnect and later resume from the last update it applied. Multiple clients — a web app, CLI, and service — can share the same actor session, each keeping its own position in the same ordered history.
Clients interact with an actor's saved record using five operations: session.open (open or return to a session), command submission (with a receipt), view.read (current saved state), updates.read (missed events), and outcome.read (a command's result).
The server saves acceptance of a command before replying, returns an accepted receipt, and records the final outcome separately — so if effects cannot be established, the outcome is marked uncertain rather than lost.
The server retains ordered updates when a connection ends. A returning client reads after the last update it applied, replaying only the missed portion of the history.
A web app, command-line tool, and service can use the same actor session. The server checks access and serves the same ordered history, with each client tracking its own cursor position.
The protocol defines a shared wire contract and recovery rules; your application supplies the transport and storage layers.
Elixir and TypeScript clients are provided, both experimental and built on the same messages and recovery rules.
Aimed at workflow actors, device actors, and agent actors — any long-lived actor whose work must outlive client connections.
The client sends a command with a stable ID (e.g., cmd-042) and keeps the ID and data for retries. The server saves admission first, then returns an accepted receipt.
The client uses view.read for the current saved state, updates.read for missed events, and outcome.read to check a command's result (completed, failed, cancelled, or uncertain).
After a disconnect, the client reconnects to the same record and reads updates after its last applied cursor, replaying only what it missed from the server's saved session history.
DASP is a server protocol for durable actors. Clients send commands and read outcomes that the server saves independently of the connection: admission is saved before a reply, final outcomes are stored separately, and ordered updates are retained so clients can reconnect and resume.
The server saves the command's admission before replying and records the final outcome separately. If effects cannot be established, the outcome is marked uncertain. On reconnect, the client reads updates after the last one it applied, replaying only the missed events.
session.open (open or return to a session), command submission (request with an accepted receipt), view.read (current saved state), updates.read (missed events), and outcome.read (a command's result).
Yes. A web app, CLI, and service can use the same session. The server checks access and gives each client the same ordered history, with each client keeping its own cursor position.
DASP is developed in the open, with its specification, guide, and reference available on GitHub, where the project also solicits feedback and contributions.
There are native Elixir and TypeScript clients. Both are experimental and share the same wire contract and recovery rules. No production binding or host is released yet.
Yes. DASP defines the protocol — messages and recovery rules — while your application supplies the transport and storage.
It is a working review draft. The project is actively seeking feedback on GitHub and lists release preparation as ongoing, with experimental (not production) clients.