5.36: routing-precedence regression fix + metrics test repair + 5.36.0 cut#2655
Merged
Conversation
mcr.microsoft.com/mssql/server:2025-latest ships with Windows build-server paths embedded in the master.mdf template (F:\dbs\sh\5uj5\…\model.mdf), so first-boot crashes on Linux/ARM hosts with FCB::Open failed / "Database 'model' cannot be opened" (errors 5120/945). 2022-latest has a clean Linux build, runs reliably under Rosetta on Apple Silicon, and Wolverine doesn't depend on any 2025-only T-SQL surface — so this is safe. The Polecat 2.0 native-json pin (UseNativeJsonType defaulting on) needs 2025+, but Polecat tests can opt out via UseNativeJsonType=false; the override path is documented inline so future Polecat work doesn't get blocked by this pin. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…text_fields to SlowTests The only [Fact] in inner_envelope_is_stamped_before_serialization is end-to-end and depends on a 2-minute Task.Delay to give the scheduled-job poller time to fire. That makes it the slowest test in the entire CoreTests suite by an order of magnitude, dragging out PR feedback for a regression case unrelated to the rest of CoreTests. SlowTests is the right home — CoreTests stays fast, the regression coverage moves with the test, no behavioral change. Renamed namespace to match the new SlowTests.SharedMemory location. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
IMessageBus is scoped per-message, so resolving it from the host's root container yields a bus that isn't wired into the active MessageContext. Such a bus silently misbehaves under tracking, outbox, and context- propagation tests — symptoms look like "tracking saw nothing" or "context fields didn't propagate," not an obvious wiring error. Codify the rule: tests must use the host.MessageBus() extension method (in the Wolverine namespace) which returns a scoped bus already attached to the current message context. Drive-by fix the one CoreTests caller that was on the wrong path. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…rs into ExplicitRouting PR #2596 added MessageRoutingConvention.PreregisterSenders to make endpoint policies like UseDurableOutboxOnAllSendingEndpoints see Subscriptions.Any() on conventionally-routed sender endpoints at Compile() time. The fix worked for #2588 but introduced a routing-precedence regression: ExplicitRouting walks Transports.AllEndpoints().Where(ShouldSendMessage), and ShouldSendMessage just calls Subscriptions.Any(s => s.Matches(messageType)). Pre-registering subscriptions on the conventional sender now makes ExplicitRouting fire for handled messages — and since ExplicitRouting is non-additive, it short-circuits past LocalRouting, so handled messages stop routing to their local handlers. Explicit publish rules also got duplicated against the conventional broker exchange. Eight MessageRoutingTests caught it: - explicit_rules_always_win.locally_handled_messages_get_overridden_by_routing - using_additive_local_routing_and_external_conventions.{local_routes_and_broker_conventional_routing_for_handled_messages,explicit_rules_win} - using_messaging_conventions_for_both_external_and_local.{local_routes_for_handled_messages,multiple_handlers_are_still_routed_to_one_place_in_default_mode,respect_sticky_attributes_but_default_is_still_there_too,respect_sticky_attributes_no_default} - using_local_routing_disabled_and_external_routing_conventions.explicit_routing_wins_no_matter_what Fix: tag convention-pre-registered subscriptions with a new internal Subscription.IsFromConvention flag (via Subscription.ForConventionalType), and have Endpoint.ShouldSendMessage skip those when answering "is this an explicit publish rule?". The AllSenders policy still gates on Subscriptions.Any() (count, not provenance), so #2588's outbox fix keeps working — verified by re-running Bug_2588 and Bug_2304 reproducers across RabbitMQ / ASB / SQS / GCP Pub/Sub. The Bug_2588 tests previously asserted endpoint.Mode via routes.Single() — that worked only because of this leak. Reworked them to look up the conventional broker sender directly via IMessageRoutingConvention.DiscoverSenders, which tests the actual #2588 invariant ("AllSenders policy applied to conventional sender") without depending on routing precedence. CI: add CIMessageRouting target (boots RabbitMQ via docker compose, runs MessageRoutingTests one class at a time) and wire it into the .NET workflow's CI dependency chain plus a docker compose down step. Without this, the regression wouldn't have been caught on PRs — MessageRoutingTests isn't part of any existing per-transport workflow even though the bug lives in core routing precedence. Closes the regression introduced by #2596. Refs #2588. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…r pipeline
end_to_end_publishing_to_critter_watch.run_for_quite_awhile_{in_critter_watch_mode,in_hybrid_mode}
have been failing on metrics.Length.ShouldBeGreaterThan(0) since commit
d999a2e ("Shifted the metrics accumulation publishing to be through the
observer instead of through messaging"). That commit moved
MessageHandlingMetrics export from `bus.PublishAsync` → direct
`IWolverineObserver.MessageHandlingMetricsExported` callbacks, but the test
fixture stayed on the message-bus contract: a `LocalQueueFor<MessageHandlingMetrics>`
plus a static `MetricsCollectionHandler.Handle(MessageHandlingMetrics)`. The
default observer's MessageHandlingMetricsExported is a no-op, so nothing
ever calls into MetricsCollectionHandler — Collected stayed empty for the
full 30s pump.
Fix in the test fixture, not the framework — the observer-shift was
deliberate, the test just hadn't caught up. After StartAsync, swap
runtime.Observer for a MetricsCapturingObserver that forwards
MessageHandlingMetricsExported into MetricsCollectionHandler.Handle and
no-ops the rest. Drop the now-dead LocalQueueFor<MessageHandlingMetrics>
wiring. Add a lock around the Collected swap so concurrent observer ticks
can't race with Clear().
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Minor bump for the 5.36 release. Cuts: - Routing-precedence regression fix introduced by #2596 (PreregisterSenders was leaking conventional senders into ExplicitRouting and breaking local handler routing for handled message types). - MetricsTests now wired to the IWolverineObserver pipeline so the end-to-end CritterWatch / Hybrid mode tests actually exercise the metrics-export path again after d999a2e. - SQL Server docker image pinned to 2022-latest (2025-latest is broken on Linux/ARM hosts). - New CIMessageRouting target in the .NET workflow so future routing- precedence regressions fail fast on PRs. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…+ Polecat SQL2025 Three CI failures from PR #2655's first run, all addressed here. 1. AWS / GCP test projects don't have InternalsVisibleTo("Wolverine.AmazonSqs.Tests" / "Wolverine.Pubsub.Tests") on the Wolverine assembly, so my previous `runtime.Options.RoutingConventions` lookup didn't compile in those projects (works for RabbitMQ / ASB which both have InternalsVisibleTo). The compile error broke the .NET workflow's full-solution build too. Switched all five Bug_2588 reproducers to a public-API lookup: `runtime.Options.Transports.AllEndpoints().Single(e => e.Uri.Scheme != "local" && e.Subscriptions.Any(s => s.Matches(typeof(Msg))))`. Equivalent semantic — we still find the conventional broker sender that PreregisterSenders created, regardless of routing precedence — without depending on internal API. Drive-by: same rewrite for the EFCore Bug_2588 reproducer, which was still on the old `routes.Single().Endpoint.Mode` pattern (it was previously passing only because of the leak that PR #2655 closes). 2. Polecat regressed on the SQL Server image pin from 8b948fe. Polecat 2.0+ defaults UseNativeJsonType=true and needs the native `json` column type that arrived in SQL Server 2025. The 2022-latest pin in docker-compose.yml exists because 2025-latest crashes on first boot under Apple Silicon (Windows build paths embedded in master.mdf). 2025-latest works fine on Linux x64 — Polecat passed on main against 2025-latest before the pin. Override the image just in the Polecat workflow via a generated docker-compose.override.yml. Local Apple Silicon devs keep 2022-latest; CI for Polecat gets 2025-latest. The override file is ignored by git (already in .gitignore via docker-compose's standard pattern); written inline in the workflow YAML so there's no committed override drifting from the comment in docker-compose.yml. The pending workflows on the previous CI run (rabbitmq / azure-service-bus / marten / persistence / sqlite / sqlserver) were blocked behind the Wolverine.RabbitMq.Tests Bug_2588 test still trying to compile against the new public-API path — they should run cleanly now that compile is unblocked. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This was referenced May 2, 2026
vgmello
pushed a commit
to vgmello/momentum
that referenced
this pull request
May 10, 2026
Updated [WolverineFx](http://github.com/jasperfx/wolverine) from 5.32.1 to 5.36.2. <details> <summary>Release notes</summary> _Sourced from [WolverineFx's releases](http://github.com/jasperfx/wolverine/releases)._ ## 5.36.1 **Upgrade to this version please if you use the EF Core transactional middleware and are using a very recent version of Wolverine** ## What's Changed * fix(efcore): suppress duplicate FlushOutgoingMessages in Eager-mode HTTP chains by @jeremydmiller in JasperFx/wolverine#2663 **Full Changelog**: JasperFx/wolverine@V5.36.0...v5.36.1 ## 5.36.0 ## What's Changed * Add IAgent.Description for monitoring-tool tooltips by @jeremydmiller in JasperFx/wolverine#2645 * feat: AES-256-GCM message encryption with send/receive enforcement (#2643) by @BlackChepo in JasperFx/wolverine#2644 * fix(rdbms-inbox): discard duplicate Kafka messages instead of freezing the partition (#2639) by @BlackChepo in JasperFx/wolverine#2648 * Prevent leadership re-election every 5 minutes by @Bishbulb in JasperFx/wolverine#2625 * Enrich DurabilityAgent.CheckHealthAsync with persistence-layer signals (#2646) by @jeremydmiller in JasperFx/wolverine#2649 * Native API versioning for Wolverine.Http (closes #2627) by @outofrange-consulting in JasperFx/wolverine#2633 * Enrich StickyPostgresqlQueueListenerAgent.CheckHealthAsync with listener-state signals (#2647) by @jeremydmiller in JasperFx/wolverine#2650 * fix(rdbms-inbox): align RavenDb and CosmosDb batch inbox with #2648 duplicate-envelope contract by @BlackChepo in JasperFx/wolverine#2651 * Surface 'Custom' interop mode + DefaultSerializerDescription on EndpointDescriptor (#2641) by @jeremydmiller in JasperFx/wolverine#2652 * 5.36: routing-precedence regression fix + metrics test repair + 5.36.0 cut by @jeremydmiller in JasperFx/wolverine#2655 * feat(durability): AlwaysMakeScheduledMessagesDurable policy by @jeremydmiller in JasperFx/wolverine#2657 **Full Changelog**: JasperFx/wolverine@V5.35.2...V5.36.0 ## 5.35.2 ## What's Changed A small bug-fix and dependency-refresh release. ### Persistence fixes * **Oracle: timestamp default expressions now survive non-UTC DB sessions** (#2634) — `OracleMessageStore.Initialize` and the surrounding schema declared timestamp columns (`health_check`, `started`, `posted`, etc.) with a DEFAULT of `SYS_EXTRACT_UTC(SYSTIMESTAMP)`. That returns a TIMESTAMP without a time zone, and when implicitly cast into the `TIMESTAMP WITH TIME ZONE` column Oracle stamps it with the *session* time zone — so for any session in UTC+N the just-persisted value's UTC equivalent was N hours in the past. That tripped the `NodeAgentController.DoHealthChecksAsync` staleness filter and surfaced as a `NullReferenceException` during the first leadership-election heartbeat (`self!.AssignAgents([LeaderUri])` on a `null` self). All 18 occurrences swapped to `SYSTIMESTAMP AT TIME ZONE 'UTC'`, with quote-doubling for the DDL contexts that go through Weasel's `EXECUTE IMMEDIATE '...'` wrapper. ### Reliability hardening * **Lock `dbcontrol://` and `oraclecontrol://` endpoints to `BufferedInMemory`** (#2637) — the database-backed control transport carries inter-node leader-election and agent-reassignment commands. Marking either endpoint Durable would route every control envelope through the same store-backed inbox/outbox the durability agent itself owns (deadlock); marking it Inline contradicts the batched-poll semantics. Both `DatabaseControlEndpoint` and `OracleControlEndpoint` now override `supportsMode` so any policy that tries to flip them off `BufferedInMemory` either silently skips (`UseDurableInboxOnAllListeners`, `UseDurableOutboxOnAllSendingEndpoints`, etc., already check `SupportsMode`) or fails fast with a clear `InvalidOperationException`. ### Source-gen / startup * **Aggregate `IWolverineTypeLoader` across all known assemblies (#2632)** by @devployment — since 5.34.0, hosts on the source-generated codegen path silently dropped handlers that lived in *referenced* assemblies because `tryDiscoverTypeLoaderFromAttribute` only inspected `Options.ApplicationAssembly`. First invocation of one of those handlers threw `IndeterminateRoutesException`. The runtime now walks `ApplicationAssembly` *and* every assembly in `Discovery.Assemblies`, collects every `[WolverineTypeManifest]` loader it finds, and exposes their union via the new internal `CompositeWolverineTypeLoader`. Existing single-loader semantics are preserved when only one manifest is found. ### Other * **Saga timeout flag + scheduled-dispatch Activity tag (#2631)** by @jeremydmiller — surfaces saga timeout and scheduled-dispatch metadata so the upcoming CritterWatch saga visualization can render in-flight saga state. ### Dependencies * **Bump JasperFx 1.28.0 → 1.28.2 and JasperFx.Events 1.29.0 → 1.31.1** (#2638). **Full Changelog**: JasperFx/wolverine@V5.35.1...V5.35.2 ## 5.35.1 ## What's Changed A bug-fix and small-feature release covering Oracle-in-Balanced-mode startup, a duplicate-poller defect on RavenDb, an AWS SQS sharded-slot naming fix, and a new SagaDescriptor surface for CritterWatch. ### Persistence fixes * **Oracle in `DurabilityMode.Balanced` now boots** (#2622) — `OracleMessageStore.Initialize` was a no-op, so hosts using Oracle persistence in Balanced mode failed to start with `ArgumentOutOfRangeException("ControlEndpoint cannot be null for this usage")`. The fix mirrors `MessageDatabase.Initialize` for Oracle and stands up a parallel `OracleControlTransport` / `OracleControlEndpoint` / `OracleControlSender` / `OracleControlListener` set under the new `oraclecontrol://` protocol — necessary because the shared `DatabaseControlSender` / `DatabaseControlListener` assume `@`-prefixed placeholders and Guid values that map directly onto a `DbParameter`, neither of which Oracle accepts (`:`-prefixed placeholders, `RAW(16)` id columns requiring `byte[]`). Also fixes a latent `OracleMessageStore.EnqueueAsync` no-op that left `LogRecordsAsync` silently dropping node records, and makes `FetchRecentRecordsAsync` `DBNull`-safe on the description column. Adds a new `OracleTests.LeaderElection` project so the leadership-compliance suite runs against Oracle (marked `[Trait("Category","Flaky")]` because the suite needs careful TM/DML lock sequencing between back-to-back runs). * **RavenDb: only one durability agent polls after host start** (#2623, #2629) by @Bishbulb (root-cause investigation and original fix) and @jeremydmiller — `RavenDbMessageStore.StartScheduledJobs` eagerly built and started a `RavenDbDurabilityAgent` at boot in addition to the agent that `NodeAgentController` already builds and starts via `IAgentFamily` / `MessageStoreCollection`. Two `RavenDbDurabilityAgent` instances then polled the same database concurrently, both believed they held the scheduled-job lock, raced to mark the same envelopes `Incoming`, and surfaced `ConcurrencyException` plus double-fired timeouts. Drops the eager `StartTimers()` call; the cluster-managed agent is now the single owner of polling. The agent returned from `StartScheduledJobs` is held by `WolverineRuntime.DurableScheduledJobs` purely for its disposal-time `StopAsync`. Comes with a reflection-free regression test (added `RavenDbDurabilityAgent.IsPolling` and `CompositeAgent.InnerAgents` for the test to enumerate without poking at private fields). A companion regression-guard test for CosmosDb is included; investigation showed the equivalent CosmosDb path does NOT have the bug today (`CosmosDbMessageStore.BuildAgentFamily` returns null and `Uri` uses the `cosmosdb://` scheme rather than `wolverinedb://`, so `MessageStoreCollection` never registers a competing agent). ### Other improvements * **AWS SQS: correct naming for sharded slot endpoints** in #1f294ce5 — fixes a regression where sharded slot endpoint URIs were assembled with the wrong segment ordering, causing the consumer side to listen at the wrong queue. * **`SagaDescriptor` exported via `ServiceCapabilities`** in #f0998c7b — adds a saga-shape descriptor (saga type, id type, current state) to the capabilities exporter so CritterWatch can surface saga inventory and current state in its dashboard. **Full Changelog**: JasperFx/wolverine@V5.34.0...V5.35.1 ## 5.34.0 ## What's Changed This release introduces three new features (Claim Check pattern, declarative Polecat data requirements, and a new opt-in `WolverineFx.RuntimeCompilation` package as the first step toward AOT compatibility), a fix for a long-standing service-location footgun, several real RavenDB and EF Core durability fixes, plus the cold-start prep work done as part of issue #1577. ### Highlights * **Add Claim Check / DataBus pattern with `[Blob]` attribute (#2412)** by @jeremydmiller in #2617 — off-load large message-property payloads to external storage on send and re-hydrate them on receive, so the on-the-wire envelope stays small. Core abstractions (`IClaimCheckStore`, `ClaimCheckToken`, `[Blob]`, `FileSystemClaimCheckStore`, `opts.UseClaimCheck(...)`) live in `Wolverine.Persistence`. Two new backend NuGet packages ship alongside: `WolverineFx.ClaimCheck.AzureBlobStorage` and `WolverineFx.ClaimCheck.AmazonS3`. New documentation page under `/guide/durability/claim-checks`. * **Declarative data-requirement attributes for Polecat (#2552)** by @jeremydmiller in #2615 — `[DocumentExists<T>]`, `[DocumentDoesNotExist<T>]`, and `PolecatOps.Document<T>().MustExist(...)` / `.MustNotExist(...)` mirror the Marten ergonomics, with the same batch-query optimization that folds multiple existence checks into a single Polecat `IBatchedQuery` round-trip. * **Service-located `IMessageBus` / `IMessageContext` now see the active context (#2583)** by @jeremydmiller in #2616 — when user code service-locates `IMessageBus` (e.g., constructor injection on a service the handler resolves at runtime), it now receives the same `MessageContext` the handler itself uses, preserving outbox semantics. Implemented as a per-chain opt-in (gated on `Chain.UsesServiceLocation`) so chains that don't service-locate pay zero `AsyncLocal` overhead per message. * **Cold-start optimizations and `WolverineFx.RuntimeCompilation` opt-in package (#1577)** by @jeremydmiller in #2613 and #cc00ca0a — first pass at the cold-start / AOT roadmap. Wires the `Wolverine.SourceGeneration` analyzer into the `WolverineFx` NuGet output (so source-generated `IWolverineTypeLoader` discovery flows transitively to consumers), pre-populates the `WolverineMessageNaming` cache during startup to eliminate first-message reflection cost, applies `[DynamicallyAccessedMembers]` annotations on the `Activator.CreateInstance` call sites for trimmer-friendliness, and adds `ConfigureAwait(false)` across 117 awaits on the per-message hot path. The new `WolverineFx.RuntimeCompilation` package becomes the future-facing opt-in API for runtime Roslyn compilation; default behavior is preserved. ### RavenDB durability fixes * **Fix bulk RavenDB inbox store leaking duplicates as inbox-unavailable (#2606)** by @Bishbulb in #2606 * **Take over expired RavenDB scheduled-job and leadership locks (#2608)** by @Bishbulb in #2608 * **Disable optimistic concurrency on RavenDB cluster-wide node sessions; load-then-modify on agent-assignment writes (#2610)** by @Bishbulb in #2610 ### EF Core / ancillary stores * **Fix `DurableLocalQueue` to route incoming envelopes to ancillary stores (#2611)** by @jeremydmiller — handler chains targeting an ancillary message store now have their incoming envelopes persisted in that store rather than the main store, fixing a class of "envelope stuck as Incoming forever" bugs. * **Fix `WolverineEnabled` annotation collision in ancillary-store EF Core scenarios** as part of #2618 — `MapWolverineEnvelopeStorage` is now idempotent when called against the same model graph more than once. ### Other improvements * **Fix `MessageBus` clobbering per-message `Envelope.Source`** in #26e38002 — `MessageBus.Send` was overwriting the per-message `Source` with the host's `ServiceName`, masking the originating service in causation tracking. * **Surface upcoming `ServiceLocationPolicy.NotAllowed` v6 default (#2584)** by @jeremydmiller in #2609 — chains that resolve dependencies via service location now log a warning at codegen time, with a clear migration path to the new opt-in `Wolverine.RuntimeCompilation` story for v6. ### CI stabilization * **Several flaky test classes fixed or marked** in #2612 and #2618 — timeout bumps, `IDisposable` → `IAsyncLifetime` conversions, lifecycle cleanup; chronically broken-on-CI classes (`SqliteTests.Transport.multi_tenancy_with_multiple_files`, `CosmosDbTests.LeaderElection.leader_election`, `Wolverine.RabbitMQ.Tests.send_by_topics`, `Wolverine.RabbitMQ.Tests.sending_raw_messages`) tagged `[Trait("Category", "Flaky")]` with header comments documenting the symptom and the real follow-up fix. * **JasperFx 1.28 / RuntimeCompiler 4.5 ambiguity fallout fixed** in #2618 — files importing both `JasperFx.CodeGeneration` and `JasperFx.RuntimeCompiler` now compile cleanly after the `InitializeSynchronously` extension method was moved into `JasperFx.CodeGeneration` upstream. ### Issue-tracker housekeeping * `#2507` (Quartz.Net / TickerQ first-class integration) added to the 6.0 milestone with a phased plan documented on the issue. * `#1577` (cold-start optimization roadmap) updated with a six-phase plan and current-state checklist; phases 1–4 are non-breaking on v5.x and largely landed in this release. **Full Changelog**: JasperFx/wolverine@V5.33.0...V5.34.0 ## 5.33.0 ## What's Changed This release includes a major reliability fix for distributed leader election, a port of the Polecat 2.x event store integration, and several other quality-of-life improvements. ### Highlights * **Fix #2602: Leader split-brain via stale advisory lock** by @jeremydmiller in #2607 — three-layer defensive fix that detects when a Postgres/SQL Server/MySQL/Oracle/SQLite advisory lock has been silently released server-side, steps down the local leader, releases its agents, and triggers a fresh leader election. Adds a new `LeadershipLost` node record type and an `IWolverineObserver.LostLeadership()` hook for monitoring. * **Polecat 2.x event store integration** by @jeremydmiller in #2598 — ports the aggregate handler workflow from Marten so SQL Server-backed projects can use Polecat as a native event store with Wolverine. Requires SQL Server 2025 for the native `JSON` type. * **Fix #2571: Preserve context fields on scheduled-send wrap/unwrap** by @jeremydmiller in #2605 — saga IDs, tenant IDs, and other correlation fields now survive the scheduled-send envelope round-trip. * **gRPC enhancements** by @jeremydmiller in #2565 — middleware weaving, validate convention, user exception mapping, bidirectional streaming, code-first codegen, plus new samples. * **Allow RabbitMQ exchanges to be declared passive** by @jeremydmiller in #2574 ### Other Improvements * Move non-sticky-handlers guard inside the compile lock by @jeremydmiller in #2556 * Add `launchSettings.json` to sample projects by @jeremydmiller in #2600 **Full Changelog**: JasperFx/wolverine@V5.32.1...V5.33.0 ## What's Changed * Update vulnerable OpenTelemetry dependencies by @dmytro-pryvedeniuk in JasperFx/wolverine#2590 * Fix tenant partitioning precedence with inferred grouping by @erdtsieck in JasperFx/wolverine#2581 * Use quoted schema names in SQL statements for RDBMS persistence by @esskar in JasperFx/wolverine#2577 * Skip logging when the count is zero by @Bishbulb in JasperFx/wolverine#2560 * Accept *Async suffix on saga method names (#2578) by @jeremydmiller in JasperFx/wolverine#2593 * Fix ancillary store scheduled messages stuck Incoming forever (#2576) by @jeremydmiller in JasperFx/wolverine#2591 * Add Wolverine.SourceGeneration to slnx (supersedes #2575) by @jeremydmiller in JasperFx/wolverine#2592 * Honor [Consumes] / IAcceptsMetadata on form endpoints by @rmasciarella in JasperFx/wolverine#2589 * Materialize EF domain-event scraper before publishing (#2585) by @jeremydmiller in JasperFx/wolverine#2594 * Process Manager via Handlers sample by @erikshafer in JasperFx/wolverine#2579 * Fix missing ParameterDescriptor for form parameters in API descriptions by @rmasciarella in JasperFx/wolverine#2587 * Allow configuration of the MessageBatchTimeout by @lyall-sc in JasperFx/wolverine#2582 * Fix #2588: durable outbox policy ignored for conventionally-routed senders by @jeremydmiller in JasperFx/wolverine#2596 * Fix #2595: explicit DeliveryOptions.SagaId on saga Start cascades should win by @jeremydmiller in JasperFx/wolverine#2597 * Allow RabbitMQ exchanges to be declared passive by @saithis in JasperFx/wolverine#2574 * Fix NoHandlerForEndpointException during concurrent saga chain compile by @Bishbulb in JasperFx/wolverine#2556 * gRPC: Middleware Weaving, Validate Convention, User Exception Mapping, Bidi Streaming, Code-First Codegen, New Samples by @erikshafer in JasperFx/wolverine#2565 * Add launchSettings.json files to the sample projects by @dmytro-pryvedeniuk in JasperFx/wolverine#2600 * Fix #2571: preserve context fields on scheduled-send wrap unwrap by @jeremydmiller in JasperFx/wolverine#2605 * Add Endpoint.BrokerRole for CritterWatch endpoint display (#2601) by @jeremydmiller in JasperFx/wolverine#2603 * Process Manager via Handlers Cleanup by @erikshafer in JasperFx/wolverine#2604 * Fix #2602: leader split-brain via stale advisory-lock state by @jeremydmiller in JasperFx/wolverine#2607 * Polecat parity port from Wolverine.Marten + Polecat 2.1.0 bump by @jeremydmiller in JasperFx/wolverine#2598 ## New Contributors * @esskar made their first contribution in JasperFx/wolverine#2577 * @rmasciarella made their first contribution in JasperFx/wolverine#2589 * @saithis made their first contribution in JasperFx/wolverine#2574 **Full Changelog**: JasperFx/wolverine@V5.32.1...V5.33.0 Commits viewable in [compare view](http://github.com/jasperfx/wolverine/commits). </details> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) 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-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will 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 version` will 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 dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This was referenced May 10, 2026
vgmello
pushed a commit
to vgmello/momentum
that referenced
this pull request
May 14, 2026
Updated [WolverineFx.Kafka](http://github.com/jasperfx/wolverine) from 5.32.1 to 5.39.0. <details> <summary>Release notes</summary> _Sourced from [WolverineFx.Kafka's releases](http://github.com/jasperfx/wolverine/releases)._ ## 5.39.0 ## What's Changed * docs(logging): correct OpenTelemetry AddMeter sample by @stigrune in JasperFx/wolverine#2707 * Add nuke/build.schema.json to .gitignore by @dmytro-pryvedeniuk in JasperFx/wolverine#2706 * Allow NATS messages without message-type header when DefaultIncomingMessage is set by @frankvdb7 in JasperFx/wolverine#2703 * fix(http): honor [RoutePrefix] when no global prefix is configured by @outofrange-consulting in JasperFx/wolverine#2708 * Fault Events — Auto-Publish `Fault<T>` on Terminal Handler Failure by @BlackChepo in JasperFx/wolverine#2695 * Outbox behavior alignment with EF Core transaction model by @Ferchke7 in JasperFx/wolverine#2677 * Preserve correlation/trace context across Global Partitioning interceptor (supersedes #2709) by @jeremydmiller in JasperFx/wolverine#2710 * feat(nats): expose JetStream DeliverPolicy on transport + listener by @jeremydmiller in JasperFx/wolverine#2711 * fix(build): include Wolverine.HealthChecks in the Pack target by @jeremydmiller in JasperFx/wolverine#2712 * feat(sqs): transport-wide DefaultDeadLetterQueueName with per-listener override precedence by @jeremydmiller in JasperFx/wolverine#2714 ## New Contributors * @stigrune made their first contribution in JasperFx/wolverine#2707 **Full Changelog**: JasperFx/wolverine@V5.38.0...V5.39.0 ## 5.38.0 ## What's Changed * Disable build-time document generation by @dmytro-pryvedeniuk in JasperFx/wolverine#2684 * Add IBrokerHealthProbe + RabbitMQ implementation (CritterWatch#70) by @jeremydmiller in JasperFx/wolverine#2686 * Add Wolverine.HealthChecks for ASP.NET Core IHealthCheck integration (CritterWatch#73) by @jeremydmiller in JasperFx/wolverine#2687 * Add WolverineHeartbeat emission (CritterWatch#72) by @jeremydmiller in JasperFx/wolverine#2688 * fix(agents): never let self fall into the staleNodes filter (GH-2682) by @jeremydmiller in JasperFx/wolverine#2689 * feat(http): api-versioning headers on all responses + multi-version handler support by @outofrange-consulting in JasperFx/wolverine#2683 * fix(advisory-lock): make TryAttainLockAsync idempotent against re-entrant calls by @jeremydmiller in JasperFx/wolverine#2691 * fix(test): lock AllItemsReceived state in batch_processing tests by @jeremydmiller in JasperFx/wolverine#2692 * fix(marten): publish IEvent.TenantId verbatim under conjoined tenancy by @jeremydmiller in JasperFx/wolverine#2693 * fix(rabbitmq): bind handler queue to every handled-message exchange under FromHandlerType by @jeremydmiller in JasperFx/wolverine#2697 * fix(sqlite): close #2680 by bumping Weasel to 8.15.1 by @jeremydmiller in JasperFx/wolverine#2696 * [1/N] dynamic listeners — foundation only (GH-2685) by @jeremydmiller in JasperFx/wolverine#2699 * feat(tracing): opt-in handler-execution diagnostics on WolverineOptions.Tracking by @jeremydmiller in JasperFx/wolverine#2698 * Fix unbounded retry loop on durable receiver shutdown (GH-2671) by @jeremydmiller in JasperFx/wolverine#2701 * [2/N] real RDBMS-backed IListenerStore (GH-2685) by @jeremydmiller in JasperFx/wolverine#2700 * [3/N] DynamicListenerAgentFamily — cluster-coordinated dynamic listeners (GH-2685) by @jeremydmiller in JasperFx/wolverine#2702 **Full Changelog**: JasperFx/wolverine@V5.37.2...V5.38.0 ## 5.37.2 ## What's Changed * Fixing a regression problem with explicit type discovery getting lost… by @jeremydmiller in JasperFx/wolverine#2678 * chore(core): remove Wolverine-specific Roslyn source generator by @jeremydmiller in JasperFx/wolverine#2679 **Full Changelog**: JasperFx/wolverine@V5.37.0...V5.37.2 ## 5.37.0 ## What's Changed * The real fix to our EF Core + Outbox problem. Bump to 5.36.2 by @jeremydmiller in JasperFx/wolverine#2665 * fix(sqlite): use BEGIN EXCLUSIVE for migration lock; TTL sweep + heartbeat for non-migration advisory locks by @mysticmind in JasperFx/wolverine#2666 * feat(http): support [ApiVersionNeutral] for opt-out endpoints by @outofrange-consulting in JasperFx/wolverine#2660 * feat(critterwatch): polecat outbox listener fix + DocumentStores capability surface by @jeremydmiller in JasperFx/wolverine#2672 * feat(rabbitmq): public API for multi-node cluster endpoints (#2659) by @BlackChepo in JasperFx/wolverine#2664 * fix(marten): GH-2669 alternative — Uri-based ancillary store routing (no IMessageStore.Id dependency) by @jeremydmiller in JasperFx/wolverine#2674 **Full Changelog**: JasperFx/wolverine@v5.36.1...V5.37.0 ## 5.36.1 **Upgrade to this version please if you use the EF Core transactional middleware and are using a very recent version of Wolverine** ## What's Changed * fix(efcore): suppress duplicate FlushOutgoingMessages in Eager-mode HTTP chains by @jeremydmiller in JasperFx/wolverine#2663 **Full Changelog**: JasperFx/wolverine@V5.36.0...v5.36.1 ## 5.36.0 ## What's Changed * Add IAgent.Description for monitoring-tool tooltips by @jeremydmiller in JasperFx/wolverine#2645 * feat: AES-256-GCM message encryption with send/receive enforcement (#2643) by @BlackChepo in JasperFx/wolverine#2644 * fix(rdbms-inbox): discard duplicate Kafka messages instead of freezing the partition (#2639) by @BlackChepo in JasperFx/wolverine#2648 * Prevent leadership re-election every 5 minutes by @Bishbulb in JasperFx/wolverine#2625 * Enrich DurabilityAgent.CheckHealthAsync with persistence-layer signals (#2646) by @jeremydmiller in JasperFx/wolverine#2649 * Native API versioning for Wolverine.Http (closes #2627) by @outofrange-consulting in JasperFx/wolverine#2633 * Enrich StickyPostgresqlQueueListenerAgent.CheckHealthAsync with listener-state signals (#2647) by @jeremydmiller in JasperFx/wolverine#2650 * fix(rdbms-inbox): align RavenDb and CosmosDb batch inbox with #2648 duplicate-envelope contract by @BlackChepo in JasperFx/wolverine#2651 * Surface 'Custom' interop mode + DefaultSerializerDescription on EndpointDescriptor (#2641) by @jeremydmiller in JasperFx/wolverine#2652 * 5.36: routing-precedence regression fix + metrics test repair + 5.36.0 cut by @jeremydmiller in JasperFx/wolverine#2655 * feat(durability): AlwaysMakeScheduledMessagesDurable policy by @jeremydmiller in JasperFx/wolverine#2657 **Full Changelog**: JasperFx/wolverine@V5.35.2...V5.36.0 ## 5.35.2 ## What's Changed A small bug-fix and dependency-refresh release. ### Persistence fixes * **Oracle: timestamp default expressions now survive non-UTC DB sessions** (#2634) — `OracleMessageStore.Initialize` and the surrounding schema declared timestamp columns (`health_check`, `started`, `posted`, etc.) with a DEFAULT of `SYS_EXTRACT_UTC(SYSTIMESTAMP)`. That returns a TIMESTAMP without a time zone, and when implicitly cast into the `TIMESTAMP WITH TIME ZONE` column Oracle stamps it with the *session* time zone — so for any session in UTC+N the just-persisted value's UTC equivalent was N hours in the past. That tripped the `NodeAgentController.DoHealthChecksAsync` staleness filter and surfaced as a `NullReferenceException` during the first leadership-election heartbeat (`self!.AssignAgents([LeaderUri])` on a `null` self). All 18 occurrences swapped to `SYSTIMESTAMP AT TIME ZONE 'UTC'`, with quote-doubling for the DDL contexts that go through Weasel's `EXECUTE IMMEDIATE '...'` wrapper. ### Reliability hardening * **Lock `dbcontrol://` and `oraclecontrol://` endpoints to `BufferedInMemory`** (#2637) — the database-backed control transport carries inter-node leader-election and agent-reassignment commands. Marking either endpoint Durable would route every control envelope through the same store-backed inbox/outbox the durability agent itself owns (deadlock); marking it Inline contradicts the batched-poll semantics. Both `DatabaseControlEndpoint` and `OracleControlEndpoint` now override `supportsMode` so any policy that tries to flip them off `BufferedInMemory` either silently skips (`UseDurableInboxOnAllListeners`, `UseDurableOutboxOnAllSendingEndpoints`, etc., already check `SupportsMode`) or fails fast with a clear `InvalidOperationException`. ### Source-gen / startup * **Aggregate `IWolverineTypeLoader` across all known assemblies (#2632)** by @devployment — since 5.34.0, hosts on the source-generated codegen path silently dropped handlers that lived in *referenced* assemblies because `tryDiscoverTypeLoaderFromAttribute` only inspected `Options.ApplicationAssembly`. First invocation of one of those handlers threw `IndeterminateRoutesException`. The runtime now walks `ApplicationAssembly` *and* every assembly in `Discovery.Assemblies`, collects every `[WolverineTypeManifest]` loader it finds, and exposes their union via the new internal `CompositeWolverineTypeLoader`. Existing single-loader semantics are preserved when only one manifest is found. ### Other * **Saga timeout flag + scheduled-dispatch Activity tag (#2631)** by @jeremydmiller — surfaces saga timeout and scheduled-dispatch metadata so the upcoming CritterWatch saga visualization can render in-flight saga state. ### Dependencies * **Bump JasperFx 1.28.0 → 1.28.2 and JasperFx.Events 1.29.0 → 1.31.1** (#2638). **Full Changelog**: JasperFx/wolverine@V5.35.1...V5.35.2 ## 5.35.1 ## What's Changed A bug-fix and small-feature release covering Oracle-in-Balanced-mode startup, a duplicate-poller defect on RavenDb, an AWS SQS sharded-slot naming fix, and a new SagaDescriptor surface for CritterWatch. ### Persistence fixes * **Oracle in `DurabilityMode.Balanced` now boots** (#2622) — `OracleMessageStore.Initialize` was a no-op, so hosts using Oracle persistence in Balanced mode failed to start with `ArgumentOutOfRangeException("ControlEndpoint cannot be null for this usage")`. The fix mirrors `MessageDatabase.Initialize` for Oracle and stands up a parallel `OracleControlTransport` / `OracleControlEndpoint` / `OracleControlSender` / `OracleControlListener` set under the new `oraclecontrol://` protocol — necessary because the shared `DatabaseControlSender` / `DatabaseControlListener` assume `@`-prefixed placeholders and Guid values that map directly onto a `DbParameter`, neither of which Oracle accepts (`:`-prefixed placeholders, `RAW(16)` id columns requiring `byte[]`). Also fixes a latent `OracleMessageStore.EnqueueAsync` no-op that left `LogRecordsAsync` silently dropping node records, and makes `FetchRecentRecordsAsync` `DBNull`-safe on the description column. Adds a new `OracleTests.LeaderElection` project so the leadership-compliance suite runs against Oracle (marked `[Trait("Category","Flaky")]` because the suite needs careful TM/DML lock sequencing between back-to-back runs). * **RavenDb: only one durability agent polls after host start** (#2623, #2629) by @Bishbulb (root-cause investigation and original fix) and @jeremydmiller — `RavenDbMessageStore.StartScheduledJobs` eagerly built and started a `RavenDbDurabilityAgent` at boot in addition to the agent that `NodeAgentController` already builds and starts via `IAgentFamily` / `MessageStoreCollection`. Two `RavenDbDurabilityAgent` instances then polled the same database concurrently, both believed they held the scheduled-job lock, raced to mark the same envelopes `Incoming`, and surfaced `ConcurrencyException` plus double-fired timeouts. Drops the eager `StartTimers()` call; the cluster-managed agent is now the single owner of polling. The agent returned from `StartScheduledJobs` is held by `WolverineRuntime.DurableScheduledJobs` purely for its disposal-time `StopAsync`. Comes with a reflection-free regression test (added `RavenDbDurabilityAgent.IsPolling` and `CompositeAgent.InnerAgents` for the test to enumerate without poking at private fields). A companion regression-guard test for CosmosDb is included; investigation showed the equivalent CosmosDb path does NOT have the bug today (`CosmosDbMessageStore.BuildAgentFamily` returns null and `Uri` uses the `cosmosdb://` scheme rather than `wolverinedb://`, so `MessageStoreCollection` never registers a competing agent). ### Other improvements * **AWS SQS: correct naming for sharded slot endpoints** in #1f294ce5 — fixes a regression where sharded slot endpoint URIs were assembled with the wrong segment ordering, causing the consumer side to listen at the wrong queue. * **`SagaDescriptor` exported via `ServiceCapabilities`** in #f0998c7b — adds a saga-shape descriptor (saga type, id type, current state) to the capabilities exporter so CritterWatch can surface saga inventory and current state in its dashboard. **Full Changelog**: JasperFx/wolverine@V5.34.0...V5.35.1 ## 5.34.0 ## What's Changed This release introduces three new features (Claim Check pattern, declarative Polecat data requirements, and a new opt-in `WolverineFx.RuntimeCompilation` package as the first step toward AOT compatibility), a fix for a long-standing service-location footgun, several real RavenDB and EF Core durability fixes, plus the cold-start prep work done as part of issue #1577. ### Highlights * **Add Claim Check / DataBus pattern with `[Blob]` attribute (#2412)** by @jeremydmiller in #2617 — off-load large message-property payloads to external storage on send and re-hydrate them on receive, so the on-the-wire envelope stays small. Core abstractions (`IClaimCheckStore`, `ClaimCheckToken`, `[Blob]`, `FileSystemClaimCheckStore`, `opts.UseClaimCheck(...)`) live in `Wolverine.Persistence`. Two new backend NuGet packages ship alongside: `WolverineFx.ClaimCheck.AzureBlobStorage` and `WolverineFx.ClaimCheck.AmazonS3`. New documentation page under `/guide/durability/claim-checks`. * **Declarative data-requirement attributes for Polecat (#2552)** by @jeremydmiller in #2615 — `[DocumentExists<T>]`, `[DocumentDoesNotExist<T>]`, and `PolecatOps.Document<T>().MustExist(...)` / `.MustNotExist(...)` mirror the Marten ergonomics, with the same batch-query optimization that folds multiple existence checks into a single Polecat `IBatchedQuery` round-trip. * **Service-located `IMessageBus` / `IMessageContext` now see the active context (#2583)** by @jeremydmiller in #2616 — when user code service-locates `IMessageBus` (e.g., constructor injection on a service the handler resolves at runtime), it now receives the same `MessageContext` the handler itself uses, preserving outbox semantics. Implemented as a per-chain opt-in (gated on `Chain.UsesServiceLocation`) so chains that don't service-locate pay zero `AsyncLocal` overhead per message. * **Cold-start optimizations and `WolverineFx.RuntimeCompilation` opt-in package (#1577)** by @jeremydmiller in #2613 and #cc00ca0a — first pass at the cold-start / AOT roadmap. Wires the `Wolverine.SourceGeneration` analyzer into the `WolverineFx` NuGet output (so source-generated `IWolverineTypeLoader` discovery flows transitively to consumers), pre-populates the `WolverineMessageNaming` cache during startup to eliminate first-message reflection cost, applies `[DynamicallyAccessedMembers]` annotations on the `Activator.CreateInstance` call sites for trimmer-friendliness, and adds `ConfigureAwait(false)` across 117 awaits on the per-message hot path. The new `WolverineFx.RuntimeCompilation` package becomes the future-facing opt-in API for runtime Roslyn compilation; default behavior is preserved. ### RavenDB durability fixes * **Fix bulk RavenDB inbox store leaking duplicates as inbox-unavailable (#2606)** by @Bishbulb in #2606 * **Take over expired RavenDB scheduled-job and leadership locks (#2608)** by @Bishbulb in #2608 * **Disable optimistic concurrency on RavenDB cluster-wide node sessions; load-then-modify on agent-assignment writes (#2610)** by @Bishbulb in #2610 ### EF Core / ancillary stores * **Fix `DurableLocalQueue` to route incoming envelopes to ancillary stores (#2611)** by @jeremydmiller — handler chains targeting an ancillary message store now have their incoming envelopes persisted in that store rather than the main store, fixing a class of "envelope stuck as Incoming forever" bugs. * **Fix `WolverineEnabled` annotation collision in ancillary-store EF Core scenarios** as part of #2618 — `MapWolverineEnvelopeStorage` is now idempotent when called against the same model graph more than once. ### Other improvements * **Fix `MessageBus` clobbering per-message `Envelope.Source`** in #26e38002 — `MessageBus.Send` was overwriting the per-message `Source` with the host's `ServiceName`, masking the originating service in causation tracking. * **Surface upcoming `ServiceLocationPolicy.NotAllowed` v6 default (#2584)** by @jeremydmiller in #2609 — chains that resolve dependencies via service location now log a warning at codegen time, with a clear migration path to the new opt-in `Wolverine.RuntimeCompilation` story for v6. ### CI stabilization * **Several flaky test classes fixed or marked** in #2612 and #2618 — timeout bumps, `IDisposable` → `IAsyncLifetime` conversions, lifecycle cleanup; chronically broken-on-CI classes (`SqliteTests.Transport.multi_tenancy_with_multiple_files`, `CosmosDbTests.LeaderElection.leader_election`, `Wolverine.RabbitMQ.Tests.send_by_topics`, `Wolverine.RabbitMQ.Tests.sending_raw_messages`) tagged `[Trait("Category", "Flaky")]` with header comments documenting the symptom and the real follow-up fix. * **JasperFx 1.28 / RuntimeCompiler 4.5 ambiguity fallout fixed** in #2618 — files importing both `JasperFx.CodeGeneration` and `JasperFx.RuntimeCompiler` now compile cleanly after the `InitializeSynchronously` extension method was moved into `JasperFx.CodeGeneration` upstream. ### Issue-tracker housekeeping * `#2507` (Quartz.Net / TickerQ first-class integration) added to the 6.0 milestone with a phased plan documented on the issue. * `#1577` (cold-start optimization roadmap) updated with a six-phase plan and current-state checklist; phases 1–4 are non-breaking on v5.x and largely landed in this release. **Full Changelog**: JasperFx/wolverine@V5.33.0...V5.34.0 ## 5.33.0 ## What's Changed This release includes a major reliability fix for distributed leader election, a port of the Polecat 2.x event store integration, and several other quality-of-life improvements. ### Highlights * **Fix #2602: Leader split-brain via stale advisory lock** by @jeremydmiller in #2607 — three-layer defensive fix that detects when a Postgres/SQL Server/MySQL/Oracle/SQLite advisory lock has been silently released server-side, steps down the local leader, releases its agents, and triggers a fresh leader election. Adds a new `LeadershipLost` node record type and an `IWolverineObserver.LostLeadership()` hook for monitoring. * **Polecat 2.x event store integration** by @jeremydmiller in #2598 — ports the aggregate handler workflow from Marten so SQL Server-backed projects can use Polecat as a native event store with Wolverine. Requires SQL Server 2025 for the native `JSON` type. * **Fix #2571: Preserve context fields on scheduled-send wrap/unwrap** by @jeremydmiller in #2605 — saga IDs, tenant IDs, and other correlation fields now survive the scheduled-send envelope round-trip. * **gRPC enhancements** by @jeremydmiller in #2565 — middleware weaving, validate convention, user exception mapping, bidirectional streaming, code-first codegen, plus new samples. * **Allow RabbitMQ exchanges to be declared passive** by @jeremydmiller in #2574 ### Other Improvements * Move non-sticky-handlers guard inside the compile lock by @jeremydmiller in #2556 * Add `launchSettings.json` to sample projects by @jeremydmiller in #2600 **Full Changelog**: JasperFx/wolverine@V5.32.1...V5.33.0 ## What's Changed * Update vulnerable OpenTelemetry dependencies by @dmytro-pryvedeniuk in JasperFx/wolverine#2590 * Fix tenant partitioning precedence with inferred grouping by @erdtsieck in JasperFx/wolverine#2581 * Use quoted schema names in SQL statements for RDBMS persistence by @esskar in JasperFx/wolverine#2577 * Skip logging when the count is zero by @Bishbulb in JasperFx/wolverine#2560 * Accept *Async suffix on saga method names (#2578) by @jeremydmiller in JasperFx/wolverine#2593 * Fix ancillary store scheduled messages stuck Incoming forever (#2576) by @jeremydmiller in JasperFx/wolverine#2591 * Add Wolverine.SourceGeneration to slnx (supersedes #2575) by @jeremydmiller in JasperFx/wolverine#2592 * Honor [Consumes] / IAcceptsMetadata on form endpoints by @rmasciarella in JasperFx/wolverine#2589 * Materialize EF domain-event scraper before publishing (#2585) by @jeremydmiller in JasperFx/wolverine#2594 * Process Manager via Handlers sample by @erikshafer in JasperFx/wolverine#2579 * Fix missing ParameterDescriptor for form parameters in API descriptions by @rmasciarella in JasperFx/wolverine#2587 * Allow configuration of the MessageBatchTimeout by @lyall-sc in JasperFx/wolverine#2582 * Fix #2588: durable outbox policy ignored for conventionally-routed senders by @jeremydmiller in JasperFx/wolverine#2596 * Fix #2595: explicit DeliveryOptions.SagaId on saga Start cascades should win by @jeremydmiller in JasperFx/wolverine#2597 * Allow RabbitMQ exchanges to be declared passive by @saithis in JasperFx/wolverine#2574 * Fix NoHandlerForEndpointException during concurrent saga chain compile by @Bishbulb in JasperFx/wolverine#2556 * gRPC: Middleware Weaving, Validate Convention, User Exception Mapping, Bidi Streaming, Code-First Codegen, New Samples by @erikshafer in JasperFx/wolverine#2565 * Add launchSettings.json files to the sample projects by @dmytro-pryvedeniuk in JasperFx/wolverine#2600 * Fix #2571: preserve context fields on scheduled-send wrap unwrap by @jeremydmiller in JasperFx/wolverine#2605 * Add Endpoint.BrokerRole for CritterWatch endpoint display (#2601) by @jeremydmiller in JasperFx/wolverine#2603 * Process Manager via Handlers Cleanup by @erikshafer in JasperFx/wolverine#2604 * Fix #2602: leader split-brain via stale advisory-lock state by @jeremydmiller in JasperFx/wolverine#2607 * Polecat parity port from Wolverine.Marten + Polecat 2.1.0 bump by @jeremydmiller in JasperFx/wolverine#2598 ## New Contributors * @esskar made their first contribution in JasperFx/wolverine#2577 * @rmasciarella made their first contribution in JasperFx/wolverine#2589 * @saithis made their first contribution in JasperFx/wolverine#2574 **Full Changelog**: JasperFx/wolverine@V5.32.1...V5.33.0 Commits viewable in [compare view](http://github.com/jasperfx/wolverine/compare/V5.32.1...V5.39.0). </details> Pinned [WolverineFx.Postgresql](http://github.com/jasperfx/wolverine) at 5.39.0. <details> <summary>Release notes</summary> _Sourced from [WolverineFx.Postgresql's releases](http://github.com/jasperfx/wolverine/releases)._ ## 5.39.0 ## What's Changed * docs(logging): correct OpenTelemetry AddMeter sample by @stigrune in JasperFx/wolverine#2707 * Add nuke/build.schema.json to .gitignore by @dmytro-pryvedeniuk in JasperFx/wolverine#2706 * Allow NATS messages without message-type header when DefaultIncomingMessage is set by @frankvdb7 in JasperFx/wolverine#2703 * fix(http): honor [RoutePrefix] when no global prefix is configured by @outofrange-consulting in JasperFx/wolverine#2708 * Fault Events — Auto-Publish `Fault<T>` on Terminal Handler Failure by @BlackChepo in JasperFx/wolverine#2695 * Outbox behavior alignment with EF Core transaction model by @Ferchke7 in JasperFx/wolverine#2677 * Preserve correlation/trace context across Global Partitioning interceptor (supersedes #2709) by @jeremydmiller in JasperFx/wolverine#2710 * feat(nats): expose JetStream DeliverPolicy on transport + listener by @jeremydmiller in JasperFx/wolverine#2711 * fix(build): include Wolverine.HealthChecks in the Pack target by @jeremydmiller in JasperFx/wolverine#2712 * feat(sqs): transport-wide DefaultDeadLetterQueueName with per-listener override precedence by @jeremydmiller in JasperFx/wolverine#2714 ## New Contributors * @stigrune made their first contribution in JasperFx/wolverine#2707 **Full Changelog**: JasperFx/wolverine@V5.38.0...V5.39.0 ## 5.38.0 ## What's Changed * Disable build-time document generation by @dmytro-pryvedeniuk in JasperFx/wolverine#2684 * Add IBrokerHealthProbe + RabbitMQ implementation (CritterWatch#70) by @jeremydmiller in JasperFx/wolverine#2686 * Add Wolverine.HealthChecks for ASP.NET Core IHealthCheck integration (CritterWatch#73) by @jeremydmiller in JasperFx/wolverine#2687 * Add WolverineHeartbeat emission (CritterWatch#72) by @jeremydmiller in JasperFx/wolverine#2688 * fix(agents): never let self fall into the staleNodes filter (GH-2682) by @jeremydmiller in JasperFx/wolverine#2689 * feat(http): api-versioning headers on all responses + multi-version handler support by @outofrange-consulting in JasperFx/wolverine#2683 * fix(advisory-lock): make TryAttainLockAsync idempotent against re-entrant calls by @jeremydmiller in JasperFx/wolverine#2691 * fix(test): lock AllItemsReceived state in batch_processing tests by @jeremydmiller in JasperFx/wolverine#2692 * fix(marten): publish IEvent.TenantId verbatim under conjoined tenancy by @jeremydmiller in JasperFx/wolverine#2693 * fix(rabbitmq): bind handler queue to every handled-message exchange under FromHandlerType by @jeremydmiller in JasperFx/wolverine#2697 * fix(sqlite): close #2680 by bumping Weasel to 8.15.1 by @jeremydmiller in JasperFx/wolverine#2696 * [1/N] dynamic listeners — foundation only (GH-2685) by @jeremydmiller in JasperFx/wolverine#2699 * feat(tracing): opt-in handler-execution diagnostics on WolverineOptions.Tracking by @jeremydmiller in JasperFx/wolverine#2698 * Fix unbounded retry loop on durable receiver shutdown (GH-2671) by @jeremydmiller in JasperFx/wolverine#2701 * [2/N] real RDBMS-backed IListenerStore (GH-2685) by @jeremydmiller in JasperFx/wolverine#2700 * [3/N] DynamicListenerAgentFamily — cluster-coordinated dynamic listeners (GH-2685) by @jeremydmiller in JasperFx/wolverine#2702 **Full Changelog**: JasperFx/wolverine@V5.37.2...V5.38.0 ## 5.37.2 ## What's Changed * Fixing a regression problem with explicit type discovery getting lost… by @jeremydmiller in JasperFx/wolverine#2678 * chore(core): remove Wolverine-specific Roslyn source generator by @jeremydmiller in JasperFx/wolverine#2679 **Full Changelog**: JasperFx/wolverine@V5.37.0...V5.37.2 ## 5.37.0 ## What's Changed * The real fix to our EF Core + Outbox problem. Bump to 5.36.2 by @jeremydmiller in JasperFx/wolverine#2665 * fix(sqlite): use BEGIN EXCLUSIVE for migration lock; TTL sweep + heartbeat for non-migration advisory locks by @mysticmind in JasperFx/wolverine#2666 * feat(http): support [ApiVersionNeutral] for opt-out endpoints by @outofrange-consulting in JasperFx/wolverine#2660 * feat(critterwatch): polecat outbox listener fix + DocumentStores capability surface by @jeremydmiller in JasperFx/wolverine#2672 * feat(rabbitmq): public API for multi-node cluster endpoints (#2659) by @BlackChepo in JasperFx/wolverine#2664 * fix(marten): GH-2669 alternative — Uri-based ancillary store routing (no IMessageStore.Id dependency) by @jeremydmiller in JasperFx/wolverine#2674 **Full Changelog**: JasperFx/wolverine@v5.36.1...V5.37.0 ## 5.36.1 **Upgrade to this version please if you use the EF Core transactional middleware and are using a very recent version of Wolverine** ## What's Changed * fix(efcore): suppress duplicate FlushOutgoingMessages in Eager-mode HTTP chains by @jeremydmiller in JasperFx/wolverine#2663 **Full Changelog**: JasperFx/wolverine@V5.36.0...v5.36.1 ## 5.36.0 ## What's Changed * Add IAgent.Description for monitoring-tool tooltips by @jeremydmiller in JasperFx/wolverine#2645 * feat: AES-256-GCM message encryption with send/receive enforcement (#2643) by @BlackChepo in JasperFx/wolverine#2644 * fix(rdbms-inbox): discard duplicate Kafka messages instead of freezing the partition (#2639) by @BlackChepo in JasperFx/wolverine#2648 * Prevent leadership re-election every 5 minutes by @Bishbulb in JasperFx/wolverine#2625 * Enrich DurabilityAgent.CheckHealthAsync with persistence-layer signals (#2646) by @jeremydmiller in JasperFx/wolverine#2649 * Native API versioning for Wolverine.Http (closes #2627) by @outofrange-consulting in JasperFx/wolverine#2633 * Enrich StickyPostgresqlQueueListenerAgent.CheckHealthAsync with listener-state signals (#2647) by @jeremydmiller in JasperFx/wolverine#2650 * fix(rdbms-inbox): align RavenDb and CosmosDb batch inbox with #2648 duplicate-envelope contract by @BlackChepo in JasperFx/wolverine#2651 * Surface 'Custom' interop mode + DefaultSerializerDescription on EndpointDescriptor (#2641) by @jeremydmiller in JasperFx/wolverine#2652 * 5.36: routing-precedence regression fix + metrics test repair + 5.36.0 cut by @jeremydmiller in JasperFx/wolverine#2655 * feat(durability): AlwaysMakeScheduledMessagesDurable policy by @jeremydmiller in JasperFx/wolverine#2657 **Full Changelog**: JasperFx/wolverine@V5.35.2...V5.36.0 ## 5.35.2 ## What's Changed A small bug-fix and dependency-refresh release. ### Persistence fixes * **Oracle: timestamp default expressions now survive non-UTC DB sessions** (#2634) — `OracleMessageStore.Initialize` and the surrounding schema declared timestamp columns (`health_check`, `started`, `posted`, etc.) with a DEFAULT of `SYS_EXTRACT_UTC(SYSTIMESTAMP)`. That returns a TIMESTAMP without a time zone, and when implicitly cast into the `TIMESTAMP WITH TIME ZONE` column Oracle stamps it with the *session* time zone — so for any session in UTC+N the just-persisted value's UTC equivalent was N hours in the past. That tripped the `NodeAgentController.DoHealthChecksAsync` staleness filter and surfaced as a `NullReferenceException` during the first leadership-election heartbeat (`self!.AssignAgents([LeaderUri])` on a `null` self). All 18 occurrences swapped to `SYSTIMESTAMP AT TIME ZONE 'UTC'`, with quote-doubling for the DDL contexts that go through Weasel's `EXECUTE IMMEDIATE '...'` wrapper. ### Reliability hardening * **Lock `dbcontrol://` and `oraclecontrol://` endpoints to `BufferedInMemory`** (#2637) — the database-backed control transport carries inter-node leader-election and agent-reassignment commands. Marking either endpoint Durable would route every control envelope through the same store-backed inbox/outbox the durability agent itself owns (deadlock); marking it Inline contradicts the batched-poll semantics. Both `DatabaseControlEndpoint` and `OracleControlEndpoint` now override `supportsMode` so any policy that tries to flip them off `BufferedInMemory` either silently skips (`UseDurableInboxOnAllListeners`, `UseDurableOutboxOnAllSendingEndpoints`, etc., already check `SupportsMode`) or fails fast with a clear `InvalidOperationException`. ### Source-gen / startup * **Aggregate `IWolverineTypeLoader` across all known assemblies (#2632)** by @devployment — since 5.34.0, hosts on the source-generated codegen path silently dropped handlers that lived in *referenced* assemblies because `tryDiscoverTypeLoaderFromAttribute` only inspected `Options.ApplicationAssembly`. First invocation of one of those handlers threw `IndeterminateRoutesException`. The runtime now walks `ApplicationAssembly` *and* every assembly in `Discovery.Assemblies`, collects every `[WolverineTypeManifest]` loader it finds, and exposes their union via the new internal `CompositeWolverineTypeLoader`. Existing single-loader semantics are preserved when only one manifest is found. ### Other * **Saga timeout flag + scheduled-dispatch Activity tag (#2631)** by @jeremydmiller — surfaces saga timeout and scheduled-dispatch metadata so the upcoming CritterWatch saga visualization can render in-flight saga state. ### Dependencies * **Bump JasperFx 1.28.0 → 1.28.2 and JasperFx.Events 1.29.0 → 1.31.1** (#2638). **Full Changelog**: JasperFx/wolverine@V5.35.1...V5.35.2 ## 5.35.1 ## What's Changed A bug-fix and small-feature release covering Oracle-in-Balanced-mode startup, a duplicate-poller defect on RavenDb, an AWS SQS sharded-slot naming fix, and a new SagaDescriptor surface for CritterWatch. ### Persistence fixes * **Oracle in `DurabilityMode.Balanced` now boots** (#2622) — `OracleMessageStore.Initialize` was a no-op, so hosts using Oracle persistence in Balanced mode failed to start with `ArgumentOutOfRangeException("ControlEndpoint cannot be null for this usage")`. The fix mirrors `MessageDatabase.Initialize` for Oracle and stands up a parallel `OracleControlTransport` / `OracleControlEndpoint` / `OracleControlSender` / `OracleControlListener` set under the new `oraclecontrol://` protocol — necessary because the shared `DatabaseControlSender` / `DatabaseControlListener` assume `@`-prefixed placeholders and Guid values that map directly onto a `DbParameter`, neither of which Oracle accepts (`:`-prefixed placeholders, `RAW(16)` id columns requiring `byte[]`). Also fixes a latent `OracleMessageStore.EnqueueAsync` no-op that left `LogRecordsAsync` silently dropping node records, and makes `FetchRecentRecordsAsync` `DBNull`-safe on the description column. Adds a new `OracleTests.LeaderElection` project so the leadership-compliance suite runs against Oracle (marked `[Trait("Category","Flaky")]` because the suite needs careful TM/DML lock sequencing between back-to-back runs). * **RavenDb: only one durability agent polls after host start** (#2623, #2629) by @Bishbulb (root-cause investigation and original fix) and @jeremydmiller — `RavenDbMessageStore.StartScheduledJobs` eagerly built and started a `RavenDbDurabilityAgent` at boot in addition to the agent that `NodeAgentController` already builds and starts via `IAgentFamily` / `MessageStoreCollection`. Two `RavenDbDurabilityAgent` instances then polled the same database concurrently, both believed they held the scheduled-job lock, raced to mark the same envelopes `Incoming`, and surfaced `ConcurrencyException` plus double-fired timeouts. Drops the eager `StartTimers()` call; the cluster-managed agent is now the single owner of polling. The agent returned from `StartScheduledJobs` is held by `WolverineRuntime.DurableScheduledJobs` purely for its disposal-time `StopAsync`. Comes with a reflection-free regression test (added `RavenDbDurabilityAgent.IsPolling` and `CompositeAgent.InnerAgents` for the test to enumerate without poking at private fields). A companion regression-guard test for CosmosDb is included; investigation showed the equivalent CosmosDb path does NOT have the bug today (`CosmosDbMessageStore.BuildAgentFamily` returns null and `Uri` uses the `cosmosdb://` scheme rather than `wolverinedb://`, so `MessageStoreCollection` never registers a competing agent). ### Other improvements * **AWS SQS: correct naming for sharded slot endpoints** in #1f294ce5 — fixes a regression where sharded slot endpoint URIs were assembled with the wrong segment ordering, causing the consumer side to listen at the wrong queue. * **`SagaDescriptor` exported via `ServiceCapabilities`** in #f0998c7b — adds a saga-shape descriptor (saga type, id type, current state) to the capabilities exporter so CritterWatch can surface saga inventory and current state in its dashboard. **Full Changelog**: JasperFx/wolverine@V5.34.0...V5.35.1 ## 5.34.0 ## What's Changed This release introduces three new features (Claim Check pattern, declarative Polecat data requirements, and a new opt-in `WolverineFx.RuntimeCompilation` package as the first step toward AOT compatibility), a fix for a long-standing service-location footgun, several real RavenDB and EF Core durability fixes, plus the cold-start prep work done as part of issue #1577. ### Highlights * **Add Claim Check / DataBus pattern with `[Blob]` attribute (#2412)** by @jeremydmiller in #2617 — off-load large message-property payloads to external storage on send and re-hydrate them on receive, so the on-the-wire envelope stays small. Core abstractions (`IClaimCheckStore`, `ClaimCheckToken`, `[Blob]`, `FileSystemClaimCheckStore`, `opts.UseClaimCheck(...)`) live in `Wolverine.Persistence`. Two new backend NuGet packages ship alongside: `WolverineFx.ClaimCheck.AzureBlobStorage` and `WolverineFx.ClaimCheck.AmazonS3`. New documentation page under `/guide/durability/claim-checks`. * **Declarative data-requirement attributes for Polecat (#2552)** by @jeremydmiller in #2615 — `[DocumentExists<T>]`, `[DocumentDoesNotExist<T>]`, and `PolecatOps.Document<T>().MustExist(...)` / `.MustNotExist(...)` mirror the Marten ergonomics, with the same batch-query optimization that folds multiple existence checks into a single Polecat `IBatchedQuery` round-trip. * **Service-located `IMessageBus` / `IMessageContext` now see the active context (#2583)** by @jeremydmiller in #2616 — when user code service-locates `IMessageBus` (e.g., constructor injection on a service the handler resolves at runtime), it now receives the same `MessageContext` the handler itself uses, preserving outbox semantics. Implemented as a per-chain opt-in (gated on `Chain.UsesServiceLocation`) so chains that don't service-locate pay zero `AsyncLocal` overhead per message. * **Cold-start optimizations and `WolverineFx.RuntimeCompilation` opt-in package (#1577)** by @jeremydmiller in #2613 and #cc00ca0a — first pass at the cold-start / AOT roadmap. Wires the `Wolverine.SourceGeneration` analyzer into the `WolverineFx` NuGet output (so source-generated `IWolverineTypeLoader` discovery flows transitively to consumers), pre-populates the `WolverineMessageNaming` cache during startup to eliminate first-message reflection cost, applies `[DynamicallyAccessedMembers]` annotations on the `Activator.CreateInstance` call sites for trimmer-friendliness, and adds `ConfigureAwait(false)` across 117 awaits on the per-message hot path. The new `WolverineFx.RuntimeCompilation` package becomes the future-facing opt-in API for runtime Roslyn compilation; default behavior is preserved. ### RavenDB durability fixes * **Fix bulk RavenDB inbox store leaking duplicates as inbox-unavailable (#2606)** by @Bishbulb in #2606 * **Take over expired RavenDB scheduled-job and leadership locks (#2608)** by @Bishbulb in #2608 * **Disable optimistic concurrency on RavenDB cluster-wide node sessions; load-then-modify on agent-assignment writes (#2610)** by @Bishbulb in #2610 ### EF Core / ancillary stores * **Fix `DurableLocalQueue` to route incoming envelopes to ancillary stores (#2611)** by @jeremydmiller — handler chains targeting an ancillary message store now have their incoming envelopes persisted in that store rather than the main store, fixing a class of "envelope stuck as Incoming forever" bugs. * **Fix `WolverineEnabled` annotation collision in ancillary-store EF Core scenarios** as part of #2618 — `MapWolverineEnvelopeStorage` is now idempotent when called against the same model graph more than once. ### Other improvements * **Fix `MessageBus` clobbering per-message `Envelope.Source`** in #26e38002 — `MessageBus.Send` was overwriting the per-message `Source` with the host's `ServiceName`, masking the originating service in causation tracking. * **Surface upcoming `ServiceLocationPolicy.NotAllowed` v6 default (#2584)** by @jeremydmiller in #2609 — chains that resolve dependencies via service location now log a warning at codegen time, with a clear migration path to the new opt-in `Wolverine.RuntimeCompilation` story for v6. ### CI stabilization * **Several flaky test classes fixed or marked** in #2612 and #2618 — timeout bumps, `IDisposable` → `IAsyncLifetime` conversions, lifecycle cleanup; chronically broken-on-CI classes (`SqliteTests.Transport.multi_tenancy_with_multiple_files`, `CosmosDbTests.LeaderElection.leader_election`, `Wolverine.RabbitMQ.Tests.send_by_topics`, `Wolverine.RabbitMQ.Tests.sending_raw_messages`) tagged `[Trait("Category", "Flaky")]` with header comments documenting the symptom and the real follow-up fix. * **JasperFx 1.28 / RuntimeCompiler 4.5 ambiguity fallout fixed** in #2618 — files importing both `JasperFx.CodeGeneration` and `JasperFx.RuntimeCompiler` now compile cleanly after the `InitializeSynchronously` extension method was moved into `JasperFx.CodeGeneration` upstream. ### Issue-tracker housekeeping * `#2507` (Quartz.Net / TickerQ first-class integration) added to the 6.0 milestone with a phased plan documented on the issue. * `#1577` (cold-start optimization roadmap) updated with a six-phase plan and current-state checklist; phases 1–4 are non-breaking on v5.x and largely landed in this release. **Full Changelog**: JasperFx/wolverine@V5.33.0...V5.34.0 ## 5.33.0 ## What's Changed This release includes a major reliability fix for distributed leader election, a port of the Polecat 2.x event store integration, and several other quality-of-life improvements. ### Highlights * **Fix #2602: Leader split-brain via stale advisory lock** by @jeremydmiller in #2607 — three-layer defensive fix that detects when a Postgres/SQL Server/MySQL/Oracle/SQLite advisory lock has been silently released server-side, steps down the local leader, releases its agents, and triggers a fresh leader election. Adds a new `LeadershipLost` node record type and an `IWolverineObserver.LostLeadership()` hook for monitoring. * **Polecat 2.x event store integration** by @jeremydmiller in #2598 — ports the aggregate handler workflow from Marten so SQL Server-backed projects can use Polecat as a native event store with Wolverine. Requires SQL Server 2025 for the native `JSON` type. * **Fix #2571: Preserve context fields on scheduled-send wrap/unwrap** by @jeremydmiller in #2605 — saga IDs, tenant IDs, and other correlation fields now survive the scheduled-send envelope round-trip. * **gRPC enhancements** by @jeremydmiller in #2565 — middleware weaving, validate convention, user exception mapping, bidirectional streaming, code-first codegen, plus new samples. * **Allow RabbitMQ exchanges to be declared passive** by @jeremydmiller in #2574 ### Other Improvements * Move non-sticky-handlers guard inside the compile lock by @jeremydmiller in #2556 * Add `launchSettings.json` to sample projects by @jeremydmiller in #2600 **Full Changelog**: JasperFx/wolverine@V5.32.1...V5.33.0 ## What's Changed * Update vulnerable OpenTelemetry dependencies by @dmytro-pryvedeniuk in JasperFx/wolverine#2590 * Fix tenant partitioning precedence with inferred grouping by @erdtsieck in JasperFx/wolverine#2581 * Use quoted schema names in SQL statements for RDBMS persistence by @esskar in JasperFx/wolverine#2577 * Skip logging when the count is zero by @Bishbulb in JasperFx/wolverine#2560 * Accept *Async suffix on saga method names (#2578) by @jeremydmiller in JasperFx/wolverine#2593 * Fix ancillary store scheduled messages stuck Incoming forever (#2576) by @jeremydmiller in JasperFx/wolverine#2591 * Add Wolverine.SourceGeneration to slnx (supersedes #2575) by @jeremydmiller in JasperFx/wolverine#2592 * Honor [Consumes] / IAcceptsMetadata on form endpoints by @rmasciarella in JasperFx/wolverine#2589 * Materialize EF domain-event scraper before publishing (#2585) by @jeremydmiller in JasperFx/wolverine#2594 * Process Manager via Handlers sample by @erikshafer in JasperFx/wolverine#2579 * Fix missing ParameterDescriptor for form parameters in API descriptions by @rmasciarella in JasperFx/wolverine#2587 * Allow configuration of the MessageBatchTimeout by @lyall-sc in JasperFx/wolverine#2582 * Fix #2588: durable outbox policy ignored for conventionally-routed senders by @jeremydmiller in JasperFx/wolverine#2596 * Fix #2595: explicit DeliveryOptions.SagaId on saga Start cascades should win by @jeremydmiller in JasperFx/wolverine#2597 * Allow RabbitMQ exchanges to be declared passive by @saithis in JasperFx/wolverine#2574 * Fix NoHandlerForEndpointException during concurrent saga chain compile by @Bishbulb in JasperFx/wolverine#2556 * gRPC: Middleware Weaving, Validate Convention, User Exception Mapping, Bidi Streaming, Code-First Codegen, New Samples by @erikshafer in JasperFx/wolverine#2565 * Add launchSettings.json files to the sample projects by @dmytro-pryvedeniuk in JasperFx/wolverine#2600 * Fix #2571: preserve context fields on scheduled-send wrap unwrap by @jeremydmiller in JasperFx/wolverine#2605 * Add Endpoint.BrokerRole for CritterWatch endpoint display (#2601) by @jeremydmiller in JasperFx/wolverine#2603 * Process Manager via Handlers Cleanup by @erikshafer in JasperFx/wolverine#2604 * Fix #2602: leader split-brain via stale advisory-lock state by @jeremydmiller in JasperFx/wolverine#2607 * Polecat parity port from Wolverine.Marten + Polecat 2.1.0 bump by @jeremydmiller in JasperFx/wolverine#2598 ## New Contributors * @esskar made their first contribution in JasperFx/wolverine#2577 * @rmasciarella made their first contribution in JasperFx/wolverine#2589 * @saithis made their first contribution in JasperFx/wolverine#2574 **Full Changelog**: JasperFx/wolverine@V5.32.1...V5.33.0 Commits viewable in [compare view](http://github.com/jasperfx/wolverine/compare/V5.32.1...V5.39.0). </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This was referenced May 14, 2026
Merged
Merged
This was referenced May 25, 2026
This was referenced Jun 1, 2026
This was referenced Jun 15, 2026
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.
Summary
Cuts the 5.36.0 release. Three landings:
MessageRoutingConvention.PreregisterSendersfrom leaking conventional senders intoExplicitRouting. PR Fix #2588: durable outbox policy ignored for conventionally-routed senders #2596 fixed UseDurableOutboxOnAllSendingEndpoints does not work for EF Core #2588 (durable outbox policy on conventionally-routed senders) by pre-registering subscriptions on those endpoints, but the subscription matchedEndpoint.ShouldSendMessage— makingExplicitRouting(non-additive) short-circuit pastLocalRoutingfor handled messages. Result: locally-handled messages stopped routing to local handlers; explicit publish rules got duplicated against the conventional broker exchange. Now subscriptions added by a routing convention carry an internalSubscription.IsFromConventionflag andShouldSendMessageignores them. TheAllSenderspolicy still gates onSubscriptions.Any()(count, not provenance), so UseDurableOutboxOnAllSendingEndpoints does not work for EF Core #2588's outbox fix keeps working — verified by re-runningBug_2588+Bug_2304+Bug_topic_exchange_ignores_durable_outbox_policyreproducers across RabbitMQ / ASB / SQS / GCP Pub/Sub. Reworked the fourBug_2588_…tests to assert on the conventional broker sender directly viaIMessageRoutingConvention.DiscoverSendersinstead of via routing precedence (they were implicitly relying on the leak).end_to_end_publishing_to_critter_watch.run_for_quite_awhile_{in_critter_watch_mode,in_hybrid_mode}. Failing since commitd999a2e5(Feb 2026) which moved metrics export frombus.PublishAsync→ directIWolverineObserver.MessageHandlingMetricsExportedcallbacks. Test fixture stayed on the message-bus contract; default observer'sMessageHandlingMetricsExportedis no-op. Wire aMetricsCapturingObserverinto the runtime afterStartAsyncsoMetricsCollectionHandler.Collectedactually fills.CIMessageRoutingNuke target wired into the.NETworkflow so future routing-precedence regressions fail fast on PRs.MessageRoutingTestsruns against a real RabbitMQ broker (started inline by the build target viadocker compose up rabbitmq) — that's the only place this regression class manifests.Plus housekeeping: SQL Server image pinned to
2022-latest(2025-latest crashes on Linux/ARM), the slowinner_envelope_is_stamped_before_serializationtest moved out ofCoreTestsintoSlowTests, and aCLAUDE.mdnote documentinghost.MessageBus()overhost.Services.GetRequiredService<IMessageBus>()in tests.Test plan
.NETworkflow green (now also runsCIMessageRouting)rabbitmqworkflow green (Bug_2588 / Bug_2304 / Bug_topic reproducers)azure-service-busworkflow green (ASB Bug_2588 + topic-broadcasting variant)awsworkflow green (SQS Bug_2588)dotnet test src/Testing/MessageRoutingTests— 25/25dotnet test src/Testing/MetricsTests— 25/25 (~60s, slow tests)🤖 Generated with Claude Code