Bump WolverineFx from 6.29.2 to 6.31.0 - #334
Merged
github-actions[bot] merged 1 commit intoSep 7, 2026
Merged
github-actions[bot] merged 1 commit into
github-actions[bot] merged 1 commit into
Conversation
--- updated-dependencies: - dependency-name: WolverineFx dependency-version: 6.31.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com>
github-actions
Bot
deleted the
dependabot/nuget/benchmarks/Foundatio.Mediator.Benchmarks/WolverineFx-6.31.0
branch
September 7, 2026 22:18
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 WolverineFx from 6.29.2 to 6.31.0.
Release notes
Sourced from WolverineFx's releases.
6.31.0
Logical message deduplication
Envelope.Ididentifies one delivery. That is the right identity for "the broker handed me this twice" and the wrong one for "the operator clicked Rebuild twice" — those are different deliveries of the same intent, so each carries a differentEnvelope.Idand every one gets through.6.31.0 promotes
Envelope.DeduplicationIdinto a first-class logical id, with storage, enforcement, and a retention policy behind it.It is opt-in throughout — leaving it off means no schema change at all on upgrade. Storage is a separate
wolverine_deduplicationtable rather than a column on the inbox, because underEnableInboxPartitioningthe inbox isPARTITION BY LIST (status)and marking an envelope handled moves the row between partitions, which would let one logical id exist as both Incoming and Handled — silently, and only for users who enabled partitioning. Claiming is anINSERTthat either succeeds or trips the primary key, never aSELECT-then-INSERT.Refusals differ per chain type: a message handler discards and acks, HTTP returns 409 with
ProblemDetails(configurable to 2xx where a replay is benign), gRPC returnsAlreadyExists/InvalidArgumentper AIP-193. Storage on PostgreSQL, SQL Server, MySQL and SQLite.Deriving the id from the message
The publishing side does not have to remember
DeliveryOptions.DeduplicationIdat every call site. A message type declares its own logical identity once, the way it already declares a topic name with[Topic]or a saga id with[SagaIdentity]:These are
IEnvelopeRuleat the message type level, resolved once when the route is built rather than per message. An explicitDeliveryOptions.DeduplicationIdalways wins, then configured rules, then the attribute.Fixes
ListeningAgentsees past its receiver wrappers.ReceiverWithRules— installed by a bare endpoint-levelMessageTypeorTenantId— is unconditionally anILocalQueue, so a wrapped NativeAck or Inline receiver took the wrong branch and threw on the durability agent's re-entry path. The same blindness meant a terminally faulted receiver reported healthy forever on exactly the endpoints most likely to be non-trivially configured. (#4188, #4191)TriggerLabel, which was beating overlay declarations and minting aSourceDisagreementhotspot per labelled route; and a collection response now reads its element type instead of reporting an assembly-qualified CLR string as a canvas node. (#4181, #4182)Dependencies
Full changelog: JasperFx/wolverine@V6.30.3...V6.31.0
... (truncated)
6.30.3
Patch release. Requires JasperFx 2.57.1, which ships the code-generation half of two of these fixes.
Several of these failed silently — a host that started clean, passed health checks, and did less than it appeared to. Worth a look if any of the shapes below match your application.
Code generation and service location
ServiceProviderSource.IsolatedAndScopedis now honored by Wolverine.HTTP (#4171). An endpoint or middleware asking for anIServiceProvideralways receivedhttpContext.RequestServices, whatever you configured. Note the consequence: asking for anIServiceProviderin an endpoint is service location and now registers as such, so underServiceLocationPolicy.NotAllowedthose endpoints will throw where they previously slipped past the policy unnoticed. Message handlers have always behaved this way.Scope priming now fires for every chain that service-locates, not only those naming an
IServiceProvider(#4171). If a chain reached service location solely through an opaque scoped/transient registration, its child scope was never primed — so a service-locatedIMessageContext,IMessageBus, or MartenIDocumentSessionwas a second, un-enrolled instance rather than the one the handler already owned. Handlers and HTTP endpoints are both covered now.Lazy<T>dependencies resolve through their registration (#4159). An open-generic registration such asTryAddScoped(typeof(Lazy<>), typeof(LazyResolver<>))was ignored whenever the closed type was itself concrete, andnew Lazy<IFoo>()was emitted instead. That compiles and can never work — the first.ValuethrowsMissingMemberExceptionfor any service without a public parameterless constructor. Relatedly,AlwaysUseServiceLocationFor(typeof(Lazy<>))accepted an open generic and then matched nothing; it now matches that generic's closed forms.Sagas
ResequencerSagaadvancesLastSequencewhen a message is handled, not when it is published (#4172). A replayed message could let a queue backlog walk past the ordering guard while it was still in flight, reordering the handled sequence.An already-sequenced arrival is observable and overridable (#4175). A message whose order the saga had already passed was handled again in silence. The new
shouldHandleAlreadySequencedhook logs a warning by default — behavior is unchanged — and can be overridden to discard, raise a metric, or throw.Startup
AutoCreate.Noneno longer pays for a full schema diff at startup (#4166).Full changelog: JasperFx/wolverine@V6.30.2...V6.30.3
6.30.2
This addresses an issue encountered by a JasperFx client hitting a sudden crunch of messages being enqueued into local queues. Not something we expect to be common at all, but now we're better anyway!
What's Changed
Full Changelog: JasperFx/wolverine@V6.30.1...V6.30.2
6.30.1
There's some CritterWatch related functionality smuggled in here for our forthcoming Event Modeling visualization. Otherwise, this is mostly a ton of fine grained improvements for CI or message broker usage problems detected by dogfooding and some "Mr. AI tool, go try to identify potential problems" action
What's Changed
Full Changelog: JasperFx/wolverine@V6.30.0...V6.30.1
6.30.0
Wolverine 6.30.0 is a large release built around one headline feature — a new endpoint mode — plus the usual crop of transport fixes, and a couple of long-standing multi-tenancy and HTTP gaps closed.
EndpointMode.NativeAckThe main event. Buffered's throughput and partitioning with Inline's no-loss guarantee, and no database required.
A broker delivery is held unacknowledged while the envelope flows through an in-memory, optionally group-partitioned execution block, and is settled natively when the handler pipeline terminates. Nothing is acknowledged ahead of its handler, so work parked in a lane when a node goes away comes back rather than vanishing.
The guarantee, stated exactly: no two messages sharing a group id execute concurrently. Ordering is per-slot best-effort, not per-group guaranteed; redelivery may reorder. Anything needing strict order under failure keeps the durable inbox.
Transport support is opt-in and default-closed — a transport must explicitly claim the mode, because most settlement models cannot express out-of-order completion. Adopted by RabbitMQ, Amazon SQS, Azure Service Bus, NATS JetStream, Redis Streams, Pulsar and GCP Pub/Sub (#3708, #4046, #4047, #4050, #4051, #4052, #4053).
Supporting work in the same wave:
BufferedInMemory()(#3712, #4022).Multi-tenancy
IntegrateWithWolverine(). Marten hands Wolverine anNpgsqlDataSourcerather than a connection string, andNpgsqlDataSource.ConnectionStringdeliberately omits the password — so there is a newDbDataSourceoverload ofAddDbContextWithWolverineManagedConjoinedTenancythat carries credentials through intact. A second defect on the same path is fixed too:IntegrateWithWolverine()never registered the tenant partitioning provider, soPartitionPerTenant()failed (#4044).HTTP and event sourcing
[StreamState]and[StreamEvents]— new parameter attributes for handlers whose read is the raw stream rather than the folded aggregate, for timeline and audit shaped endpoints that[ReadModel]cannot express. Store-agnostic across Marten, Polecat and Fisher; Marten batches both fetches into a single round trip (#3627).[WriteAggregate]endpoints toProblemDetailsinstead of an unhandled 500. Note thatStreamLockedExceptionderives fromMartenException, notConcurrencyException, so catching only the latter silently leavesFetchForExclusiveWritingreturning 500s (#3764).HttpChainDescriptorandGrpcRpcDescriptornow carry the slice the route is, so a consumer walking endpoint by endpoint sees it next to the route rather than only through the assembled model (#4000).Transport fixes
MaxTotalAckExtensionsilently delivered a concurrent duplicate rather than reporting anything (#4066); effective listener concurrency was not what the configuration implied, and the flow-control bound is global perSubscriberClientrather than per inner client (#4067).PubsubTopicOptions.OrderBygained a configuration surface (#4087).DeleteStreamEntryOnAcksilently never acked on Redis < 8.2, whereXACKDELis unsupported (#4058).Upgrading
Additive.
EndpointMode.NativeAckis opt-in per endpoint and default-closed per transport, andMaximumBrokerRedeliveriesdefaults to off. Requires JasperFx 2.55.0.Commits viewable in compare view.
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting
@dependabot rebase.Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore this major versionwill close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this minor versionwill close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this dependencywill close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)