I Shipped...

3 September 2026 (14PRs)

stable persisted batches after refresh failures

I fixed a problem where a refresh failure could make a durable batch look unapplied, omit remote progress, and trigger reconnect or replay. Now the tick records applied progress exactly once, routes the refresh failure, retains the row, and does not redeliver the batch.

safer validation for pending enum lineages

I fixed a problem where out-of-order activation could leave an over-capacity sibling durably pending and poison a later reopen. Now invalid pending lineage is quarantined and durably removed without consuming physical IDs.

safer cloned subscription reconciliation

I fixed a problem where sibling receipts could use a different generation from their view, disappear on backpressure, or miss fate registration. Now sibling messages share one generation, retry exactly once after backpressure, register fates, and avoid the established-set copy when no clone is pending.

safer branch-view upserts

I fixed a problem where inherited large values could fail during branch upserts. Now branch upserts read the complete head-over-base view and preserve verified inherited large-value descriptors.

retry-safe Inspector saves

I fixed a problem where retrying an ambiguously acknowledged insert could issue a second insert with the same UUID. Now a submitted insert keeps one stable UUID and is never submitted as a second insert.

per-peer query shape ownership

I updated Jazz to attribute each retained query-shape registration to the peer that owns it. I also changed it to make repeated registration by one peer idempotent while keeping shared shapes until their final owner releases them.

non-blocking large-value lifecycle cleanup

I fixed a problem where cross-receipt eviction could deadlock behind a lifecycle guard, and reclaim could read the same backend metadata twice. Now eviction returns a retryable deferred result until persistence advances, and reclaim performs one required durable metadata read.

direct subscription finalisation

I fixed a problem where explicit close could remain incomplete until unrelated database work drove another tick. Now close drains ownership directly, later callers rejoin the same retained result, and wire unsubscribe remains retryable after local retirement.

deterministic ArgBy tie-breaking

I fixed a problem where tied winners could depend on record arrival, while implementation and recursion specifications disagreed about whether recursive ArgBy was valid. Now both extrema choose deterministic tied winners, preserve multiplicity by full-record identity, and reject ArgBy inside recursive children consistently.

cancellation-safe transaction shutdown

I fixed a problem where cancelling close during an early drain could leave transactions open and omit the shutdown sweep. Now every close attempt leaves a closed admission gate and node-owned sweep behind, so cancellation cannot strand mergeable or exclusive transactions.

browser database recovery after SharedWorker shutdown

I updated Jazz to stop a retiring broker realm from accepting new runtime or foreground-lease bootstraps before it releases its physical database owners. I also changed it to return explicit closing and physical-owner busy responses so pages can recover through a bounded SharedWorker generation hand-off.

bounded WebSocket connection setup

I fixed a problem where the transport could wait indefinitely when a peer accepted TCP but stalled the HTTP WebSocket upgrade. Now one deadline begins before connectasync and covers:.

bounded RocksDB WAL synchronisation

I fixed a problem where background WAL writeback smoothed I/O, but the number of acknowledged mutation batches since the last synchronous WAL boundary was unbounded. Now every 64 successful backend mutation batches completes a synchronous WAL flush by default.

a clearer supported-platform message for the Windows CLI

I updated Jazz to remove Windows from the advertised jazz-tools CLI targets because the release workflow does not produce a standalone Windows executable. I also changed it to keep the separate Windows NAPI build unchanged.

29 August 2026 (6PRs)

validate migration integrity before publication

I made migration publication verify that each operation, filename, and schema description all agree before anything is sent to the server. I also made each upload use private temporary storage and reject symlinked or executable inputs that could escape the project directory.

serialise authentication and database transitions

I serialised authentication-secret and database changes so the newest login, logout, or session action wins even when earlier asynchronous work finishes later. Old databases and token refreshes can no longer overwrite the current session, and startup now reconciles changes that happen while the database opens.

reject unorderable query sort fields before runtime

I made query validation reject records and arrays used as sort or tie-breaking fields, because they do not have a reliable ordering and could make the runtime fail later. Valid scalar and nullable fields keep their existing ordering behaviour.

reject compound relation checks before they can authorise the wrong rows

I made schema validation reject relation checks containing more than one comparison, because the query engine only knows how to use one and could otherwise silently ignore the rest. The check now applies through nested policy conditions and across reads and writes before any query runs.

keep React providers on the right runtime client

I made React providers distinguish clients created by different factories or runtime sources, so one provider cannot accidentally reuse another runtime's client. I also kept the React Native factory stable between unchanged renders, avoiding unnecessary client replacement.

deliver native mutation errors in the expected callback shape

I fixed native mutation notifications so a rejected mutation reaches JavaScript as the one event the runtime expects, rather than an extra empty error argument followed by the event. Rejections can now become structured transaction errors instead of looking like timeouts or native callback failures.