Skip to content
AbloAblo
Esc
navigateopen⌘Jpreview
On this page

v0.34.0

Minor Changes

A long-running actor has a stale-context problem the per-commit read gate never reaches. The reads guard is a premise for the commit in hand: you declare what you looked at, the server checks it at commit, and the premise is gone. That fits an actor that reads and writes in one breath, not one that reads a row, works for minutes — an LLM call, a fetch, a human’s turn — and only then writes. By the time it commits, the premise it would have declared is already old, and there was no commit in between on which to hear that the ground had shifted. This release adds track, the durable half of the same idea. ablo.<model>.track({ id }) registers a read-dependency that persists on the server; the next time you commit anything, a change that landed on the tracked row since you registered rides back on the receipt’s notifications — the same StaleNotification an onStale: 'notify' premise hands you, arriving on the write you were going to make anyway. You can also register one as part of a write, track: [{ group: 'deck:abc' }] alongside the batch, the standing-subscription companion to the single-commit reads. A track is idempotent — registering the same target again refreshes the one subscription rather than stacking duplicates — it re-baselines after it fires so a given change notifies once, and it never notifies you of your own writes, since the signal is about what others did. Delivery is on your next commit’s receipt; a track does not yet push out of band between commits, so it sharpens the write-time freshness check rather than replacing a live subscription.

The model-level presence verb is renamed from watch to join. It read like a data subscription but delivered presence — who else is on a set of rows and what they hold — so it now says what it does. ablo.<model>.join(ids, { ttl }) opens the participant handle, with .peers, the scoped claim stream, and await using disposal unchanged; the handle’s status was already 'joined' and the layer beneath always called itself join, so the verb now matches the thing it returns. onChange remains the way to hear a row’s values change, and track is the durable read-dependency for actors — three distinct jobs that the one overloaded watch used to blur. The React hook follows: useWatch becomes useJoin, the WatchOptions / UseWatchOptions / UseWatchReturn types become JoinOptions / UseJoinOptions / UseJoinReturn, and the error code model_watch_not_configured is now model_join_not_configured. There is no compatibility alias — rename the call sites and the type imports. The migration guide carries the mechanical diff.

Patch Changes

ablo connect --apply now checks, before it runs any grants, that you can actually grant on the tables you’re publishing — and stops with the one-line fix if you can’t, instead of failing partway through. The setup grants the writer role access to each published table, an operation Postgres reserves for the table’s owner, so a table left owned by an earlier integration’s role used to abort the run midway with a bare must be owner of table … and no guidance. Apply now names the offending tables and their owner up front and prints the exact ALTER TABLE … OWNER TO to reassign them to your admin — metadata only, your rows and row-level-security policies untouched. The check understands inherited role membership, so an admin that inherits the owning role — the ordinary managed-Postgres case — is left to proceed rather than stopped needlessly; only a membership that can’t act as the owner is flagged.

Was this page helpful?