Repository navigation
Bump the minor-and-patch group with 10 updates - #330
Open
dependabot[bot] wants to merge 2 commits into
Open
dependabot[bot] wants to merge 2 commits into
dependabot[bot] wants to merge 2 commits into
Conversation
Bumps FluentValidation from 12.1.1 to 12.2.0 Bumps Microsoft.AspNetCore.Mvc.Testing from 10.0.12 to 10.0.13 Bumps Microsoft.AspNetCore.OpenApi from 10.0.12 to 10.0.13 Bumps Microsoft.Extensions.ApiDescription.Server from 10.0.12 to 10.0.13 Bumps Microsoft.NET.Test.Sdk from 18.10.1 to 18.11.0 Bumps microsoft.openapi.kiota from 1.35.0 to 1.36.1 Bumps WolverineFx.Http from 6.41.0 to 6.51.1 Bumps WolverineFx.Http.FluentValidation from 6.41.0 to 6.51.1 Bumps xunit.runner.visualstudio from 4.0.0 to 4.0.1 Bumps xunit.v3 from 4.0.1 to 4.0.2 --- updated-dependencies: - dependency-name: Microsoft.AspNetCore.Mvc.Testing dependency-version: 10.0.13 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-and-patch - dependency-name: Microsoft.AspNetCore.OpenApi dependency-version: 10.0.13 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-and-patch - dependency-name: Microsoft.Extensions.ApiDescription.Server dependency-version: 10.0.13 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-and-patch - dependency-name: Microsoft.NET.Test.Sdk dependency-version: 18.11.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: minor-and-patch - dependency-name: microsoft.openapi.kiota dependency-version: 1.36.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: minor-and-patch - dependency-name: xunit.runner.visualstudio dependency-version: 4.0.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-and-patch - dependency-name: FluentValidation dependency-version: 12.2.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: minor-and-patch - dependency-name: Microsoft.AspNetCore.Mvc.Testing dependency-version: 10.0.13 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-and-patch - dependency-name: Microsoft.AspNetCore.OpenApi dependency-version: 10.0.13 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-and-patch - dependency-name: Microsoft.Extensions.ApiDescription.Server dependency-version: 10.0.13 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-and-patch - dependency-name: Microsoft.NET.Test.Sdk dependency-version: 18.11.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: minor-and-patch - dependency-name: microsoft.openapi.kiota dependency-version: 1.36.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: minor-and-patch - dependency-name: xunit.runner.visualstudio dependency-version: 4.0.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-and-patch - dependency-name: Microsoft.AspNetCore.Mvc.Testing dependency-version: 10.0.13 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-and-patch - dependency-name: Microsoft.AspNetCore.OpenApi dependency-version: 10.0.13 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-and-patch - dependency-name: xunit.v3 dependency-version: 4.0.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-and-patch - dependency-name: Microsoft.AspNetCore.Mvc.Testing dependency-version: 10.0.13 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-and-patch - dependency-name: Microsoft.AspNetCore.OpenApi dependency-version: 10.0.13 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-and-patch - dependency-name: Microsoft.Extensions.ApiDescription.Server dependency-version: 10.0.13 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-and-patch - dependency-name: Microsoft.NET.Test.Sdk dependency-version: 18.11.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: minor-and-patch - dependency-name: microsoft.openapi.kiota dependency-version: 1.36.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: minor-and-patch - dependency-name: xunit.runner.visualstudio dependency-version: 4.0.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-and-patch - dependency-name: FluentValidation dependency-version: 12.2.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: minor-and-patch - dependency-name: Microsoft.AspNetCore.Mvc.Testing dependency-version: 10.0.13 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-and-patch - dependency-name: Microsoft.AspNetCore.OpenApi dependency-version: 10.0.13 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-and-patch - dependency-name: Microsoft.Extensions.ApiDescription.Server dependency-version: 10.0.13 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-and-patch - dependency-name: Microsoft.NET.Test.Sdk dependency-version: 18.11.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: minor-and-patch - dependency-name: microsoft.openapi.kiota dependency-version: 1.36.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: minor-and-patch - dependency-name: WolverineFx.Http dependency-version: 6.51.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: minor-and-patch - dependency-name: WolverineFx.Http.FluentValidation dependency-version: 6.51.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: minor-and-patch - dependency-name: xunit.runner.visualstudio dependency-version: 4.0.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minor-and-patch ... Signed-off-by: dependabot[bot] <support@github.com>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Updated FluentValidation from 12.1.1 to 12.2.0.
Release notes
Sourced from FluentValidation's releases.
12.2.0
Release notes
Please read the upgrade guide if you are moving from 11.x to 12.x
Changes in 12.2.0
Changes in 12.1.0
Changes in 12.0.0
Downloads
Binaries can be downloaded from nuget:
Commits viewable in compare view.
Updated Microsoft.AspNetCore.Mvc.Testing from 10.0.12 to 10.0.13.
Release notes
Sourced from Microsoft.AspNetCore.Mvc.Testing's releases.
No release notes found for this version range.
Commits viewable in compare view.
Updated Microsoft.AspNetCore.OpenApi from 10.0.12 to 10.0.13.
Release notes
Sourced from Microsoft.AspNetCore.OpenApi's releases.
No release notes found for this version range.
Commits viewable in compare view.
Updated Microsoft.Extensions.ApiDescription.Server from 10.0.12 to 10.0.13.
Release notes
Sourced from Microsoft.Extensions.ApiDescription.Server's releases.
No release notes found for this version range.
Commits viewable in compare view.
Updated Microsoft.NET.Test.Sdk from 18.10.1 to 18.11.0.
Release notes
Sourced from Microsoft.NET.Test.Sdk's releases.
18.11.0
What's Changed
New Contributors
Full Changelog: microsoft/vstest@v18.10.1...v18.11.0
Commits viewable in compare view.
Updated microsoft.openapi.kiota from 1.35.0 to 1.36.1.
Release notes
Sourced from microsoft.openapi.kiota's releases.
1.36.1
Added
Changed
1.36.0
Added
messagereturns the property the description marks withx-ms-primary-error-message, as the other languages do. An error property namedmessageis renamedmessage_escaped, likeMessageEscapedin C#; when it is a string,messagestill returns it. kiota-ruby#63Changed
Fixed relative description paths when opening or selecting clients in the VS Code Kiota workspace.
Removed the retired lock-search command from the VS Code command palette. Lock-file migration remains available.
Preserve inherited properties when a single
oneOforanyOfmember defines its properties only throughallOf. Fixes #6778.Python: preserve false, zero, empty strings, and empty collections when parsing and serializing union type wrappers.
All language refiners accept a generation logger consistently, retaining configuration-only compatibility constructors hidden from IntelliSense.
Reject plugin-manifest file references whose path components become parent-directory traversal after Windows trims trailing spaces or dots.
Fixed a stack overflow when generating API plugins from descriptions with cyclic
allOfschemas.Dart: omit unsupported schema defaults with a generation warning, preserve supported literal and enum property and parameter defaults (including empty strings), initialize query parameters from schema defaults, and keep constructor initialization valid with or without backing stores.
Dart: preserve nullable optional request-builder constructor parameters, including UUIDs and collections, so cloning accepts null arguments without overwriting existing path parameters.
Dart: escape URL templates once at final emission to preserve literal dollar signs and backslashes in constructor defaults and method overrides.
Dart: preserve schema string defaults named
null, including enum wire values, without treating them as JSON-null sentinels.Dart: preserve query-parameter defaults inside single-member
allOfwrappers, retaining outer-default precedence and explicit JSON-null defaults.Dart: validate parser-backed date, time, and UUID defaults before emission, omitting unsupported values with a generation warning.
Ruby: a union of object types that no discriminator decides, such as a oneOf without a discriminator, now reads the payload into every object member, as TypeScript does, instead of returning an empty wrapper. A union whose discriminator matched no member does the same, and its array member is only read when no other member was picked. Requires the runtime gems at 0.24.0.
Ruby: enum members hold their wire value, so a value such as
incoming-paymentorreadis sent and read as the description declares it instead of asIncomingPaymentorRead.Enum[:Name]now returns the wire value as a string. Requires the runtime gems at 0.24.0.Go: keep escaped namespace segments lowercase so imports match generated package directories on case-sensitive filesystems. Fixes #7828.
TypeScript: import response enum objects for request builders reached through path parameters. #6884
Resolve enum query parameters wrapped in single-member
allOfschemas, including enum array items.Go: cast scalar enum values in union factories and avoid reading an empty discriminator name for undiscriminated unions. Addresses #7808.
Preserve models for multipart properties with default content types when other properties specify an encoding. #7342
Dart: escape enum options named value or values to avoid conflicts with generated and built-in enum members. #7807
Ruby: the client's root module has an
eager_load!method that loads every autoloaded model, for servers that preload before forking.Ruby: generated files start with
# frozen_string_literal: true, so string default values handed to user code are frozen.Ruby: generated string literals are double quoted, the StandardRB convention.
Ruby: namespaces with nothing to autoload no longer get an empty barrel file, and generated files no longer require them (561 fewer files in a GitHub client).
Ruby: a client generated with a multi-segment
--namespace-name, such asintegration_test.client, failed to load because its root file was written one directory too deep.Ruby: namespace barrels register their models and enums with
autoloadinstead of requiring them, so a subclass no longer fails to load when its base class file is required first. Other files require the barrel rather than an individual model file, and models now load on first use. A type no barrel autoloads, such as a model named after its namespace, is now required directly: 1,315 constants referenced by a Meraki client never loaded, and a client generated from the current GitHub description failed to load because it required a file that is never written. #7956Ruby: model properties are declared with
attr_accessor, which removes the thousands of "possibly useless use of a variable" warningsruby -wprinted while loading a client.Ruby: enum hashes are frozen. kiota-ruby#68
C#: escape Unicode line and paragraph separators in generated string literals so generated clients remain valid C# source.
External reference allowlist wildcards no longer cross the URI authority boundary, so a wildcard in the scheme or host cannot match text in the path, the user information or the port.
Initialize inherited Dart model fields in constructor initializer lists.
Replace only unresolved binary types with a native stream type, and translate a resolved model by its definition rather than its name, so a model whose schema is named
binary,base64orbase64urlkeeps its own name across every language instead of being rendered as the native binary type. Generation no longer fails for C# and Java.Avoid redundant parsing branches for equivalent binary alternatives in Dart and PHP composed models.
Preserve imports for distinct types from the same namespace when inlining error model inheritance.
Dart: qualify model fields named
nodeordeserializerMapduring deserialization so local variables do not shadow them; escapeoverridemodel members to preserve Dart annotations. Fixes #7822.PHP: disambiguate enum constants that normalize to the same name while preserving wire values and existing constant names.
Java: omit unused discriminator-mapping imports for union/intersection wrappers, avoiding imports of nonexistent models while retaining member and inherited-factory imports.
Dart: omit unused discriminator-mapping imports for composed wrappers while preserving member and inherited-factory imports. Addresses #7821.
Preserve endpoints whose static path segments collide after name sanitization, such as /v1.1 and /v11. #7143
Ruby: a path with an escaped suffix, such as
/domains/{domainName}!quote, generated a request builder method that passed the raw path parameter name where the signature had snake cased it, and referenced the builder class without its namespace. Both raisedNameErroron first use. #7956... (truncated)
Commits viewable in compare view.
Updated WolverineFx.Http from 6.41.0 to 6.51.1.
Release notes
Sourced from WolverineFx.Http's releases.
6.51.1
Bug fix release, and some doc updates too
What's Changed
Full Changelog: JasperFx/wolverine@V6.51.0...v6.51.1
6.51.0
Everything since 6.50.1.
Highlights
opts.Durability.NodeRole = NodeRole.Warmupand a node joins the serving cluster but does none of the serving nodes' messaging. Its only job is to run the new release's projection shards in Rebuild mode, so the new projection versions are caught up before you cut over. The role is opt-in; the default isNodeRole.Serving, and no schema change is needed. Docs: Marten · PolecatDurabilityMode.ServerlessWithOutbox(#5016, #5044). The leanServerlessruntime, but with the transactional outbox kept:JsonOptionswithout needingMapWolverineEndpoints(). Two new properties,HttpChain.JsonSerializerOptionsandHttpHandler.JsonSerializerOptions, give a single endpoint its own JSON options.chain.FailureLogLevel,opts.Policies.MessageFailureLogLevel(...)or[WolverineLogging(FailureLogLevel = ...)]. The default is stillError.Durability fixes
InboxStaleTime(#5022, #5025, #5039):Serverlessmode no longer fails at startup with RavenDB persistence.AddMessageHandlerhandler committing an ancillary sessionServerlessWithOutbox, a failed inline send is retried by the destination's sending agent.Serverlesswarns about durable endpoints downgraded after startup.Dependencies
System.Security.Cryptography.Pkcsadvisory GHSA-846f-f764-76mx.6.50.2
A dependency patch release. No configuration or code changes needed.
Dependencies
This moves Wolverine onto the Critter Stack releases that fix CVE-2026-84008 / GHSA-846f-f764-76mx (
System.Security.Cryptography.Pkcs, high-severity denial of service) (#5018):Weasel.SqlServerandWeasel.Oraclenow reference the patched Pkcs directly.Polecatnow references the patched Pkcs directly. This also brings in Polecat 5.39 and 5.40.Marten,Marten.AspNetCoreandMarten.Newtonsoft. Marten was never affected by the advisory.Wolverine 6.50.1 already pinned the patched Pkcs in
WolverineFx.SqlServer,WolverineFx.OracleandWolverineFx.ClaimCheck.SqlServer, so applications on 6.50.1 were already protected. Those pins stay, because Wolverine referencesMicrosoft.Data.SqlClientandOracle.ManagedDataAccess.Coredirectly. 6.50.2 means the upstream libraries carry the fix too, so a NuGet audit comes back clean whichever of them your application references directly.6.50.1
Patch release with a memory-leak fix and two security dependency updates.
Fixes
WolverineRuntimenow disposes itsMeter(#5012, #5013). The runtime'sSystem.Diagnostics.Metrics.Meterused to stay in the process-wide staticMeterregistry after the host was disposed. The durable persistence gauges on it hold callbacks back into the runtime, so every disposed host stayed reachable for the life of the process. Test suites that build manyWebApplicationFactoryorHostinstances with durable persistence saw the heap grow without bound. Thanks to @AndriiKononenko3 for the detailed report and the retention path.Security dependency updates
System.Security.Cryptography.Pkcs, high-severity denial of service). The package arrived transitively at vulnerable versions throughMicrosoft.Data.SqlClient,Oracle.ManagedDataAccess.Coreand Polecat.WolverineFx.SqlServer,WolverineFx.OracleandWolverineFx.ClaimCheck.SqlServernow reference the patched version directly: 9.0.21 on net9.0 and 10.0.13 on net10.0. Every package built on them, includingWolverineFx.PolecatandWolverineFx.Http.Polecat, picks up the fix.Microsoft.AspNetCore.SignalR.Common, high-severity denial of service).WolverineFx.SignalRnow depends onMicrosoft.AspNetCore.SignalR.Client9.0.21 on net9.0 and 10.0.13 on net10.0, up from 9.0.8.6.50.0
Wolverine 6.50.0 is a feature release. The headline is a new way to send a message to every node in your cluster. Just as much of this release came from the community, though: five community pull requests landed, and several issue reports led straight to fixes.
The two Bobcat packages,
WolverineFx.BobcatandWolverineFx.Bobcat.Http, ship as6.50.0-alpha.1and are still pre-release.Broadcast a message to every node in the cluster
BroadcastToAllNodesAsync()(#4993, closes #4988). Wolverine's normal delivery is competing consumers, where exactly one node handles a message. Sometimes you want every node to hear about something instead: a cache to invalidate, a configuration change to pick up, some node-local state to reset. Now you can just do this:Every running node, including the one that sent it, handles the message exactly once with its own handler. The sending node gets the message on the local routes its type already has, or on
local://default, and it's never forwarded to the external routesPublishAsync()would use. Every other node gets a copy on its node control endpoint, which is the broker control queue if you've configured one and the database control queue otherwise. Nodes that have gone stale are skipped, using the same rule the leader applies before ejecting a node. A broadcast from inside a handler goes through the outbox like any other outgoing message, and correlation ids are stamped as usual. InSoloandServerlessdurability modes the message is delivered to this node only, andMediatorOnlyrefuses it just likePublishAsync(). It's an extension method onIMessageBus, so no otherIMessageBusimplementation breaks, andTestMessageContextrecords broadcasts in a newBroadcastToAllNodeslist for your unit tests. See the new Broadcast Messages to Every Node guide.From the community
A big thank you to everyone who sent pull requests and reports for this release:
@jcd1991 contributed two PostgreSQL transport features:
LISTEN/NOTIFYwakeups for PostgreSQL queues (#4998, closes #3480). WithEnableQueueNotifications(), an idle queue listener is woken as soon as a message is written instead of waiting out its polling interval. In local benchmarks the median delivery time on an idle queue dropped from about 650ms to under 3ms. It's off by default because it holds one extra, long-lived database connection per database per running process. Read the trade-offs in the new Queue Notifications with LISTEN/NOTIFY section before you turn it on.EnableDeterministicQueueOrdering()now preserves their order, and it was followed up for SQL Server, MySQL, Oracle and SQLite in #4987.@jcd1991 also fixed Wolverine.HTTP treating a container-registered service as the JSON request body on POST and PUT endpoints (#5010, closes #3863, reported by @erdtsieck). The same parameter on a GET endpoint was correctly injected, but on a POST or PUT every call failed with a 500. An explicitly registered, non-keyed concrete type is now resolved from the container on every endpoint. This is a behavior change: if you register a type in the container and post it as a request body without
[FromBody], add[FromBody]to keep binding it from the request.@erdtsieck found and fixed a ping-pong in agent assignment during blue/green warm-ups (#5000, closes #4999). Projection partitions that could only run on the previous version's nodes moved between those nodes on every evaluation, which showed up in production as 1,000 to 3,000
ReassignAgentcommands a minute. A partition that fits nowhere now stays where it is unless another node is strictly lighter. The follow-up in #5001 makes it settle in one move.@PascalEschbach contributed a big round of NATS follow-ups (#4976, closes #4973), with tests for every change:
resources setupprovisioning declared streams once per connection;TrustTenantIdHeadersetting;ILoggerFactory;#4985 followed up on the core side.
@Maflend reported that the static handler registry ignored custom discovery rules once conventional discovery was disabled (#4984), a regression since 6.44.0. It's fixed in #4992.
@uniquelau's report in marten#5652 led to #5011, below: the leader no longer builds every event store's full usage descriptor on every heartbeat.
Agents and event subscriptions
IEventStore.RegisteredShardNames()and the newIEventStore.TryDescribeDatabasesAsync(), instead of a fullTryCreateUsage()that also read the highest event sequence and described every projection, subscription and event type, for every store, every 10 seconds. To get the full saving, also take Marten 9.50.1, Polecat 5.40.1 or Fisher 1.20.2, which answerTryDescribeDatabasesAsync()straight from their tenancy.IProjectionDaemon.IsRebuilding(), so it can no longer start a second copy of the shard on top of a running rebuild.Transports and persistence
OptimizeQueueThroughput()(#4991, closes #4989).EnableDeterministicQueueOrdering()for SQL Server, MySQL, Oracle and SQLite (#4987).HTTP
Valuestrong-typed id wrappers, such asrecord struct OrderId(Guid Value), without aTryParse(#4995, closes #4978).... (truncated)
6.49.0
Wolverine 6.49.0 is a feature release. The big themes are optimized envelope ids for SQL Server, additive per-message topic routing across NATS, RabbitMQ and MQTT, a long list of NATS hardening, and a big round of Event Modeling and Bobcat work. Thank you to @knotekbr, @me-azlam-kp, @faustodc, @luisarellano09 and @alesdvorakcz, whose reports, tests and pull requests are all over this one.
The two Bobcat packages,
WolverineFx.BobcatandWolverineFx.Bobcat.Http, ship as6.49.0-alpha.3and are still pre-release.SQL Server
uniqueidentifierstarting from its last six bytes, so to SQL Server those ids arrive in random order and fragment the clustered inbox, outbox and dead letter tables. One production inbox was measured at 99% fragmented with its pages half full. The newEnvelopeIdGeneration.NewIdSqlServerOrderuses the same NewId algorithm with the timestamp where SQL Server sorts on it. Wolverine now switches to it on its own at startup when every message store in the application is SQL Server -- plain SQL Server persistence, the SQL Server transport, EF Core on SQL Server, or Polecat -- and you haven't setEnvelopeIdGenerationyourself. There's no schema change. If a SQL Server-only application sends messages to Wolverine services that store their envelopes in PostgreSQL, opt out, because the receiving service uses the same id as its inbox key and PostgreSQL indexes these ids worse than random GUIDs. Either setopts.EnvelopeIdGeneration = EnvelopeIdGeneration.NewIdor use the newoptimizeEnvelopeIdsForSqlServer: falseoverloads ofPersistMessagesWithSqlServer(),UseSqlServerPersistenceAndTransport()and Polecat'sIntegrateWithWolverine(). Behind it,IMessageStoregains aPreferredEnvelopeIdGenerationmember with a default implementation, so existing stores are unaffected.Routing
PublishMessagesToNatsSubject<T>(),PublishMessagesToRabbitMqExchange<T>()orPublishMessagesToMqttTopic<T>()-- used to silently switch off an explicitPublishMessage<T>().ToLocalQueue()rule, local routing to a handler, and broker conventions for the same message type. Each of those now has an overload that takesadditive: true, so the other routing rules still apply. The original overloads are unchanged. A customIMessageRouteSourcecan opt into the same behavior through the newIPassThroughMessageRouteSource, andExplainRoutingFor()labels such a source[additive, pass-through].MultipleHandlerBehavior.Separatedfor conventional routing on Amazon SQS, Azure Service Bus queues and GCP Pub/Sub (#4948, #4949, #4951, closing #4524, #4525 and #4526). Each handler type gets its own queue or subscription, on top of a small new hook for routing conventions.NATS
DiscardPolicy.New, a failedNats-Expected-*check, an oversized message -- used to be retried three times, logged as errors, and dropped, whileSendAsync()returned as if it worked. Now it isn't retried, andSendAsync()throws the newSendRejectedExceptionwith the JetStream error inside. Other transports can throwSendRejectedExceptionfrom their senders to get the same treatment.DefineStream()used to be created as a default work-queue stream, which then showed up as drift underProvisioning(Verify).ConfigureJetStreamPublish.HTTP
[RequestSizeLimit], for example, now answers 413 instead of a 500 saying the body could not be deserialized.Persistence and durability
PartitionPerTenantfor a table that already exists, and EF Core, Marten and Polecat conjoined tenancy are tested together in one database. Along the way, this fixed a saga saved with a temporary EF Core key landing under a tenant id that was a random GUID.MessageIdentity.IdAndDestination(#4969, closes #4216). Running the shared message store tests under that identity found that it put slashes into Cosmos document ids, which Cosmos does not allow, so every update quietly missed its document. That's fixed, and CosmosDB and RavenDB both now run the whole contract under that identity.Microsoft.Azure.Cosmos3.63.2 and pinning the emulator image.Agents and leadership
DurabilitySettingshave backward-compatible defaults.Code generation
Event Modeling and Bobcat
wolverine scaffoldfollows Bobcat'sFeatures/{Chapter}layout (#4959), gains--jsonoutput with stable notice codes (#4947, closes #4928), and has a round of output fixes: record views built withCreate, the events that start a stream first, and long attributes on their own line (#4929). Scaffolded HTTP endpoints are tested against Marten, Polecat and Fisher, and a stream start answers 201 with its id (#4947, closes #4927).[Emits]inference, definition discovery,describe-event-model, and new WolverineFx.Bobcat assertions.FetchLatestread models, and DCB and multi-stream scaffolding.ThenEventuallyCausedchecks the events an act caused past an async boundary (#4965, closes #4939). The new WolverineFx.Bobcat step finds them by correlation id once the async daemons catch up, and there's an opt-in correlation header for every HTTP endpoint.6.48.3
A patch release for blue/green warm-ups at fleet scale, from a second production report by @erdtsieck on 6.48.2: every green-only agent went to the first green node to register, and the two green nodes that joined seconds later got nothing for half an hour.
WOLVERINE_FLEET_SCALE=production.IQuerySessionbut sends messages now gets its commit (#4910, @srimalw; #4912 for Polecat and Fisher). TheIQuerySessionpermutation of #2941: the read-only parameter was served by casting the outbox-enrolled session, butCanApplyignored it, so a scheduled cascade was never handled and a durable local message only ever ran from memory. Reading alone still does not make a chain transactional; reading plus sending does — an injectedIMessageBus, a returnedOutgoingMessages, or a cascading return value.Everything else is as in 6.48.2.
6.48.2
A patch release for agent assignment at fleet scale, from a production report by @erdtsieck: ~62,000 per-tenant event-subscription agents on 5 to 8 nodes, where a newly elected leader spent 66 minutes in its first assignment evaluation during a blue/green warm-up and three leaders in a row were replaced before one finished.
AssignmentGrid.MatchAgentsToCapableNodesForwas quadratic in the agent count whenever any capability differed between nodes — which a single bumped projection version is enough to trigger.batchCommandsremoving each start command from the list one at a time, the heartbeatFill()-ing every running agent into the node record, per-placementFill()on the grid's node, and per-placement recounts in both even distribution paths. Measured through the leader's real evaluation at the reported shape: the even blue/green path's first evaluation went from 76 s to under 5 s.DurabilitySettings.LeaderTakeoverHoldEvaluations(default 1, 0 disables) withholds bare first-time placements for that many evaluations after election, so the predecessor's starts can surface as assignment rows and be kept where they are. It stands down when no other node holds any assignment, so a cold start pays nothing.WOLVERINE_CHAOS_SOAK=<rounds>) that stays out of CI.Everything else is as in 6.48.1.
6.48.1
A patch release for one global partitioning bug found by @alexandrefresnais right after 6.48.0.
Everything else is as in 6.48.0.
6.48.0
A fast follow-up to 6.47.0 with five fixes, three of them for how a Wolverine cluster behaves when nodes come and go.
Clustering and agent distribution
StartAgents,StopAgents,QueryAgentPresence) were logged as enqueued, never reached the broker, and timed out, so agents stopped on a scaled-in node were never re-placed. Routes now resolve their sending agent on every use. Reported from production on Azure Container Apps with Azure Service Bus control queues; the workaround there was a very longSendingAgentIdleTimeout.TooBusy, so the back pressure sweep later restarted the slot on a node that no longer owned it. Reported with a complete reproduction by @alexandrefresnais.ApplyRestrictionsAsyncwaits for the released or pinned agent to appear in the persisted node assignments and throwsAgentRestrictionsNotConfirmedExceptionnaming it, instead of returning as if the agent had started. NewDurabilitySettings.AgentRestrictionConfirmationTimeout(default 10 seconds) bounds the wait. This is what lets CritterWatch stop acknowledging a restart that started nothing.RabbitMQ
Deduplication
[Deduplicated]takes its own claim window (#4857, #4858, by @uniquelau).[Deduplicated(WindowInSeconds = 600)]gives one handler a different claim lifetime from the host-wideDeduplicationWindow, matching what[DeduplicatedWithResponse]already offered for HTTP. Works across the RDBMS, Marten, Polecat and Fisher deduplicators; pre-generated code for handlers without a window is unchanged.Thanks to @alexandrefresnais, @tannerwatson and @uniquelau for the reports, reproductions and pull requests.
6.47.0
Wolverine 6.47.0 is a release that largely came from outside the core team. The biggest change in it, a hardening pass over the NATS JetStream transport, was reported, designed and written by a community member, and so was the fix for a global partitioning handoff that stranded scheduled messages. Thank you to everyone who sent code, reproductions, or diagnoses this time around.
Community contributions
NATS JetStream
Sending durably over JetStream, with an outbox in front of a stream, lost messages in several places without an error or a log line. All of them are closed (#4856, with follow-ups in #4859):
DiscardPolicy.New, a failedNats-Expected-*check, an oversized message) with aPubAckcarrying an error, not an exception. Wolverine read only the sequence, reported success, and the durable outbox deleted a message the stream never stored. It throws now, the outbox keeps the message, and a duplicateNats-Msg-Idis still a success.MaxDeliveris used up. A buffered listener acknowledges on receipt, so under the old guard the message was simply gone. The dead letter copy carries its ownNats-Msg-Id, because the original's id had it discarded as a duplicate when the dead letter subject sat in the same stream.AsWorkQueue()has always meant interest retention, which drops a message published while no consumer is bound, which is exactly the startup and rebalancing window a sharded topology has. The streamsUseShardedNatsSubjects()declares now keep a message until it is acknowledged.AsWorkQueue()itself is unchanged; its docs now say what it does.ConfigureNatsOpts()gives you the last word over the NATS.Net client options, for the pending channel size, ping interval and anything else Wolverine does not surface. It applies to the shared and every tenant connection.AckWaitorMaxDeliverin code just works.Provisioning(NatsProvisioning.CreateOnly | CreateOrUpdate | Verify)controls what startup does with declared streams and named consumers that already exist, withVerifyfailing the start and listing every deviation. Resource setup and the listener now write the same consumer settings, filter included, so aVerifyhost starts cleanly after resource setup.InvokeAsync()fails at once when nobody is listening. A request now carries a per-request reply subject, so the server's "no responders" answer reaches the waiting call and it fails in milliseconds withWolverineRequestReplyExceptioninstead of waiting out its timeout. The responding side answers on that exact subject, which a NATS user limited toallow_responsesrequires.Global partitioning and durability
An exploratory pass over global partitioning after the long chain of slot handoff fixes, looking for the next "runs on a node that does not own the slot" before it was reported (#4853). It found two:
And around it:
Envelope.Attempts; a database or broker queue saw attempts go 1 then 3 (#4855).Native AOT
The 6.46.0 AOT work stopped at the first failure each publish cycle, because the smoke target did. That is fixed, and the lanes it now runs found the rest:
SideEffectPolicycould not findExecuteonIStartStream, the HTTPIEndpointMetadataProviderclose was trimmed, and Marten could not mapEnvelopein a native image. All three are rooted or avoided now.InvokeAsync<Guid>request/reply shape, killed a native image at startup because the routing warm-up closed a generic over it reflectively. The routers take the message type as an argument now, so the one reflective close every message type had to be rooted for is gone, along with everything that existed to prop it up.Also in this release
JasperFx.Events.InMemoryprototyping store, so a store-agnostic application's handlers run before anyone has chosen Marten, Polecat or Fisher. Only Wolverine's store-agnostic usage is supported (#4844).6.46.0
Wolverine 6.46.0 is the release where Native AOT stopped being aspirational. Ten of the changes below came out of one sustained hunt, and the pattern that emerged is worth stating plainly: under Native AOT, the fix is almost never to root a generic harder — it is to stop closing one.
Thank you to the people outside the core team who shipped code in this one. Five of the fixes here came from the community, and several of them are in corners the maintainers would not have found on their own.
Community contributions
[FromClaim]code generation was broken for URI claim types (#4783), and EF Core had three distinct problems in one report:[Entity]on a step method, query plans, and multi-tenantDbContextresolution (#4769).User-scope warning (#4779), plus a documentation fix for something that bites every newcomer: the first-use handler compile counts against a tracked session's timeout (#4786).[Deduplicated]claims are kept in the main store when you run a database per tenant (#4813). Every[Deduplicated]chain used to throw on its first keyed message in that configuration.Native AOT
Sagas work under Native AOT now (#4809). That took three separate blockers, and each one taught us a rule that is now written down:
[DynamicDependency]preserves metadata, not code. An AOT root over a value-type instantiation is silently ineffective — no warning, no diagnostic, just a missing type at startup. The roots that appear to work survive through reference-type canonical sharing, which is why this went unnoticed for so long.Acting on those: a frame can now contribute its own AOT root (#4801), the EF Core frames closed over your
DbContextare rooted (#4803), and the Marten, Polecat and FisherFetchLatestframes were de-genericized rather than rooted (#4793, #4806). The HTTP and response-aware chain paths got the closed generics they need (#4790), and an[UnconditionalSuppressMessage]scope that ILC rejects outright was fixed (#4791).Two things worth calling out for anyone running AOT in production:
Guidtenant id, or a[DeduplicationIdentity]on aGuid, which needs no configuration at all. Both crashed the host at startup in a native image. Neither was reachable by any existing rooting mechanism, so both now avoid closing the generic at all.Durability and clustered agents
A wave of fixes to inbox ownership and global partition slots, all of them cases where a message could stall rather than fail:
TenantedSenderdeliberately cannot forward anISenderCallback— doing so broke fire-and-forget senders in a previous attempt. There is now aCallbackAwareTenantedSenderfor the senders that settle the outbox themselves, with the original left exactly as it was. Every broker-per-tenant transport can use it; only MQTT does so far.Security and dependencies
System.Formats.Asn17.0.0 is lifted, and the whole package graph is audited (#4781, GH-4773).JasperFx.Eventsinterface breaks a store at runtime rather than at compile time, so leaving a store package behind is the actual hazard.6.45.0
Wolverine 6.45.0 is mostly a community release. Seven people outside JasperFx shaped it, and the headline feature came in as a contributor's pull request with 17 tests already passing.
Idempotency keys that answer with the first response
6.44 could stop a
POSTrunning twice. It could not tell the second caller what the first one created.[Deduplicated]refuses a repeat with a status code, which is the right answer when the client can go and fetch the resource. It is the wrong answer when the client is the one that lost the connection mid-request and has no idea what id it created. The docs said as much, and said replaying the original response was out of scope.6.45 adds
[DeduplicatedWithResponse], which stores the first response and replays it:A repeat under the same
Idempotency-Keygets the original status — a 201 stays a 201 — along with the body and theLocationheader. The handler does not run again, and its cascaded messages are not sent again.Three details worth knowing before you reach for it:
Scopeis required, not optional. A claimed key used to be global across every endpoint, tenant and user. That was tolerable when a duplicate was merely refused; it is not tolerable when a stored response is replayed to whoever presents the key. So the attribute will not let you declare it without saying who a key belongs to, and refuses at startup if you try.The request is compared by a hash of the bytes sent — method, path, query string and body. A repeat that differs gets
422rather than being answered with a response that does not belong to it. The corollary: a retry has to resend the same bytes, so a client that re-serializes and reorders JSON properties will see a 422.It is opt-in and provisions its own table.
opts.Durability.EnableDeduplicatedResponses = true, a separatewolverine_deduplicated_responsestable, and nothing changes for an application that does not ask for it. PostgreSQL, SQL Server, MySQL and SQLite, which covers Marten and EF Core applications. F# endpoints are supported —[Deduplicated]still does not support them.Three more deduplication fixes landed alongside it. Two cases where a claim outlived a request that did no work: middleware ending the request early with a success code, and a caller hanging up while the request was failing — in the second, the release itself was being cancelled by the caller's own disconnect, so the key survived for the full window. Deduplication keys also now compare the same way on every engine; they previously followed the database's default collation, so
Abcandabcwere one claim on SQL Server and MySQL but two on PostgreSQL and SQLite.Thank you
[DeduplicatedWithResponse]itself, the two claim-leak fixes, the collation report, theEnableRelayOfUserNamediagnosis, and a doc correction. Four pull requests and three issues in one release.InvokeAsyncretry discarded the failed attempt's outgoing messages, and fixed it.ReleaseIncomingAsyncscanned the whole inbox on SQL Server. Measured at 6,748 logical reads before and 3 after.And from the core team, @erdtsieck caught the worst regression in 6.44 — every durable-inbox message dead-lettered on partitioned Marten inboxes — and reported it with the exact SQL that
QueueSqlCommandwas rejecting, which is why it was fixed the same day.Durability and reliability
;, which Marten'sQueueSqlCommandrejects — so every durable-inbox message was dead-lettered. (#4736)owner_id = @owner, so these were clustered index scans; a blue/green deploy had been failing on the resulting command timeouts. (#4739)HttpChaincould never serve a request again — a missed type lookup overwrote an already-resolved handler type with null. (#4749)Native AOT
... (truncated)
6.44.0
This release came overwhelmingly from outside the core team. Six people outside JasperFx reported or fixed
the work in it, including three who sent the pull request themselves, and one report that reconstructed a
production cluster failure in enough detail to find two defects nobody had suspected.
Thank you
MessageIdentity.IdAndDestinationhad every destination's inbox row retired by the first handler to commit, losing the copies whose handlers had not run, with no dead letter and no log. Also reported GH-4704.Description has been truncated