Skip to content

chore(deps): Bump the minor-and-patch group with 10 updates - #324

Open
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/nuget/backend/minor-and-patch-19bf7f5afc
Open

chore(deps): Bump the minor-and-patch group with 10 updates#324
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/nuget/backend/minor-and-patch-19bf7f5afc

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Jul 30, 2026

Copy link
Copy Markdown
Contributor

Updated Anthropic from 12.35.1 to 12.39.0.

Updated Marten from 9.15.4 to 9.21.0.

Release notes

Sourced from Marten's releases.

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

## 9.19.0

Marten 9.19.0 is a maintenance release adopting the coordinated **JasperFx / JasperFx.Events 2.35.0** drop, with a new projection side-effect capability and a secondary-store fix.

## Event sourcing

- **`RaiseSideEffects` slice-identity overload** — JasperFx.Events 2.35.0 (jasperfx#​561) adds a backwards-compatible aggregation-projection overload `RaiseSideEffects(IDocumentOperations operations, TId id, IEventSlice<TDoc> slice)`. The new `id` parameter hands you the slice identity **even when `slice.Snapshot` is null** because the aggregate was deleted in the same batch — so a `MultiStreamProjection` can recover the aggregate key to emit a follow-on event or publish a message on deletion. The original two-argument overload is unchanged, and the new one delegates to it by default. Documented with a compiled sample in [Side Effects](https://martendb.io/events/projections/side-effects).

## Fixes

- **#​5039** — `SecondaryStoreConfig.Build` threw `UriFormatException` when a secondary store was registered with a **generic** marker interface (e.g. `AddMartenStore<IMartenStoreMarker<MyContext>>()`). A closed generic CLR type name contains a backtick + arity, which is not a valid URI host. The `marten://` subject is now sanitized (arity stripped, generic argument names folded in so distinct closed generics still map to distinct subjects).

## Dependencies

- JasperFx / JasperFx.Events / JasperFx.Events.SourceGenerator / JasperFx.SourceGenerator → **2.35.0**
- Weasel.Postgresql / Weasel.Storage → 9.17.0 (unchanged)

## Notes

- The LINQ query-plan cache proposal (#​5013 / #​5018) is **not** in this releasereview surfaced a correctness gap on null filter values; it remains open for a follow-up.
- #​5001 (`running_on_node` under managed distribution) is resolved on the Marten side and closed; the node-stamping half ships in the JasperFx 2.35.0 / Wolverine distribution layer.


## 9.18.0

Marten 9.18.0 focuses on **raw-JSON streaming endpoints for ASP.NET Core**, **server-side LINQ `Select()` projection**, and continued **event-store observability** work.

## ASP.NET Core streaming & pagination

- **`StreamPaged<T>`** — stream a paged JSON envelope (`pageNumber`/`pageSize`/`totalItemCount`/`pageCount`/`hasNextPage`/`hasPreviousPage`/`items`) in a **single** round trip via a `count(*) OVER()` window column (#​5014). Test coverage hardened to pin the camelCase wire contract, page-past-end behavior, and filtered totals (#​5028).
- **`StreamPagedByCursor<T>`** — keyset ("seek") pagination that costs the same regardless of depth, using an opaque continuation cursor (#​5016). Now streams the **raw, already-persisted `data` column** byte-identical to `StreamMany`/`StreamPaged` (no hydrate + re-serialize) by reading the next cursor's ORDER BY key values off the same reader; a malformed client-supplied cursor now returns a clean **400** instead of a 500 (#​5033).
- **ETag / `If-None-Match` (304)** conditional-request support on `StreamOne<T>` and `StreamAggregate<T>` (#​5015). `StreamOne<T>` now reads the document's `mt_version` **inline in the same single round trip** (no follow-up metadata query), and the `where T : notnull` constraint tightening was reversed (#​5030).

## LINQ

- Simple `Select()` projections (`x => new Dto { A = x.A, B = x.Nested.B }`) now translate to a server-side **`jsonb_build_object(...)`** expression that is streamable as raw JSON, instead of hydrating the full document and projecting on the client (#​5017). Value-preserving conversions — widening numerics (`int`→`long`/`decimal`), boxing to `object`, nullable wrapping, `enum`→integral under `EnumStorage.AsInteger` — stay translatable and streamable; only lossy/computed conversions fall back (#​5032).
- **DCB tag operators** usable in `Where()` over events (#​5004).
- **`AggregateToMany()`** LINQ operator — run an event query through a multi-stream projection (#​5003).

## Event store, projections & daemon

- **Marten.TimescaleDB** extension — projection + document hypertables (#​4995).
- **Extended-progression telemetry**: batched per-flush heartbeat writes (#​5008); fixed a shutdown telemetry race in `extended_progression_batch_write` (#​5023); `running_on_node` write-path regression coverage (#​5001 / #​5007). The cross-repo `running_on_node` population under Wolverine-managed distribution is completed via JasperFx 2.34.0 + Wolverine.
- **Tenant-scoped event/tag explorer reads** — `ReadStreamAsync` / `GetRecentStreamsAsync` overrides honor tenancy (#​5020, #​5025), plus a `MultiStreamProjection` stepthrough via the instrumented fold in `EventStoreExplorer` (#​5002).
- **HighWaterHealthCheck** scoped to owned databases, with per-tenant and `ExternallyManaged` daemon support (#​4992).
- Surface JasperFx's application-assembly-reuse warning (GH-3521) at startup (#​5000).

## Multi-tenancy & infrastructure

- Token-capable maintenance connection for tenant database provisioning (#​5006).
- Docs: connecting to **Azure Database for PostgreSQL with Entra ID / managed identity** (#​4993).

## Dependencies

- JasperFx / JasperFx.Events **2.34.0**, Weasel **9.17.0**.

**Full changelog:** https://github.com/JasperFx/marten/compare/V9.17.0...V9.18.0


## 9.17.0

## High-water health check: opt-in `autoRestart` + heartbeat primary signal (#​4986)

Builds on the detection-only check from 9.16 (#​4984). Requires JasperFx **2.32.0** (jasperfx#​539), which this release rolls up to (#​4987).

- **Opt-in `autoRestart`** — `AddMartenHighWaterHealthCheck(TimeSpan? staleThreshold = null, long minimumGap = 1, bool autoRestart = false)`. When the check is Unhealthy and `autoRestart` is on, it asks the local projection coordinator's daemon to restart the high-water agent's **poll loop only** — the mark is never advanced — capped to once per staleness window per database. The cycle is still reported **Unhealthy** so an alert still fires. Intended for Solo / leader nodes.
- **Heartbeat is now the primary staleness signal**when `EnableExtendedProgressionTracking` is on, the high-water agent stamps a liveness heartbeat on the `HighWaterMark` row every poll cycle. Heartbeat age proves the loop is *cycling* independent of whether the mark *advances*, so a quiet store is never a false positive, and a dead agent is caught even when projections are fully caught up (the exact #​4961 blind spot). The original sequence-gap heuristic is retained as the `ExtendedProgression`-off fallback.

**Full changelog:** https://github.com/JasperFx/marten/compare/V9.16.1...V9.17.0

## 9.16.1

Async daemon data-safety release: the high water detection can no longer advance past "outstanding" event sequence numbers — sequences reserved by transactions that are still in flight — which could silently skip those events in async projections under concurrent append load (bulk imports being the classic case). Root-caused and fixed from discussion #​4953.

The four closed mechanisms:

* The `GapDetector` command batched three statements, each reading its own READ COMMITTED snapshot — commits landing mid-command could defeat every gap check and silently advance the mark over an in-flight append, regardless of `StaleSequenceThreshold`. Detection is now a single statement / single snapshot.
* Projection rebuilds and forced catch-up looped the gap-skipping detection toward the *reserved* sequence `last_value`, mowing through in-flight gaps. `CheckNowAsync` (JasperFx.Events 2.29.1) now targets the highest *committed* sequence and simply waits for in-flight appends to land.
* The stale fallback could teleport the mark to `reserved last_value - 32` across thousands of in-flight reservations on an idle-then-suddenly-busy store, because its gate measured staleness against `mt_event_progression.last_updated`. The threshold is now measured from when each specific gap was first observed.
* Wall-clock stale skipping could not tell a slow transaction from a rolled-back one. Before skipping any stale gap, Marten now checks PostgreSQL for evidence that a transaction which could still fill the gap is alive (`pg_locks` on the mt_events tables, open transactions in `pg_stat_activity`, in-progress write xids from `pg_current_snapshot()`), and holds while any exists — by default Marten never knowingly skips past a live appender. Only provably-dead gaps (rolled-back appends) are skipped, bounded to the sequence ceiling observed with the gap, and every skip is logged at Warning with its exact range.

New knobs on `StoreOptions.Projections`: `UseTransactionEvidenceForGapSkipping` (default `true`; `false` restores the previous wall-clock behavior) and `SkipStaleGapsDespiteLiveTransactionsAfter` (default `null` = never skip a live appender; PostgreSQL's `idle_in_transaction_session_timeout` is the recommended backstop against leaked sessions).

## What's Changed
* fix(#​4953): high water detection never crosses outstanding event sequences by @​jeremydmiller in https://github.com/JasperFx/marten/pull/4977
* Consumes JasperFx.Events 2.29.1 (https://github.com/JasperFx/jasperfx/pull/530)

**Full Changelog**: https://github.com/JasperFx/marten/compare/V9.16.0...V9.16.1


## 9.16.0

Lot of CritterWatch, couple bug fixes too

## What's Changed
* Fix AdvancedSql/raw-SQL scalar queries for reference-typed columns (byte[], IPAddress, etc.) by @​mdissel in https://github.com/JasperFx/marten/pull/4960
* fix(#​4961): PostgresqlListenWakeup falls back to a timeout wait when the DB is unreachable by @​jeremydmiller in https://github.com/JasperFx/marten/pull/4965
* Bump JasperFx to 2.28.0; declare EventProjection doc types for rebuild teardown (#​4685 COPY) by @​jeremydmiller in https://github.com/JasperFx/marten/pull/4969
* fix(#​4966): update natural key on projection rebuild (JasperFx 2.28.1) by @​jeremydmiller in https://github.com/JasperFx/marten/pull/4970
* test(#​4963): verify + document the blue/green side-effect gate by @​jeremydmiller in https://github.com/JasperFx/marten/pull/4971
* fix(#​4964): hold the Normal high-water mark before a leading sequence gap by @​jeremydmiller in https://github.com/JasperFx/marten/pull/4972
* refactor(#​4968): route stream archive through the shared Weasel event-store seam by @​jeremydmiller in https://github.com/JasperFx/marten/pull/4973
* feat(#​4962): targeted per-cell ReadProjectionProgressAsync on MartenDatabase by @​jeremydmiller in https://github.com/JasperFx/marten/pull/4974
* feat(#​4975): exact ReadProjectionProgressAsync(ShardName) override + JasperFx 2.29.0 by @​jeremydmiller in https://github.com/JasperFx/marten/pull/4976


**Full Changelog**: https://github.com/JasperFx/marten/compare/v9.15.4...V9.16.0

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

Updated [Marten.EntityFrameworkCore](https://github.com/JasperFx/marten) from 9.15.4 to 9.21.0.

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

_Sourced from [Marten.EntityFrameworkCore's releases](https://github.com/JasperFx/marten/releases)._

## 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](https://martendb.io/migration-guide.html#key-changes-in-9-21-0) for details.

## Bug Fixes

### `mt_quick_append_events` returned `{NULL}` for an empty event array ([#​5062](https://github.com/JasperFx/marten/issues/5062), [#​5088](https://github.com/JasperFx/marten/pull/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 `COALESCE`s 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](https://github.com/JasperFx/marten/issues/5063), [#​5073](https://github.com/JasperFx/marten/pull/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](https://github.com/JasperFx/marten/issues/5076), [#​5080](https://github.com/JasperFx/marten/pull/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](https://github.com/JasperFx/marten/issues/5065), [#​5085](https://github.com/JasperFx/marten/pull/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](https://github.com/JasperFx/marten/issues/5061), [#​5089](https://github.com/JasperFx/marten/pull/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**:

```csharp
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

## 9.19.0

Marten 9.19.0 is a maintenance release adopting the coordinated **JasperFx / JasperFx.Events 2.35.0** drop, with a new projection side-effect capability and a secondary-store fix.

## Event sourcing

- **`RaiseSideEffects` slice-identity overload** — JasperFx.Events 2.35.0 (jasperfx#​561) adds a backwards-compatible aggregation-projection overload `RaiseSideEffects(IDocumentOperations operations, TId id, IEventSlice<TDoc> slice)`. The new `id` parameter hands you the slice identity **even when `slice.Snapshot` is null** because the aggregate was deleted in the same batch — so a `MultiStreamProjection` can recover the aggregate key to emit a follow-on event or publish a message on deletion. The original two-argument overload is unchanged, and the new one delegates to it by default. Documented with a compiled sample in [Side Effects](https://martendb.io/events/projections/side-effects).

## Fixes

- **#​5039** — `SecondaryStoreConfig.Build` threw `UriFormatException` when a secondary store was registered with a **generic** marker interface (e.g. `AddMartenStore<IMartenStoreMarker<MyContext>>()`). A closed generic CLR type name contains a backtick + arity, which is not a valid URI host. The `marten://` subject is now sanitized (arity stripped, generic argument names folded in so distinct closed generics still map to distinct subjects).

## Dependencies

- JasperFx / JasperFx.Events / JasperFx.Events.SourceGenerator / JasperFx.SourceGenerator → **2.35.0**
- Weasel.Postgresql / Weasel.Storage → 9.17.0 (unchanged)

## Notes

- The LINQ query-plan cache proposal (#​5013 / #​5018) is **not** in this releasereview surfaced a correctness gap on null filter values; it remains open for a follow-up.
- #​5001 (`running_on_node` under managed distribution) is resolved on the Marten side and closed; the node-stamping half ships in the JasperFx 2.35.0 / Wolverine distribution layer.


## 9.18.0

Marten 9.18.0 focuses on **raw-JSON streaming endpoints for ASP.NET Core**, **server-side LINQ `Select()` projection**, and continued **event-store observability** work.

## ASP.NET Core streaming & pagination

- **`StreamPaged<T>`** — stream a paged JSON envelope (`pageNumber`/`pageSize`/`totalItemCount`/`pageCount`/`hasNextPage`/`hasPreviousPage`/`items`) in a **single** round trip via a `count(*) OVER()` window column (#​5014). Test coverage hardened to pin the camelCase wire contract, page-past-end behavior, and filtered totals (#​5028).
- **`StreamPagedByCursor<T>`** — keyset ("seek") pagination that costs the same regardless of depth, using an opaque continuation cursor (#​5016). Now streams the **raw, already-persisted `data` column** byte-identical to `StreamMany`/`StreamPaged` (no hydrate + re-serialize) by reading the next cursor's ORDER BY key values off the same reader; a malformed client-supplied cursor now returns a clean **400** instead of a 500 (#​5033).
- **ETag / `If-None-Match` (304)** conditional-request support on `StreamOne<T>` and `StreamAggregate<T>` (#​5015). `StreamOne<T>` now reads the document's `mt_version` **inline in the same single round trip** (no follow-up metadata query), and the `where T : notnull` constraint tightening was reversed (#​5030).

## LINQ

- Simple `Select()` projections (`x => new Dto { A = x.A, B = x.Nested.B }`) now translate to a server-side **`jsonb_build_object(...)`** expression that is streamable as raw JSON, instead of hydrating the full document and projecting on the client (#​5017). Value-preserving conversions — widening numerics (`int`→`long`/`decimal`), boxing to `object`, nullable wrapping, `enum`→integral under `EnumStorage.AsInteger` — stay translatable and streamable; only lossy/computed conversions fall back (#​5032).
- **DCB tag operators** usable in `Where()` over events (#​5004).
- **`AggregateToMany()`** LINQ operator — run an event query through a multi-stream projection (#​5003).

## Event store, projections & daemon

- **Marten.TimescaleDB** extension — projection + document hypertables (#​4995).
- **Extended-progression telemetry**: batched per-flush heartbeat writes (#​5008); fixed a shutdown telemetry race in `extended_progression_batch_write` (#​5023); `running_on_node` write-path regression coverage (#​5001 / #​5007). The cross-repo `running_on_node` population under Wolverine-managed distribution is completed via JasperFx 2.34.0 + Wolverine.
- **Tenant-scoped event/tag explorer reads** — `ReadStreamAsync` / `GetRecentStreamsAsync` overrides honor tenancy (#​5020, #​5025), plus a `MultiStreamProjection` stepthrough via the instrumented fold in `EventStoreExplorer` (#​5002).
- **HighWaterHealthCheck** scoped to owned databases, with per-tenant and `ExternallyManaged` daemon support (#​4992).
- Surface JasperFx's application-assembly-reuse warning (GH-3521) at startup (#​5000).

## Multi-tenancy & infrastructure

- Token-capable maintenance connection for tenant database provisioning (#​5006).
- Docs: connecting to **Azure Database for PostgreSQL with Entra ID / managed identity** (#​4993).

## Dependencies

- JasperFx / JasperFx.Events **2.34.0**, Weasel **9.17.0**.

**Full changelog:** https://github.com/JasperFx/marten/compare/V9.17.0...V9.18.0


## 9.17.0

## High-water health check: opt-in `autoRestart` + heartbeat primary signal (#​4986)

Builds on the detection-only check from 9.16 (#​4984). Requires JasperFx **2.32.0** (jasperfx#​539), which this release rolls up to (#​4987).

- **Opt-in `autoRestart`** — `AddMartenHighWaterHealthCheck(TimeSpan? staleThreshold = null, long minimumGap = 1, bool autoRestart = false)`. When the check is Unhealthy and `autoRestart` is on, it asks the local projection coordinator's daemon to restart the high-water agent's **poll loop only** — the mark is never advanced — capped to once per staleness window per database. The cycle is still reported **Unhealthy** so an alert still fires. Intended for Solo / leader nodes.
- **Heartbeat is now the primary staleness signal**when `EnableExtendedProgressionTracking` is on, the high-water agent stamps a liveness heartbeat on the `HighWaterMark` row every poll cycle. Heartbeat age proves the loop is *cycling* independent of whether the mark *advances*, so a quiet store is never a false positive, and a dead agent is caught even when projections are fully caught up (the exact #​4961 blind spot). The original sequence-gap heuristic is retained as the `ExtendedProgression`-off fallback.

**Full changelog:** https://github.com/JasperFx/marten/compare/V9.16.1...V9.17.0

## 9.16.1

Async daemon data-safety release: the high water detection can no longer advance past "outstanding" event sequence numbers — sequences reserved by transactions that are still in flight — which could silently skip those events in async projections under concurrent append load (bulk imports being the classic case). Root-caused and fixed from discussion #​4953.

The four closed mechanisms:

* The `GapDetector` command batched three statements, each reading its own READ COMMITTED snapshot — commits landing mid-command could defeat every gap check and silently advance the mark over an in-flight append, regardless of `StaleSequenceThreshold`. Detection is now a single statement / single snapshot.
* Projection rebuilds and forced catch-up looped the gap-skipping detection toward the *reserved* sequence `last_value`, mowing through in-flight gaps. `CheckNowAsync` (JasperFx.Events 2.29.1) now targets the highest *committed* sequence and simply waits for in-flight appends to land.
* The stale fallback could teleport the mark to `reserved last_value - 32` across thousands of in-flight reservations on an idle-then-suddenly-busy store, because its gate measured staleness against `mt_event_progression.last_updated`. The threshold is now measured from when each specific gap was first observed.
* Wall-clock stale skipping could not tell a slow transaction from a rolled-back one. Before skipping any stale gap, Marten now checks PostgreSQL for evidence that a transaction which could still fill the gap is alive (`pg_locks` on the mt_events tables, open transactions in `pg_stat_activity`, in-progress write xids from `pg_current_snapshot()`), and holds while any exists — by default Marten never knowingly skips past a live appender. Only provably-dead gaps (rolled-back appends) are skipped, bounded to the sequence ceiling observed with the gap, and every skip is logged at Warning with its exact range.

New knobs on `StoreOptions.Projections`: `UseTransactionEvidenceForGapSkipping` (default `true`; `false` restores the previous wall-clock behavior) and `SkipStaleGapsDespiteLiveTransactionsAfter` (default `null` = never skip a live appender; PostgreSQL's `idle_in_transaction_session_timeout` is the recommended backstop against leaked sessions).

## What's Changed
* fix(#​4953): high water detection never crosses outstanding event sequences by @​jeremydmiller in https://github.com/JasperFx/marten/pull/4977
* Consumes JasperFx.Events 2.29.1 (https://github.com/JasperFx/jasperfx/pull/530)

**Full Changelog**: https://github.com/JasperFx/marten/compare/V9.16.0...V9.16.1


## 9.16.0

Lot of CritterWatch, couple bug fixes too

## What's Changed
* Fix AdvancedSql/raw-SQL scalar queries for reference-typed columns (byte[], IPAddress, etc.) by @​mdissel in https://github.com/JasperFx/marten/pull/4960
* fix(#​4961): PostgresqlListenWakeup falls back to a timeout wait when the DB is unreachable by @​jeremydmiller in https://github.com/JasperFx/marten/pull/4965
* Bump JasperFx to 2.28.0; declare EventProjection doc types for rebuild teardown (#​4685 COPY) by @​jeremydmiller in https://github.com/JasperFx/marten/pull/4969
* fix(#​4966): update natural key on projection rebuild (JasperFx 2.28.1) by @​jeremydmiller in https://github.com/JasperFx/marten/pull/4970
* test(#​4963): verify + document the blue/green side-effect gate by @​jeremydmiller in https://github.com/JasperFx/marten/pull/4971
* fix(#​4964): hold the Normal high-water mark before a leading sequence gap by @​jeremydmiller in https://github.com/JasperFx/marten/pull/4972
* refactor(#​4968): route stream archive through the shared Weasel event-store seam by @​jeremydmiller in https://github.com/JasperFx/marten/pull/4973
* feat(#​4962): targeted per-cell ReadProjectionProgressAsync on MartenDatabase by @​jeremydmiller in https://github.com/JasperFx/marten/pull/4974
* feat(#​4975): exact ReadProjectionProgressAsync(ShardName) override + JasperFx 2.29.0 by @​jeremydmiller in https://github.com/JasperFx/marten/pull/4976


**Full Changelog**: https://github.com/JasperFx/marten/compare/v9.15.4...V9.16.0

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

Updated [OpenTelemetry.Instrumentation.AspNetCore](https://github.com/open-telemetry/opentelemetry-dotnet-contrib) from 1.16.0 to 1.17.0.

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

_Sourced from [OpenTelemetry.Instrumentation.AspNetCore's releases](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/releases)._

## 1.17.0

* NuGet: [OpenTelemetry.Exporter.Geneva v1.17.0](https://www.nuget.org/packages/OpenTelemetry.Exporter.Geneva/1.17.0)

  * Updated OpenTelemetry core component version(s) to `1.17.0`.
    ([#​4773](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/4773))
  
  * Updated ETW manifest and payload in `EtwDataTransport`
    with synthetic payload so that the runtime-generated .NET
    ETW manifest matches the actual payload.
    ([#​4729](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/4729)

  See [CHANGELOG](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/Exporter.Geneva-1.17.0/src/OpenTelemetry.Exporter.Geneva/CHANGELOG.md) for details.


## 1.17.0-rc.1

* NuGet: [OpenTelemetry.Instrumentation.Process v1.17.0-rc.1](https://www.nuget.org/packages/OpenTelemetry.Instrumentation.Process/1.17.0-rc.1)

  * Updated OpenTelemetry core component version(s) to `1.17.0`.
    ([#​4773](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/4773))

  See [CHANGELOG](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/Instrumentation.Process-1.17.0-rc.1/src/OpenTelemetry.Instrumentation.Process/CHANGELOG.md) for details.


## 1.17.0-beta.1

* NuGet: [OpenTelemetry.Extensions.Enrichment v1.17.0-beta.1](https://www.nuget.org/packages/OpenTelemetry.Extensions.Enrichment/1.17.0-beta.1)

  * Updated OpenTelemetry core component version(s) to `1.17.0`.
    ([#​4773](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/4773))

  See [CHANGELOG](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/Extensions.Enrichment-1.17.0-beta.1/src/OpenTelemetry.Extensions.Enrichment/CHANGELOG.md) for details.


## 1.17.0-alpha.1

* NuGet: [OpenTelemetry.Instrumentation.EventCounters v1.17.0-alpha.1](https://www.nuget.org/packages/OpenTelemetry.Instrumentation.EventCounters/1.17.0-alpha.1)

  * Assemblies are now digitally signed using cosign.
    ([#​4637](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/4637))
  
  * Updated OpenTelemetry core component version(s) to `1.17.0`.
    ([#​4773](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/4773))

  See [CHANGELOG](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/Instrumentation.EventCounters-1.17.0-alpha.1/src/OpenTelemetry.Instrumentation.EventCounters/CHANGELOG.md) for details.


Commits viewable in [compare view](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/compare/Instrumentation.AWS-1.16.0...Exporter.Geneva-1.17.0).
</details>

Updated [OpenTelemetry.Instrumentation.Http](https://github.com/open-telemetry/opentelemetry-dotnet-contrib) from 1.16.0 to 1.17.0.

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

_Sourced from [OpenTelemetry.Instrumentation.Http's releases](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/releases)._

## 1.17.0

* NuGet: [OpenTelemetry.Exporter.Geneva v1.17.0](https://www.nuget.org/packages/OpenTelemetry.Exporter.Geneva/1.17.0)

  * Updated OpenTelemetry core component version(s) to `1.17.0`.
    ([#​4773](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/4773))
  
  * Updated ETW manifest and payload in `EtwDataTransport`
    with synthetic payload so that the runtime-generated .NET
    ETW manifest matches the actual payload.
    ([#​4729](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/4729)

  See [CHANGELOG](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/Exporter.Geneva-1.17.0/src/OpenTelemetry.Exporter.Geneva/CHANGELOG.md) for details.


## 1.17.0-rc.1

* NuGet: [OpenTelemetry.Instrumentation.Process v1.17.0-rc.1](https://www.nuget.org/packages/OpenTelemetry.Instrumentation.Process/1.17.0-rc.1)

  * Updated OpenTelemetry core component version(s) to `1.17.0`.
    ([#​4773](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/4773))

  See [CHANGELOG](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/Instrumentation.Process-1.17.0-rc.1/src/OpenTelemetry.Instrumentation.Process/CHANGELOG.md) for details.


## 1.17.0-beta.1

* NuGet: [OpenTelemetry.Extensions.Enrichment v1.17.0-beta.1](https://www.nuget.org/packages/OpenTelemetry.Extensions.Enrichment/1.17.0-beta.1)

  * Updated OpenTelemetry core component version(s) to `1.17.0`.
    ([#​4773](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/4773))

  See [CHANGELOG](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/Extensions.Enrichment-1.17.0-beta.1/src/OpenTelemetry.Extensions.Enrichment/CHANGELOG.md) for details.


## 1.17.0-alpha.1

* NuGet: [OpenTelemetry.Instrumentation.EventCounters v1.17.0-alpha.1](https://www.nuget.org/packages/OpenTelemetry.Instrumentation.EventCounters/1.17.0-alpha.1)

  * Assemblies are now digitally signed using cosign.
    ([#​4637](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/4637))
  
  * Updated OpenTelemetry core component version(s) to `1.17.0`.
    ([#​4773](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/4773))

  See [CHANGELOG](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/Instrumentation.EventCounters-1.17.0-alpha.1/src/OpenTelemetry.Instrumentation.EventCounters/CHANGELOG.md) for details.


Commits viewable in [compare view](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/compare/Instrumentation.AWS-1.16.0...Exporter.Geneva-1.17.0).
</details>

Updated [SonarAnalyzer.CSharp](https://github.com/SonarSource/sonar-dotnet) from 10.29.0.143774 to 10.31.0.145097.

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

_Sourced from [SonarAnalyzer.CSharp's releases](https://github.com/SonarSource/sonar-dotnet/releases)._

## 10.31.0.145097

# Release notes - .NET Analyzers - 10.31

### Feature
[NET-3865](https://sonarsource.atlassian.net/browse/NET-3865) Implement S8733: Potential Cartesian Explosion
[NET-3875](https://sonarsource.atlassian.net/browse/NET-3875) Implement rule S8718: Client-evaluated default values should use database functions
[NET-4087](https://sonarsource.atlassian.net/browse/NET-4087) Use shared secret exclusion patterns in hardcoded secrets rules
[NET-4211](https://sonarsource.atlassian.net/browse/NET-4211) Update RSPEC before 10.31 release

### False Positive
[NET-1922](https://sonarsource.atlassian.net/browse/NET-1922) S1144 FP: When registering a service with Microsoft.Extensions.DependencyInjecion framework
[NET-3928](https://sonarsource.atlassian.net/browse/NET-3928) Fix S3267 FP: Should not raise on EntityFramework IQueryables
[NET-4205](https://sonarsource.atlassian.net/browse/NET-4205) Fix S1244 FP: should not raise on NaN check via x.Equals(double.NaN)




## 10.30.0.144632

# Release notes - .NET Analyzers - 10.30

### Feature
[NET-1536](https://sonarsource.atlassian.net/browse/NET-1536) Implement rule S8970: Null-forgiving operators should not be used when nullable warnings are disabled
[NET-3436](https://sonarsource.atlassian.net/browse/NET-3436) Implement rule S8949: Use the overload that accepts a CancellationToken
[NET-3810](https://sonarsource.atlassian.net/browse/NET-3810) Fix: Protobuf Importer logs debug on excluded files
[NET-3877](https://sonarsource.atlassian.net/browse/NET-3877) Implement rule S8747: Migrations should not narrow column types without converting existing data
[NET-4091](https://sonarsource.atlassian.net/browse/NET-4091) Implement rule S8969: Null-forgiving operators should not be redundant
[NET-4120](https://sonarsource.atlassian.net/browse/NET-4120) Update RSPEC before 10.30 release

### False Positive
[NET-1541](https://sonarsource.atlassian.net/browse/NET-1541) Fix S3459 FP: support classes marked with [AutoConstructor] attribute
[NET-1583](https://sonarsource.atlassian.net/browse/NET-1583) Fix S6967 FP: Raises when model has no validation attributes
[NET-1840](https://sonarsource.atlassian.net/browse/NET-1840) Fix S3903 FP: top-level statements and partial Program in separate file
[NET-4059](https://sonarsource.atlassian.net/browse/NET-4059) Improve precision of S8949 (CancellationTokenShouldBeUsed) - umbrella
[NET-4191](https://sonarsource.atlassian.net/browse/NET-4191) Fix S3169 FP: Should not raise in Azure Cosmos

### False Negative
[NET-3819](https://sonarsource.atlassian.net/browse/NET-3819) Fix S1244 FN: Should report on Double.Equals

### Bug
[NET-4107](https://sonarsource.atlassian.net/browse/NET-4107) Fix S4026 Race Condition




Commits viewable in [compare view](https://github.com/SonarSource/sonar-dotnet/compare/10.29.0.143774...10.31.0.145097).
</details>

Updated [WolverineFx](http://github.com/jasperfx/wolverine) from 6.17.0 to 6.24.1.

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

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

## 6.24.1

Patch release. Four reported issues, all with reproductions from production clusters.

## Fixes

**[#​3701](https://github.com/JasperFx/wolverine/issues/3701) — `wolverine_node_records` grows without bound** ([#​3734](https://github.com/JasperFx/wolverine/pull/3734))

A reporting cluster reached 36,135,221 rows / 16 GB in five days on a diagnostic table nothing on the hot path reads. Three distinct defects:

- `INodeAgentPersistence.DeleteOldNodeRecordsAsync` was implemented for every relational store and never invoked outside tests.
- The pruning that *did* run bounds the table by **age only** (`NodeEventRecordExpirationTime`, 5 days), which is no ceiling at all at high write rates — every one of those 36M rows was inside the window.
- That age sweep's hourly throttle was dead. Its backing field was never assigned (the `CS0649` suppression on it said so), so a full-table delete went out on **every recovery cycle** — every 5 seconds by default.

New `Durability.NodeRecordRetention` (default 10,000 rows) and `Durability.NodeRecordPruningPeriod` (default hourly). `MultiTenantedMessageStore` now delegates the trim to the main store instead of inheriting a no-op default, and Sqlite, MySQL and Oracle gained implementations they had also been missing.

**[#​3697](https://github.com/JasperFx/wolverine/issues/3697) — no supported force-catch-up under Wolverine-managed event subscription distribution** ([#​3735](https://github.com/JasperFx/wolverine/pull/3735))

Wolverine already implemented the coordinator-driven catch-up path, but only exposed it as a `TrackActivity()` stage. Adds the standalone entry point on `IHost` and `IServiceProvider`, plus `<T>` ancillary-store variants:

```csharp
await host.PauseThenCatchUpOnMartenDaemonActivityAsync();
await host.PauseThenCatchUpOnMartenDaemonActivityAsync(CatchUpMode.AndDoNothing);
await host.PauseThenCatchUpOnMartenDaemonActivityAsync<IMyStore>();

It never calls IProjectionDaemon.CatchUpAsync — doing so under a live coordinator is what produces the ProgressionProgressOutOfOrderException and pk_mt_event_progression duplicate-key errors suites have been retrying around. Resuming the agents that already own the shards means there is only ever one writer.

#​3733 — a comma in an agent Uri voided a whole batch confirmation (#​3736)

AgentsStarted, StartAgents, AgentsStopped and StopAgents joined their Uri[] on a comma, which RFC 3986 permits unescaped in a path segment. Agent URIs embed tenant ids and projection names, so one comma shattered an agent into fragments — and because the read side built the array in a single projection, the resulting throw took out the confirmation for the entire batch. Newline is the delimiter now, and entries are parsed individually so a bad one names itself.

The comma remains the default on the wire for payloads that do not contain one, so rolling upgrades keep working in both directions.

#​3706 — RabbitMQ acks were cumulative (#​3737)

Every ack went out as BasicAckAsync(tag, multiple: true), acknowledging every lower delivery tag on the channel. That is only correct when completions happen in delivery order, and they do not with ConsumerDispatchConcurrency > 1 — acking one message silently acknowledged deliveries whose handlers were still running, and a crash at that moment lost them.

Acks are now per message. Two dead-letter paths that relied on the cumulative sweep settle themselves, most importantly the un-mappable-message branch in WorkerQueueMessageConsumer, which dead-lettered and returned without touching the delivery at all. This unblocks the planned native-ack parallel endpoint mode.

Also included

  • #​3730 — compliance coverage for a pause and node loss landing on in-flight assignments (GH-3698)
  • #​3732 — seed the departed node's inbox rows as already owned (GH-3729)

6.24.0

Two data-loss fixes — but for unusual usages

This release closes two bugs that silently destroyed data rather than failing loudly. Both are worth reading before you skip the rest of these notes.

Durable inbox rows were orphaned when a circuit breaker tripped (#​3680). DurableReceiver checked its latched flag before calling MarkReceived. The latched path still persists each envelope to the inbox as a safety net — but on an envelope that never went through MarkReceived, Status is the enum default (Outgoing) and Destination is null. Both are filter columns for inbox recovery, so the rows were written in a state no recovery sweep on any node could ever see. The null Listener also skipped the nack back to the broker, and the broker's redelivery after restart hit DuplicateIncomingEnvelopeException — which acks and drops. Net result: genuine message loss under a durable inbox any time a circuit breaker trip latched the receiver mid-flight. Measured on the circuit-breaker suite, 9 of 1,200 messages were lost per run.

Dropping one tenant from a shared partition bucket destroyed its co-tenants' data (#​3686). Found alongside #​3683. Tenant bucketing — registering several small tenants against one partition suffix so they share a physical partition — is documented and exposed through PartitionPerTenant(p => p.AllowPartitionSharing = true), and it did not work on either engine. It had no test coverage, because the doc sample demonstrating it is compile-only and never executed.

Global partitioning

Part of the GlobalPartitioning epic (#​3482).

  • Global partitioning topologies for PostgreSQL and SQL Server queues (#​3468, #​3469)
  • End-to-end sharded-processing suites for Azure Service Bus, GCP Pub/Sub, NATS, Redis Streams and Pulsar (#​3467). The scenario is lifted into Wolverine.ComplianceTests.Partitioning.ShardedProcessing, so a new transport costs one small test class
  • Native-mode design comparison and per-transport native alternatives documented (#​3481)

The new suites immediately found two real bugs:

  • NATS global partitioning had never worked at all. The topology forces EndpointMode.Durable on every slot, and a NatsEndpoint only supports Durable when JetStream-backed — so every UseShardedNatsSubjects() call threw at configuration time. The topology now enables JetStream on its own endpoints and declares a work-queue stream per shard, without which the listener died at startup on stream not found
  • Pulsar named its companion local queues off the full topic path, producing queues like global-persistent://public/default/orders1. They now use the topic's short name, matching every other transport

Multi-tenancy and persistence

  • EF Core tenant partition back-fill (#​3496). Routine migration deltas deliberately leave Weasel-managed partitions alone, so a table joining an existing managed set — a newly deployed service, or a newly mapped ITenanted entity — had no partition for any tenant registered before that table existed. IConjoinedTenantPartitions<T>.MigrateTenantPartitionsAsync() reconciles every partitioned table against the full registered tenant set, with per-table TenantPartitionResult reporting
  • Conjoined tenant partition bucketing actually works now, on both PostgreSQL and SQL Server (#​3683, and see #​3686 above)
  • Exclusive listener inbox recovery is now covered for RavenDb (#​3595) and CosmosDb (#​3596)

Transports

  • RabbitMQ: deliveries are settled against the channel they arrived on (#​3687). Acking a delivery on a torn-down channel threw a NullReferenceException
  • NATS: auto-provisioned JetStream durable consumers are filtered to their own subject (#​3676). FilterSubject was only assigned when ConsumerName was empty, so every durable consumer on a stream received every message. The fix needs a FilterSubjects multi-filter — a single filter cannot cover both {subject} and {subject}.scheduled, and a work-queue stream discards an uncovered control message
  • MQTT: the v5 authentication method name is configurable (#​3588). It was hardcoded to "OAUTH2-JWT". Azure Event Grid's custom JWT authentication requires CUSTOM-JWT, so those brokers could not be reached through Wolverine's authentication support at all. You could already set the method by hand through MqttClientOptionsBuilder.WithAuthentication(), but that gave up Wolverine's token refresh loop — the whole reason to use MqttJwtAuthenticationOptions. You no longer have to choose
  • The HTTP transport can send to a destination nobody pre-registered (#​3681, reported as ProductSupport#​34). WolverineHttpTransportClient used the endpoint's OutboundUri purely as an IHttpClientFactory client name, then posted to that client's BaseAddress — so operator commands sent back over the HTTP transport failed with An invalid request URI was provided

Performance

  • RabbitMQ consumer dispatch concurrency is now per-endpoint (#​3492). The client default of 1 was the bottleneck. Simulated handler, 2,000 msg/s offered load, 30s measured window:

    ConsumerDispatchConcurrency Throughput Transit p50
    1 (client default) 163.7/s — (nothing from the measured window was consumed before the run ended)
    5 828/s 22,871.9 ms
    20 1,999.1/s 1.486 ms (p95 2.54, p99 3.22)

    The 5.1x and 12.2x multiples understate it — at 1 and 5 the listener never catches up at all.

  • Amazon SQS batches message deletions and chunks outgoing batches on the 256KB request size limit (#​3493)

  • Azure Service Bus session listeners are no longer quadratic — the n² session loops are now n. MaxConcurrentCalls is surfaced, and a batched defer settles the original message (#​3494)

HTTP and gRPC

... (truncated)

6.23.1

Agent distribution

TL;DR: if you pause a projection from CritterWatch on 6.23.0, restarting it appears to do nothing for a full minute. This fixes that.

  • A paused projection or subscription agent now resumes immediately when you restart it (#​3663). On 6.23.0 the restart was accepted, the pause restriction was cleared, and then nothing happened until the pending-assignment ledger's TTL expired — 2 × CheckAssignmentPeriod, so 60 seconds with the defaults. Long enough that an operator reasonably concludes the agent is never coming back.

    The ledger introduced in 6.23.0 (#​3622) only counted an assignment as confirmed if a later evaluation saw the agent running and still assigned to the same node. A pause makes those two conditions mutually exclusive: the first evaluation that can observe the delivered assignment is the same one that detaches the agent. The entry was never confirmed, nothing on the stop path cleared it, and the restart's AssignAgent was suppressed as a duplicate still in flight. Delivery alone now confirms the entry, which is the only question the ledger was ever asking.

  • Pausing an agent no longer briefly starts it first (#​3666). ApplyRestrictionsAsync kickstarted a health check before persisting the operator's restriction change, so that evaluation ran against the old restrictions and could act against the very intent being applied — for a pause, re-assigning and starting the agent one beat before the merged evaluation stopped it again. Besides the wasted daemon start/stop cycle, this is what armed the stale ledger entry behind #​3663.

PostgreSQL

  • Advisory-lock sessions stay invisible to Marten's async-daemon gap detection (#​3664). Marten 9.16.1+ will not skip a stale event-sequence gap while any session whose open transaction predates that gap is still alive (marten#​4953). A session parked in an open transaction for the life of the process therefore reads as a permanent "possible reserver" and can hold the high-water mark — and every async projection — behind a gap that is genuinely dead.

    Wolverine's long-held locks were already shaped correctly: leader election and node coordination hold session-scoped advisory locks on a dedicated connection with no transaction, so they show up as state='idle' with a NULL xact_start. Those sessions are now also tagged application_name = 'wolverine-advisory-lock:<database>', which turns a pg_stat_activity investigation from guesswork into something you can read at a glance. The constraints are pinned in tests and in the Postgres durability docs, including the trap worth knowing in your own code: never add a keepalive query inside a long-lived open transaction — it bumps state_change, makes the session look active, and re-promotes it to candidate reserver.

    Note for combined Marten + Wolverine deployments: older guidance suggested Postgres's idle_in_transaction_session_timeout as a dead-gap backstop. Prefer upgrading Marten and using SkipStaleGapsDespiteLiveTransactionsAfter instead.

6.23.0

Projection & agent distribution

TL;DR: this prevents Wolverine from going into a panic doing agent assignments and churning crazily hard during Kubernetes rollouts or cluster starts and that's a very good thing

The bulk of this release. A wave of fixes (WO-1..8) to the agent assignment plane that together remove the re-assignment churn and livelock that could leave projection agents flapping or wedged.

  • Node heartbeats no longer block behind command execution (#​3620)
  • Node resurrection restores the node's real identity rather than a skeleton record (#​3621)
  • A pending-assignment ledger suppresses duplicate AssignAgent floods (#​3622)
  • Agent batch starts are chunked and bounded-parallel, so they stay safe at scale (#​3623)
  • Ejection hysteresis plus leader protection (#​3624)
  • The assignment row is re-upserted for agents that are already running (#​3619)
  • Local agents drain with bounded parallelism on shutdown (#​3636)
  • Paused shards now say why. IEventSubscriptionAgent.Failure surfaces a ShardFailure — category, the failing event's sequence and type, and the root exception type — through health checks and a new IWolverineObserver.AgentPaused hook plus a NodeRecordType.AgentPaused record. Failures bound to a specific event (ApplyEvent, EventSerialization, UnknownEventType) or to two processes racing one shard (ProgressionOutOfOrder) are no longer auto-restarted, since they would die on the identical event every time (#​3637, #​3638)
  • Agent starts retry locally, bounded by Durability.AgentStartRetryAttempts / AgentStartRetryDelay, instead of idling a full CheckAssignmentPeriod after a startup race (#​3519)
  • Store-scoped FindAgentUriAsync overload (#​3647) and a store-aware TryRebuildRegisteredProjectionAsync overload (#​3618)

Bumps JasperFx.Events to 2.36.1, Marten to 9.20.0 and Polecat to 5.7.0.

HTTP

  • Endpoints that advertise a request body their HTTP method cannot carry now fail fast at startup instead of silently 404ing out of the route matcher (#​3648)
  • A missing Content-Type on an [AcceptsContentType] route returns 415 rather than 404 (#​3649)
  • Query-only [AsParameters] endpoints no longer advertise a form body, which had been dropping them from route matching entirely (#​3630)
  • Explicitly-routed chains — PublishMessage<T> and SendMessage<T> — now describe the message they read from the body. They had been advertising no request body at all in OpenAPI (#​3646)
  • Enum values in query strings and form posts parse case-insensitively (#​3629)
  • Compiled queries returned as a Wolverine.Http resource no longer execute twice (#​3625)

Transports

  • Conventional routing respects named brokers (#​3633)
  • Google Pub/Sub: named-broker support for sharded and partitioned topics (#​3632), and ListenToPubsubSubscriptionOnNamedBroker (#​3631)
  • Kafka: topic-already-exists error codes are handled rather than thrown (#​3640)
  • Redis: scheduled retries survive an unreadable timestamp (#​3613), and scheduled entries that repeatedly fail to deserialize are dead-lettered instead of looping (#​3644)
  • EnvelopeMapper reads both timestamp header formats (#​3645)
  • NServiceBus interop: the EnclosedMessageTypes header is split before the message type is resolved, so interop works across Azure Service Bus, SNS, SQS and the database transports (#​3628)

Persistence

  • Oracle runs the durability agent through the shared batching mechanics (#​3614). Note that ODP.NET exposes no DbBatch, so the work splits per statement.

Other

  • Resource discovery no longer eager-connects broker transports (#​3617)

Contributors

Thank you to everyone who contributed to this release:

... (truncated)

6.22.0

Wolverine 6.22.0 rolls up the claim-check backend wave, distributed-agent and durability hardening, HTTP/OpenAPI binding fixes, and the Marten 9.18 / JasperFx 2.34 critter-stack alignment.

Dependency alignment

  • JasperFx family → 2.34.0
  • Marten9.18.0 (with Marten.AspNetCore / Marten.Newtonsoft), Polecat [5.5.0,6.0.0)
  • Weasel family → 9.18.1

Claim-check offloading

  • New NATS JetStream Object Store claim-check backend (#​3506)
  • New PostgreSQL database-LOB claim-check backend (#​3507)
  • New Google Cloud Storage claim-check backend (#​3505)
  • Size-threshold auto-offload — large payloads offload to the claim-check store automatically (#​3504)
  • Per-message / per-endpoint store selection (#​3508)
  • Honor a DI-registered IClaimCheckStore (#​3564)
  • New claim-check backends are now packed for NuGet (#​3565)

Distributed agents & durability

  • Recover exclusive listener inboxes on the listening node (#​3590)
  • Reverse the reset-clears-queue-tables behavior; add IHost.ClearAllWolverineStorageAsync() (#​3592)
  • Subscription health check uses the tenant-scoped high water mark for per-tenant subscription agents (#​3582)
  • Isolate agent start failures so one wedged agent no longer skips its siblings (#​3519)
  • Restart a projection agent whose shard wedged out from under it (#​3519)
  • EventSubscriptionAgent restores continuous execution after Rebuild/Rewind (#​3520)
  • Stamp the assigned node onto owned event-store daemons (running_on_node, marten#​5001) (#​3578)
  • Solo-mode health-check loop no longer leaks an unbounded OpenTelemetry trace (#​3518)
  • Warn loudly when a host's application assembly is pinned by an earlier host (#​3521)

HTTP & OpenAPI

  • Describe chain-bound OpenAPI params from produced variables; narrow re-reflection to postprocessors (#​3601)
  • Bind [FromQuery] on arrays/collections instead of misrouting to complex-flattening (#​3602)
  • Bind scalar [FromQuery] decimal correctly + shape-test OpenAPI parameter description across type families (#​3586)
  • Don't describe a route-bound [FromQuery]/[FromHeader] parameter twice in OpenAPI (#​3586)
  • Marten 9.18 streaming typesStreamPaged, StreamPagedByCursor, ETag support (#​3593)
  • Honour opt-in discovery filters for HTTP endpoint discovery (#​3525)
  • Never infer a DbContext parameter as the HTTP request body (#​3538)

Transports

  • Add a parallel WolverineFx.Mqtt5 package (MQTTnet 5) (#​3517)
  • Pulsar: don't claim native scheduling without a retry-letter topic (#​3491)
  • Azure ...

Description has been truncated

Bumps Anthropic from 12.35.1 to 12.39.0
Bumps Marten from 9.15.4 to 9.21.0
Bumps Marten.EntityFrameworkCore from 9.15.4 to 9.21.0
Bumps OpenTelemetry.Instrumentation.AspNetCore from 1.16.0 to 1.17.0
Bumps OpenTelemetry.Instrumentation.Http from 1.16.0 to 1.17.0
Bumps SonarAnalyzer.CSharp from 10.29.0.143774 to 10.31.0.145097
Bumps WolverineFx from 6.17.0 to 6.24.1
Bumps WolverineFx.EntityFrameworkCore from 6.17.0 to 6.24.1
Bumps WolverineFx.Marten from 6.17.0 to 6.24.1
Bumps WolverineFx.RuntimeCompilation from 6.17.0 to 6.24.1

---
updated-dependencies:
- dependency-name: Anthropic
  dependency-version: 12.39.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: Marten
  dependency-version: 9.21.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: Marten.EntityFrameworkCore
  dependency-version: 9.21.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: OpenTelemetry.Instrumentation.AspNetCore
  dependency-version: 1.17.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: OpenTelemetry.Instrumentation.Http
  dependency-version: 1.17.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: SonarAnalyzer.CSharp
  dependency-version: 10.31.0.145097
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: WolverineFx
  dependency-version: 6.24.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: WolverineFx.EntityFrameworkCore
  dependency-version: 6.24.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: WolverineFx.Marten
  dependency-version: 6.24.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: WolverineFx.RuntimeCompilation
  dependency-version: 6.24.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-and-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 Jul 30, 2026
@github-actions

Copy link
Copy Markdown

Dependency Review

The following issues were found:
  • ✅ 0 vulnerable package(s)
  • ✅ 0 package(s) with incompatible licenses
  • ✅ 0 package(s) with invalid SPDX license definitions
  • ⚠️ 80 package(s) with unknown licenses.
See the Details below.

Snapshot Warnings

⚠️: The number of snapshots compared for the base SHA (2) and the head SHA (1) do not match. You may see unexpected removals in the diff.
Re-running this action after a short time may resolve the issue. See the documentation for more information and troubleshooting advice.

License Issues

backend/src/RunCoach.Api/RunCoach.Api.csproj

PackageVersionLicenseIssue Type
Anthropic12.39.0NullUnknown License
JasperFx2.36.2NullUnknown License
JasperFx.Events2.36.2NullUnknown License
JasperFx.SourceGenerator2.36.1NullUnknown License
Marten9.21.0NullUnknown License
Marten.EntityFrameworkCore9.21.0NullUnknown License
OpenTelemetry.Instrumentation.AspNetCore1.17.0NullUnknown License
OpenTelemetry.Instrumentation.Http1.17.0NullUnknown License
SonarAnalyzer.CSharp10.31.0.145097NullUnknown License
Weasel.Core9.20.0NullUnknown License
Weasel.EntityFrameworkCore9.20.0NullUnknown License
Weasel.Postgresql9.20.0NullUnknown License
Weasel.Storage9.17.0NullUnknown License
WolverineFx6.24.1NullUnknown License
WolverineFx.EntityFrameworkCore6.24.1NullUnknown License
WolverineFx.Marten6.24.1NullUnknown License
WolverineFx.Postgresql6.24.1NullUnknown License
WolverineFx.RDBMS6.24.1NullUnknown License
WolverineFx.RuntimeCompilation6.24.1NullUnknown License
Anthropic12.39.0NullUnknown License
JasperFx2.36.2NullUnknown License
JasperFx.Events2.36.2NullUnknown License
JasperFx.SourceGenerator2.36.1NullUnknown License
Marten9.21.0NullUnknown License
Marten.EntityFrameworkCore9.21.0NullUnknown License
OpenTelemetry.Instrumentation.AspNetCore1.17.0NullUnknown License
OpenTelemetry.Instrumentation.Http1.17.0NullUnknown License
SonarAnalyzer.CSharp10.31.0.145097NullUnknown License
Weasel.Core9.20.0NullUnknown License
Weasel.EntityFrameworkCore9.20.0NullUnknown License
Weasel.Postgresql9.20.0NullUnknown License
Weasel.Storage9.17.0NullUnknown License
WolverineFx6.24.1NullUnknown License
WolverineFx.EntityFrameworkCore6.24.1NullUnknown License
WolverineFx.Marten6.24.1NullUnknown License
WolverineFx.Postgresql6.24.1NullUnknown License
WolverineFx.RDBMS6.24.1NullUnknown License
WolverineFx.RuntimeCompilation6.24.1NullUnknown License
Anthropic12.39.0NullUnknown License
JasperFx2.36.2NullUnknown License
JasperFx.Events2.36.2NullUnknown License
JasperFx.SourceGenerator2.36.1NullUnknown License
Marten9.21.0NullUnknown License
Marten.EntityFrameworkCore9.21.0NullUnknown License
OpenTelemetry.Instrumentation.AspNetCore1.17.0NullUnknown License
OpenTelemetry.Instrumentation.Http1.17.0NullUnknown License
SonarAnalyzer.CSharp10.31.0.145097NullUnknown License
Weasel.Core9.20.0NullUnknown License
Weasel.EntityFrameworkCore9.20.0NullUnknown License
Weasel.Postgresql9.20.0NullUnknown License
Weasel.Storage9.17.0NullUnknown License
WolverineFx6.24.1NullUnknown License
WolverineFx.EntityFrameworkCore6.24.1NullUnknown License
WolverineFx.Marten6.24.1NullUnknown License
WolverineFx.Postgresql6.24.1NullUnknown License
WolverineFx.RDBMS6.24.1NullUnknown License
WolverineFx.RuntimeCompilation6.24.1NullUnknown License
Anthropic12.39.0NullUnknown License
JasperFx2.36.2NullUnknown License
JasperFx.Events2.36.2NullUnknown License
JasperFx.SourceGenerator2.36.1NullUnknown License
Marten9.21.0NullUnknown License
Marten.EntityFrameworkCore9.21.0NullUnknown License
OpenTelemetry.Instrumentation.AspNetCore1.17.0NullUnknown License
OpenTelemetry.Instrumentation.Http1.17.0NullUnknown License
SonarAnalyzer.CSharp10.31.0.145097NullUnknown License
Weasel.Core9.20.0NullUnknown License
Weasel.EntityFrameworkCore9.20.0NullUnknown License
Weasel.Postgresql9.20.0NullUnknown License
Weasel.Storage9.17.0NullUnknown License
WolverineFx6.24.1NullUnknown License
WolverineFx.EntityFrameworkCore6.24.1NullUnknown License
WolverineFx.Marten6.24.1NullUnknown License
WolverineFx.Postgresql6.24.1NullUnknown License
WolverineFx.RDBMS6.24.1NullUnknown License
WolverineFx.RuntimeCompilation6.24.1NullUnknown License

backend/tests/RunCoach.Api.Tests/RunCoach.Api.Tests.csproj

PackageVersionLicenseIssue Type
SonarAnalyzer.CSharp10.31.0.145097NullUnknown License
SonarAnalyzer.CSharp10.31.0.145097NullUnknown License
SonarAnalyzer.CSharp10.31.0.145097NullUnknown License
SonarAnalyzer.CSharp10.31.0.145097NullUnknown License
Allowed Licenses: MIT, Apache-2.0, BSD-2-Clause, BSD-3-Clause, ISC, 0BSD, Unlicense, CC0-1.0, CC-BY-4.0, OFL-1.1, Zlib, BSL-1.0, Python-2.0, PSF-2.0, Artistic-2.0, MPL-2.0, WTFPL, PostgreSQL
Excluded from license check: pkg:githubactions/SonarSource/sonarqube-scan-action, pkg:npm/runcoach-frontend

OpenSSF Scorecard

Scorecard details
PackageVersionScoreDetails
nuget/Anthropic 12.39.0 UnknownUnknown
nuget/JasperFx 2.36.2 UnknownUnknown
nuget/JasperFx.Events 2.36.2 UnknownUnknown
nuget/JasperFx.SourceGenerator 2.36.1 UnknownUnknown
nuget/Marten 9.21.0 UnknownUnknown
nuget/Marten.EntityFrameworkCore 9.21.0 UnknownUnknown
nuget/OpenTelemetry.Instrumentation.AspNetCore 1.17.0 🟢 8.8
Details
CheckScoreReason
Code-Review🟢 10all changesets reviewed
Dependency-Update-Tool🟢 10update tool detected
Maintained🟢 1030 commit(s) and 28 issue activity found in the last 90 days -- score normalized to 10
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Pinned-Dependencies🟢 9dependency not pinned by hash detected -- score normalized to 9
CII-Best-Practices🟢 5badge detected: Passing
License🟢 10license file detected
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
Vulnerabilities🟢 100 existing vulnerabilities detected
SAST🟢 10SAST tool is run on all commits
Packaging🟢 10packaging workflow detected
Branch-Protection🟢 5branch protection is not maximal on development and all release branches
Fuzzing🟢 10project is fuzzed
Security-Policy🟢 10security policy file detected
CI-Tests🟢 1030 out of 30 merged PRs checked by a CI test -- score normalized to 10
Contributors🟢 10project has 23 contributing companies or organizations
nuget/OpenTelemetry.Instrumentation.Http 1.17.0 🟢 8.8
Details
CheckScoreReason
Code-Review🟢 10all changesets reviewed
Dependency-Update-Tool🟢 10update tool detected
Maintained🟢 1030 commit(s) and 28 issue activity found in the last 90 days -- score normalized to 10
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Pinned-Dependencies🟢 9dependency not pinned by hash detected -- score normalized to 9
CII-Best-Practices🟢 5badge detected: Passing
License🟢 10license file detected
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
Vulnerabilities🟢 100 existing vulnerabilities detected
SAST🟢 10SAST tool is run on all commits
Packaging🟢 10packaging workflow detected
Branch-Protection🟢 5branch protection is not maximal on development and all release branches
Fuzzing🟢 10project is fuzzed
Security-Policy🟢 10security policy file detected
CI-Tests🟢 1030 out of 30 merged PRs checked by a CI test -- score normalized to 10
Contributors🟢 10project has 23 contributing companies or organizations
nuget/SonarAnalyzer.CSharp 10.31.0.145097 UnknownUnknown
nuget/Weasel.Core 9.20.0 UnknownUnknown
nuget/Weasel.EntityFrameworkCore 9.20.0 UnknownUnknown
nuget/Weasel.Postgresql 9.20.0 UnknownUnknown
nuget/Weasel.Storage 9.17.0 UnknownUnknown
nuget/WolverineFx 6.24.1 UnknownUnknown
nuget/WolverineFx.EntityFrameworkCore 6.24.1 UnknownUnknown
nuget/WolverineFx.Marten 6.24.1 UnknownUnknown
nuget/WolverineFx.Postgresql 6.24.1 UnknownUnknown
nuget/WolverineFx.RDBMS 6.24.1 UnknownUnknown
nuget/WolverineFx.RuntimeCompilation 6.24.1 UnknownUnknown
nuget/SonarAnalyzer.CSharp 10.31.0.145097 UnknownUnknown
nuget/Anthropic 12.39.0 UnknownUnknown
nuget/JasperFx 2.36.2 UnknownUnknown
nuget/JasperFx.Events 2.36.2 UnknownUnknown
nuget/JasperFx.SourceGenerator 2.36.1 UnknownUnknown
nuget/Marten 9.21.0 UnknownUnknown
nuget/Marten.EntityFrameworkCore 9.21.0 UnknownUnknown
nuget/OpenTelemetry.Instrumentation.AspNetCore 1.17.0 🟢 8.8
Details
CheckScoreReason
Code-Review🟢 10all changesets reviewed
Dependency-Update-Tool🟢 10update tool detected
Maintained🟢 1030 commit(s) and 28 issue activity found in the last 90 days -- score normalized to 10
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Pinned-Dependencies🟢 9dependency not pinned by hash detected -- score normalized to 9
CII-Best-Practices🟢 5badge detected: Passing
License🟢 10license file detected
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
Vulnerabilities🟢 100 existing vulnerabilities detected
SAST🟢 10SAST tool is run on all commits
Packaging🟢 10packaging workflow detected
Branch-Protection🟢 5branch protection is not maximal on development and all release branches
Fuzzing🟢 10project is fuzzed
Security-Policy🟢 10security policy file detected
CI-Tests🟢 1030 out of 30 merged PRs checked by a CI test -- score normalized to 10
Contributors🟢 10project has 23 contributing companies or organizations
nuget/OpenTelemetry.Instrumentation.Http 1.17.0 🟢 8.8
Details
CheckScoreReason
Code-Review🟢 10all changesets reviewed
Dependency-Update-Tool🟢 10update tool detected
Maintained🟢 1030 commit(s) and 28 issue activity found in the last 90 days -- score normalized to 10
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Pinned-Dependencies🟢 9dependency not pinned by hash detected -- score normalized to 9
CII-Best-Practices🟢 5badge detected: Passing
License🟢 10license file detected
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
Vulnerabilities🟢 100 existing vulnerabilities detected
SAST🟢 10SAST tool is run on all commits
Packaging🟢 10packaging workflow detected
Branch-Protection🟢 5branch protection is not maximal on development and all release branches
Fuzzing🟢 10project is fuzzed
Security-Policy🟢 10security policy file detected
CI-Tests🟢 1030 out of 30 merged PRs checked by a CI test -- score normalized to 10
Contributors🟢 10project has 23 contributing companies or organizations
nuget/SonarAnalyzer.CSharp 10.31.0.145097 UnknownUnknown
nuget/Weasel.Core 9.20.0 UnknownUnknown
nuget/Weasel.EntityFrameworkCore 9.20.0 UnknownUnknown
nuget/Weasel.Postgresql 9.20.0 UnknownUnknown
nuget/Weasel.Storage 9.17.0 UnknownUnknown
nuget/WolverineFx 6.24.1 UnknownUnknown
nuget/WolverineFx.EntityFrameworkCore 6.24.1 UnknownUnknown
nuget/WolverineFx.Marten 6.24.1 UnknownUnknown
nuget/WolverineFx.Postgresql 6.24.1 UnknownUnknown
nuget/WolverineFx.RDBMS 6.24.1 UnknownUnknown
nuget/WolverineFx.RuntimeCompilation 6.24.1 UnknownUnknown
nuget/SonarAnalyzer.CSharp 10.31.0.145097 UnknownUnknown
nuget/Anthropic 12.39.0 UnknownUnknown
nuget/JasperFx 2.36.2 UnknownUnknown
nuget/JasperFx.Events 2.36.2 UnknownUnknown
nuget/JasperFx.SourceGenerator 2.36.1 UnknownUnknown
nuget/Marten 9.21.0 UnknownUnknown
nuget/Marten.EntityFrameworkCore 9.21.0 UnknownUnknown
nuget/OpenTelemetry.Instrumentation.AspNetCore 1.17.0 🟢 8.8
Details
CheckScoreReason
Code-Review🟢 10all changesets reviewed
Dependency-Update-Tool🟢 10update tool detected
Maintained🟢 1030 commit(s) and 28 issue activity found in the last 90 days -- score normalized to 10
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Pinned-Dependencies🟢 9dependency not pinned by hash detected -- score normalized to 9
CII-Best-Practices🟢 5badge detected: Passing
License🟢 10license file detected
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
Vulnerabilities🟢 100 existing vulnerabilities detected
SAST🟢 10SAST tool is run on all commits
Packaging🟢 10packaging workflow detected
Branch-Protection🟢 5branch protection is not maximal on development and all release branches
Fuzzing🟢 10project is fuzzed
Security-Policy🟢 10security policy file detected
CI-Tests🟢 1030 out of 30 merged PRs checked by a CI test -- score normalized to 10
Contributors🟢 10project has 23 contributing companies or organizations
nuget/OpenTelemetry.Instrumentation.Http 1.17.0 🟢 8.8
Details
CheckScoreReason
Code-Review🟢 10all changesets reviewed
Dependency-Update-Tool🟢 10update tool detected
Maintained🟢 1030 commit(s) and 28 issue activity found in the last 90 days -- score normalized to 10
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Pinned-Dependencies🟢 9dependency not pinned by hash detected -- score normalized to 9
CII-Best-Practices🟢 5badge detected: Passing
License🟢 10license file detected
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
Vulnerabilities🟢 100 existing vulnerabilities detected
SAST🟢 10SAST tool is run on all commits
Packaging🟢 10packaging workflow detected
Branch-Protection🟢 5branch protection is not maximal on development and all release branches
Fuzzing🟢 10project is fuzzed
Security-Policy🟢 10security policy file detected
CI-Tests🟢 1030 out of 30 merged PRs checked by a CI test -- score normalized to 10
Contributors🟢 10project has 23 contributing companies or organizations
nuget/SonarAnalyzer.CSharp 10.31.0.145097 UnknownUnknown
nuget/Weasel.Core 9.20.0 UnknownUnknown
nuget/Weasel.EntityFrameworkCore 9.20.0 UnknownUnknown
nuget/Weasel.Postgresql 9.20.0 UnknownUnknown
nuget/Weasel.Storage 9.17.0 UnknownUnknown
nuget/WolverineFx 6.24.1 UnknownUnknown
nuget/WolverineFx.EntityFrameworkCore 6.24.1 UnknownUnknown
nuget/WolverineFx.Marten 6.24.1 UnknownUnknown
nuget/WolverineFx.Postgresql 6.24.1 UnknownUnknown
nuget/WolverineFx.RDBMS 6.24.1 UnknownUnknown
nuget/WolverineFx.RuntimeCompilation 6.24.1 UnknownUnknown
nuget/SonarAnalyzer.CSharp 10.31.0.145097 UnknownUnknown
nuget/Anthropic 12.39.0 UnknownUnknown
nuget/JasperFx 2.36.2 UnknownUnknown
nuget/JasperFx.Events 2.36.2 UnknownUnknown
nuget/JasperFx.SourceGenerator 2.36.1 UnknownUnknown
nuget/Marten 9.21.0 UnknownUnknown
nuget/Marten.EntityFrameworkCore 9.21.0 UnknownUnknown
nuget/OpenTelemetry.Instrumentation.AspNetCore 1.17.0 🟢 8.8
Details
CheckScoreReason
Code-Review🟢 10all changesets reviewed
Dependency-Update-Tool🟢 10update tool detected
Maintained🟢 1030 commit(s) and 28 issue activity found in the last 90 days -- score normalized to 10
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Pinned-Dependencies🟢 9dependency not pinned by hash detected -- score normalized to 9
CII-Best-Practices🟢 5badge detected: Passing
License🟢 10license file detected
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
Vulnerabilities🟢 100 existing vulnerabilities detected
SAST🟢 10SAST tool is run on all commits
Packaging🟢 10packaging workflow detected
Branch-Protection🟢 5branch protection is not maximal on development and all release branches
Fuzzing🟢 10project is fuzzed
Security-Policy🟢 10security policy file detected
CI-Tests🟢 1030 out of 30 merged PRs checked by a CI test -- score normalized to 10
Contributors🟢 10project has 23 contributing companies or organizations
nuget/OpenTelemetry.Instrumentation.Http 1.17.0 🟢 8.8
Details
CheckScoreReason
Code-Review🟢 10all changesets reviewed
Dependency-Update-Tool🟢 10update tool detected
Maintained🟢 1030 commit(s) and 28 issue activity found in the last 90 days -- score normalized to 10
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Pinned-Dependencies🟢 9dependency not pinned by hash detected -- score normalized to 9
CII-Best-Practices🟢 5badge detected: Passing
License🟢 10license file detected
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
Vulnerabilities🟢 100 existing vulnerabilities detected
SAST🟢 10SAST tool is run on all commits
Packaging🟢 10packaging workflow detected
Branch-Protection🟢 5branch protection is not maximal on development and all release branches
Fuzzing🟢 10project is fuzzed
Security-Policy🟢 10security policy file detected
CI-Tests🟢 1030 out of 30 merged PRs checked by a CI test -- score normalized to 10
Contributors🟢 10project has 23 contributing companies or organizations
nuget/SonarAnalyzer.CSharp 10.31.0.145097 UnknownUnknown
nuget/Weasel.Core 9.20.0 UnknownUnknown
nuget/Weasel.EntityFrameworkCore 9.20.0 UnknownUnknown
nuget/Weasel.Postgresql 9.20.0 UnknownUnknown
nuget/Weasel.Storage 9.17.0 UnknownUnknown
nuget/WolverineFx 6.24.1 UnknownUnknown
nuget/WolverineFx.EntityFrameworkCore 6.24.1 UnknownUnknown
nuget/WolverineFx.Marten 6.24.1 UnknownUnknown
nuget/WolverineFx.Postgresql 6.24.1 UnknownUnknown
nuget/WolverineFx.RDBMS 6.24.1 UnknownUnknown
nuget/WolverineFx.RuntimeCompilation 6.24.1 UnknownUnknown
nuget/SonarAnalyzer.CSharp 10.31.0.145097 UnknownUnknown

Scanned Files

  • .github/workflows/ci.yml
  • .github/workflows/license-review.yml
  • .github/workflows/sonarqube.yml
  • backend/src/RunCoach.Api/RunCoach.Api.csproj
  • backend/tests/RunCoach.Api.Tests/RunCoach.Api.Tests.csproj
  • frontend/node_modules/@apidevtools/swagger-parser/node_modules/json-schema-traverse/.github/workflows/build.yml
  • frontend/node_modules/@apidevtools/swagger-parser/node_modules/json-schema-traverse/.github/workflows/publish.yml
  • frontend/node_modules/@scalar/openapi-parser/node_modules/json-schema-traverse/.github/workflows/build.yml
  • frontend/node_modules/@scalar/openapi-parser/node_modules/json-schema-traverse/.github/workflows/publish.yml
  • frontend/node_modules/ajv-formats/node_modules/json-schema-traverse/.github/workflows/build.yml
  • frontend/node_modules/ajv-formats/node_modules/json-schema-traverse/.github/workflows/publish.yml
  • frontend/node_modules/fast-uri/.github/workflows/ci.yml
  • frontend/node_modules/fast-uri/.github/workflows/lock-threads.yml
  • frontend/node_modules/fast-uri/.github/workflows/package-manager-ci.yml
  • frontend/node_modules/oazapfts/node_modules/json-schema-traverse/.github/workflows/build.yml
  • frontend/node_modules/oazapfts/node_modules/json-schema-traverse/.github/workflows/publish.yml
  • frontend/package-lock.json
  • package-lock.json

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.

0 participants