github akkadotnet/akka.net 1.6.0-beta1
akka.net v1.6.0-beta1

pre-release2 hours ago

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.0 only, so .NET Framework, .NET 6 and .NET 8 apps can't reference 1.6. Dependency minimums rise to Microsoft.Extensions.* 10.0 for Akka, Akka.DependencyInjection and 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.ByteString is gone. TCP (Tcp.Received, Tcp.Write) and the Streams byte APIs (Framing, JsonFraming, FileIO, StreamConverters, Tcp) use ReadOnlySequence<byte>, UDP uses ReadOnlyMemory<byte>, and ByteOrder moved to Akka.Util. Replace ByteString with byte[], ReadOnlyMemory<byte> or ReadOnlySequence<byte>. (#8132)
  • No more HOCON from App.config / Web.config. ConfigurationFactory.Load(), AkkaConfigurationSection and Akka.FSharp's Configuration.load are removed. Load HOCON from a string or file with ConfigurationFactory.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 as Akka.*. WithExtension<T>() now registers through ExtensionsSetup; see Akka.Hosting now ships from this repository below. (#8594, #8649)
  • Serialization. An akka.actor.serialization-identifiers override 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 own serialization-settings block is ignored (#8698). Serializer gains virtual FromBinary(byte[], string) and Manifest(object), so FromBinary(bytes, null) no longer compiles without a cast, and ByteArraySerializer.IncludeManifest is now true (#8222). Module serializers now handle some types that used to fall back to json; 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 to 0 to 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=true and runs them on every pull request: a local ActorSystem (src/aot/Akka.AOT.App) and an Akka.Hosting app with dependency injection, a custom extension, Microsoft.Extensions.Logging and 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 of Akka.dll) or in Akka.Hosting, Akka.DependencyInjection and Akka.Streams.
  • A new feature switch, Akka.DynamicTypeLoading, controls whether Akka may resolve HOCON type names with Type.GetType. It stays on for ordinary builds. The Akka package turns it off for you when your project sets PublishAot or PublishTrimmed; with it off, only Akka's built-in type names resolve and nearly anything else throws a ConfigurationException that names the setting. To turn it back on, add <RuntimeHostConfigurationOption Include="Akka.DynamicTypeLoading" Value="true" />. (#8601, #8608)
  • Two new Setup types, LoggerSetup (custom loggers and the log formatter, #8218) and ExtensionsSetup (extensions, #8648), join the existing SerializationSetup (serializers and bindings), so you can register your own types without HOCON type names. Combine them with ActorSystemSetup and pass the result to ActorSystem.Create. Akka.Hosting's WithExtension<T>() uses ExtensionsSetup (#8649).
  • With the switch off, core doesn't register the reflection-based json serializer or its System.Object binding, so register a serializer for your own messages through SerializationSetup; the source-generated serializer in Akka.Serialization.V2 is 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 ActorSystem starts, whether or not you configure or start that module. Precedence is module defaults, then HOCON, then SerializationSetup, 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.dll or Akka.Cluster.dll, even one that never turns on remoting or clustering, these types no longer fall back to json (or your own System.Object binding):

    • string, int, long go to primitive (id 17)
    • Google.Protobuf.IMessage goes to proto (id 2)
    • Akka.dll types such as IActorRef, PoisonPill, Kill, Identify / ActorIdentity, Status.Success / Status.Failure, the router pools and Config go to akka-misc (id 16); ActorSelectionMessage to akka-containers (id 6); SystemMessage to akka-system-msg (id 22)
    • IDeliverySerializable (reliable delivery, in Akka.dll) goes to reliable-delivery (id 36) when Akka.Cluster.dll ships

    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 in akka.actor.serialization-bindings or through SerializationSetup.

  • Serializers resolve their own manifests. SystemMessageSerializer and the two Persistence serializers map manifests to types from their own tables, and SerializerV1Adapter now calls a plain Serializer's own FromBinary(byte[], string) override instead of skipping it. With Akka.DynamicTypeLoading off, the base Serializer.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 from SerializerWithStringManifest. (#8697)

SerializerV2 and source-generated serializers

  • SerializerV2 is a new public base class that writes to an IBufferWriter<byte> and reads from a ReadOnlySequence<byte>, instead of returning a new byte[] per call. (#8222)
  • Serialization stores every serializer as a SerializerV2. Existing Serializer and SerializerWithStringManifest implementations get wrapped in SerializerV1Adapter automatically, keep working, and write the same bytes. HOCON and SerializationSetup registrations don't change, and the public lookup APIs still return Serializer.
  • The new Akka.Serialization.V2 package 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 with CreateRegistration().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. tcp is the only transport, and there's no Akka.Hosting helper yet; configure it through HOCON.

Akka.IO

  • TcpConnection now runs on Stream + System.IO.Pipelines instead of SocketAsyncEventArgs. With the ReadOnlySequence<byte> API, framing decode allocates less. (#8132)
  • WriteAck now 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-size now caps a single write instead of the backlog, so use ack-based writes for backpressure. (#8132, #8646)
  • Tcp.ResumeWriting, Tcp.WritingResumed and the useResumeWriting parameter are removed; they never did anything. (#8660)
  • TCP connects to a DnsEndPoint use the OS resolver, not akka.io.dns. (#8132)
  • UDP no longer pools buffers. If you pointed buffer-pool at direct-buffer-pool or a custom pool, move its buffer-size to disabled-buffer-pool.buffer-size, or datagrams over 512 bytes are truncated. (#8606)
  • akka.io.tcp.maximum-frame-size keeps its 1.5 meaning on the new transport: it caps bytes per socket read and per socket send. (#8663)
  • A Tcp.Close sent while a ConfirmedClose is draining now upgrades it to a full close instead of being dropped (#8636). If the drain fails during a close, the connection now reports ErrorClosed instead 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.TestKit and Akka.Hosting.TestKit.Xunit2 now live under src/contrib/hosting and ship at the Akka.NET version (forward-port of #8591). Package ids and namespaces stay the same. Bump Akka.Hosting.* to the same version as Akka.*; 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.0 only and need Microsoft.Extensions.* 10.0 or later (Akka.Hosting 1.5.71 needed 9.0). Akka.Hosting's OpenTelemetry dependency moves to 1.15.3 or later, which clears GHSA-g94r-2vxg-569j.
  • Hosting API changes: WithExtension<T>() / WithExtensions(...) now register through ExtensionsSetup, so akka.extensions no longer lists those extensions, and an extension id whose constructor throws now fails startup with a ConfigurationException (1.5 logged and skipped it). Read Settings.Setup.Get<ExtensionsSetup>() or call HasExtension<T>() instead of reading akka.extensions. WithExtensions(params Type[]) is now marked [RequiresUnreferencedCode] - prefer WithExtension<T>(). AddAkka<T>, WithHealthCheck<T>, WithDefaultLogMessageFormatter<T> and WithExtension<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 Down can 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 (default 24h). 1.5 nodes ignore the new field. (#8484)
  • Akka.Cluster.Metrics: a remote-deployed AdaptiveLoadBalancingPool with a non-default MetricsSelector now deserializes. (#8704)
  • Akka.DistributedData: ReplicatorMessageSerializer no longer starts a timer that nothing cancels. Its cache never worked and is gone; serializer-cache-time-to-live is 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 ISurrogated member that has no $type metadata. (#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.Queue offers (1.5.69) and the consistent-hashing router collision fix for #8031 (1.5.70).

Changes:

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.

Don't miss a new akka.net release

NewReleases is sending notifications on new releases.