v0.21.0
Minor Changes
-
Coordination observability now fires on BOTH transports. Previously
captureClaim/captureConflictwere emitted only by the WebSocket transport, so aClaimLog(or anyobservabilityprovider) handed to a stateless HTTP client — the transport server-side agents use viaAblo({ transport: 'http' })— stayed empty, and even on WebSocket a hard commit rejection went unrecorded. Fixed:- HTTP transport now emits.
Ablo({ transport: 'http', observability })recordsclaimacquisition (captureClaim) and coordination-conflict rejections (captureConflict, codestale_context/claim_conflict/entity_claimed) on BOTH HTTP write doors (commits.createand per-modelablo.<model>.update/create/delete). The conflict names the collided rows — from the server’sconflictsdetail when present, otherwise the ops the write attempted.observabilityis now a documented option on the HTTP client. - WebSocket rejections now recorded. A commit rejected by the conflict policy (
mutation_resultsuccess: falsewith a coordination code) now callscaptureConflict, mirroring the existing notify-on-success path. SoClaimLog.collisions()no longer silently misses rejected writes.
Net effect: a
ClaimLogbehaves identically regardless of transport —entries,collisions(), andonChangereflect the real coordination timeline for headless agent evals and live activity feeds alike. - HTTP transport now emits.