I Shipped...

26 August 2026 (10PRs)

restored frozen rows after head deletions were undone

I fixed frozen branch views so restoring a deletion can make an inherited opening row visible again. The view keeps its original opening snapshot, while newer head content still takes precedence.

rejected reset versions with conflicting metadata

I made reset handling compare the full version information, not just the stored row bytes. If two reset versions disagree, the operation now fails before it changes storage or other reset state, regardless of which one arrives first.

rejected ambiguous relation names

I made relation building reject two reference columns that would produce the same relation name. Instead of silently picking whichever one appears first, schema and query construction now report the ambiguity so the column can be renamed.

made Expo secret scope keys safe

I changed scoped Expo SecureStore keys to use safe encoded pieces instead of punctuation that the store rejects. Different scope types stay separate, and because the key format changed, affected users may need to sign in again.

kept generated app IDs on their own dotenv lines

I fixed a small dotenv-file trap: when the file did not end with a newline, a generated app ID could be glued onto the previous setting. The writer now adds the missing line break and only treats an exact app-ID assignment as the setting, leaving comments and similarly named variables alone.

kept CollectBy operations terminal

I made CollectBy a true end-of-pipeline operation. Ordinary filters and projections can no longer consume it directly, while prepared routes still filter their own input before collecting it.

closed late native connections safely

I stopped a native connection from being attached after it had already disconnected. The admission step now checks that the connection is still current before accepting it, and closes late arrivals through the normal cleanup path.

required admin claims for announcement changes

I tightened announcement permissions so creating, changing, or deleting announcements requires an authenticated administrator. Ordinary chat messages keep their existing rules, and an ordinary message can no longer be moved into the announcements room to bypass them.

made anonymous sessions read-only even on exclusive writes

I enforced the documented read-only rule for anonymous sessions at the final write-admission point. Anonymous clients can still read public data, but they can no longer insert, update, or delete data through ordinary or exclusive-write paths.

flushed pending RocksDB writes when closing

I made storage shutdown flush acknowledged writes that were still waiting in RocksDB. A failed flush is reported and remains retryable, so closing the database cannot falsely claim that pending data has been safely synchronised.

25 August 2026 (10PRs)

preserved original row provenance in write policy checks

I fixed write-policy checks so updates keep the original creator and creation time separate from the person making the change. I also made inline policy requirements request the hidden version information they need, and reject the operation when that history cannot be reconstructed.

made persistence regression tests wait for real completion

I made persistence regression tests wait for storage shutdown and replay to finish instead of relying on fixed delays. This prevents slow CI runs from racing a live browser database or checking for restored data too early.

made failed broker-worker initialisation safely retryable

I made failed broker-worker setup retryable instead of leaving a permanent failed result behind. Partially opened databases and related resources are now closed exactly once, so a later connection can try again without leaking the earlier attempt.

kept failed client shutdowns as registry barriers

I stopped the client registry from forgetting a failed shutdown and immediately creating a replacement for the same key. Later users now see the shutdown error until the broken state is dealt with, while failures during initial creation can still be retried.

kept caller-owned starter directories intact

I stopped the starter test helper from deleting a directory supplied by its caller. It now removes temporary directories that it created itself, while leaving caller-owned directories and their contents alone.

failed startup when the durable catalogue is corrupt

I changed server startup to report a damaged or unreadable durable catalogue instead of silently starting with an empty in-memory index. The error now points to the failed operation, while unknown catalogue entries remain forward-compatible.

expired incomplete fragmented messages before they leaked resources

I added idle and maximum-age limits for messages that arrive in fragments. Stale partial messages now release their stored bytes and IDs during normal transport activity, while fragments that continue making progress can still complete.

encoded payload enums inside arrays without panics

I fixed encoding for arrays containing enum values with their own payload fields. Each value now uses the description of its selected case, so valid data round-trips correctly and invalid data returns a normal error instead of crashing.

delivered shared collector updates to every subscription

I fixed shared query updates so every subscription listening to the same result receives the update. The change only copies the data when another subscriber still needs it, and keeps it available if a paused subscriber has to retry.

avoided copying uncompressed inbound messages

I removed an unnecessary full-buffer copy when decoding uncompressed incoming messages. The decoder now borrows those bytes, while compressed messages still own their decompressed data and the public interface stays unchanged.