1.6.0-beta1 October 2nd, 2026
Akka.NET 1.6.0-beta1 is the first public beta of the 1.6 line. Every package now targets .NET 10 only. This beta adds an experimental Artery TCP remoting transport, a buffer-based SerializerV2 API with a source generator for your own messages, a rewritten Akka.IO TCP layer, Native AOT support for local and Akka.Hosting apps, and code-based serializer registration for Akka's built-in modules. Akka.Hosting now ships from this repository. This release has breaking changes.
Start here: Akka.NET v1.6 getting started guide
Upgrading from 1.5? Read the breaking changes.
Breaking changes
The ledger linked above lists every change with its migration step. The ones most apps will hit:
- .NET 10 only. Every package, Akka.Hosting included, targets
net10.0only, so .NET Framework, .NET 6 and .NET 8 apps can't reference 1.6. Dependency minimums rise toMicrosoft.Extensions.*10.0 forAkka,Akka.DependencyInjectionand Akka.Hosting (Akka.Hosting 1.5.71 needed 9.0), Google.Protobuf 3.36.1 (#8577), LightningDB 0.22.0 for Akka.DistributedData.LightningDB (#8338) and FSharp.Core 10.1.302 for Akka.FSharp and Akka.Persistence.FSharp (#8386). Move your app to .NET 10. (#8132, #8594) Akka.IO.ByteStringis gone. TCP (Tcp.Received,Tcp.Write) and the Streams byte APIs (Framing,JsonFraming,FileIO,StreamConverters,Tcp) useReadOnlySequence<byte>, UDP usesReadOnlyMemory<byte>, andByteOrdermoved toAkka.Util. ReplaceByteStringwithbyte[],ReadOnlyMemory<byte>orReadOnlySequence<byte>. (#8132)- No more HOCON from
App.config/Web.config.ConfigurationFactory.Load(),AkkaConfigurationSectionand Akka.FSharp'sConfiguration.loadare removed. Load HOCON from a string or file withConfigurationFactory.ParseString, or configure through Akka.Hosting. (#7456) - Akka.Hosting ships in lockstep with Akka.NET, so reference every
Akka.Hosting.*package at the same version asAkka.*.WithExtension<T>()now registers throughExtensionsSetup; see Akka.Hosting now ships from this repository below. (#8594, #8649) - Serialization. An
akka.actor.serialization-identifiersoverride for a built-in serializer no longer has any effect (#8694). A second alias that names a built-in Akka.Remote/Akka.Cluster/... serializer type gets the shared built-in instance, and its ownserialization-settingsblock is ignored (#8698).Serializergains virtualFromBinary(byte[], string)andManifest(object), soFromBinary(bytes, null)no longer compiles without a cast, andByteArraySerializer.IncludeManifestis nowtrue(#8222). Module serializers now handle some types that used to fall back tojson; see Serialization registration below (#8702). - Akka.Cluster.Sharding uses bounded rebalancing by default (
least-shard-allocation-strategy.rebalance-absolute-limit = 20), which changes how a running cluster moves shards. Set it to0to keep the old strategy. (#8445)
Also breaking - see the ledger: long system UIDs (#8317); Akka.IO TCP writes, UDP buffers and DNS (#8132, #8606, #8646, #8660); Cluster.Get() no longer blocks (#8359); Source.ActorRef<T> ignores PoisonPill/Kill (#8263); DotNetty ValidateHostname checks the name (#8465); Akka.DynamicTypeLoading turns off for AOT/trimmed publishes (#8608); TestKit IAsyncLifetime (#8545); no more TargetInvocationException wrapping (#8601 and others); ProviderSelectionType/ProviderClass (#8599); the multi-node Player needs TestTransport = true to throttle or blackhole (#8378); new trimming attributes on public APIs.
Native AOT and trimming
- CI publishes two apps with
PublishAot=trueand runs them on every pull request: a localActorSystem(src/aot/Akka.AOT.App) and an Akka.Hosting app with dependency injection, a custom extension,Microsoft.Extensions.Loggingand health checks (src/aot/Akka.Hosting.AOT.App). Both apps publish with no trim or AOT warnings from the Akka code they use. CI fails on any new warning in core (checked against a full, rooted analysis ofAkka.dll) or in Akka.Hosting, Akka.DependencyInjection and Akka.Streams. - A new feature switch,
Akka.DynamicTypeLoading, controls whether Akka may resolve HOCON type names withType.GetType. It stays on for ordinary builds. TheAkkapackage turns it off for you when your project setsPublishAotorPublishTrimmed; with it off, only Akka's built-in type names resolve and nearly anything else throws aConfigurationExceptionthat names the setting. To turn it back on, add<RuntimeHostConfigurationOption Include="Akka.DynamicTypeLoading" Value="true" />. (#8601, #8608) - Two new
Setuptypes,LoggerSetup(custom loggers and the log formatter, #8218) andExtensionsSetup(extensions, #8648), join the existingSerializationSetup(serializers and bindings), so you can register your own types without HOCON type names. Combine them withActorSystemSetupand pass the result toActorSystem.Create. Akka.Hosting'sWithExtension<T>()usesExtensionsSetup(#8649). - With the switch off, core doesn't register the reflection-based
jsonserializer or itsSystem.Objectbinding, so register a serializer for your own messages throughSerializationSetup; the source-generated serializer inAkka.Serialization.V2is built for this. Stream refs need the switch left on. - Not supported under Native AOT yet: classic DotNetty remoting (fails at startup, because it loads its transport by type name); Akka.Cluster (including Sharding and DData), Akka.Persistence and the cluster tools (ClusterClient, PubSub, Singleton); remote deployment; custom mailboxes and dispatchers. Artery is the target transport for Akka.Remote under AOT, but no CI check covers Artery under AOT yet.
- Full details: Native AOT and Trimming. Progress is tracked in #7246.
Serialization registration
-
Built-in serializers declare their wire ids in code instead of reading them from
akka.actor.serialization-identifiers. The ids don't change. A subclass of a built-in serializer still reads its id from HOCON. (#8694) -
Akka's built-in modules (Remote, Streams, Cluster, Cluster.Tools, Cluster.Sharding, DistributedData, Cluster.Metrics, Persistence) each carry a C# table of their serializers, aliases and bindings, so their serializers resolve without
Type.GetType(#8645, #8658, #8666, #8669, #8695, #8698). The modules' HOCON serializer rows are still there. -
Every built-in module that ships with your app registers its serializers and bindings from that table as defaults when the
ActorSystemstarts, whether or not you configure or start that module. Precedence is module defaults, then HOCON, thenSerializationSetup, each overriding the one before. A module message that arrives before its extension starts now deserializes instead of being dropped, and stream refs work before any materializer exists. Replacing a module default no longer logs the override warning. (#8702) -
What that means for local apps: on any system that ships
Akka.Remote.dllorAkka.Cluster.dll, even one that never turns on remoting or clustering, these types no longer fall back tojson(or your ownSystem.Objectbinding):string,int,longgo toprimitive(id 17)Google.Protobuf.IMessagegoes toproto(id 2)Akka.dlltypes such asIActorRef,PoisonPill,Kill,Identify/ActorIdentity,Status.Success/Status.Failure, the router pools andConfiggo toakka-misc(id 16);ActorSelectionMessagetoakka-containers(id 6);SystemMessagetoakka-system-msg(id 22)IDeliverySerializable(reliable delivery, in Akka.dll) goes toreliable-delivery(id 36) whenAkka.Cluster.dllships
Akka.Persistence writes events and snapshots of these types with the module serializer. 1.6 still reads your old rows, but a rollback to 1.5.x can't read the new ones unless that process also loads Akka.Remote's config (Akka.Cluster's for
reliable-delivery). A type that implements one of these interfaces and one of your own bound interfaces now matches two bindings. To keep the old serializer for a type, or to settle an ambiguous match, bind the concrete type inakka.actor.serialization-bindingsor throughSerializationSetup. -
Serializers resolve their own manifests.
SystemMessageSerializerand the two Persistence serializers map manifests to types from their own tables, andSerializerV1Adapternow calls a plainSerializer's ownFromBinary(byte[], string)override instead of skipping it. WithAkka.DynamicTypeLoadingoff, the baseSerializer.FromBinary(byte[], string)throws for a manifest it hasn't seen, so a custom serializer that writes a manifest should override that method or derive fromSerializerWithStringManifest. (#8697)
SerializerV2 and source-generated serializers
SerializerV2is a new public base class that writes to anIBufferWriter<byte>and reads from aReadOnlySequence<byte>, instead of returning a newbyte[]per call. (#8222)Serializationstores every serializer as aSerializerV2. ExistingSerializerandSerializerWithStringManifestimplementations get wrapped inSerializerV1Adapterautomatically, keep working, and write the same bytes. HOCON andSerializationSetupregistrations don't change, and the public lookup APIs still returnSerializer.- The new
Akka.Serialization.V2package ships a Roslyn source generator that writes MessagePack serializers for your messages at compile time: mark messages with[AkkaSerializable]and[AkkaField(n)], declare a[AkkaSerializer<T>("name", id)]partial class, and register it withCreateRegistration().CreateSetup(). No reflection, and the analyzer reports schema mistakes as build errors. It depends on MessagePack 3.1.8, past the 3.1.7 fix for CVE-2026-48109. - Akka's own Cluster, DistributedData, Sharding and Delivery messages keep their existing protobuf serializers in this beta. Only Artery's control messages use the generator today (#8334).
Artery TCP remoting (experimental, off by default)
- Akka.Remote gains Artery, a new TCP remoting transport built on Akka.Streams. It runs beside classic DotNetty remoting, which stays the default. Turn it on with
akka.remote.artery.enabled = on. Akka.NET logs a warning at startup that it is experimental; don't use it in production. - Artery has its own handshake, a dedicated control stream, reliable system-message delivery, optional inbound and outbound lanes (
akka.remote.artery.advanced.inbound-lanes/outbound-lanes) and a separate stream for large messages (akka.remote.artery.large-message-destinations). No compression yet. - Artery is not wire-compatible with classic remoting. It uses the
akka://scheme and port 25520 by default, so every node in a cluster must run the same transport and your seed-node addresses change.tcpis the only transport, and there's no Akka.Hosting helper yet; configure it through HOCON.
Akka.IO
TcpConnectionnow runs onStream+System.IO.Pipelinesinstead ofSocketAsyncEventArgs. With theReadOnlySequence<byte>API, framing decode allocates less. (#8132)WriteAcknow means the write is in the connection's output buffer and that buffer is below its resume mark, not that the bytes reached the socket. (#8646)akka.io.tcp.write-commands-queue-max-sizenow caps a single write instead of the backlog, so use ack-based writes for backpressure. (#8132, #8646)Tcp.ResumeWriting,Tcp.WritingResumedand theuseResumeWritingparameter are removed; they never did anything. (#8660)- TCP connects to a
DnsEndPointuse the OS resolver, notakka.io.dns. (#8132) - UDP no longer pools buffers. If you pointed
buffer-poolatdirect-buffer-poolor a custom pool, move itsbuffer-sizetodisabled-buffer-pool.buffer-size, or datagrams over 512 bytes are truncated. (#8606) akka.io.tcp.maximum-frame-sizekeeps its 1.5 meaning on the new transport: it caps bytes per socket read and per socket send. (#8663)- A
Tcp.Closesent while aConfirmedCloseis draining now upgrades it to a full close instead of being dropped (#8636). If the drain fails during a close, the connection now reportsErrorClosedinstead of the requested close event (#8630).
Akka.Hosting now ships from this repository
Akka.Hosting,Akka.Remote.Hosting,Akka.Cluster.Hosting,Akka.Persistence.Hosting,Akka.Hosting.TestKitandAkka.Hosting.TestKit.Xunit2now live undersrc/contrib/hostingand ship at the Akka.NET version (forward-port of #8591). Package ids and namespaces stay the same. BumpAkka.Hosting.*to the same version asAkka.*; Hosting-only versions no longer exist. The akkadotnet/Akka.Hosting repository keeps history up to 1.5.71 and will be archived.- On 1.6 the Hosting packages target
net10.0only and needMicrosoft.Extensions.*10.0 or later (Akka.Hosting 1.5.71 needed 9.0). Akka.Hosting'sOpenTelemetrydependency moves to 1.15.3 or later, which clears GHSA-g94r-2vxg-569j. - Hosting API changes:
WithExtension<T>()/WithExtensions(...)now register throughExtensionsSetup, soakka.extensionsno longer lists those extensions, and an extension id whose constructor throws now fails startup with aConfigurationException(1.5 logged and skipped it). ReadSettings.Setup.Get<ExtensionsSetup>()or callHasExtension<T>()instead of readingakka.extensions.WithExtensions(params Type[])is now marked[RequiresUnreferencedCode]- preferWithExtension<T>().AddAkka<T>,WithHealthCheck<T>,WithDefaultLogMessageFormatter<T>andWithExtension<T>carry new trimming attributes, so apps that run the trim analyzer can see new warnings at those call sites. (#8649, #8655)
Other fixes and changes
- Akka.Cluster: a node that is
Downcan no longer become leader of its own view, remove itself and keep running outside the cluster. (#8652, forward-port of #8650) - Akka.Cluster: gossip keeps tombstones for removed members, so they can't come back; new setting
akka.cluster.prune-gossip-tombstones-after(default24h). 1.5 nodes ignore the new field. (#8484) - Akka.Cluster.Metrics: a remote-deployed
AdaptiveLoadBalancingPoolwith a non-defaultMetricsSelectornow deserializes. (#8704) - Akka.DistributedData:
ReplicatorMessageSerializerno longer starts a timer that nothing cancels. Its cache never worked and is gone;serializer-cache-time-to-liveis still accepted but unused. (#8699) - Akka.Remote: classic remoting half-closes the socket on disassociate, so a Windows peer no longer loses the last frames we sent to a TCP reset. (#8635)
- Akka.Remote: classic remoting decodes inbound envelopes with fewer allocations. No wire change. (#8272)
- Akka.Streams: fixed a lost wakeup that could stall a
MergeHub. (#8665) - Serialization: the JSON serializer no longer crashes the process with a stack overflow on an
ISurrogatedmember that has no$typemetadata. (#8358) - 1.6.0-beta1 also includes the fixes and features shipped in 1.5.x up to 1.5.71, such as logging context enrichment and scopes (1.5.60), cancellation-aware
Source.Queueoffers (1.5.69) and the consistent-hashing router collision fix for #8031 (1.5.70).
Changes:
- d8fe28c Release 1.6.0-beta1 (#8597) [ #8702 ]
- 792fd2d Serialization: register every deployed module's serializers as defaults (#8676, part 3) (#8702)
- de851d4 Fix ReceiveActor regression: Receive(Type, Func<object,bool>) blocks later handlers (#8706) [ #7557 ]
- 882242b De-flake ThrottlerManagerLifecycleSpec: wait for the manager's own Terminated before SetThrottle (#8708)
- 4b7a458 Cluster.Metrics: fix nested selector manifest so remote-deployed adaptive pools deserialize (#8704)
- aefcdfc Audit BREAKING_CHANGES_V1.6.md against v1.5.71 and catch up through #8698 (#8700) [ #8694, #8132, #7456, #7622, #8222, #8465, #7557, #8594 ]
- 05cb1fc Add GETTING_STARTED_V1.6.md beta guide (#8703)
- dd0de31 Docs: update Native AOT support scope for v1.6 (#8701) [ #8667, #8697 ]
- fd9849b DistributedData: remove ReplicatorMessageSerializer's dead cache and its leaked timer (#8643) (#8699)
- 74d8bfd Serialization: module tables carry aliases and bindings (#8676, part 2) (#8698)
See More
- 6565f17 AOT: serializers resolve their own manifests; guard the TypeCache fallback (#8697) [ #8672 ]
- d8d6a4e AOT: module serializer table for Akka.Persistence (#8626, part 4) (#8695)
- cf25db8 Add LoggerSetup for AOT-compatible custom logger registration (#7902) (#8218)
- 3daa5e4 Serialization: built-in serializers declare their ids in code (#8676, part 1) (#8694)
- 1fb112e AOT: Akka.Hosting canary app and CI job (#8668) [ #8667, #8649, #8671 ]
- 1ec9e5e AOT: remove the Akka.Streams stream-ref reflection warnings (#8671) [ #8658, #8667, #8673 ]
- 7516241 De-flake ParallelTestActorDeadlockSpec: wait for the actor, dilate the budgets (#8595) [ #7974, #8016, #8023 ]
- 1f16a3d Hosting samples: use class registry keys; document class keys for IRequiredActor under Native AOT (#8674)
- 37ada27 AOT: module serializer tables for the Cluster contrib family (#8626, part 3b) (#8669)
- 352396b AOT: guard akka.extensions and custom akka.actor.provider reflection behind Akka.DynamicTypeLoading (#8670)
- 5644f71 AOT: module serializer table for Akka.Cluster (#8626, part 3a) (#8666)
- 6e20088 Hosting: register WithExtension through ExtensionsSetup (#8649)
- 51cf0df AOT: ExtensionsSetup and a first-party akka.extensions table (#8648)
- 3d89d29 Akka.Streams: fix a possible lost wakeup in MergeHub (missing memory fence) (#8665)
- 6ef46df De-flake HubsDocTests dynamic merge: async expectation with an explicit 10s timeout (#8664)
- 6c46ee0 AOT: module serializer tables for Akka.Remote and Akka.Streams (#8626, part 2) (#8658)
- c110c5e Akka.IO: wire akka.io.tcp.maximum-frame-size to the pipe segment size (#8663) [ #8132, #8657 ]
- 16359b5 Akka.IO: remove the unimplemented ResumeWriting / WritingResumed / useResumeWriting API (#8660) [ #8646, #8617 ]
- 5bb1f1c Akka.IO TCP: hold back WriteAck until the output pipe's flush completes (#8646) [ #8617 ]
- 4316f71 De-flake TcpConnectionOwnershipDisposalSpec: keep the close from finishing before the rejected write lands (#8661)
- 2c14582 AOT: first-party logger table so Akka.Hosting's LoggerFactoryLogger resolves without reflection (#8654) [ #8613, #8603 ]
- 1e4a82a AOT: core module-serializer table (#8626, part 1) (#8645)
- 33710a3 Akka.Hosting: add missing trimming annotations for Native AOT (#8655) [ #8649 ]
- bea8482 CI: capture hang dumps on unit-test jobs (#8653)
- 0c84d4f Akka.Cluster: a Down node must never be leader, so it can't remove itself and linger outside the cluster (forward-port of #8650) (#8652)
- 1dca4b4 Disassociate the wrapped handle when a throttled association stops (#8637) (#8647)
- f923d5b AOT canary: cover routers, Stash/Become, timers, FSM, DeathWatch, and PipeTo (#8640) [ #8605 ]
- ae8f153 Cleanup after AOT milestone-1 merge (#8639)
- 74d13c2 Bump CsCheck from 4.8.0 to 4.9.1 (#8598)
- a498171 Collapse every BuiltIn* type-name table to one key, widen matching to Type.GetType's rules (#8613)
- be04d6b AOT (7/7): canary in CI with a warning baseline, buildTransitive .targets for automatic AOT/trim opt-in, Native AOT docs (#8608) [ #7246 ]
- ebb0c78 AOT: remove UDP buffer pooling, keep the DNS provider configurable through a built-in table (#8606)
- f69625f AOT (5/7): built-in routers and guardian strategy, guarded dispatcher/executor fallbacks, generic Expression.Lambda in the Props argument parser (#8605)
- 3756123 AOT (4/7): core serializers and bindings from a built-in table; serialization-identifiers matched by name — canary goes green (#8604)
- dcfeaf1 Fix Artery shutdown-flush data loss: wait for streams to actually close (#8628) [ #8636 ]
- b18540f Classic remoting: half-close on disassociate so a Windows peer doesn't lose our last frames to an RST (#8635) [ #8589 ]
- 238b986 De-flake ReplicatorPruningSpec: wait for every replicator to know every node before WriteAll (#8638)
- 0e7dc22 IO: handle Tcp.Close while a ConfirmedClose is draining (#8636) [ #8634, #8630 ]
- a0623e4 De-flake ClusterShardingFailureSpec join phase (DData variant) (#8633)
- 5fa0921 IO: fix Tcp.ConfirmedClose racing the peer's FIN (#8630) [ #8629 ]
- a26b03e AOT (3/7): Props/actor-type trimming annotations, akka.loggers from a built-in table, Akka.DependencyInjection ripple (#8603)
- ef7f9c4 LoggerStartupSpec: gate the slow logger on the test instead of a fixed 1 s delay (#8621)
- 95dd7e7 Cluster.Hosting TestHelper: stop a host that fails to start, allow 60 s for it to join (#8620)
- a4b2383 RemotingTerminatorSpecs: don't depend on the best-effort Terminated from a graceful shutdown (#8622)
- 2d33a57 TransportFailSpec: probe the reconnect with a fresh Identify per attempt and a 15 s budget (#8623)
- 8bc7e44 Hosting SemanticLoggingSpecs/WithContextSpecs: give the logger 10 s, make SemanticTestLogger thread-safe (#8624)
- e88b4f1 AOT (2/7): built-in mailbox types, mailbox requirement map, MailboxType/Mailboxes trimming annotations (#8602)
- 2f4d9d4 Hosting EventFilterTestBase: retry the logger handshake like core; listeners reply OK once per forwarder (#8619) [ #8594 ]
- 3d7cd46 ShardRegionQueriesSpecs: form the cluster in InitializeAsync and stop asking with 1-3 s timeouts (#8618)
- 0ea28f8 De-flake two TestKit timing tests (TestFSMRef state timeout, WaitForRadioSilence reset) in Akka.TestKit and Akka.Hosting.TestKit (#8615)
- ad06084 TcpHelper: give ServerConnection.WaitReadAsync a 10 s default instead of 3 s (#8616)
- 25b82f2 FileSinkSpec: flush until the elements land instead of sleeping a fixed 100 ms (#8614)
- 533064e AOT (1/7): Akka.DynamicTypeLoading feature switch, canary app, built-in tables for formatter/stdout logger/scheduler (#8601) [ #8608 ]
- edf98c6 ReplicatorSpecs: replicate the 20k-element ORMultiValueDictionary with WriteLocal and poll the replicas (#8611) [ #5686, #7899, #5663 ]
- 3a92fde De-flake the scheduler 0-delay tests and ArteryBlackholeQuarantineSpec (#8610)
- cfc11a7 De-flake DispatcherModelSpec: await conditions instead of blocking on fixed deadlines (#8609) [ #8601, #8299, #8600 ]
- 25e1dac De-flake ClusterSingletonRestartSpec: accept the hand-over retry's second HandOverInProgress (#8600) [ #8590 ]
- c6b3bd5 AOT: resolve built-in actor ref providers from constant type names so the trimmer preserves them (#8599)
- 8de1cb9 ClusterSingletonRestartSpec: assert the hand-over confirmation reaches the new oldest, so a lost HandOverInProgress is named instead of timed out (#8590) [ #8588, #8589 ]
- 8463d5c docs: explain record property targets for generated serialization (#8596)
- 8424a98 Forward-port #8591 to dev: Akka.Hosting in the akka.net repository, net10.0 only (#8594)
- 8629e6a Bump Google.Protobuf from 3.35.1 to 3.36.1 (#8577)
- e201662 De-flake StressSpec: leave the cluster before terminating a churn system; run it with 7 nodes on the 2-vCPU hosted agents (#8543)
- 3f966aa TestKit: put the DotNetty batching override under akka.remote, where the transport reads it (re-land of #8546 with the RemoteConfigSpec fix) (#8561)
- 450bebf TestKit.Xunit: implement the async dispose chain so a derived DisposeAsync no longer leaks the ActorSystem; de-flake StreamRefsSpec (#8545) [ #8191, #8217 ]
- 025eb4b Artery: honour the reconnect backoff, return the held control element on stage stop, publish the inbound context before bind, host the materializer under /system (#8554)
- 147a810 De-flake PropsSpec: await the producer latch instead of blocking on it for a flat second (#8587)
- e62aa19 De-flake RemoteDeliverySpec: give the final barrier a budget that covers the loop (#8542)
- 8c41b08 Serialization.V2: ManifestPrefix expansion moves out of the serializer transform into a per-compilation stage (#8538)
- 0d78532 Serialization.V2: referenced-assembly implementor walk; marked union bases; closed-set discovery in the facts stage (Decisions 19 and 21) (#8537)
- d5bcef0 Serialization.V2: closed-generic expansion and adoption; ManifestPrefix; AKKASG034 retired (Decisions 17 and 18) (#8536)
- 9e21298 Serialization.V2: schemas from metadata for referenced-assembly types (Decision 16) (#8534)
- cd444a1 Serialization.V2: diagnostic locations beside the model; report output joins spans (#8533)
- d1cfd05 Serialization.V2: compilation-facts stage; KnownTypes once per compilation; referenced-assembly walk skeleton (#8532)
- 75b2ffd Serialization.V2: typed keys and one schema table; nested-type collision closed (#8530)
- aaf9e66 Serialization.V2: object elements inside collections are envelope-payload boundaries (#8528)
- 3cbdf93 Serialization.V2: cached per-serializer resolve stage; one message edit re-emits one serializer (#8527)
- 2c2a406 Fix Replicator.IsKnownNode to trust members first seen as Leaving/Exiting/Downed (#8582)
- c0600b7 Cluster.Sharding: a coordinator hand-over only stops the local ShardRegion when the node is leaving (#8586) [ #8583 ]
- bef497a De-flake EntityTerminationSpec: anchor on the shard's own entity set and wait out the restart backoff without blocking a pool thread (#8584)
- 1ad1abe De-flake RemoteNodeDeathWatchSpec: barrier after the subject stops, resend-derived bound, identify asserts the actor exists (#8581)
- 9c75211 De-flake ClusterShardingRegistrationCoordinatedShutdownSpec: wait on the spec's own budget instead of a probe's flat 5 s default (#8544)
- 2d8fa21 Cluster.Sharding: arm the remember-entities write timeout with updating-state-timeout, as the config documents (#8574) [ #6479 ]
- 59d5da6 Cluster: route user commands through /system/cluster for the extension's lifetime so their order survives startup; LeaveAsync re-sends its Leave (#8580) [ #8359 ]
- ec983f6 De-flake ClusterSpec leave facts: await MemberUp before leaving so the join is ordered first; one leader pass, then MemberRemoved (#8579)
- 986e473 De-flake NodeChurnSpec: turn off legacy auto-down, widen the heartbeat pause over the measured stall, and make the payload listener match real log messages (#8556) [ #8549 ]
- 8e53c0e De-flake RemoteNodeRestartDeathWatchSpec: probe with Identify before the destructive kill, and let the subject terminate on a sliding timer (#8557)
- 86e479d De-flake ReceiveTimeoutSpec: measure the two timeout cycles with dilated probe waits instead of one flat latch (#8541)
- 408e008 De-flake ClusterShardingLeaseSpec: join the cluster in InitializeAsync instead of blocking a pool worker in the constructor (#8558)
- fe82b52 De-flake UnreachableNodeJoinsAgainSpec: the master waits for the victim to go unreachable before it terminates (#8575)
- 808de09 De-flake ShardingBufferAdapterSpec: re-send the cold messages with a fresh probe per attempt under a sharding-derived budget (#8573) [ #8545 ]
- b2524f6 De-flake ClusterSingletonManagerLeave2Spec: watch the proxy from a dedicated probe, as upstream does; migrate the file to the async TestKit API (#8569)
- 3432d6f De-flake BugFix3724Spec and HubSpec: give the zero-count event filter its own 3 s window instead of the Within's remaining time (#8566) [ #8516 ]
- 989e299 De-flake InboxSpec: receive through ReceiveAsync so a deadline failure surfaces as TimeoutException (#8564)
- a00df61 De-flake ClusterDeathWatchSpec: resolve first's end actor over the return lane before sending End (#8563)
- 91556a0 Akka.Streams: Tcp Unbind completes at once when no connection is awaiting initialization; the counter was seeded at -1 (#8570)
- 2cc9d1e De-flake DistributedPubSubRestartSpec: the restarted node makes first contact, and the survivor waits on it (#8552) [ #8557 ]
- 9705d36 De-flake ClusterSpec: stop passing an already-cancelled token to its WithinAsync block (#8540)
- 97eb9ce Bump FsCheck.Xunit from 3.3.3 to 3.4.0 (#8517)
- 287eb44 Serialization.V2: validation returns diagnostics; one gate ladder shared by both outputs (#8526)
- 846029a Serialization.V2: generator test harness, internal models, incrementality scenarios, baseline benchmark (#8525)
- a16ebf1 Revert "TestKit: put the DotNetty batching override under akka.remote, where the transport reads it (#8546)"
- d88eec8 TestKit: put the DotNetty batching override under akka.remote, where the transport reads it (#8546)
- 78f5cdc De-flake ClusterShardingQueriesSpec: wait for all three regions before allocating shards (#8524) [ #8519, #1012486927, #8310 ]
- 1552bd2 Build: bump Microsoft.SourceLink.GitHub to 10.0.303 to clear NU1902 (CVE-2026-62900) (#8535)
- 94c1949 TestKit: WithinAsync no longer swallows the block's failure when the deadline wins (#8516) [ #8483 ]
- 6cd8884 Serialization.V2: split the generator into phase files (move only, no behavior change) (#8519)
- 8ef02f2 Docs: source-generated serialization guide reflects the object-typed boundary (#8518) (#8520) [ #8384 ]
- 6775212 Serialization.V2: remove [AkkaEnvelopePayload]; a property typed object is the serializer boundary (#8518) [ #8384 ]
- bc6695b Serialization.V2: pin cross-assembly generator behavior, fix AKKASG023 mislabel, add fix-it hints (#8512) [ #8384 ]
- 2ece2c6 MNTR: eliminate the conductor port race - bind port 0 and propagate via stdout sentinel (#8515)
- 0d9deb1 Docs: user guide for source-generated MessagePack serialization (Akka.Serialization.V2) (#8514) [ #8384 ]
- 7cb73d6 Serialization.V2: record boundary decisions 16-20 in the OpenSpec design document (#8513) [ #8384 ]
- 855e8d8 Fix #8508: arm ClusterClient's reconnect deadline per establishing phase, not per message (#8510)
- e340146 Wave-3 de-flake: ReplicatorChaosSpec, ClusterShardingLeavingSpec pin, DistributedPubSubRestartSpec baseline (#8509) [ #8481, #8500, #8498 ]
- e0ab16e Artery: stop dropping the first ordinary message when the peer dialed first (#8504) [ #8496, #7314 ]
- d8e1eea Replace TBD XML doc placeholders in Akka.Event (#3435) (#8118)
- d4f8672 Replace TBD XML doc placeholders in Akka.Serialization (#3435) (#8121)
- e6e014d De-flake ClusterShardingSpec family: re-send Gets that race shard hand-off (#8500)
- 81289e8 Add TestKitBase.ShutdownAsync and adopt it in StressSpec churn teardown (#8499) [ #8497 ]
- 9b0fc9f De-flake ClusterSingletonProxySpec, ClusterSingletonRestartSpec, and DistributedPubSubRestartSpec (#8498)
- 43e9038 Fix Cluster Sharding private replicator recovery (#8480) (#8491)
- ebced6a Artery: flush outbound streams on graceful shutdown (#8486) [ #8474 ]
- c2cbd6a Bump Akka.Persistence.Sql from 1.5.67 to 1.5.70 (#8495)
- b86a6a1 Akka.Cluster: gossip removal tombstones - stop resurrecting removed members (#8484)
- 60a01d0 perf: stop retaining ConsistentHash ring's SortedDictionary (#8293) (#8324)
- 04a7980 MNTR: conductor keeps re-registered nodes; make RemoteReDeploymentSpec deterministic (#8485)
- a918393 Fix: flush graceful Disassociate PDUs before transport force-close on shutdown (#8421)
- e11bb6f MNTR: deterministic fixes for the Artery-lane spec failures (#8475)
- e581901 Wrap single-lane outbound socket in inner restart flow (#8479)
- c1c58f0 Artery: enforce quarantine on the inbound path (#8416)
- f8bcfe5 Artery test-mode: disarm the unknown-origin gate when the last blackhole heals (#8478) [ #8476 ]
- cb3147b CI: non-blocking Artery MNTR stage (#8373) [ #8378 ]
- 503e7f7 fix: update Incrementalist to 1.2.2 for SDK 10.0.4xx compatibility (#8473)
- b2cff22 Use explicit hostname in DotNetty certificate validator (#8465)
- 0cbf8d1 feat: use bounded shard rebalancing by default (#8445)
- 1e12bac Add AutoDilate metadata to TestKit timeouts (#8441)
- 0ec2139 fix: stop blocking the thread in async CircuitBreakerSpec latch waits (#8288)
- 732a17a build(deps): bump actions/setup-dotnet from 5 to 6 (#8388)
- 8dd4cca De-flake MNTR specs: stop inner waits from consuming their enclosing Within budget (#8429)
- dcd9acb MNTR: make barrier failures actually fail the barrier (#8431)
- 1a4caf7 Akka.Remote: stop, don't restart, failed throttler children (#8433, #8434) (#8437)
- f38a78c Fix torn read in PromiseActorRef.GetPath that made Path return null (#8436) [ #1, #2 ]
- 3b76168 Fix double-dilated timeout in ExpectMsgAsync(Func<T, IActorRef, bool>, ...) (#8430)
- d5993ab De-flake ActorSystemSpec.Log_dead_letters: await DeadLetterListener startup (#8428)
- 90ea389 De-flake CircuitBreakerSpec + StressSpec (deterministic) (#8427) [ #8372 ]
- 810c00a Fix ClusterClientDiscovery: preserve contact-point subscriptions across rediscovery (#8426)
- a64827d Fix flaky SpecRunCoordinatorSpec: deterministic EndSpec aggregation (no timeout race) (#8424)
- fc56f7a De-flake cluster-formation race in MNTR specs (0s auto-down + tight FD tolerance) (#8423)
- 5fae4d6 MNTR: pin restarted-system ports for both transports (#8413)
- b603b04 De-flake MNTR suite: DistributedPubSubRestartSpec + ClusterClientDiscoverySpec (bug squash) (#8415) [ #8404, #8413 ]
- 8943f25 Bump Microsoft.Extensions.Http from 10.0.9 to 10.0.10 (#8418)
- 010e0fd Artery: order DaemonMsgCreate ahead of Watch and retry early inbound resolves (#8414)
- 5b025a5 OpenSpec: drop the write-flag, migrate via reference.conf binding flips (supersedes #8403) (#8411)
- 35667df Serialization.V2: cap nested [AkkaEnvelopePayload] depth at 100 (crash guard) (#8412)
- f13a8fa De-flake ClusterShardingSpec recovery phase: keep barriers out of Within (#8406)
- 937c35b openspec: uniform migration - no per-message carve-outs, protobuf exit path (#8408)
- 464d757 DistributedPubSubRestartSpec: restore sender/receiver window ordering (#8405) [ #8400 ]
- 2679bef De-flake RemoteNodeRestartDeathWatchSpec: out-wait the association gate (#8404)
- 67db580 OpenSpec: propose internal-serializers-messagepack-v2 (#8402)
- 7704408 Serialization.V2: structured CodeWriter emission layer (provable no-op) (#8401)
- 7cbd024 Bump Microsoft.Data.Sqlite.Core from 10.0.9 to 10.0.10 (#8391)
- 86976dd Serialization.V2: committed wire-format snapshot tests (30 cases, Verify) (#8396)
- 7ea1c48 De-flake DistributedPubSubRestartSpec: fresh Identify probe + windows sized to association cycles (#8400)
- 5f225ed De-flake Bugfix5962Spec: dilated async waits, dynamic port, async TCS member-up signal (#8398) [ #5962 ]
- 27ae2cf Artery: close the shutdown-quarantine window in CompleteControlOutbound (#8397)
- aba332d Serialization.V2: immutable/read-only collection support (task 5.7) (#8395)
- 564ec6a Serialization.V2: pack generator into the runtime NuGet (analyzers/dotnet/cs) (#8394)
- 9f5e4b6 Artery: batch lane frames ahead of the connection restart boundary (#8376)
- 76a41b7 De-flake RemoteReDeploymentSpec: port upstream hardening (#8393)
- 86fdbb3 Seed ThreadLocalRandom from a cryptographic source (#8377)
- ca57893 Serialization.V2: incremental-generator discipline, union/closed-generic benchmarks, OpenSpec sync (follow-up to #8385) (#8392)
- 778d13b Bump MessagePack from 3.1.7 to 3.1.8 (#8380)
- cb7af4c Artery: log reconnect attempts on a per-outage cadence instead of per-second Warnings (#8374)
- 9e35110 Artery: TestConductor blackhole and passThrough support (test-mode) (#8378)
- 03ffbc9 chore: remove global:: qualifiers from hand-written code (#8387)
- 3864f3b Akka.Serialization.V2: closed generic messages + manifest-discriminated union fields (PoC for #8384) (#8385)
- 87f43cc Bump NUnit3TestAdapter from 4.5.0 to 6.2.0 (#8381)
- a2be71a Bump PublicApiGenerator from 11.5.0 to 11.5.4 (#8382)
- 7e4db36 Build: pin SDK-implicit FSharp.Core and bump FsharpVersion to 10.1.302 (#8386)
- 84524b3 Artery: match both terminating-child wordings in the shutdown-race guard (#8375) [ #8368 ]
- 0a05191 De-flake StressSpec: retry the aggregator Identify, fix blocking WatchAsync, add timefactor (#8372) [ #8363 ]
- 8515732 Artery: keep outbound-lanes in-flight messages alive across transient connection faults (#8368)
- a903425 Fix uid-less watch in ArteryInboundLanesSpec DeathWatch test (#8371)
- 9d09209 De-flake RollingUpdateShardAllocationSpec (#8370)
- 8ae7add Akka.Serialization.V2: native generator support for collection fields (#8364)
- ea2ddb0 Bump Grpc.Tools from 2.81.0 to 2.82.0 (#8337)
- fbc207e Bump LightningDB from 0.21.0 to 0.22.0 (#8338)
- cf2b4e3 Bump Google.Protobuf from 3.35.0 to 3.35.1 (#8251)
- b3a2831 RemotePingPong: resend-on-ack-timeout for oneway credit protocol (#8367)
- 1b0653c Dilate QuickRestartSpec windows via akka.test.timefactor (#8366) [ #8183 ]
- c2591dd RemotePingPong: add msgpack serializer arm to real payload benchmark (#8365)
- 1bffb42 RemotePingPong: add --inbound-lanes and --outbound-lanes options (#8355)
- d301d72 Artery: outbound lanes for parallel encode fan-out per association (#8357)
- 30e749c De-flake region-registration asserts in ClusterShardingRolePartitioningSpec (#8363) [ #8333 ]
- 62c6def Artery: inbound lanes for parallel per-connection deserialization and dispatch (#8356)
- 2d71eb5 Fix starvation flake in ArteryShutdownSystemMessageAckRaceSpec (#8360)
- 13426de Raise and dilate the cold-association resolve timeout in MultiTransportAddressingSpec (#8362)
- f4d25d8 Fix stack overflow deserializing ISurrogated-typed members without $type metadata (#8358) [ #6502, #6503, #8354 ]
- bb031d8 Fix RememberEntitiesStarterSpec constant-strategy throttle test (#8361)
- 26e32af Akka.Cluster: make Cluster extension startup non-blocking (fixes StressSpec CI deadlock) (#8359)
- 72d5e13 MNTR: opt-in Artery transport via AKKA_MNTR_TRANSPORT env var (#8351)
- 3b41efb Artery: large-message stream (streamId 3) (#8352)
- 05dce42 RemotePingPong: System.CommandLine CLI + real-payload serializer benchmark mode (#8350) [ #8349 ]
- 1f146b8 Serialization: document threading contracts + transport-info concurrency spec (#8353)
- 3b7094d Benchmark harness: RemotePingPong drop visibility, queue sizing, split two-node mode (#8347)
- 52693e0 Artery: don't quarantine on control sends after outbound channel completes (#8348)
- 2c0107d Artery: fix control-queue sizing, overflow observability, and shutdown races (#8346)
- cc15e5b Artery: raise Akka.IO pipe watermarks on Artery TCP connections (#8345)
- c0ae21a Benchmark harness QoL: RemotePingPong knobs + one-way mode, PingPong headless fix (#8344)
- 407d70c Akka.Serialization.V2: add AKKASG012/AKKASG013 collision diagnostics (#8342)
- c8e107a Akka.Streams TCP write-coalescing + zero-copy Artery write path (#8340)
- 81ed9bc Akka.IO: ownership-carrying Tcp.Write, buffer disposal at the copy point (#8341) [ #8323 ]
- 799465d Artery group 9: association reconnect, lifecycle suite, and cluster formation over Artery (#8336)
- c0e4484 Artery task group 8: bounded-queue backpressure verification + slow-receiver tests (G4) (#8335)
- 6bdd347 Artery: swap all nine control messages to source-generated V2 serializers (#8334) [ #8331 ]
- f89037b Artery G3 task group 7: reliable system-message delivery — the G3 correctness gate (#8332) [ #6414 ]
- 0ac9d67 Batch elements across the .Async() island boundary (OnNextBatch) - fixes #8314 (#8326) [ #8243 ]
- 1adbd58 fix(cluster.sharding): widen AwaitAssert windows in ClusterShardingRolePartitioningSpec to de-flake MNTR (#8333)
- 67b4883 sourcegen: AllowEmpty opt-in for fieldless protocol messages + annotated-struct nested fields (#8331)
- c97cd21 Artery G3 task group 6: dedicated control stream (#8330) [ #8327 ]
- a0d2d78 Artery G3 opening: envelope-typed pipeline + zero-copy encode stage (Detach) (#8327)
- 2e552c6 SerializerV2: sourcegen foreign-type formatters, oversized-payload determinism, sync + manifest contracts (goals B–E, pre-Artery-G3) (#8325) [ #8322 ]
- 8f3ebde fix: make RemotingTerminator remotely-deployed-actor shutdown test converge-then-assert (async) (#8328) [ #8316 ]
- f9c49c8 docs(openspec): Tcp.Write ownership-transfer design — dispose at the pipe-copy point (#8329)
- c3ade82 Akka.IO: copy pre-registration TCP writes at enqueue — never retain caller buffers (#8323)
- 35aa478 Artery G2: handshake, association state, and basic ordinary messaging over Artery TCP (gate passed) (#8320)
- 153662f SerializerV2: pooled buffer writer + ownership contract (PooledPayloadWriter) — precedes Artery G2 (#8322)
- fc92055 Artery G1: TCP framing foundation + envelope codec (gates on framing/envelope round-trip) (#8319)
- 2241ab0 docs(openspec): Artery Decision 2 correction — inbound lanes are hubs, #8314 decoupled (#8318)
- 52ec912 docs: post-merge bookkeeping for widen-system-uid-to-64bit (#8317)
- 7f12ff8 Milestone 3.5: widen system/address UID int32 -> int64 (Artery prerequisite) (#8317)
- 5720111 Artery Task 0: transport-substrate validation gate (G0) — harness, N=3 measurements, gate amendments (#8315) [ #8314 ]
- 4a41d91 docs(openspec): flesh out artery-tcp-remoting design from verified research (#8313) [ #36, #37, #38, #39 ]
- 232d3e3 Fix #8031: consistent-hashing router wedges cluster-wide on 32-bit hash collision (#8294) (#8305) [ #8293, #2, #3, #1 ]
- 4175b76 fix: make ClusterShardingQueriesSpec stats/region-state queries converge-then-assert (async) (#8310)
- ee30c3a Bump Microsoft.SourceLink.GitHub from 8.0.0 to 10.0.300 (#8312)
- 14529e7 Add a "from the end" (last-N) query Offset to Akka.Persistence.Query (#8245) (#8308) [ #8244 ]
- 45270c8 Bump Microsoft.NET.Test.Sdk from 17.9.0 to 18.7.0 (#8282)
- ffc1c78 fix: make A_dispatcher_must_process_messages_one_at_a_time deterministic (#8299)
This list of changes was auto generated.