chore(deps): clear all five package advisories, .NET 10 servicing patches, and test-tooling majors - #53
Merged
Conversation
…patches A full `dotnet list package --vulnerable --include-transitive` showed five advisories, not the one visible in build warnings — the rest were being lost in warning noise. All are now clear across the solution and the build project. Security: - OpenTelemetry 1.11.x -> 1.17.0 (Prometheus exporter 1.10.0-beta.1 -> 1.17.0-beta.1 to stay in step). GHSA-g94r-2vxg-569j + GHSA-4625-4j76-fww9. Highest-impact of the set: ServiceDefaults is referenced by every host, so this shipped everywhere. - SharpCompress 0.38.0 -> 0.50.1. GHSA-6c8g-7p36-r338. Interim fix — its only consumer is the dead MediathekView parser that #49 removes outright. - Aspire.Hosting* 13.1.2 -> 13.4.6, which drops the StreamJsonRpc that carried MessagePack 2.5.192. GHSA-hv8m-jj95-wg3x. - Fallout.Common/Components 10.3.49 -> 10.4.0-rc.4, picking up Microsoft.Build 18.0.2 and clearing the five System.Security.Cryptography.Xml advisories on the Nuke build project. Servicing patches, same major (no API surface change): - EF Core + Design + SqlServer 10.0.4 -> 10.0.10 - Microsoft.Extensions.{Hosting.Abstractions,Configuration.Binder,Http} and Microsoft.AspNetCore.OpenApi 10.0.0 -> 10.0.10 - Riok.Mapperly 4.1.1 -> 4.3.1 The Aspire bump needed a second change to work. `Aspire.AppHost.Sdk` in Krautwatch.AppHost.csproj separately pins Aspire.Hosting.AppHost, the DCP orchestrator and the dashboard; leaving it at 13.1.2 while Aspire.Hosting moved to 13.4.6 made DCP refuse to start outright ("Newer version of the Aspire.Hosting.AppHost package is required"). Bumped to 13.4.6 with a comment so the lockstep requirement is not rediscovered the hard way. Deliberately NOT bumped — majors wanting their own PR and real testing: WolverineFx 5.18 -> 6.22 (the messaging/outbox backbone), NSubstitute 5 -> 6, Microsoft.NET.Test.Sdk 17 -> 18, xunit.runner.visualstudio 2 -> 3, and Microsoft.Extensions.{ServiceDiscovery,Http.Resilience} 9.x -> 10.8.0. Verified: `dotnet list package --vulnerable --include-transitive` clean on both the solution and build/_build.csproj. Build is 0 warnings / 0 errors. Tests green (Infra 67 / App 50 / Arch 8). `dotnet run --project AppHost` brings the fleet up — DCP created the Postgres container and started all five long-running hosts, with the run-to-completion migrator finishing first. Note: Aspire 13.4.6 defaults the dev Postgres container to postgres:18.3 (was 17.x). Dev data is ephemeral so this is harmless, but our Testcontainers fixture pins postgres:17-alpine and could be aligned. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Takes the three dev-tooling majors held back from the previous commit. These are
build/test-time only — nothing here ships in a host:
- Microsoft.NET.Test.Sdk 17.14.1 -> 18.8.1
- xunit.runner.visualstudio 2.8.2 -> 3.1.5 (the v3 runner supports the
xunit 2.9.3 core we use)
- NSubstitute 5.3.0 -> 6.0.0
Shouldly (4.3.0), xunit (2.9.3) and ArchUnitNET (0.13.3) were already current.
NSubstitute 6 changed the nullability annotation on Arg.Is<T>'s predicate — the
lambda parameter is now T? — which surfaced four new CS8602/CS8604 warnings in
Application.Tests. Fixed with explicit null guards rather than the null-forgiving
operator, so a null argument fails the Received() assertion with NSubstitute's own
message instead of throwing an NRE inside the matcher.
Verified the test-runner major did not break trait filtering, which is what
separates the two build targets:
- ./build.sh Test -> 125 tests, Live correctly EXCLUDED (9s)
- ./build.sh TestLive -> 16/16 Live tests, correctly INCLUDED, real ARD/ZDF
network downloads green (6m6s)
Build is back to 0 warnings / 0 errors.
Also corrected a prerequisite I got wrong in the README rewrite: it told readers to
run `dotnet workload install aspire`. That is legacy — Aspire 13 arrives via the
Aspire.AppHost.Sdk reference plus NuGet packages. Confirmed empirically: this
machine has NO workloads installed and the fleet starts fine.
global.json is deliberately left at 10.0.100 — with rollForward latestMinor that is
a floor, not a pin (it resolves to 10.0.302 here). Raising it would only exclude
contributors on an earlier 10.0.x feature band for no gain.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ChrisonSimtian
added a commit
that referenced
this pull request
Jul 27, 2026
…ery-driven DR-010 stated that polling each Sonarr/Radarr instance for its monitored series "is the crawl work-list". That made the monitored list load-bearing: #6 was scoped as the work-list, #12 was blocked behind it, and #4/#48 became prerequisites for basic indexing. Before building it, checked how the comparable projects solve the same problem. Neither does it this way: - MediathekArr keeps no catalog at all. It is a live search proxy — "pretending to be a usenet indexer, but actually just fetching and parsing search results from MediathekViewWeb", with TVDB for metadata and the real effort in matching. - RundfunkArr uses curated configuration: data/shows.json plus data/rulesets.json (Mediathek topic, filters, season/episode regex), extended by community PRs. Neither reads Sonarr's monitored series via the Sonarr API, because the Newznab contract is pull-by-query: Sonarr already knows what it monitors and asks for exactly what it wants. An indexer is not supposed to know the monitored list. The reason the question arose for us is our own choice, not a property of being an *arr indexer: DR-010 de-emphasised MediathekView in favour of the direct ARD/ZDF APIs. MediathekViewWeb is effectively a complete dump, so MediathekArr gets breadth free; our ARD crawler must walk A-Z catalog -> show page -> episodes -> item page and therefore has to be told which shows to walk. The work-list problem is self-inflicted by the direct-API decision. DR-011 accordingly: - Search becomes query-driven (resolve on demand, cache), so any show works without pre-registration. - The standing crawl list survives only as RSS-feed input, since RSS-Sync genuinely needs a recent-releases list. - Reach-back is demoted to an optional pre-warm. Nothing may depend on a configured *arr instance to function. - Matching (EpisodeNumbering, SeriesType, the unset Show.TvdbId) is where the effort belongs, since that is where both comparables concentrate. Reach-back was also insufficient on its own: an interactive search for a show that is unmonitored, or monitored but not yet crawled, returns nothing — so a query-driven path was needed regardless, which demotes reach-back by definition. DR-010's clause is struck through in place rather than deleted, so the history stays readable, and its header records the retraction. CLAUDE.md stated the retracted claim as fact and is corrected. Recorded honestly in the DR: MediathekArr's README does not explicitly say live-versus-cached (inferred), and neither project documents RSS support — which is exactly the half that still needs a standing crawl, so our RSS design cannot be copied from either. Backlog: #6 re-scoped to an optional pre-warm and unblocked from #12; #58 opened for query-driven search; #49 (delete MediathekView) put on hold — its SharpCompress advisory was already fixed by a version bump in #53, and the filmliste is the only full-catalog source available, which is precisely what MediathekArr depends on. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
A
dotnet list package --vulnerable --include-transitivesweep found five advisories, not the one that happened to surface as a build warning — the rest were being lost in NU19xx noise. All are now clear.Security
OpenTelemetry.*1.11.x → 1.17.0ServiceDefaultsis referenced by every host, so this shipped everywhere. Prometheus exporter1.10.0-beta.1→1.17.0-beta.1to stay in step.SharpCompress0.38.0 → 0.50.1Aspire.Hosting*13.1.2 → 13.4.6StreamJsonRpcthat carriedMessagePack 2.5.192.Fallout.Common/Components10.3.49 → 10.4.0-rc.4System.Security.Cryptography.XmlMicrosoft.Build 18.0.2. Clears every advisory on the Nuke build project.Servicing patches (same major, no API change)
10.0.4→10.0.10Microsoft.Extensions.{Hosting.Abstractions,Configuration.Binder,Http}+Microsoft.AspNetCore.OpenApi10.0.0→10.0.10Riok.Mapperly4.1.1→4.3.1The Aspire bump needed a second, non-obvious change
Bumping the
Aspire.Hosting*packages alone broke the fleet outright:<Sdk Name="Aspire.AppHost.Sdk" Version="13.1.2" />inKrautwatch.AppHost.csprojseparately pinsAspire.Hosting.AppHost, the DCP orchestrator and the dashboard. WithAspire.Hostingat 13.4.6 and DCP still at 13.1.2, DCP refuses to start. Bumped to 13.4.6 with a comment recording the lockstep requirement.This only shows up at runtime —
dotnet buildand the whole test suite passed while the fleet was completely broken. Worth knowing for future Aspire bumps.Test tooling upgraded too (second commit)
The dev-tooling majors, now done and verified — build/test-time only, nothing here ships in a host:
Microsoft.NET.Test.Sdk17.14.1→ 18.8.1xunit.runner.visualstudio2.8.2→ 3.1.5 (the v3 runner supports the xunit 2.9.3 core we use)NSubstitute5.3.0→ 6.0.0Shouldly (4.3.0), xunit (2.9.3) and ArchUnitNET (0.13.3) were already current.
NSubstitute 6 changed the nullability annotation on
Arg.Is<T>'s predicate — the lambda parameteris now
T?— surfacing four newCS8602/CS8604warnings. Fixed with explicit null guards ratherthan
!, so a null argument fails theReceived()assertion with NSubstitute's own message instead ofthrowing an NRE inside the matcher.
A test-runner major can break trait filtering, which is exactly what separates our two build
targets, so both directions were verified:
./build.sh Test./build.sh TestLiveAlso corrected a prerequisite I got wrong in the README rewrite: it told readers to run
dotnet workload install aspire. That is legacy — Aspire 13 arrives via theAspire.AppHost.Sdkreference plus NuGet. Confirmed empirically: this machine has no workloads installed at all and the
fleet starts fine.
global.jsondeliberately left at10.0.100— withrollForward: latestMinorthat is a floor, not apin (resolves to 10.0.302 locally). Raising it would only exclude contributors on an earlier 10.0.x
feature band.
Still deliberately NOT bumped
WolverineFx5.18 → 6.22 — the messaging/mediator/outbox backbone. A major there deserves its own PR and its own testing.Microsoft.Extensions.{ServiceDiscovery,Http.Resilience}9.x → 10.8.0 — the only packages still on 9.x while everything else is 10.x, so worth doing, but they're majors that touch service discovery and HTTP resilience at runtime.Testing
dotnet list package --vulnerable --include-transitive— clean on both the solution andbuild/_build.csproj../build.sh Test: Infra 67 / App 50 / Arch 8 green.dotnet run --project AppHost— DCP created the Postgres container and started all five long-running hosts (newznab,web,agent-ard,agent-zdf,agent-downloader), with the run-to-completionmigratorfinishing first..github/workflows/build.yml(and.fallout/build.schema.json) are Fallout-generated, and bumping to10.4.0-rc.4 regenerated them as a side effect of running the build. I did not hand-edit either.
The workflow change is not cosmetic:
The last line matters: CI now invokes the Fallout global tool instead of
./build.cmd. That tool ispinned to 10.3.49 in
.config/dotnet-tools.jsonand cannot be bumped — 10.4.0-rc.4 offallout.globaltoolis not on nuget.org. So as of this PR, CI runs the 10.3.49 tool against a_build.csprojthat references 10.4.0-rc.4 packages.Resolved empirically: the skew is fine. CI passed and the log confirms it genuinely ran the old tool
against the new packages:
So this is not a blocker.
fallout.globaltoolhas no 10.4.x on nuget.org (latest is 10.3.49), so.config/dotnet-tools.jsonstays put — publish the tool at 10.4.0-rc.4 and it can follow in a one-linechange.
Two further notes for the reviewer
fallout.globaltoolstays at 10.3.49 in.config/dotnet-tools.json— there is no 10.4.0-rc.4 of the global tool on nuget.org. It is not in the build path (build.shrunsdotnet runagainst_build.csprojdirectly); it is only used forfallout --generate-configuration. So there is now a tool/package skew that could regenerate a stale CI workflow. Publish the tool at 10.4.0-rc.4 and this can follow.postgres:18.3(was 17.x). Dev data is ephemeral so it is harmless, but the Testcontainers fixture pinspostgres:17-alpineand could be aligned so tests match dev.🤖 Generated with Claude Code