---
title: "Release 2026-09-09 - Changelog"
url: "https://nsta1.github.io/Orleans.Lattice/changelog/2026-09-09.html"
source: "https://github.com/NSTA1/Orleans.Lattice/blob/release/9.9/CHANGELOG.md?plain=1#L1039-L1046"
documents: "Orleans.Lattice 9.9.0 (release line 9.9)"
built: "2026-10-04"
all-pages: "https://nsta1.github.io/Orleans.Lattice/llms.txt"
---
# Release 2026-09-09

Part of the [changelog](../CHANGELOG.md).

Patch release on the `9.6` line. Seven packages advance to `9.6.2`: `Orleans.Lattice`, `Orleans.Lattice.Api.TreeAdmin`, `Orleans.Lattice.Backup`, `Orleans.Lattice.GrainIndex`, `Orleans.Lattice.Membership`, `Orleans.Lattice.Replication` and `Orleans.Lattice.Schema`. Fourteen advance to `9.6.1`: `Orleans.Lattice.Api.Auth.Grpc`, `Orleans.Lattice.Api.Backup.Grpc`, `Orleans.Lattice.Api.Data.Grpc`, `Orleans.Lattice.Api.Replication.Grpc`, `Orleans.Lattice.Api.Schema.Grpc`, `Orleans.Lattice.Api.State`, `Orleans.Lattice.Api.State.Grpc`, `Orleans.Lattice.Api.Telemetry.Grpc`, `Orleans.Lattice.Api.TenantAdmin`, `Orleans.Lattice.Api.TenantAdmin.Grpc`, `Orleans.Lattice.Api.TreeAdmin.Grpc`, `Orleans.Lattice.Dashboards`, `Orleans.Lattice.Replication.Grpc` and `Orleans.Lattice.Tenancy`. Each is tagged per [`docs/RELEASING.md`](../docs/RELEASING.md). Every other published package is unchanged and stays on its current version. In particular the `Orleans.Lattice.Explorer` family continues to publish from the `9.4` line, so the Explorer credential-trust fixes that this wave carries in source are not claimed here and ship separately in a `9.4` patch wave.

Three themes account for the wave. The largest is authorization, where ten entries close seams whose enforcement was weaker than the contract the surface published: a second, caller-supplied identifier that was composed and acted upon without ever reaching the access gate; a failed-attempt lockout that could be bypassed, or turned into a self-inflicted denial of service; a tenant suspension honoured locally while its peers kept applying that tenant's writes; and four caches an unauthenticated caller could grow without bound. The second is arithmetic that overflowed instead of saturating, where an extreme-but-permitted `TimeSpan` option added to a tick count wrapped to a past instant and expired a lease or a deadline at the moment it was set. Every remaining site now saturates; ordinary configurations compute an identical value and are unchanged. The third is the cross-tree atomicity protocol, whose six-finding audit closes the paths by which a saga's outcome could be reported as decided when it was not, or stranded when its terminal decision failed to persist.

Being a patch wave, the public surface grows only where a fix could not be expressed without it: `LatticeOptions.MaxDurableUnresolvedReplayWork` with its `DefaultMaxDurableUnresolvedReplayWork` companion, the `LatticeMetrics.LeafUnresolvedPrepareLedgerBeyondCap` instrument, and a `TxStatus.Indeterminate` case that lets a registry state that it cannot determine a saga's outcome rather than imply one. Nothing is removed or renamed.

## Releases

- [Security](../changelog/2026-09-09-1.md)
- [Fixed](../changelog/2026-09-09-2.md)

Newer release: [Release 2026-09-21](../changelog/2026-09-21.md). Older release: [Release 2026-09-09: Security](../changelog/2026-09-09-1.md). Contents: [Changelog](../CHANGELOG.md).
