Skip to content

Bobcat 1.0.0-rc.1 - #5079

Merged
jeremydmiller merged 1 commit into
mainfrom
bobcat-1.0.0-rc.1
Oct 18, 2026
Merged

jeremydmiller merged 1 commit into
mainfrom
bobcat-1.0.0-rc.1

Conversation

@jeremydmiller

@jeremydmiller jeremydmiller commented Oct 18, 2026 •

Copy link
Copy Markdown
Member

Moves Wolverine onto Bobcat 1.0.0-rc.1. Nothing is published from this PR.

This unblocks a WolverineFx.Bobcat release paired with Bobcat 1.0 (JasperFx/bobcat#677). The published WolverineFx.Bobcat 6.51.0-alpha.1 does not work with Bobcat rc.1 at run time, because rc.1 renamed CritterStackScenario.Store to EventStore with no alias. WolverineScenario.heardOn, on runActAsync's path, calls CritterStackScenario.get_Store(), so WolverineSpec.WhenActing throws MissingMethodException. The CritterStackSamples migration found this. This PR moves that call to EventStore.

Pins changed (root Directory.Packages.props)

Package Was Now
Bobcat, Bobcat.Xunit, Bobcat.Generators 1.0.0-alpha.1 (but 0.60.4 for WolverineFx.Bobcat, its tests and two samples, through VersionOverride) 1.0.0-rc.1 everywhere
Bobcat.Supervisor (build project only) 0.60.4 1.0.0-rc.1
JasperFx, JasperFx.Events, JasperFx.Events.SourceGenerator, JasperFx.Events.InMemory, JasperFx.SourceGenerator 2.90.1 2.90.2
  • The WolverineFxBobcatBobcatVersion hold (0.60.4) is gone. It was there for ThenSingleReadModel<T>() no longer refuses a MultiStreamProjection when the scenario has no stream (#616 short-circuits the check) bobcat#672 (ThenSingleReadModel stopped refusing a MultiStreamProjection when the scenario has no stream). rc.1 fixed that (bobcat#719), and a_single_read_model_refuses_a_multi_stream_projection passes unchanged. The VersionOverride was removed from these projects:
    • src/Bobcat/Wolverine.Bobcat/Wolverine.Bobcat.csproj, which is the WolverineFx.Bobcat package. Its nuspec dependency becomes Bobcat >= 1.0.0-rc.1.
    • Wolverine.Bobcat.Tests and Wolverine.Bobcat.Http.Tests.
    • IncidentService.Tests and ProcessManagerViaHandlers.Tests.
    • WolverineFx.Bobcat.Http follows through its reference to Wolverine.Bobcat.
  • JasperFx 2.90.2 is the minimum Bobcat 1.0's nuspec declares, and Bobcat's compatibility page says not to pin JasperFx below it. It's a patch release (the stopped-agent memory leak fix).
  • No xUnit change. The whole repo was already on xunit.v3 4.0.2 / Microsoft.Testing.Platform 2.x (Move the whole repo to xunit.v3 4.x on Microsoft.Testing.Platform 2 (root global.json test runner) #4979), which is what Bobcat 1.0's adapters need. The projects that take Bobcat (Wolverine.ComplianceTests, SlowTests, the six LeaderElection projects, the RabbitMQ and Azure Service Bus transport tests, the two samples, and WolverineFx.Bobcat and its tests) all go through central package management and need no csproj change beyond the VersionOverride removals above.

Code changes

  • WolverineScenario: Store -> EventStore, the CritterStackScenario rename (bobcat#709/Explicit binding of Rabbit MQ topic exchange somehow leading to erroneous usage with Wolverine internal agent messages #710, no alias). That was the only use in WolverineFx.Bobcat. I checked the built assemblies with System.Reflection.Metadata:
    • The rebuilt Wolverine.Bobcat.dll has no member reference to CritterStackScenario::get_Store. The only get_Store references left are on Wolverine.Tracking.AppendedEvents and Bobcat.CritterStack.StoreHighWaterMark, both of which still have it. It now references CritterStackScenario::get_EventStore.
    • Wolverine.Bobcat.Http.dll references neither.
    • acting_through_the_tracked_session.an_act_that_goes_through_the_bus_is_judged_on_what_the_tracked_session_saw is the regression test for this. It acts with WhenActing through the bus on a single store, so the append goes through a Wolverine-opened session and the tracked session hears it, which goes through runActAsync and heardOn. It passes, along with the rest of that class and ancillary_stores (11/11). Nothing in the tests or samples used the scenario's Store: the samples' Store is their own IDocumentStore.
  • WolverineFx.Bobcat tests now expect the intended 1.0 rendering. Only the expected strings changed, with no behaviour change:
    • value aliases render as #theAppointment (bobcat#640): 9 tests in Wolverine.Bobcat.Tests and 3 in Wolverine.Bobcat.Http.Tests
    • strings in a values cell are quoted (Seat: "4C", bobcat#633)
    • GivenReadModel reads there is a Dashboard with Status: "quiet" (bobcat#634)
    • a read model's Then names its id: the Appointment #theAppointment matches
  • modeled_read_models.a_single_read_model_needs_a_stream_to_be_about: with no stream, a single read now reads the one T in the store (bobcat#616). None is now an assertion failure (SpecificationFailedException) rather than a SpecCriticalException. The message assertion ("the act started none and the givens arranged none") is unchanged.
  • build/SupervisedTests.cs is unchanged. Its RetryFailuresInFreshProcess policy retries every failure in a fresh process, with or without a trait. Bobcat 1.0's new default (bobcat#661) only covers tests carrying a Retry trait, so dropping the policy would stop retries for the whole repo. It stays so behaviour is identical. RetryLedger.cs is Wolverine's own JSON ledger: it doesn't use Bobcat's TestLedger and doesn't parse RunReport text or JSON, so Docs: Remove method injection of bus in constructor injection example #730, Map message type to MQTT topic #655 and Dynamic code generation fails occasionaly on a list messages that use a Marten aggregate and thus trigger code generation in parallel #649 don't affect it. KnownTestDurations is still keyed by uid, which rc.1 still accepts beside display names.

Tested locally

  • dotnet build wolverine.slnx -c Release -f net9.0: 0 errors. The net10.0-only projects (WolverineFx.Bobcat.Http and its tests, both samples' tests) built unpinned, and build/build.csproj builds too.
  • Wolverine.Bobcat.Tests (net9.0) against a throwaway Postgres: 166 passed, 1 skipped, 0 failed apart from the 37 Polecat tests, which need SQL Server. All 37 failed connecting in fixture setup. CI runs them.
  • Wolverine.Bobcat.Http.Tests (net10.0): 43/43 passed.
  • IncidentService.Tests: 8/8 passed. ProcessManagerViaHandlers.Tests: 29/29 passed.
  • ./build.sh CoreTests --framework net9.0, which runs CoreTests through the Bobcat.Supervisor rc.1 build code: 3668 passed, 8 skipped, 0 retries, exit 0.

The database, broker and LeaderElection suites are left to CI.

CI

All 45 checks are green. That includes CIBobcat, where the Polecat half of WolverineFx.Bobcat's tests runs against SQL Server.

CISqlServer was cancelled once by the 20-minute job cap. The tests had already finished green (636 passed, 2 skipped, target Succeeded 19:15), and the cap hit during the post-job steps. A re-run passed in 19m50s. This is not caused by rc.1:

  • CISqlServer already runs near the cap on main before this change: 19m09s, 18m26s and 19m22s, plus two other runs cancelled at 20m (38960108320, 38807955941).
  • Every other job ran within normal variance of main at the same base commit.

Bobcat issues found

This migration found no Bobcat bug. Every test change matches an intended 1.0 change listed above.

The one break is the binary incompatibility above. It is intended (the rename has no alias), but Bobcat's docs/compatibility.md still names WolverineFx.Bobcat 6.51.0-alpha.1 as the supported pairing for 1.0.0-rc.1, and that pairing fails in WhenActing. Bobcat is tracking the docs side separately.

🤖 Generated with Claude Code

https://claude.ai/code/session_01YDKQhnBVcmVLCTkJbVeADk

Every project that takes Bobcat moves to 1.0.0-rc.1 through the root Directory.Packages.props:
Bobcat, Bobcat.Xunit, Bobcat.Generators and the build's Bobcat.Supervisor (0.60.4). The 0.60.4
hold on WolverineFx.Bobcat, its tests and the two dogfooding samples (WolverineFxBobcatBobcatVersion)
is removed: rc.1 fixed JasperFx/bobcat#672, the reason for it. JasperFx and its family move
2.90.1 -> 2.90.2, the minimum Bobcat 1.0 declares.

WolverineScenario follows the CritterStackScenario.Store -> EventStore rename (bobcat#709/#710).
WolverineFx.Bobcat's tests take the intended 1.0 rendering changes: value aliases read as
#alias (bobcat#640), strings in a values cell are quoted and GivenReadModel reads as
"there is a T with ..." (bobcat#633/#634), a read model's Then names its id, and a single read
with no stream reads the one document in the store, so none is an assertion failure rather
than a critical (bobcat#616).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YDKQhnBVcmVLCTkJbVeADk
@jeremydmiller
jeremydmiller merged commit d1b1072 into main Oct 18, 2026
84 of 85 checks passed
This was referenced Oct 19, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant