Skip to content

Bump AndreGoepel.Core and 8 others - #181

Closed
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/nuget/nuget-minor-patch-934f358db5
Closed

dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/nuget/nuget-minor-patch-934f358db5

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Aug 13, 2026 •

Copy link
Copy Markdown
Contributor

⚠️ Dependabot is rebasing this PR ⚠️

Rebasing might not happen immediately, so don't worry if this takes some time.

Note: if you make any changes to this PR yourself, they will take precedence over the rebase.


Pinned AndreGoepel.Core at 1.0.1.

Release notes

Sourced from AndreGoepel.Core's releases.

1.0.1

What's Changed

New Contributors

Full Changelog: andregoepel/core@v1.0.0...v1.0.1

Commits viewable in compare view.

Updated bunit from 2.8.6 to 2.9.0.

Release notes

Sourced from bunit's releases.

2.9.0

Changed

  • Update to stable package of AngleSharp.Css

Commits viewable in compare view.

Pinned Marten at 9.23.0.

Release notes

Sourced from Marten's releases.

9.23.0

Highlights

Store-agnostic document abstractions (#​5216)

Marten now implements the JasperFx.Events.Documents contract added in JasperFx 2.47.0, the shared document session surface behind the Wolverine aggregate-handler unification (wolverine#​3907).

Marten JasperFx contract
IQuerySession IDocumentReadOperations
IDocumentOperations IDocumentWriteOperations
IDocumentSession IDocumentSessionOperations
IDocumentStore IDocumentSessionFactory<IDocumentSession, IQuerySession>
MartenLinqQueryProvider IDocumentQueryExecutor

Marten already had every operation with matching signatures, so this is additive — existing code is unaffected. Marten passes all 42 tests in the shared document storage compliance suite.

Fixes

#​5210 — UseListenNotifyForEventAppends corrupted inline projections in the same transaction. NotifyEventAppendedOperation was marked NoDataReturnedCall but emitted select pg_notify(...), which returns a one-row result set. OperationPage.ApplyCallbacksAsync never advances the reader past a NoDataReturnedCall, so every later operation in the batch read the wrong result set — surfacing as spurious ConcurrencyExceptions and wrong document versions, far from the cause. Now uses the DO $$ BEGIN PERFORM pg_notify(...); END $$ form, which fires the identical notification and returns nothing.

HardDeleteWhere<T> could not remove already soft-deleted rows. It inherited the soft-delete exclusion filter, so a retention or purge sweep returned cleanly while leaving behind exactly the rows it existed to remove. HardDelete by id was unaffected, which made the API look correct when spot-checked.

#​5159 — UseOptimisticConcurrency and UseNumericRevisions were asymmetric. UseNumericRevisions(true) cleared the competing Guid version metadata; UseOptimisticConcurrency(true) did not clear the numeric revision metadata. The order of the two fluent calls therefore decided whether the configuration worked or threw at bootstrap. Both orders are now last-wins.

The bootstrap guard is narrowed rather than dropped, and now reports which case it is:

  • a projection-target document, where numeric revisions are load-bearing for the projection machinery, still throws
  • a revision declared on your own type (IRevisioned, ILongVersioned, a long [Version] member) still throws, naming the member — honoring the override would leave that property permanently unmapped
  • everything else is last-wins

#​5131 — StreamPagedByCursor<T> published typeof(void) as its OpenAPI response type, so endpoints returning it advertised a 200 with no schema at all. Now publishes a new CursorPagedResult<T>, mirroring what StreamPaged<T> already does with PagedResult<T>.

Hardening and docs

#​5213 — an audit test over the NoDataReturnedCall invariant. Reflects over every implementation and asserts its SQL cannot return a result set, so the class of bug behind #​5210 goes red at build time rather than surfacing as a version mismatch three operations later.

#​5212 — regression pins ported from Polecat, covering DeleteWhere not re-stamping mt_deleted_at on already-deleted rows.

#​5217 — documented Npgsql's Max Auto Prepare connection-string knob, including measurements showing no resolvable effect on read latency, and the reasons Marten does not enable prepared statements: generic plans displacing parameter-aware ones (which matters most under conjoined multi-tenancy, where a skewed tenant_id sits in nearly every predicate), per-connection plan memory, and runtime DDL invalidating cached plans.

New public API

  • Marten.AspNetCore.CursorPagedResult<T>
  • IQuerySession, IDocumentOperations, IDocumentSession and IDocumentStore now implement the corresponding JasperFx.Events.Documents contracts

Both are additive.

Not shipped

The opt-in LINQ query plan cache proposed in #​5013 / #​5018 was closed rather than merged. Benchmarking showed the cost it removes — LINQ parsing plus SQL generation — is 1.2 μs on the fastest realistic Marten query, against 28–56 μs of run-to-run variance on that same query. On a warm cache hit it allocated more than no cache at all, and in a conjoined multi-tenant store it cached nothing while paying two full LINQ parses per query. Details on #​5018.
... (truncated)

9.22.6

A fix-and-adoption release: a masking-rule fix, a broadened event-store compliance net, a CI overhaul, and the JasperFx 2.46.0 / Weasel 9.24.0 dependency adoptions.

Fixes

Every matching masking rule runs, not just the first (#​5199)

ApplyEventDataMasking used to stop at the first masking rule whose event type matched, so an event enrolled in two rules (say, one masking a name and another masking an address) only ever had the first applied. All matching rules now compose: each rule runs in registration order against the output of the previous one.

Test coverage

Compliance waves 6-8 + strong-typed identity (#​5198, #​5201, #​5203, #​5205)

Marten's event-store behavior is now enrolled in the shared JasperFx.Events.ComplianceTests suite for: stream compacting and event data masking (wave 6), projection rebuild/catch-up and dead letters (wave 7), conjoined event tenancy and subscriptions (wave 8), plus StrongTypedIdentityCompliance (#​5144). These pin Marten's behavior to the same contract Polecat and future stores are held to.

CI

One job per test project, supervised (#​5096, #​5208)

The monolithic CI test run is split into one job per test project running under Bobcat's supervisor, so a flaky suite no longer poisons the whole gate and failures name the project that produced them. Also removes stray ITestOutputHelper/debug logger injections from tests (#​5211).

Dependencies

  • JasperFx / JasperFx.Events 2.45.0 -> 2.46.0 — includes the high-water-detection memory fix for very high tenant counts (jasperfx#​644, the 2,000+ tenant OOM).
  • Weasel 9.23.2 -> 9.24.0 — parallel db-apply/db-assert across physical databases (weasel#​431/#​442), per-fingerprint schema stamp keying (weasel#​439), SQL Server CREATE DATABASE postcondition check (weasel#​415), discovery progress reporting (weasel#​432).

9.22.5

Two source-generator and test-harness fixes that both surfaced on projections built through AddProjectionWithServices, plus the JasperFx 2.42.2 adoption they ride on.

Fixes

The source generator no longer breaks a projection that takes dependencies (#​5192)

The bundled JasperFx.Events.SourceGenerator registers an EventProjection's discovered published document types (#​4166) by writing into your partial class. It used to emit a parameterless constructor to do it, which failed two ways for exactly the projections that need dependencies injected.

It broke the build outright against a primary constructor. C# requires every other constructor to chain through the primary one, so this failed with CS8862 inside the generated <T>.TypeRegistration.g.cs:

public partial class MyProjection(ILogger<MyProjection> logger) : EventProjection
{
    public override ValueTask ApplyAsync(IDocumentOperations operations, IEvent e, CancellationToken cancellation)
    {
        operations.Store(new Thing());
        return new ValueTask();
    }
}

And where it did compile, it silently did nothing. A projection registered through AddProjectionWithServices is built by the container, which calls the dependency-taking constructor — so the generated parameterless one never ran and the published types went unregistered. That also left the projection's teardown targets unregistered, so a rebuild did not wipe its documents.

Registration now rides an override of ProjectionBase.PublishedTypes(), which does not care how the instance was constructed.

Affects 9.22.3 and 9.22.4. Earlier versions discovered published types syntactically, so only an explicit ops.Store<Doc>(x) produced a registration and the far more common ops.Store(x) produced none — which meant the constructor was rarely emitted at all.

One behavior change to be aware of: the generator used to skip registration entirely when your class already had an explicit parameterless constructor, a guard that existed only because you cannot add a second one. An override has no such conflict, so those projections now get their published types registered too. That is the intended #​4166 behavior, but on upgrade it can newly provision document storage — and newly register teardown targets — for a projection that was quietly getting neither. If a projection writes into storage that must not be truncated on rebuild, set DeletePublishedTypesOnTeardown = false.

EventProjectionScenario no longer spends its wall clock asleep (#​5195, in part)

Almost none of a scenario's time was work. The harness wipes the event store and then starts the daemon, so the high-water agent's first look saw an empty store, read CaughtUp, and settled into SlowPollingTime — one second by default. Every append then raced a sleeping agent, and because the agent returns to CaughtUp after each batch drains, the cost recurred at every batch boundary. Since a boundary is how a scenario says "these appends must land in different daemon batches", the more precisely a test described its batching, the slower it got.

A scenario owns both the appends and the daemon that must notice them, so it now says so directly, through an in-process IDaemonWakeup — a semaphore release, no database round trip and no LISTEN/NOTIFY. Nothing about your store's polling configuration changes.

batch boundaries before after
1 ~1290ms ~300ms
3 ~3357ms ~815ms

A flat ~250ms per boundary remains, from a hard-coded poll delay in WaitForNonStaleDataAsync. That is the other half of #​5195 and is still open.

Dependencies

JasperFx / JasperFx.Events 2.42.2. Adopting it also enrolls Marten in the strong-typed identity event-sourcing compliance suite that landed in 2.42.0 (IComplianceStoreRegistrar.RegisterValueType<T>()), taking the shared cross-store suite to 167 passing tests against Marten.

9.22.4

What's Changed

Full Changelog: JasperFx/marten@V9.22.3...V9.22.4

9.22.3

What's Changed

Full Changelog: JasperFx/marten@V9.22.1...V9.22.3

9.22.1

Security release. Upgrade is recommended for anyone using sharded tenancy together with Events.UseTenantPartitionedEvents.

A tenant id was interpolated into a double-quoted PostgreSQL identifier without doubling an embedded double quote, so a tenant id containing one could terminate the identifier and execute additional SQL statements. This is a different class from the two advisories previously published on this repository, both of which were the single-quoted string-literal class; neither of those fixes addressed this.

You are affected only if you use sharded tenancy, have UseTenantPartitionedEvents enabled, and your application passes attacker-influenced input as a tenant id. Note that the reachable surface includes ordinary session resolution, not just administrative provisioning calls — GetTenantAsync / FindOrCreateDatabase auto-provision an unknown tenant. Applications using tenant ids from a trusted fixed set are not exploitable.

Affected versions: 9.4.0 through 9.22.0.

Full details, including remediation guidance for existing data, are in the security advisory: GHSA-3vp4-34pf-2rcw

What changed

  • PerTenantEventSequences.QuotedSequenceName escapes embedded quotes, matching quote_ident/%I so the name still resolves to the same object the quick-append function finds. Covers the create, drop, schema-apply and cleanup paths.
  • BulkEventAppender no longer builds an unquoted sequence name from a suffix read back out of the tenants table. This also fixes a functional bug: PreserveSourceSequence bulk imports previously failed with 42601 for hyphenated and GUID tenant ids under sharded tenancy.
  • ShardedTenancy validates tenant ids destined for DDL, closing a long-standing asymmetry with the DefaultTenancy provisioning path. It is a narrow denylist rather than the existing identifier allowlist, so hyphenated and GUID tenant ids keep working.

Dependency

Requires Weasel.Postgresql 9.21.1, which escapes partition bound values (JasperFx/weasel#​416). Both halves are needed; the dependency is pulled in automatically.

Credit to Barak Srour (Apiiro) for the report.

9.22.0

The partitioning feature is new, but otherwise this was all about CritterWatch improvements for a huge installation

What's Changed

Full Changelog: JasperFx/marten@V9.21.0...V9.22.0

9.21.0

Highlights

A small, low-risk release: two bug fixes reported against 9.20.x, a LINQ ordering fix, a Newtonsoft serialization fix, and a new health-check overload for Wolverine-managed daemon distribution.

[!NOTE]
There is a change to the mt_quick_append_events PostgreSQL function in this release, and applying it is NOT mandatory or required.

You do not need to patch your database, schedule a migration, or coordinate a deployment window to take 9.21.0. The client-side half of the #​5062 fix ships in the assembly, so upgrading the NuGet package alone is sufficient — 9.21.0 is correct against the function version you already have deployed.

Under the default AutoCreate.CreateOrUpdate the function is simply refreshed the next time Marten ensures event storage exists (a CREATE OR REPLACE FUNCTION, no lock on your event data). If you run AutoCreate.None with db-patch / db-apply, your next patch will contain one extra CREATE OR REPLACE FUNCTION … mt_quick_append_events statement — apply it whenever it suits your normal cadence. See the migration guide for details.

Bug Fixes

mt_quick_append_events returned {NULL} for an empty event array (#​5062, #​5088)

array_length('{}', 1) is NULL in PostgreSQL rather than 0, so calling the bulk append function with no events returned a bigint[] whose single element was NULL. Npgsql could not read that into long[], and the resulting InvalidCastException was thrown from the batch's post-processing loop — where it displaced whatever exception had actually made the append fail. Callers were left with an unrelated, non-retryable error instead of the real one; for the reporter that dead-lettered Wolverine messages which would otherwise have been retried.

Fixed on three fronts:

  • The function now COALESCEs the array length, so an empty append means what it says: zero events appended, final version unchanged.
  • The append operation no longer reads the returned array when the batch carries no events — this is what makes the fix effective without any database change.
  • The one code path in Marten that could reach the function with empty arrays (ProjectionUpdateBatch.WaitForCompletion, for an Append side effect that ended up with no events) no longer issues the call.

OrderBy against a dictionary indexer dropped the key (#​5063, #​5073)

OrderBy(x => x.SomeDictionary["key"]) generated SQL that ignored the indexer key, so the ordering was wrong (or arbitrary) rather than failing loudly.

Lazy LINQ sequences serialized as objects under Newtonsoft (#​5076, #​5080)

A document property holding a deferred-execution sequence (Select(...), Where(...) without a materializing call) was written by Newtonsoft as an iterator object rather than a JSON array, so it would not round-trip. These are now written as plain arrays.

IMessageBatch is called concurrently (#​5065, #​5085)

Not a behavior change, but a documentation fix worth flagging if you implement IMessageBatch yourself: the async daemon raises projection side effects from multiple threads at once (measured at up to 8 concurrent publishers across 10 threads for a single-stream projection catching up). The interface previously said nothing about this. An implementation that appends to an unsynchronized collection will silently drop messages — the same hazard, in a real outbox, that showed up here as a "flaky" test.

New

Provider-aware databaseFilter for the high-water health check (#​5061, #​5089)

AddMartenHighWaterHealthCheck's databaseFilter is captured at registration time, so it cannot resolve services — which makes it unable to express "the databases this node currently owns" when ownership is runtime state. That is precisely the case under Wolverine-managed daemon distribution, where agents are assigned per (database, tenant) and rebalanced over a node's lifetime.

There is now an overload whose filter receives the IServiceProvider and is re-evaluated on every probe:

Services.AddHealthChecks().AddMartenHighWaterHealthCheck(
    (services, database) => services.GetRequiredService<IWolverineRuntime>()
        .Agents.AllLocallyOwnedDatabaseIds()
        .Any(id => id.Name.EqualsIgnoreCase(database.Identifier)),
    staleThreshold: TimeSpan.FromSeconds(30),
    includeExternallyManaged: true);
 ... (truncated)

## 9.20.2

## What's Changed
* Fix NgramIndex to match NgramSearch's unaccent-aware mt_grams_vector expression by @​dat-honguyen in https://github.com/JasperFx/marten/pull/5060

## New Contributors
* @​dat-honguyen made their first contribution in https://github.com/JasperFx/marten/pull/5060

**Full Changelog**: https://github.com/JasperFx/marten/compare/V9.20.1...V9.20.2

## 9.20.1

Two real improvements:
1. Less log noise and faster/cleaner shutdowns at production time
2. Adjustments to the "high water mark" detection to ignore idle transactions from advisory locks in advancing the high water mark. This was a side effect of the extra work we did in 9.18 to try to stop event skipping from slow transactions

## What's Changed
* fix(#​4953): allocation fence keeps idle advisory-lock sessions from holding gap skips forever by @​jeremydmiller in https://github.com/JasperFx/marten/pull/5057
* Adopt JasperFx.Events 2.36.2: clear resolved daemons on coordinator stop, idempotent AddAsyncDaemon by @​jeremydmiller in https://github.com/JasperFx/marten/pull/5058


**Full Changelog**: https://github.com/JasperFx/marten/compare/V9.20.0...V9.20.1

## 9.20.0

Bug fixes around permutations of the natural key usage, new convenience mechanisms for querying for event store data

## What's Changed
* chore(deps-dev): bump find-my-way from 9.5.0 to 9.7.0 by @​dependabot[bot] in https://github.com/JasperFx/marten/pull/5045
* chore(deps-dev): bump postcss from 8.5.14 to 8.5.23 by @​dependabot[bot] in https://github.com/JasperFx/marten/pull/5046
* Retire the previous natural key row when the key changes (#​5041) by @​jeremydmiller in https://github.com/JasperFx/marten/pull/5049
* Add FetchStreamStatePlan + FetchStreamPlan: raw event stream fetches as batchable query plans by @​uniquelau in https://github.com/JasperFx/marten/pull/5043
* StreamEventState + StreamEvents result types for Marten.AspNetCore by @​jeremydmiller in https://github.com/JasperFx/marten/pull/5053
* Natural key table: scope the FK guard, and land the partitioned-FK repro (#​5044) by @​jeremydmiller in https://github.com/JasperFx/marten/pull/5050
* Adopt JasperFx.Events 2.36.0: shard failure classification, drain timeout docs, natural key extraction by @​jeremydmiller in https://github.com/JasperFx/marten/pull/5054


**Full Changelog**: https://github.com/JasperFx/marten/compare/V9.19.0...V9.20.0

Commits viewable in [compare view](https://github.com/JasperFx/marten/compare/V9.19.0...V9.23.0).
</details>

Pinned [Npgsql](https://github.com/npgsql/npgsql) at 8.0.9.

<details>
<summary>Release notes</summary>

_Sourced from [Npgsql's releases](https://github.com/npgsql/npgsql/releases)._

## 8.0.9

v8.0.9 contains several minor bug fixes.

[Milestone issues](https://github.com/npgsql/npgsql/milestone/133?closed=1)

**Full Changelog**: https://github.com/npgsql/npgsql/compare/v8.0.8...v8.0.9

## 8.0.8

v8.0.8 contains quite a few bug fixes.

**Full Changelog**: https://github.com/npgsql/npgsql/compare/v8.0.7...v8.0.8

## 8.0.7

v9.0.3 contains several bug fixes.

**Full Changelog**: https://github.com/npgsql/npgsql/compare/v8.0.6...v8.0.7

## 8.0.6

The full list of changes is available [here](https://github.com/npgsql/npgsql/milestone/121?closed=1).

**Full Changelog**: https://github.com/npgsql/npgsql/compare/v8.0.5...v8.0.6

## 8.0.5

8.0.5 contains quite a few fixes, everyone is strongly encouraged to upgrade.

The full list of changes is available [here](https://github.com/npgsql/npgsql/milestone/118?closed=1).

**Full Changelog**: https://github.com/npgsql/npgsql/compare/v8.0.4...v8.0.5

## 8.0.4

A large number of number of bugs have been fixed, [here is the full list](https://github.com/npgsql/npgsql/milestone/115?closed=1).

**Full Changelog**: https://github.com/npgsql/npgsql/compare/v8.0.3...v8.0.4

Commits viewable in [compare view](https://github.com/npgsql/npgsql/compare/v8.0.3...v8.0.9).
</details>

Pinned [Npgsql](https://github.com/npgsql/npgsql) at 9.0.5.

<details>
<summary>Release notes</summary>

_Sourced from [Npgsql's releases](https://github.com/npgsql/npgsql/releases)._

## 9.0.5

v9.0.5 contains several minor bug fixes.

[Milestone issues](https://github.com/npgsql/npgsql/milestone/131?closed=1)

**Full Changelog**: https://github.com/npgsql/npgsql/compare/v9.0.4...v9.0.5

Commits viewable in [compare view](https://github.com/npgsql/npgsql/compare/v9.0.4...v9.0.5).
</details>

Pinned [Quartz.Extensions.Hosting](https://github.com/quartznet/quartznet) at 3.19.1.

<details>
<summary>Release notes</summary>

_Sourced from [Quartz.Extensions.Hosting's releases](https://github.com/quartznet/quartznet/releases)._

## 3.19.1

Quartz.NET 3.19.1 is a small bug fix release with two targeted fixes: `DailyTimeIntervalTrigger` no longer gets stuck in an infinite fire loop on DST spring-forward days, and `StdSchedulerFactory.GetScheduler(schedName)` now creates the scheduler when the name asked for is its own. There are no API or schema changes, so it is a drop-in upgrade from 3.19.0.

## Highlights

- **`DailyTimeIntervalTrigger` no longer spins on DST transition days** — `GetFireTimeAfter` could return a time at or before the one it was given, which makes `QuartzSchedulerThread` fire the trigger, compute the same next fire time, and fire again — pinning a CPU core and flooding the log. Two independent causes, both on a spring-forward day: the DST correction added for #​1114 was applied to every interval size and in either direction (so every interval of an hour or less was affected, in every DST time zone), and the daily rollover to `StartTimeOfDay` reused whatever UTC offset the previous fire time carried (so in time zones that move the clock at midnight, such as Chile, `StartTimeOfDay` 00:00 resolved to an instant *before* the transition — the same instant that was passed in). Verified across 3024 combinations of 12 time zones, both transitions, 21 intervals and 6 start times: 468 combinations produced non-advancing fire times before, none do now. (#​3190, fixes #​332)
  - **Behavior change worth noting:** the same fix stops sub-hour triggers silently dropping the last hour of a **fall-back** day. A 5-minute trigger now fires 300 times through the 25-hour day, ending at 23:55 local, instead of 288 times ending at 22:55.
- **`StdSchedulerFactory.GetScheduler(schedName)` creates its own scheduler** — asking a factory for the scheduler it is configured to produce returned `null` until somebody had called `GetScheduler()` first. It now creates it. Any other name stays a pure lookup, so probing for a scheduler somebody else owns still has no side effects, and the name comparison is case-insensitive to match how `SchedulerRepository` indexes names. The DI factory has behaved this way since #​2845; this brings the property-configured factory in line. (#​3188, reported in #​2786, originally proposed in #​360)

## What's Changed
* Create the scheduler when it is looked up by its own name (#​360) by @​lahma in https://github.com/quartznet/quartznet/pull/3188
* Fix DailyTimeIntervalTrigger infinite fire loop during DST spring-forward (#​332) by @​lahma in https://github.com/quartznet/quartznet/pull/3190


**Full Changelog**: https://github.com/quartznet/quartznet/compare/v3.19.0...v3.19.1


## 3.19.0

Quartz.NET 3.19.0 is a feature release: it adds node affinity for clustered scheduling, a fluent cron-expression builder, and richer `L`/`LW` day-of-month expressions, plus clock-jump resilience and a modernized build and publishing pipeline. The public API is unchanged (all additions are additive), so it is a drop-in upgrade — with two things to note: the new node-affinity columns are an **optional** schema migration (the feature degrades gracefully without them), and a handful of previously-broken `L`/`LW`/`W` cron expressions now fire correctly (see below).

## Highlights

- **Node affinity for clustered trigger pinning** — pin a trigger to a preferred node with `TriggerBuilder.WithPreferredNode(...)`; the node is preferred for acquisition but the trigger is still stolen on failover so it is never stranded if that node goes down. Adds optional `PREFERRED_NODE` / `PREFERRED_NODE_AUTO` columns for ADO.NET job stores (`database/schema_30_add_preferred_node.sql`); when the columns are absent the scheduler logs a warning and behaves exactly as before. (#​3013, #​3144)
- **Fluent `CronExpressionBuilder`** — compose cron expressions programmatically, one field at a time, instead of hand-writing the string — handy when a schedule is assembled from user input such as a scheduling UI. (#​3139)
- **`L` and `LW` combinable with other day-of-month values** — the day-of-month field now accepts expressions such as `1,15,L` and the new `LW-n` / `L-nW` grammar. This also corrects several previously-buggy edge cases: `29W`/`31W` no longer silently skip short months, `L-30W` no longer throws mid-schedule, and `1,15W` now applies `W` to each day rather than only the first. **These corrections change the fire times of a few expressions that were previously broken** — review any stored `L`/`LW`/`W` day-of-month expressions. (#​2759)
- **Resilience to system clock jumps** — the misfire handler and cluster manager now clamp their sleep intervals after the system clock jumps forward or backward, so a clock step no longer causes a busy-spin or an absurdly long sleep. (#​3147, fixes #​1508)
- **Modernized build & publishing** — the build orchestrator moved from the unmaintained NUKE to Fallout (#​3163), and packages now publish to nuget.org via GitHub OIDC **trusted publishing** rather than a stored API key. Dependencies were also refreshed (#​3151).

**Note for `CronScheduleBuilder` users:** `AtHourAndMinuteOnGivenDaysOfWeek` / `WeeklyOnDayAndHourAndMinute` now emit textual day-of-week names (e.g. `MON,WED` rather than `2,4`). The schedules are identical, but the generated `CRON_EXPRESSION` string differs — relevant only if you compare stored cron strings byte-for-byte.

## What's Changed
* Serve Blazor plumbing under custom DashboardPath for prefix-forwarding reverse proxies (3.x) (#​3134) by @​lahma in https://github.com/quartznet/quartznet/pull/3137
* Add fluent CronExpressionBuilder for building cron expressions programmatically (3.x) by @​lahma in https://github.com/quartznet/quartznet/pull/3139
* Support for specifying 'L' and 'LW' with other days in day-of-month field by @​lahma in https://github.com/quartznet/quartznet/pull/2759
* Add preferred node (node affinity) for cluster trigger pinning by @​lahma in https://github.com/quartznet/quartznet/pull/3013
* Store auto-pin as a flag column instead of an "auto:" name prefix by @​lahma in https://github.com/quartznet/quartznet/pull/3144
* Clamp misfire handler and cluster manager sleeps after system clock jumps (#​1508) by @​lahma in https://github.com/quartznet/quartznet/pull/3147
* Update packages and cleanup by @​lahma in https://github.com/quartznet/quartznet/pull/3151
* Migrate the build from NUKE to Fallout (3.x) by @​lahma in https://github.com/quartznet/quartznet/pull/3163
* Exclude the build orchestrator from SonarQube analysis (3.x) by @​lahma in https://github.com/quartznet/quartznet/pull/3166
* Prepare v3.19.0 release by @​lahma in https://github.com/quartznet/quartznet/pull/3169


**Full Changelog**: https://github.com/quartznet/quartznet/compare/v3.18.2...v3.19.0


Commits viewable in [compare view](https://github.com/quartznet/quartznet/compare/v3.18.2...v3.19.1).
</details>

Pinned [Quartz.Serialization.SystemTextJson](https://github.com/quartznet/quartznet) at 3.19.1.

<details>
<summary>Release notes</summary>

_Sourced from [Quartz.Serialization.SystemTextJson's releases](https://github.com/quartznet/quartznet/releases)._

## 3.19.1

Quartz.NET 3.19.1 is a small bug fix release with two targeted fixes: `DailyTimeIntervalTrigger` no longer gets stuck in an infinite fire loop on DST spring-forward days, and `StdSchedulerFactory.GetScheduler(schedName)` now creates the scheduler when the name asked for is its own. There are no API or schema changes, so it is a drop-in upgrade from 3.19.0.

## Highlights

- **`DailyTimeIntervalTrigger` no longer spins on DST transition days** — `GetFireTimeAfter` could return a time at or before the one it was given, which makes `QuartzSchedulerThread` fire the trigger, compute the same next fire time, and fire again — pinning a CPU core and flooding the log. Two independent causes, both on a spring-forward day: the DST correction added for #​1114 was applied to every interval size and in either direction (so every interval of an hour or less was affected, in every DST time zone), and the daily rollover to `StartTimeOfDay` reused whatever UTC offset the previous fire time carried (so in time zones that move the clock at midnight, such as Chile, `StartTimeOfDay` 00:00 resolved to an instant *before* the transition — the same instant that was passed in). Verified across 3024 combinations of 12 time zones, both transitions, 21 intervals and 6 start times: 468 combinations produced non-advancing fire times before, none do now. (#​3190, fixes #​332)
  - **Behavior change worth noting:** the same fix stops sub-hour triggers silently dropping the last hour of a **fall-back** day. A 5-minute trigger now fires 300 times through the 25-hour day, ending at 23:55 local, instead of 288 times ending at 22:55.
- **`StdSchedulerFactory.GetScheduler(schedName)` creates its own scheduler** — asking a factory for the scheduler it is configured to produce returned `null` until somebody had called `GetScheduler()` first. It now creates it. Any other name stays a pure lookup, so probing for a scheduler somebody else owns still has no side effects, and the name comparison is case-insensitive to match how `SchedulerRepository` indexes names. The DI factory has behaved this way since #​2845; this brings the property-configured factory in line. (#​3188, reported in #​2786, originally proposed in #​360)

## What's Changed
* Create the scheduler when it is looked up by its own name (#​360) by @​lahma in https://github.com/quartznet/quartznet/pull/3188
* Fix DailyTimeIntervalTrigger infinite fire loop during DST spring-forward (#​332) by @​lahma in https://github.com/quartznet/quartznet/pull/3190


**Full Changelog**: https://github.com/quartznet/quartznet/compare/v3.19.0...v3.19.1


## 3.19.0

Quartz.NET 3.19.0 is a feature release: it adds node affinity for clustered scheduling, a fluent cron-expression builder, and richer `L`/`LW` day-of-month expressions, plus clock-jump resilience and a modernized build and publishing pipeline. The public API is unchanged (all additions are additive), so it is a drop-in upgrade — with two things to note: the new node-affinity columns are an **optional** schema migration (the feature degrades gracefully without them), and a handful of previously-broken `L`/`LW`/`W` cron expressions now fire correctly (see below).

## Highlights

- **Node affinity for clustered trigger pinning** — pin a trigger to a preferred node with `TriggerBuilder.WithPreferredNode(...)`; the node is preferred for acquisition but the trigger is still stolen on failover so it is never stranded if that node goes down. Adds optional `PREFERRED_NODE` / `PREFERRED_NODE_AUTO` columns for ADO.NET job stores (`database/schema_30_add_preferred_node.sql`); when the columns are absent the scheduler logs a warning and behaves exactly as before. (#​3013, #​3144)
- **Fluent `CronExpressionBuilder`** — compose cron expressions programmatically, one field at a time, instead of hand-writing the string — handy when a schedule is assembled from user input such as a scheduling UI. (#​3139)
- **`L` and `LW` combinable with other day-of-month values** — the day-of-month field now accepts expressions such as `1,15,L` and the new `LW-n` / `L-nW` grammar. This also corrects several previously-buggy edge cases: `29W`/`31W` no longer silently skip short months, `L-30W` no longer throws mid-schedule, and `1,15W` now applies `W` to each day rather than only the first. **These corrections change the fire times of a few expressions that were previously broken** — review any stored `L`/`LW`/`W` day-of-month expressions. (#​2759)
- **Resilience to system clock jumps** — the misfire handler and cluster manager now clamp their sleep intervals after the system clock jumps forward or backward, so a clock step no longer causes a busy-spin or an absurdly long sleep. (#​3147, fixes #​1508)
- **Modernized build & publishing** — the build orchestrator moved from the unmaintained NUKE to Fallout (#​3163), and packages now publish to nuget.org via GitHub OIDC **trusted publishing** rather than a stored API key. Dependencies were also refreshed (#​3151).

**Note for `CronScheduleBuilder` users:** `AtHourAndMinuteOnGivenDaysOfWeek` / `WeeklyOnDayAndHourAndMinute` now emit textual day-of-week names (e.g. `MON,WED` rather than `2,4`). The schedules are identical, but the generated `CRON_EXPRESSION` string differs — relevant only if you compare stored cron strings byte-for-byte.

## What's Changed
* Serve Blazor plumbing under custom DashboardPath for prefix-forwarding reverse proxies (3.x) (#​3134) by @​lahma in https://github.com/quartznet/quartznet/pull/3137
* Add fluent CronExpressionBuilder for building cron expressions programmatically (3.x) by @​lahma in https://github.com/quartznet/quartznet/pull/3139
* Support for specifying 'L' and 'LW' with other days in day-of-month field by @​lahma in https://github.com/quartznet/quartznet/pull/2759
* Add preferred node (node affinity) for cluster trigger pinning by @​lahma in https://github.com/quartznet/quartznet/pull/3013
* Store auto-pin as a flag column instead of an "auto:" name prefix by @​lahma in https://github.com/quartznet/quartznet/pull/3144
* Clamp misfire handler and cluster manager sleeps after system clock jumps (#​1508) by @​lahma in https://github.com/quartznet/quartznet/pull/3147
* Update packages and cleanup by @​lahma in https://github.com/quartznet/quartznet/pull/3151
* Migrate the build from NUKE to Fallout (3.x) by @​lahma in https://github.com/quartznet/quartznet/pull/3163
* Exclude the build orchestrator from SonarQube analysis (3.x) by @​lahma in https://github.com/quartznet/quartznet/pull/3166
* Prepare v3.19.0 release by @​lahma in https://github.com/quartznet/quartznet/pull/3169


**Full Changelog**: https://github.com/quartznet/quartznet/compare/v3.18.2...v3.19.0


Commits viewable in [compare view](https://github.com/quartznet/quartznet/compare/v3.18.2...v3.19.1).
</details>

Pinned [Radzen.Blazor](https://github.com/radzenhq/radzen-blazor) at 11.2.4.

<details>
<summary>Release notes</summary>

_Sourced from [Radzen.Blazor's releases](https://github.com/radzenhq/radzen-blazor/releases)._

## 11.2.4

# 11.2.4 - 2026-08-13

### Improvements
- **RadzenDataGrid** - grouping can now be defined declaratively with the new `Groups` parameter. Thanks to @​Radium001!
- **Themes** - updated premium themes

### Fixes
- **RadzenDataGrid** - column widths no longer jump when a column is resized - the resize logic used the currently drawn width instead of the intended one, and `ColumnResized` now reports the intended width. Thanks to @​I-Info!
- **RadzenDataGrid** - `Reset` now also clears expanded child data, edit state and the expand-all flag. Fixes #​2651
- **RadzenDataGrid** - column visibility from before grouping is restored when a group is removed and the intended visibility is saved in settings
- **RadzenDataGrid** - the CheckBoxList filter no longer shows an empty list after a value is auto-applied - the available values are reloaded and the popup re-rendered on close
- **RadzenDatePicker** - a cleared time no longer reappears when a new date is selected - clearing the value did not reset the cached time picker state - and pending hour, minute and second edits are now applied together on Ok instead of only the last one
- **RadzenDatePicker** - the input no longer swallows the first keystroke after pressing Enter - the keydown preventDefault flag was applied client-side one keystroke late, so Ctrl+A, Delete, caret movement or a typed character right after Enter could be lost and clearing the value with the keyboard could silently fail
- **RadzenSpreadsheet** - unsupported '#' input can no longer overflow the formula parser - the lexer end token is now always emitted. Fixes #​2658
- **RadzenSpreadsheet** - keyboard navigation now skips hidden rows and columns. Fixes #​2657
- **RadzenSpreadsheet** - accepting an empty value now clears the cell instead of storing a phantom newline. Fixes #​2656
- **RadzenSpreadsheet** - the last column and row are now rendered when all others are frozen. Fixes #​2644
- **RadzenGantt** - Shift+Scroll over the data grid now scrolls it horizontally instead of being forwarded as vertical scroll. Fixes #​2655
- **RadzenProfileMenu** - the toggle is now handled server-side so clicks before JS initialization work. Fixes #​2653
- **RadzenSplitButton** - item icons are now centered vertically in Small and ExtraSmall popups. Fixes #​2654


## 11.2.3

# 11.2.3 - 2026-08-11

### Improvements
- **RadzenProgressBar** and **RadzenProgressBarCircular** - new `BufferValue` parameter displays a secondary buffer indicator ahead of the primary value, e.g. for media buffering. Thanks to @​pfs26!
- **DialogService** - the generic dialog methods now accept any type implementing `IComponent` instead of requiring `ComponentBase`. Thanks to @​drewcav96!
- **RadzenSpreadsheet** - conditional formatting is now imported from and exported to XLSX files. Fixes #​2645

### Fixes
- **RadzenSplitButton** - the popup now opens reliably on Blazor Server even when the toggle is clicked right after the page loads. Clicks during the JS initialization round trip used to flip server state without showing the popup, leaving the button dead with `aria-expanded="true"`. The popup is now driven entirely server-side and `aria-expanded` stays in sync when it is closed by clicking outside. Fixes #​2650
- **RadzenDatePicker** - the popup no longer intermittently stops opening after rapid re-renders - a stale JS dispose could remove the freshly attached click handler. The trigger also works during initial page load on high-latency connections now that it no longer depends on JS handlers attached after render. Fixes #​2646
- **RadzenSecurityCode** and **RadzenSlider** - keyboard and drag handlers are no longer removed by a stale JS dispose when the component re-renders rapidly.
- **RadzenMenu** - submenu clicks are handled by a static listener and now work immediately after page load, even before Blazor becomes interactive.
- **Keyboard navigation** - opening a popup with a key whose default action scrolls the page (ArrowDown on RadzenSplitButton, Space on RadzenDropDown, RadzenListBox, RadzenColorPicker and RadzenProfileMenu) no longer scrolls and instantly closes the popup on scrollable pages.
- **RadzenDataGrid** - client-side filtering is no longer applied to self-referencing hierarchies when `LoadData` is used. Fixes #​2649
- **RadzenChart** - stacked series render significantly faster - compiled property getters are now cached instead of recompiled on every access.
- **RadzenChat** - mention search keeps working when the search text contains spaces while a mention is active. Thanks to @​artnim!
- **RadzenChat** - keyboard navigation in the mention popup now works reliably - render-time preventDefault was replaced with a native keydown guard.
- **RadzenSelectBar** - background color is now correct in the Material, Default, Humanistic and Software themes.
- **TooltipService** - no longer modifies the caller's `TooltipOptions` instance, so shared options objects can be reused safely. Fixes #​2641


## 11.2.2

# 11.2.2 - 2026-08-04

### Improvements
- **RadzenDropDown**, **RadzenListBox** and **RadzenDropDownDataGrid** - Ctrl+A now selects all items in multiple selection when `AllowSelectAll` is enabled - press again to clear the selection. The shortcut is documented in the Keyboard Navigation section of each component.

### Fixes
- **RadzenDropDown** and **RadzenDropDownDataGrid** - the popup no longer flickers when clicking a component with `OpenOnFocus` and no longer reopens when clicking outside of it. Clicking the component while its popup is open now closes it. Fixes #​2640
- **RadzenDataGrid** - self-reference hierarchy view no longer degrades to O(n²) per enumeration - grids with tens of thousands of rows render instantly instead of taking seconds. Fixes #​2637
- **RadzenDataGrid** - custom column filter expressions are now applied even when no other filters are active (#​2639).
- **RadzenSpreadsheet** - opening xlsx files with shared formulas no longer fails - `XlsxReader` and `XlsxWriter` now support them. Fixes #​2638


## 11.2.1

# 11.2.1 - 2026-08-03

### Improvements
- **RadzenSpreadsheet** - copy and cut now highlight the source cell range with an animated marching ants marquee (#​2625).
- **RadzenDatePicker** - now passes its `InputSize` to the calendar inputs - Month and Year drop downs and Hour, Minutes and Seconds numerics.

### Fixes
- **RadzenCarousel** - pages align correctly when `ItemsPerPage` is an even number - middle pages no longer show neighboring items cut in half and the pager no longer jumps back after navigation.

## 11.2.0

# 11.2.0 - 2026-07-30

### Fixes
- **RadzenUpload** - no longer throws `NullReferenceException` in `OnAfterRenderAsync` when re-rendered or disposed while its JS handlers are being recreated, and no longer raises `Complete` twice for a single upload. Fixes #​2635.
- **RadzenDataGrid, RadzenDatePicker, RadzenDropDown, RadzenFileInput** - no longer leak a .NET JS interop proxy every time their JS handlers are recreated.
- **RadzenAccordion, RadzenAutoComplete, RadzenCarousel, RadzenFormField, RadzenGoogleMap, RadzenHtmlEditor, RadzenMask, RadzenMenu, RadzenNumeric, RadzenProfileMenu, RadzenSecurityCode, RadzenSignaturePad, RadzenSlider, RadzenSplitButton** - protected against the same JS handler race that could throw `NullReferenceException` or attach duplicate JS event handlers.

## 11.1.9

# 11.1.9 - 2026-07-29

### Improvements
- **RadzenDataGrid, RadzenDataList, RadzenPivotDataGrid, RadzenPager** - new `PagerInputSize` parameter (`InputSize` on `RadzenPager`) controls the size of the page size dropdown. Fixes #​2631.
- **RadzenPanelMenuItem** - new `SelectedChanged` event callback. Binding `Selected` (e.g. `@​bind-Selected`) now disables automatic selection from URL matching so the parameter fully controls the selected state. Fixes #​2629.
- **RadzenChart, RadzenSankeyDiagram, RadzenSpiderChart** - a console warning is now logged when a chart tooltip is about to open but no `RadzenChartTooltip` component is present, instead of failing silently. The chart tooltip demo now documents the requirement. Fixes #​2628.

### Fixes
- **RadzenDropDown, RadzenDropDownDataGrid** - the `SearchText` parameter is now updated correctly when used together with `LoadData`. `SearchTextChanged` is raised before invoking `LoadData`, so the re-rendering parent no longer writes the stale bound value back into the component. Thanks to @​tharreck! (#​2634)
- **RadzenRadioButtonList, RadzenCheckBoxList** - the first Tab press after arrow key navigation (or after freshly focusing the list) is no longer suppressed - focus moves away immediately. Arrows, Home, End, Space and Enter still select without scrolling the page. Fixes #​2633.
- **RadzenChart** - tooltips now cap their width and wrap long `TooltipTemplate` content instead of rendering as one unwrapped line overlaying the page. The cap is themeable via the new `--rz-chart-tooltip-max-width` variable (default `min(30rem, 90vw)`). Fixes #​2630.
- **RadzenDialog** - a resizable dialog no longer latches its size when its content reflows; the resized size is only applied after the user actually resizes the dialog. Thanks to @​I-Info!


## 11.1.8

# 11.1.8 - 2026-07-27

### Fixes
- **RadzenTextBox, RadzenTextArea, RadzenMask, RadzenPassword, RadzenAutoComplete** - bound inputs no longer reset their displayed value when used inside a `RenderFragment` created by another component - most commonly inline dialog content passed to `DialogService.OpenAsync`. Such fragments never re-flow parameters, so the component kept a stale value and wiped the typed text from the input on blur while the bound variable kept it. The local value assignment is now unconditional, matching Blazor's own `InputBase` behavior.
- **Popups** - popups no longer get permanently stuck open when the closing animation never runs or is canceled - e.g. app-level CSS such as reduced-motion resets with `animation: none`. Closing now hides the popup immediately when no close animation is actually running, and the `ClosePopup()` API reliably recovers a stuck popup. Fixes #​2601.
- **RadzenDialog** - opening a nested dialog no longer breaks resize and drag handling of the outer dialog. Each dialog now has its own resize observer and titlebar drag handler instead of sharing a single global slot. Thanks to @​I-Info!
- **RadzenUpload** - the `Method` and `Stream` parameters are now honored when uploading via the `Upload()` method with `Auto=false`. The manual upload path always sent a POST multipart request regardless of the configured method.


Commits viewable in [compare view](https://github.com/radzenhq/radzen-blazor/compare/v11.1.7...v11.2.4).
</details>

Pinned [WolverineFx.Marten](http://github.com/jasperfx/wolverine) at 6.27.1.

<details>
<summary>Release notes</summary>

_Sourced from [WolverineFx.Marten's releases](http://github.com/jasperfx/wolverine/releases)._

## 6.27.1

## Wolverine 6.27.1

A same-day patch on 6.27.0, fixing a regression that release introduced and closing the asymmetry that surfaced it.

### Regression fix: `[WriteAggregate]` lost its not-found guard in 6.27.0

`WriteAggregateAttribute` derives from `WriteModelAttribute` and overrides neither `Modify` nor `Required`, so it inherited 6.27.0's nullability inference (GH-3916) wholesale. `[WriteAggregate]` shipped a year before that inference, so in 6.27.0 an existing handler like:

```csharp
public static Events Handle(RecordDeposit command, [WriteAggregate] Account? account)

silently lost its not-found guard and began running against a model that was never loaded — for a write model, that means appending events against a stream that was not fetched.

[WriteAggregate] and [ReadAggregate] now pin the unconditional Required = true they have always had, in Marten, Polecat and Fisher alike. Say Required = false explicitly, or move to [WriteModel] / [ReadModel], to opt out.

If you are on 6.27.0 and use [WriteAggregate] with a nullable parameter and no explicit Required, upgrade.

[ReadModel] takes Required from the parameter's nullable annotation (#​3929)

Matching what GH-3916 did for [WriteModel]: Order order is required and gets a not-found guard, Order? order is not and is handed to your method as null so your own null branch runs. An explicit Required at the call site still wins over the annotation.

This closes the write/read asymmetry — a handler moving between the two forms no longer needs a different attribute spelling for identical intent.

What deliberately did not change

  • [Entity] keeps its unconditional Required = true. It is the oldest and most widely used of these attributes and is heavily used in HTTP endpoints, where Required = true with OnMissing.Simple404 is the documented 404 behaviour. Loosening it would turn a clean 404 into a runtime NullReferenceException in an endpoint body.
  • [DeciderFunction] and [DcbModel] keep Required = false. Their model is folded out of an event stream or boundary and is always materialized, so absence is not the normal case; inferring here would tighten the default and could stop messages that process today.

Worth knowing

In an assembly compiled with <Nullable>disable</Nullable> a reference-type parameter reads as unknown rather than nullable, so [WriteModel] and [ReadModel] fall back to Required = true. The inference is a no-op for those projects rather than a silent behaviour change. Now documented in the persistence guide.

6.27.0

Wolverine 6.27.0

New: WolverineFx.Fisher

Fisher — the embedded SQLite document database and event store — is now a first-class Wolverine persistence integration, alongside Marten and Polecat.

builder.Services.AddFisher(opts => opts.Connection("Data Source=app.db"))
    .ApplyAllDatabaseChangesOnStartup()
    .IntegrateWithWolverine();

A Fisher-backed service is zero-infrastructure: no server, no container, no network. The transactional inbox/outbox, saga storage and the full aggregate handler workflow all work, and the store-agnostic [WriteModel] / [ReadModel] / [DeciderFunction] / [DcbModel] attributes run against it unchanged — the same handler code compiles and runs on any of the three stores.

Two SQLite realities shape it, both documented:

  • One writer per file. Wolverine's durability tables commit on Fisher's own connection inside Fisher's transaction. A second connection to the same file is a second writer and presents as a hang rather than an error.
  • DurabilityMode.Solo. Leader election and agent distribution need several nodes sharing one database; a Fisher store is a file.

Ancillary stores work too. AddFisherStore<T>().IntegrateWithWolverine() is supported, and [Storage(typeof(IMyStore))] routes a handler to it without naming Fisher in the consumer's source.

Not in this first release, each for a reason rather than for lack of time: multi-tenancy (Fisher's tenancy is a file per tenant), cluster durability modes, and transport schema stamping (SQLite has no schemas). See Fisher Integration.

Requires Fisher 0.6.0.

New: [DcbModel] — Dynamic Consistency Boundaries, store-agnostic

The DCB workflow joins the store-agnostic vocabulary in Wolverine core. Where [WriteModel] is about one stream, [DcbModel] spans every stream whose events match a tag query, with the store asserting at commit that no matching event landed in the meantime.

public static EventTagQuery Load(ReserveSeat command)
    => EventTagQuery.For(command.ScreeningId).Or(command.CustomerId);

public static SeatReserved Handle(ReserveSeat command, [DcbModel] SeatAvailability availability)
    => new(command.ScreeningId, command.CustomerId);

Wolverine.Marten.BoundaryModelAttribute and Wolverine.Polecat.BoundaryModelAttribute now inherit from it and behave identically — existing [BoundaryModel] code needs no change. Prefer [DcbModel] in new code.

[WriteModel] fixes

  • Required now defaults from the parameter's nullable annotation (#​3916). Order order is required and gets a not-found guard; Order? order is not, and is handed to your method as null so your own null branch runs. A nullable annotation with Required = true was a contradiction that silently resolved in favour of the attribute default, making the handler's null branch dead code. Setting Required explicitly still overrides the annotation either way.

    ⚠️ Behaviour change for a handler with a nullable model parameter that relied on the implicit guard. Set Required = true explicitly to keep it.

  • [Identity] is now honoured (#​3918). [DeciderFunction] always respected [Identity] on the command member; [WriteModel] did not, so the same command against the same model needed an explicit [WriteModel("...")] under one form and nothing under the other. Resolution order is now: explicit [WriteModel("orderId")], then [Identity], then {Model}Id, then id, then a strong typed id match.

Amazon SQS: oversized messages (#​3926)

A message too big for SQS is no longer retried forever. SQS caps a message at 256KB and rejects a larger one with InvalidParameterValue - Message must be shorter than 262144 bytes (SenderFault: true). SenderFault: true means the identical request will fail identically forever, but Wolverine treated it as a transient send failure and re-queued it — which is why this presented as a flood of identical errors rather than one. An oversized message is now logged once and discarded.
... (truncated)

6.26.0

Upgrade note

This release moves the Critter Stack dependencies forward together:

package from to
JasperFx, JasperFx.Events (+ both source generators) 2.46.0 2.47.0
Marten, Marten.AspNetCore, Marten.Newtonsoft 9.22.6 9.23.0
Polecat [5.7.0,6.0.0) (resolving to 5.7.0) [5.12.0,6.0.0)

Polecat users get the larger jump of the two: the old range pin resolved to its 5.7.0 floor, so this is 5.7.0 → 5.12.0 in practice.

If you reference JasperFx.Events.SourceGenerator explicitly and reference Polecat, you may hit CS0433 ("the type <X>Evolver exists in both <YourAssembly> and <YourAssembly>"). The generator ships both bundled inside the Polecat nupkg and as a standalone package; when the two copies are the same version they load as two analyzer instances and each emits every projection's Evolver dispatcher. Polecat 5.12.0 bundles 2.47.0, which is what this release pins, so the pair now matches. The fix is to drop one instance — see PolecatTests.csproj for the DropDuplicateBundledEventSourceGenerator target we use, which keeps the explicitly-pinned generator and removes the bundled duplicate.

Two new packages

WolverineFx.DataAnnotationsValidation and WolverineFx.FluentValidation.Grpc are published for the first time in this release. Both were documented as installable but had never actually shipped — every version returned BlobNotFound from nuget.org — because each declared a PackageId while being absent from the packaging list. If you followed the Data Annotations validation or gRPC error details docs and found the package missing, it exists now. A build-time check keeps the two lists from drifting apart again. (#​3905, #​3909)

Fixes

A [WriteAggregate]-only chain now reports IsTransactional correctly. The Marten and Polecat aggregate handler workflows appended a SaveChangesAsync postprocessor but never set IChain.IsTransactional, so a chain reported having no transactional middleware while its generated code committed. The disagreement was visible to IHttpPolicy authors, who had no reliable signal for whether a chain would commit — the workaround was an unused IDocumentSession parameter on every such endpoint, purely to flip the detection. Thanks to @​esond for the report and the fix. (#​3893, #​3901)

Outgoing batches no longer serialize eagerly. OutgoingMessageBatch built its contiguous byte[] in its constructor whether or not anything read it. (#​3906)

Aggregate handler workflow unification (#​3907, increment one)

Wolverine has carried two near-identical copies of the aggregate handler workflow — one in Wolverine.Marten, one in Wolverine.Polecat — and improvements had been landing on one copy at a time. This release starts implementing it once, in core.

Nothing is retired and no public API changes. [WriteAggregate], [ReadAggregate], [AggregateHandler], [ConsistentAggregate], Events, MartenOps/PolecatOps and the rest of each integration's surface stay exactly where they are.

What landed:

  • The drift between the two copies is reconciled, taking whichever side was correct rather than merging mechanically. The substantive one: AggregateHandling.DetermineVersionMember now returns MemberInfo? — Marten's copy used a null-forgiving operator that was masking a real null from IAggregateVersioning.VersionMember. Polecat regains AOT annotations it had dropped. Two reflectively-closed codegen frames widen a class constraint to notnull, matching IEventStream<T>'s own declaration; the narrower form threw for a struct aggregate instead of generating the same correct code.
  • IEventSourcingFrameProvider, the store seam — deliberately a s...

Description has been truncated

Bumps AndreGoepel.Core from 1.0.0 to 1.0.1
Bumps bunit from 2.8.6 to 2.9.0
Bumps Marten from 9.19.0 to 9.23.0
Bumps Npgsql to 8.0.9, 9.0.5
Bumps Quartz.Extensions.Hosting from 3.18.2 to 3.19.1
Bumps Quartz.Serialization.SystemTextJson from 3.18.2 to 3.19.1
Bumps Radzen.Blazor from 11.1.7 to 11.2.4
Bumps WolverineFx.Marten from 6.22.0 to 6.27.1
Bumps WolverineFx.RuntimeCompilation from 6.22.0 to 6.27.1

---
updated-dependencies:
- dependency-name: AndreGoepel.Core
  dependency-version: 1.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: nuget-minor-patch
- dependency-name: bunit
  dependency-version: 2.9.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: nuget-minor-patch
- dependency-name: Marten
  dependency-version: 9.23.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: nuget-minor-patch
- dependency-name: Npgsql
  dependency-version: 8.0.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: nuget-minor-patch
- dependency-name: Npgsql
  dependency-version: 9.0.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: nuget-minor-patch
- dependency-name: Quartz.Extensions.Hosting
  dependency-version: 3.19.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: nuget-minor-patch
- dependency-name: Quartz.Serialization.SystemTextJson
  dependency-version: 3.19.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: nuget-minor-patch
- dependency-name: Radzen.Blazor
  dependency-version: 11.2.4
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: nuget-minor-patch
- dependency-name: WolverineFx.Marten
  dependency-version: 6.27.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: nuget-minor-patch
- dependency-name: WolverineFx.RuntimeCompilation
  dependency-version: 6.27.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: nuget-minor-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added .NET Pull requests that update .NET code dependencies Pull requests that update a dependency file labels Aug 13, 2026
@andregoepel

Copy link
Copy Markdown
Owner

Superseded by #182, which carries the same updates from the same base (a7e3f0b). The only difference is the bunit 2.9.0 bump, and that is already on main via #174. Closing to keep one PR for this group; #182 will be regenerated against the current main.

@dependabot @github

dependabot Bot commented on behalf of github Aug 13, 2026

Copy link
Copy Markdown
Contributor Author

This pull request was built based on a group rule. Closing it will not ignore any of these versions in future pull requests.

To ignore these dependencies, configure ignore rules in dependabot.yml

@dependabot
dependabot Bot deleted the dependabot/nuget/nuget-minor-patch-934f358db5 branch August 13, 2026 16:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file .NET Pull requests that update .NET code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant