Skip to content

GH-5094 Wolverine.Fisher: opt-in Wolverine-managed event subscription distribution - #5104

Merged
jeremydmiller merged 1 commit into
mainfrom
gh-5094-fisher-subscription-agent-family
Oct 20, 2026
Merged

jeremydmiller merged 1 commit into
mainfrom
gh-5094-fisher-subscription-agent-family

Conversation

@jeremydmiller

Copy link
Copy Markdown
Member

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 own AddAsyncDaemon(DaemonMode.Solo), so those operations were unavailable on every Fisher host (CritterWatch #1437).

Fix

FisherIntegration.UseWolverineManagedEventSubscriptionDistribution is 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.

Tests

FisherTests fisher_managed_event_subscription_distribution_5094 checks that:

  • the family is registered, Fisher's own daemon is not, and the coordinator is the Wolverine-managed one
  • FindAgentUriAsync resolves the projection's agent
  • the agent starts on the node and the async snapshot projects
  • pausing and resuming through the coordinator stops and restarts the daemon's shards
  • Fisher's Solo daemon alongside the flag is refused at startup

Local 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.0 has 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

… 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
@jeremydmiller
jeremydmiller merged commit c220dcc into main Oct 20, 2026
47 checks passed
This was referenced Oct 21, 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.

Wolverine.Fisher: no event-subscription agent family, so projections can't be paused/restarted/rewound from tooling (CritterWatch #1437)

1 participant