Repository navigation
GH-5094 Wolverine.Fisher: opt-in Wolverine-managed event subscription distribution - #5104
Merged
Merged
Conversation
… distribution FisherIntegration.UseWolverineManagedEventSubscriptionDistribution (default false) runs a Fisher store's async projections and subscriptions as Wolverine event subscription agents, as the Marten and Polecat integrations do. A Fisher store is one SQLite file, so nothing spreads across nodes. The point is one operator surface: CritterWatch pauses, restarts, rebuilds and rewinds projections through IEventSubscriptionAgentFamily, and a Fisher host had no family at all (CritterWatch #1437). - Main store: registers EventSubscriptionAgentFamily as IAgentFamily and IEventSubscriptionAgentFamily, and a WolverineProjectionCoordinator as Wolverine.Fisher's IProjectionCoordinator, so the Fisher testing helpers drive the agents. - Ancillary stores: IProjectionCoordinator<T> becomes the Wolverine-managed one when the main integration opts in, mirroring Wolverine.Polecat. - ManagedDistributionDaemonModeValidator (main and per ancillary store) refuses Fisher's own AddAsyncDaemon(DaemonMode.Solo) alongside it at host start, the Fisher twin of Marten's GH-3388 check: both would project the same events into the same file. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DCggXgxnG3EBXoR9rrq37U
This was referenced Oct 21, 2026
This was referenced Oct 26, 2026
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.
Problem
CritterWatch pauses, restarts, rebuilds and rewinds projections through
IEventSubscriptionAgentFamily. Wolverine.Fisher registered no agent family. A Fisher application's async projections ran only on Fisher's ownAddAsyncDaemon(DaemonMode.Solo), so those operations were unavailable on every Fisher host (CritterWatch #1437).Fix
FisherIntegration.UseWolverineManagedEventSubscriptionDistributionis opt-in and defaults to false. It runs the store's async projections and subscriptions as Wolverine event subscription agents, as the Marten and Polecat integrations do.A Fisher store is one SQLite file, so this does not spread anything across nodes. What it buys is one operator surface across the three stores. Fisher's own Solo daemon stays the default.
EventSubscriptionAgentFamilyasIAgentFamilyandIEventSubscriptionAgentFamily. It also registers a FisherWolverineProjectionCoordinatoras Wolverine.Fisher'sIProjectionCoordinator, so the Fisher testing helpers drive the agents. This mirrors Wolverine.Polecat, including theDaemonForMainDatabase()member that Managed distribution: AllDaemonsAsync builds + subscribes a daemon for every database (breaks the 'only observes' contract); no non-creating way to reach this node's running daemons #5092 added.IProjectionCoordinator<T>becomes the Wolverine-managed one when the main integration opts in, mirroring Wolverine.Polecat.ManagedDistributionDaemonModeValidatorruns for the main store and each ancillary store. At host start it refuses Fisher's ownAddAsyncDaemon(DaemonMode.Solo)alongside the flag, because both would project the same events into the same file. This is the Fisher twin of Marten'sPauseThenCatchUpOnMartenDaemonActivitycold first catch-up can stall #3388 check.Tests
FisherTests
fisher_managed_event_subscription_distribution_5094checks that:FindAgentUriAsyncresolves the projection's agentLocal results, after rebasing onto main with #5102 merged:
./build.sh CIFisher --framework net9.0: FisherTests 152 passed, 2 skipped, 0 retries. InMemoryTests 16 passed.dotnet build wolverine.slnx -c Release -f net9.0has 0 errors.The Fisher docs page doesn't mention the new option yet.
Closes #5094
🤖 Generated with Claude Code
https://claude.ai/code/session_01DCggXgxnG3EBXoR9rrq37U