Skip to content

release: prepare beta79 - #292

Merged
callumalpass merged 1 commit into
mainfrom
agent/release-beta79
Aug 20, 2026
Merged

release: prepare beta79#292
callumalpass merged 1 commit into
mainfrom
agent/release-beta79

Conversation

@callumalpass

Copy link
Copy Markdown
Contributor

Ships two fixes, one of which changes durable write-path behaviour.

Engine: unsettled-path commit race

Settlement runs after the commit lock is released, so a committed-but-unsettled transaction was invisible to the precondition check. Two writers could both take commit points against one baseline:

A: [lock] recheck ok                     -> phase=Committing -> [unlock]
B: [lock] recheck sees the OLD revision  -> phase=Committing -> [unlock]
A: [lock] settle -> path rewritten
B: [lock] settle -> matches neither before nor intended

B stranded its journal as NeedsManualRecovery, and recover_pending then failed on it at every later Collection::open. An ordinary lost write race could leave a collection unopenable until someone deleted the transaction directory by hand.

B is now rejected before taking a commit point, reporting concurrent_modification. (callumalpass/mdbase-rs#54, pinned via #291.)

Diagnostics: credential expiry never decoded

storage.credential_expires_at reported no expiry for every temporary credential — staging and lab read as permanent, days before they expire. The session token is standard base64 of jwt/<header>.<claims>.<signature>, not a bare JWT, so the claims were never read. None also means "permanent credential", so the broken case was indistinguishable from the healthy one. (#289.)

Also on main since beta.78

#290 adds pnpm check:workspace-pins, a developer preflight comparing sibling checkouts against pinned revisions. No runtime effect.

Operator note

A modest rise in concurrent_modification is expected and correct. Races that previously succeeded and then stranded now surface as conflicts. The signal worth investigating is a sustained rate against a small set of paths, not the aggregate change.

One behaviour change to know: a stale Committing journal now blocks commits to its paths until recovery settles it, where previously those commits proceeded and stranded. Visible and self-healing on reopen, versus silent and terminal — but new. Tracked in cloud-ops#205.

Verification

Fixes a durable write race in the engine and a credential expiry that never
decoded.

Two writers could both take commit points against one baseline, because
settlement runs after the commit lock is released and a committed-but-unsettled
transaction was invisible to the precondition check. Whichever settled second
stranded its journal, and that journal then failed every later collection open,
so an ordinary lost write race could leave a collection unopenable.

The diagnostics surface reported no expiry for every temporary R2 credential,
because the session token wraps its JWT rather than being one. Staging and lab
were reported as permanent days before they expire.

This release changes durable write-path behaviour. A modest rise in concurrent
modification conflicts is expected and correct: races that previously succeeded
and then stranded now surface as conflicts. See
.ops/tasks/monitor-unsettled-transaction-journals.md in cloud-ops.
@callumalpass
callumalpass merged commit 919dee1 into main Aug 20, 2026
21 checks passed
@callumalpass
callumalpass deleted the agent/release-beta79 branch August 20, 2026 12:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant