You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Status: in-flight (AOT pillar + all 13 extension-package AOT flags + cold-start #1577Tier 1 + foundation re-pin to the alpha.20 matrix + 6.0.0-alpha.5 cut + Marten 9 test alignment + DCB parity all complete; remaining: cold-start #1577 Tier 2/3 + #2728, feature work JasperFx/CritterWatch#239 / #2221, CI/dev-loop #2810, release-cut tasks tracked in #2745) Target version: Wolverine 6.0 Milestone:6.0
Part of [Master] Critter Stack 2026 (JasperFx/jasperfx#217).
Pillars: cold-start (JasperFx/jasperfx#212), AOT compliance (JasperFx/jasperfx#213).
Dedupe pillar (JasperFx/jasperfx#214) is not in scope for Wolverine — that pillar is Marten ↔ Polecat consolidation only.
Wolverine 6 is the messaging/orchestration release of the Critter Stack 2026 wave. The work is dominated by the cold-start and AOT pillars, plus accumulated Wolverine-specific items on the 6.0 milestone (defaults flip to ServiceLocationPolicy.NotAllowed, scheduler integrations, Result-pattern support).
Wolverine's runtime codegen stays — per the Critter Stack 2026 blog post, source-generator conversion is architecturally not feasible for Wolverine. The AOT story leans entirely on JasperFx's existing dotnet run -- codegen write pre-generation path: dev-time codegen produces source files; production publish drops JasperFx.RuntimeCompiler and the trimmer drops Roslyn.
AOT-clean (Static mode). Wolverine apps that pre-generate handlers via codegen write publish AOT-clean. Runtime codegen remains supported but is annotated with [RequiresDynamicCode] / [RequiresUnreferencedCode].
API cleanup — accumulated [Obsolete] APIs since Wolverine 5 are removed.
Out of scope for Wolverine 6
Source-generator conversion. Per the blog post: "not remotely possible" — architecturally rejected. Wolverine stays on runtime codegen + AOT annotations.
Wolverine.AotSmoke + Wolverine.AotSmoke.Static regression-guard projects in src/Testing/. CI workflow aot.yml runs them on every build via ./build.sh CIAotSmoke.
Cold-start benchmarks land in JasperFx/CritterStackScalability for side-by-side Wolverine 5 vs. Wolverine 6 measurement. Builds on the existing Scalability.WolverinePerfTest project there. (CSS #3 Wolverine cold-start child binary + CSS #4 runtime perf harness shipped via CSS PR Endpoint Configuration Policies #6. The manual harness run is tracked in #2745 — running the harness to capture release-blog numbers is Jeremy's hands.)
AOT smoke test — Wolverine in a Static-mode app passes dotnet publish /p:PublishAot=true with no IL2026 / IL3050 warnings beyond the explicitly-annotated runtime-codegen surface. (src/Testing/Wolverine.AotSmoke + src/Testing/Wolverine.AotSmoke.Static; CI workflow .github/workflows/aot.yml runs ./build.sh CIAotSmoke on every build.)
Wolverine-specific 6.0 work (existing milestone issues)
Optimize Marten CI build wall-clock by combining test invocations #2810 — Optimize Marten CI build wall-clock by combining test invocations. CIMarten spawns dotnet test once per test class (111 classes in MartenTests); the process-spawn + fixture-init overhead is the gating job on most cross-stack pin-bump PRs (see PR Bump JasperFx pins to alpha.12 / Events alpha.7 + AOT chunk M #2806). Options: batch classes, enable xUnit collection-level parallelism, or split slow daemon tests into a separate project. Same pattern applies to CIPersistence / CIEfCore / other RunSingleProjectOneClassAtATime consumers. (Chip staged at .claude/chips/2810-marten-ci-build-time.md; paused per Jeremy's preference for manual involvement.)
Foundation bump
Adopt JasperFx 2.0 + JasperFx.Events 2.0 when alphas stabilize. (Directory.Packages.props via PR Wolverine: re-pin to JasperFx.Events alpha.16 / Marten 9.0-alpha.4 / Polecat 4.0-alpha.8 / Weasel 9.0-alpha.6 (foundation re-align) #2848: JasperFx 2.0.0-alpha.20, JasperFx.Events 2.0.0-alpha.21, JasperFx.Events.SourceGenerator 2.0.0-alpha.13 (wired for projection dispatch), JasperFx.RuntimeCompiler 5.0.0-alpha.5, Marten 9.0.0-alpha.5, Polecat 4.0.0-alpha.10, Weasel 9.0.0-alpha.7. Note: Marten + Polecat are one Events alpha behind (alpha.20); the alpha.21 delta is the DCB boundary-aggregate evolver — a convergence re-pin will follow once Marten #4514 lands.)
TFM alignment: drop net8.0; targets become net9.0;net10.0. Add net11.0 when JasperFx does. (Directory.Build.props sets net9.0;net10.0 as the default for all packaged projects.)
Wolverine.RuntimeCompilation project review — its scope and packaging story relative to JasperFx.RuntimeCompiler. (Reviewed: kept as a separate opt-in package WolverineFx.RuntimeCompilation. Description on the csproj explains the contract: production deployments that pre-generate via codegen write don't reference this package; the trimmer drops Roslyn.)
Documentation
AOT publishing guide specific to Wolverine: pre-generate with codegen write at dev time, publish with Static mode and no AddRuntimeCompilation(), no runtime code generation in production. (docs/guide/aot.md.)
JasperFx's dotnet run -- codegen write must produce byte-stable output that round-trips cleanly into Wolverine's Static mode. Tracked in the JasperFx 2.0 plan; flagging the dependency here.
Wolverine does not participate in the dedupe pillar; Marten 9 ↔ Polecat 4 coordination doesn't gate Wolverine 6.
Open design questions
Cold-start budget: does Wolverine 6 commit to a numeric "first-message latency under N ms in a Lambda-equivalent" or just "trend down, no regressions"? Open question on pillar Code generation goes boom when a route pattern has a dash #212; punted here.
Explicitly out of scope for Wolverine 6
Source-generator conversion of Wolverine's codegen layer (architectural — out).
Marten ↔ Polecat dedup work (different pillar, different products).
Wolverine 6 is the messaging/orchestration release of the Critter Stack 2026 wave. The work is dominated by the cold-start and AOT pillars, plus accumulated Wolverine-specific items on the 6.0 milestone (defaults flip to
ServiceLocationPolicy.NotAllowed, scheduler integrations, Result-pattern support).Wolverine's runtime codegen stays — per the Critter Stack 2026 blog post, source-generator conversion is architecturally not feasible for Wolverine. The AOT story leans entirely on JasperFx's existing
dotnet run -- codegen writepre-generation path: dev-time codegen produces source files; production publish dropsJasperFx.RuntimeCompilerand the trimmer drops Roslyn.Goals for 6.0
codegen writepublish AOT-clean. Runtime codegen remains supported but is annotated with[RequiresDynamicCode]/[RequiresUnreferencedCode].ServiceLocationPolicy.NotAllowedbecomes the Wolverine 6 default (Make ServiceLocationPolicy.NotAllowed the Default in Wolverine 6 #2584).[Obsolete]APIs since Wolverine 5 are removed.Out of scope for Wolverine 6
✅ Major milestones already landed
HandlerGraph.Compile,Forwarders.FindForwards,EnvelopeMapper, allCloseAndBuildAssites in routing/partitioning/batching/sagas) annotated.IsAotCompatible=trueis honest.CloseAndBuildAs<T>(runtimeType)AOT-compliant replacement via pre-populated per-message-type caches (PR AOT #2769 Option A: pre-populate per-message-type CloseAndBuildAs caches #2794, "Option A").Executor.cs InvokeAsyncsites ([perf] Pool Envelope instances for the internal receive pipeline #2726 implementation). Benchmark gate tracked in [Release] Wolverine 6.0 Release Punchlist #2745.ServiceLocationPolicy.NotAllowedis now the Wolverine 6 default.FastExpressionCompilerinEnvelopeMapperwith delegate dispatch (PR AOT #2755: replace FastExpressionCompiler in EnvelopeMapper with delegate dispatch #2793).IForwardsTo<T>assembly scan with explicit registration (PR AOT #2757: explicit IForwardsTo<T> registration replaces assembly scan (BREAKING) #2795, BREAKING).Wolverine.AotSmoke+Wolverine.AotSmoke.Staticregression-guard projects insrc/Testing/. CI workflowaot.ymlruns them on every build via./build.sh CIAotSmoke.Wolverine.Postgresql,Wolverine.SqlServer,Wolverine.Sqlite,Wolverine.MySql,Wolverine.Oracle,Wolverine.Newtonsoft,Wolverine.DataAnnotationsValidation,Wolverine.FluentValidationcarryIsAotCompatible=true(chunks AE–AL, PRs AOT chunk AE: flip IsAotCompatible=true on Wolverine.Postgresql (#2746) #2789–AOT chunk AL: flip IsAotCompatible=true on Wolverine.FluentValidation (#2746) #2803). Second + third waves (HTTP/integration + serializer/transport) landed 2026-05-19 via PRs Wolverine AOT pass: HTTP + integration extension packages (5 packages) #2851 + Wolverine AOT pass: serializer + transport extension packages (8 packages) #2852 — see below.WolverineFx.Http.Newtonsoftextracted — PR #2742: extract WolverineFx.Http.Newtonsoft package #2807 (refs Newtonsoft.Json extraction: Wolverine.Http follow-up #2742).new int Versionsubclass shadows — PR Fix Saga.Version reflection ambiguity for subclasses with 'new int Version' shadow #2828.2026-05-19 landings (foundation re-align + AOT extension sweep + cold-start Tier 1 + DCB)
JasperFx.Events.SourceGeneratorfor projection dispatch + adapted to Marten 9 / JasperFx 2.0 API renames. Cut 6.0.0-alpha.5.Wolverine.HealthChecks,Wolverine.Polecat,Wolverine.Http.Marten,Wolverine.Http.Polecat,Wolverine.Http.FluentValidationnow carryIsAotCompatible=true.Wolverine.MemoryPack,Wolverine.MessagePack,Wolverine.Protobuf,Wolverine.Grpc,Wolverine.FluentValidation.Grpc,Wolverine.CosmosDb,Wolverine.ClaimCheck.AmazonS3,Wolverine.ClaimCheck.AzureBlobStorageflagged (wrapper-level annotations where upstream SDKs are reflection-driven). With Wolverine AOT pass: HTTP + integration extension packages (5 packages) #2851 + Wolverine AOT pass: serializer + transport extension packages (8 packages) #2852, every packaged lib except the intentionally-offWolverine.RuntimeCompilationnow carries the AOT flag — AOT pillar Explore the idea of a command to export external annotations for handlers, endpoints, and generated types #213 is closeable.codegen writeemits a handler-discovery manifest so Static-mode boot skips the handler-discovery assembly scan.FetchForWriting; async-only LINQ + Quick append mode;UseIdentityMapForAggregatesdefault opt-out.EnvelopeSerializer+ TCP transport.What's left
Cold-start (JasperFx/jasperfx#212)
.claude/chips/2728-snapshot-extension.md).JasperFx.Core.Reflection.GenericFactoryCache(landed in JasperFx 2.0 PR Marten command handler support without requiring Version property #191) on the per-message handler instantiation hot path. (PR AOT #2769 Option A: pre-populate per-message-type CloseAndBuildAs caches #2794 — Option A: pre-populate per-message-typeCloseAndBuildAscaches.)IForwardsTo<T>registration replaces assembly scan; further per-call-site audit tracked under Optimize Cold Start Times #1577 sub-issues.)JasperFx/CritterStackScalabilityfor side-by-side Wolverine 5 vs. Wolverine 6 measurement. Builds on the existingScalability.WolverinePerfTestproject there. (CSS #3 Wolverine cold-start child binary + CSS #4 runtime perf harness shipped via CSS PR Endpoint Configuration Policies #6. The manual harness run is tracked in #2745 — running the harness to capture release-blog numbers is Jeremy's hands.)AOT (JasperFx/jasperfx#213)
IsAotCompatible=trueonWolverine.csprojonce it builds against JasperFx 2.0 + JasperFx.Events 2.0. (src/Wolverine/Wolverine.csproj— flag is set; tracked via [AOT pillar] Wolverine.csproj IsAotCompatible=true (tracking) #2746 — CLOSED.)[RequiresDynamicCode]/[RequiresUnreferencedCode]. (Chunks A–U complete, PRs AOT pillar: foundation + Wolverine.AotSmoke regression-guard #2747 / AOT chunk B: annotate Transports/EnvelopeMapper.cs (#2746) #2753–AOT chunk U: HandlerGraph.cs codegen + bootstrap suppressions (#2746) #2778. Every reflective entry point annotated per the csproj header note.)IJasperFxCommanddiscovery uses the existing JasperFx source generator (Wolverine CLI commands). (Folded into the per-file annotation chunks under [AOT pillar] Wolverine.csproj IsAotCompatible=true (tracking) #2746.)codegen writeround-trips Wolverine code correctly — pre-generated handlers/middleware load cleanly underTypeLoadMode = Staticwith no runtime regen path. (PR #2746 sub-PR I: TypeLoadMode.Static codegen-write round-trip smoke (closes the AOT pillar) #2805 —TypeLoadMode.Staticcodegen-write round-trip smoke, closes the AOT pillar.)Static-mode app passesdotnet publish /p:PublishAot=truewith noIL2026/IL3050warnings beyond the explicitly-annotated runtime-codegen surface. (src/Testing/Wolverine.AotSmoke+src/Testing/Wolverine.AotSmoke.Static; CI workflow.github/workflows/aot.ymlruns./build.sh CIAotSmokeon every build.)Wolverine-specific 6.0 work (existing milestone issues)
ServiceLocationPolicy.NotAllowedthe default. Breaking default flip; aligns with the "defaults reflect best-observed-perf config" cross-cutting initiative. (CLOSED.)CI / dev-loop
CIMartenspawnsdotnet testonce per test class (111 classes inMartenTests); the process-spawn + fixture-init overhead is the gating job on most cross-stack pin-bump PRs (see PR Bump JasperFx pins to alpha.12 / Events alpha.7 + AOT chunk M #2806). Options: batch classes, enable xUnit collection-level parallelism, or split slow daemon tests into a separate project. Same pattern applies toCIPersistence/CIEfCore/ otherRunSingleProjectOneClassAtATimeconsumers. (Chip staged at.claude/chips/2810-marten-ci-build-time.md; paused per Jeremy's preference for manual involvement.)Foundation bump
JasperFx 2.0+JasperFx.Events 2.0when alphas stabilize. (Directory.Packages.propsvia PR Wolverine: re-pin to JasperFx.Events alpha.16 / Marten 9.0-alpha.4 / Polecat 4.0-alpha.8 / Weasel 9.0-alpha.6 (foundation re-align) #2848: JasperFx 2.0.0-alpha.20, JasperFx.Events 2.0.0-alpha.21, JasperFx.Events.SourceGenerator 2.0.0-alpha.13 (wired for projection dispatch), JasperFx.RuntimeCompiler 5.0.0-alpha.5, Marten 9.0.0-alpha.5, Polecat 4.0.0-alpha.10, Weasel 9.0.0-alpha.7. Note: Marten + Polecat are one Events alpha behind (alpha.20); the alpha.21 delta is the DCB boundary-aggregate evolver — a convergence re-pin will follow once Marten #4514 lands.)net8.0; targets becomenet9.0;net10.0. Addnet11.0when JasperFx does. (Directory.Build.props setsnet9.0;net10.0as the default for all packaged projects.)6.0.0-alpha.1on all packaged Wolverine projects. (Currently on6.0.0-alpha.5per PR Wolverine: re-pin to JasperFx.Events alpha.16 / Marten 9.0-alpha.4 / Polecat 4.0-alpha.8 / Weasel 9.0-alpha.6 (foundation re-align) #2848.)Wolverine.RuntimeCompilationproject review — its scope and packaging story relative to JasperFx.RuntimeCompiler. (Reviewed: kept as a separate opt-in packageWolverineFx.RuntimeCompilation. Description on the csproj explains the contract: production deployments that pre-generate viacodegen writedon't reference this package; the trimmer drops Roslyn.)Documentation
codegen writeat dev time, publish withStaticmode and noAddRuntimeCompilation(), no runtime code generation in production. (docs/guide/aot.md.)ServiceLocationPolicydefault change, JasperFx 2.0 adoption, API removals. (docs/guide/migration.md. Pre-release spot-check tracked in [Release] Wolverine 6.0 Release Punchlist #2745.)Cross-product dependencies
dotnet run -- codegen writemust produce byte-stable output that round-trips cleanly into Wolverine'sStaticmode. Tracked in the JasperFx 2.0 plan; flagging the dependency here.Open design questions
Explicitly out of scope for Wolverine 6
Linked implementation work