description and meta for live coordination context.
Use a messages row when the information must survive reconnects, work over
HTTP, or be replayed from the sync cursor.
The rule
| Need | Use | Why |
|---|---|---|
| ”I am holding this row because…” | claim({ action, description, meta }) | Live and low-latency. Peers see it through presence while the claim exists. |
| ”Remember this handoff/status/request” | A messages model | Durable row. Ordered in sync_deltas, replayed after reconnect, readable by HTTP agents. |
transport: "http", it can miss claim/presence frames. Message rows
are facts in your database and in the sync log.
Schema
Add amessages model to the same schema as the work it discusses. Scope it
with the same field that scopes the work row.
Server-side agent
Most server-side agents use the direct database path. Pass the schema, API key, database URL, and transport selector:databaseUrl is server-only. Browser clients must not receive it; live UIs use
the default WebSocket transport with a minted user/session token.
If your backend mints restricted agent tokens, register the database once from a
secret-key server process as above. Workers using the restricted token can then
construct Ablo({ schema, authToken, transport: "http" }) because the project
already has a registered data plane.
Link a message to a claim
The claim id is the causal id. Store it inaboutIntentId when the message is
about work currently protected by a claim.
team:${teamId} receive the message through the normal delta stream.
Peers outside that syncGroup do not.
Reading messages
Live clients read locally and update when deltas arrive:Retention
Deleting or archiving oldmessages rows is your app’s policy. The sync log is
still durable audit/history: sync_deltas has no message-specific TTL. That is
useful for coordination and compliance, but a chat-scale product should plan
retention before writing high-volume conversation traffic.