Skip to content

Questions? Join our Discord.

JasperFx

Formal support for Wolverine, Marten, and Polecat is available through our Support Plans.

What's New ​

Each Critter Stack AI Skills release lists what changed in existing skills and the skills that first shipped in it.

1.17.0 ​

Improved skills ​

  • Troubleshooting concurrency (critterstack-troubleshooting-concurrency): what Marten's own resilience pipelines retry before a policy ever runs, corrected against Marten 9.54 (marten#5528, #5566, #5577, #5578, #5682). 40001 is never replayed (replaying computed work on a stale snapshot is a silent lost update), no write is retried above Read Committed, and timeouts and pool exhaustion are not retried on reads; so ConcurrentUpdateException arrives un-retried and the only sound retry re-runs the handler. New entries for SessionTransactionUnusableException (a sticky, Serializable, caller-supplied or ambient-transaction session wrecked by an earlier failure: read the inner exception, discard the session) and for opts.Advanced.ExceptionTransforms, which maps a database guard's SQLSTATE to your own exception type ahead of Marten's translations, with a pointer from the railway-programming skill.
  • Troubleshooting multi-tenancy (critterstack-troubleshooting-multi-tenancy): Marten's DefaultTenantUsageDisabledException derives from the JasperFx.Events type since 9.41 and is no longer a MartenException (marten#5514), so one policy on the lifted type now covers Marten and Polecat and a blanket MartenException catch no longer sees it. TenantIdStyle was applied at every stamping and keying boundary only from 9.40 (marten#5516): which bulk-insert and admin paths wrote or matched the raw id before that, and that rows written raw stay invisible after the upgrade.
  • Troubleshooting projections (critterstack-troubleshooting-projections): what the daemon counts as transient since Marten 9.52 stopped registering NpgsqlException wholesale (marten#5741, jasperfx#1019, #1029, #1064): a registered type, or a driver exception that reports itself transient, a timeout or a transport failure anywhere in the graph. A permanent database error is attributed to the event but is a systemic failure, never dead-lettered even under SkipApplyErrors, and pauses the shard with IsTransient false. The restart table now says that Wolverine's node sweep restarts a paused shard whose failure is transient (wolverine#4986, Wolverine 6.51), with TransientFailureRestartMaxBackoff, while the stall restart still keys on category Other.
  • Fisher and load distribution (fisher-setup-and-decision-guide, marten-advanced-load-distribution): both said Wolverine-managed distribution did not apply to Fisher. Since Wolverine 6.51.2 (wolverine#5094) UseWolverineManagedEventSubscriptionDistribution on the Fisher integration runs its projections and subscriptions as Wolverine agents, so CritterWatch and the MCP actions pause, restart, rebuild and rewind them like a Marten store's, though still on the one node that owns the file. The host refuses it beside AddAsyncDaemon(DaemonMode.Solo), with the message quoted.
  • Wolverine.HTTP fundamentals and troubleshooting (wolverine-http-fundamentals, wolverine-troubleshooting-http): the 6.50 binding change (wolverine#3863): a concrete parameter with an unkeyed container registration is a service dependency, never the inferred body, and [FromBody] is the override the other way, with the silent-empty-command symptom an upgrade produces. Also hand-written strong-typed ids with a single Value binding without TryParse (wolverine#4978), an omitted query, header, form or optional route value binding the declared default (wolverine#5099), MultipartReader for streaming uploads and its startup refusals (wolverine#4674), per-endpoint HttpChain.JsonSerializerOptions through ConfigureEndpoints (wolverine#5042), and a pointer to the HTTP messaging transport (UseHttpTransport, wolverine#5238) so it is not confused with an endpoint style.
  • Bobcat troubleshooting and CritterWatch conversations (critterstack-sdd-bobcat-troubleshooting, wolverine-integrations-critterwatch-conversations): the Message activity report carries message id, correlation id, causation id, saga id, trace id and activity id since WolverineFx.Bobcat 6.51.3 (wolverine#5106), and an HTTP exchange row carries the correlation id the act sent. Both skills said the grid did not have them yet; the join from a red row to a CritterWatch conversation, a trace, a dead letter or a saga is now by id.
  • Stoat agent workflow (stoat-coordination-agent-workflow): the licence model decided on 2026-10-27. Stoat is free on its own machine: a request from a loopback address with no forwarding header is never refused, which is every call an agent on the box makes (the MCP client, hooks, run-plan, gate exec). A Stoat other machines reach is Stoat Team and needs a CritterStack licence, with the remote check still off in the 0.5.0 preview. The skill had said an unlicensed Stoat refuses every MCP tool. Also what stoat setup prints about the licence and the /api/license fields an agent can read.
  • CritterWatch setup (wolverine-integrations-critterwatch-setup): the broker-less channels of 1.1.0 (CritterWatch#1517). A broker is no longer a requirement: Wolverine's HTTP transport (opts.UseHttpTransport(), Wolverine 6.56, and MapWolverineHttpTransportEndpoints() on both sides, with URIs naming the /_wolverine/batch/{queue} route), gRPC (ListenAtGrpcPort) and PostgreSQL or SQL Server queues as an ancillary store carry the same envelopes. The two startup refusals (UseHttpTransport missing; a URI not naming the batch route, which is how /_wolverine/invoke is refused), what the console side needs, the two limits a broker does not have (no buffering while the console is down, per-node ordering and no leader pinning behind a load balancer), and the symptom table.
  • Logical deduplication (wolverine-messaging-logical-deduplication, with a line in wolverine-messaging-recurring-schedules): MessageDeduplicationMode replaces the obsolete EnableMessageDeduplication bool (wolverine#4757, 6.45): CompareByHash and its wolverine_deduplication_hashed table, CompareByString and the original table, why a string comparison differs by engine collation, the upgrade path and the new warning text. And ClaimInTransaction on [DeduplicatedWithResponse] with DefaultClaimInTransaction (wolverine#5160, 6.52): the claim written inside the Marten transaction, what it buys (a failed attempt never claimed) and what it costs (concurrent repeats both run).
  • EF Core handlers (wolverine-handlers-efcore, with a line in marten-advanced-ancillary-stores): a handler that depends on two persistence providers is refused at startup since Wolverine 6.41 (wolverine#4631), with the message and the three answers ([Transactional(typeof(...))], [Storage(typeof(...))], [NonTransactional]); the EfCoreOps set-based operations that force Eager by return type and [RequiresEagerTransaction] (wolverine#4629), replacing the "run the whole app on Eager" advice; and conjoined tenancy with PartitionPerTenant, partitioned sagas and enabling partitioning on an existing table (wolverine#4937, 6.49).
  • RabbitMQ (wolverine-integrations-rabbitmq, wolverine-troubleshooting-transports): a quorum queue under a durable listener needs an x-delivery-limit on RabbitMQ 4, which drops a message on its 21st return and returns in-flight deliveries on every restart (wolverine#5123, 6.51.3): DeliveryLimitForDurableQuorumQueues(-1), the per-queue DeliveryLimit, the startup warning, and why an existing queue has to be deleted or given a broker policy.
  • Resiliency policies (wolverine-messaging-resiliency-policies, with a paragraph in wolverine-integrations-critterwatch-dlq-triage): the store side of dead-letter failure groups (wolverine#5181, #5210, 6.52 to 6.54): how the default fingerprint is computed, tuning it with FrameworkNamespacePrefixes or a custom IDeadLetterFingerprinter, ArchivedDeadLetterRetention, the DeadLetterEnvelopeQuery filters (FailureGroup, ExceptionMessageMatch, TenantId, Archived), ArchiveMatchingAsync / RestoreMatchingAsync, ReplayCount and IDeadLetters.Capabilities. And DoThenRetry (wolverine#5068, 6.52): recovery work then a retry that works for queued and inline messages alike.
  • Message routing and endpoint modes (wolverine-messaging-message-routing, wolverine-messaging-endpoint-modes): BroadcastToAllNodesAsync (wolverine#4993, 6.50), every node handling a message once through its control endpoint, with what it skips, when it degrades to one node and its test double; and the database-transport opt-ins EnableDeterministicQueueOrdering, PostgreSQL EnableQueueNotifications and SQL Server OptimizeQueueThroughput (wolverine#4970, #4991, #4998, 6.50) with their costs and rollout rules.
  • NATS (wolverine-integrations-nats, wolverine-troubleshooting-transports): what startup does with an existing stream or consumer (Provisioning: CreateOnly / CreateOrUpdate / Verify, 6.47), the NATS.Net client options through ConfigureNatsOpts and the dropped-message warning (6.47), ConfigureJetStreamPublish and DeduplicateUsing (6.49), SendRejectedException for a refused publish (wolverine#4955, 6.49), a request with no responders failing at once (6.47), and TrustTenantIdHeader = false for subjects untrusted producers can reach (6.50).
  • Modular monolith and message batching (critterstack-arch-modular-monolith, wolverine-handlers-message-batching): MultipleHandlerBehavior.ClassicCombineIntoOneLogicalHandler is obsolete since Wolverine 6.52 and removed in 7.0 (wolverine#5133); the startup warning naming the combined message types, what the upgrade changes for them, and AssertNoCombinedHandlers() to make it a startup failure ahead of time.
  • Metrics and auditing (wolverine-observability-metrics-and-auditing): the three levels of Wolverine's own per-message log lines (execution, success, and the 6.51 FailureLogLevel, wolverine#5043), their policy and attribute forms, and why a retried chain should lower its failure level rather than the application's.
  • Load distribution and alerts (marten-advanced-load-distribution, wolverine-integrations-critterwatch-alerts): the placement knobs Wolverine 6.44 to 6.52 added (LeadershipEligible, the cold-start and takeover holds, NodeAcceptThreshold, AgentRestrictionConfirmationTimeout with AgentRestrictionsNotConfirmedException, CompressAgentCommands and its upgrade rule) and all five UnplacedReason values with what each means.
  • Store-agnostic code (critterstack-arch-store-agnostic-code): UseInMemoryStoreForPrototyping (wolverine#4844, 6.47), the in-memory JasperFx.Events store that runs the store-agnostic surface before a store is chosen, what it does not do, and the Production refusal with its one escape hatch.
  • Cosmos DB and sagas (critterstack-arch-new-project-wolverine-cosmosdb, wolverine-handlers-sagas): one Cosmos container is one Wolverine cluster, and UseContainer (6.45) gives each application its own; a Cosmos saga start is a conditional create since 6.55 (wolverine#5221), so a duplicate id is SagaConcurrencyException like the ETag failures.
  • Integration testing (wolverine-testing-integration): IgnoreEnvelopes on a tracked session (wolverine#4704, 6.44) for a shared host where the message type alone cannot separate the flow under test, with its two caveats, and the host-wide form on WolverineOptions.Tracking (6.50).
  • Async daemon and subscriptions (marten-advanced-async-daemon-deep-dive, marten-event-subscriptions, lines in marten-advanced-ancillary-stores and critterstack-troubleshooting-schema-and-migrations): the drain timeout (StopAndDrainTimeout, what a drain does and does not do since 9.47, marten#5610), the session-scoped leadership lock default and the PgBouncer case (marten#5526), AddMartenHighWaterHealthCheck with its per-store overload and database filters (marten#5716), and SubscribeFromFirstRun with the mt_event_projection_floors table (marten#5740).
  • Aggregate workflow and batched loads (marten-aggregate-handler-workflow, wolverine-refactor-to-batched-loads): FetchManyForWriting (marten#5550, 9.45) with its guarantees and its sequential fallback for Async aggregates, and the two batch rules of 9.47 (an Async aggregate's fetch first in the batch, marten#5604; SnapshotRaceException from a batched exclusive fetch, marten#5613).
  • Archiving and compaction (marten-archiving-and-stream-compaction): TombstoneStream (marten#5673, 9.50.3), the hard delete of a stream, its events and tag rows, compared with archiving, with what it leaves alone.
  • Marten under Native AOT (marten-migration-v8-to-v9, marten-advanced-dynamic-consistency-boundary, a pointer from critterstack-arch-new-project-wolverine-marten): the registrations an AOT publish needs (Marten 9.46 to 9.50): RegisterValueTypeId<TDoc, TWrapper, TInner>, RegisterScalarType<T>, the explicit RegisterTagType<TTag, TInner> overload (jasperfx#1012), each with the failure it prevents, and the UseTypeInfoResolver rule for a source-generated JSON context. The DCB skill notes that tag queries exclude archived events since marten#5677.
  • Compiled queries and LINQ (wolverine-refactor-to-compiled-query, critterstack-troubleshooting-linq): a compiled query whose QueryIs() uses a value computed from the query object is refused since Marten 9.51 (marten#5711), with the message and the inline-array trap; and QueryEventData<T> (9.53) beside QueryStreamStates.
  • Schema and migrations (critterstack-troubleshooting-schema-and-migrations): ApplyChangesLockTimeout as the budget behind "Unable to attain the global lock in time" (marten#5529, 9.42), and the 63-character schema-name truncation with the 42710 symptom it ended (marten#5536).
  • Indexes and query optimization (marten-advanced-indexes-and-query-optimization): FillFactor and StorageParameter on a document table and DcbTagVersionFillFactor (marten#5615, #5622, 9.47), with the HOT-update rule that decides whether they help and the rewrite needed for existing rows.
  • Projection troubleshooting (critterstack-projection-troubleshooting): advancing a frozen high-water mark without the console (marten#5738, 9.52): PreviewHighWaterAdvanceAsync then AdvanceHighWaterMarkToLatestAsync with the compare-and-set, the marten --advance CLI, the tenant rules, and the same preview-first discipline as over MCP.
  • CritterWatch setup (wolverine-integrations-critterwatch-setup): the console's 50-connection pool ceiling and the two ways to raise it (CritterWatch#1495), MaxPushWireBytes as the push bound in the broker's units (CritterWatch#1267), and the Datadog Site values (CritterWatch#1494).
  • CritterWatch alerts (wolverine-integrations-critterwatch-alerts): Slack posts from a standalone console only from 1.1.0 (CritterWatch#1516), as an IAlertNotificationSink on every console flavour, with the best-effort delivery rules; the stale 1.0.1 pin is gone.
  • CritterWatch dead-letter triage (wolverine-integrations-critterwatch-dlq-triage): the client features a service advertises for failure groups (dlq-groups, dlq-group-ops), the NotSupportedByService refusal for a service that cannot, and OperationInFlight for a second operation on a group still being worked.
  • Bobcat versions (critterstack-sdd-bobcat-authoring, critterstack-sdd-event-model-import): Bobcat 1.0.0 and WolverineFx.Bobcat 6.56.0 (stable since 6.55.0; .Http stays -alpha.1 while Alba 9 is a release candidate) replace the rc.2 pins, and write-specs pins the WolverineFx.Bobcat version stamped into the EventModel package (wolverine#5222).
  • Bobcat authoring (critterstack-sdd-bobcat-authoring): the NUnit and MSTest adapters (bobcat#385, #386): Bobcat.NUnit as an ITestAction, Bobcat.MSTest through MSTest 3.10's global hooks with the bracket for a project that owns them, and the minimum versions.
  • Running specs (critterstack-sdd-bobcat-authoring/references/running-specs.md, a pointer in wolverine-testing-with-aspire): selecting specs by Event Model coordinates (--slice, --chapter, --domain, --pattern, --trait, and the Slice / Chapter / Domain / Pattern traits every runner can filter on, bobcat#573), adopting Bobcat in one project of a repository that stays on xUnit v3 3.x (bobcat#690), and test infrastructure owned by an Aspire AppHost (bobcat#769).
  • Bobcat diagnostics (critterstack-sdd-bobcat-authoring): BOBCAT029, a comment read as prose rather than a step.
  • Stoat skills (stoat-coordination-agent-workflow, stoat-coordination-plan-authoring): gitHubProblem on a plan's status and the token order (stoat#151, #168), the refusal for an unregistered repository slug, the .mcp.json setup writes dirtying the tree until committed, the slug / id versus plan / node split and the argument errors that explain it, and a consume pin written through an MSBuild property (stoat#150).

1.16.0 ​

Improved skills ​

  • CritterWatch document explorer (wolverine-integrations-critterwatch-document-explorer): the CritterWatch 1.1 additions. The write tools update_document (with a dryRun preview), delete_document and undelete_document, and their read-first / expectedVersion protocol, soft vs permanent delete from isSoftDeleted, the documents.write / documents.delete capabilities, the EnableDocumentEditing opt-in and the write error kinds (ConcurrencyConflict, EditingDisabled, NotFound, Refused, BadRequest, a Timeout that may still have written). query_documentsexplain (the store's plan: rows examined vs returned, indexes used, whether it scans, null meaning unknown, planUnavailable), get_document rebuild (stored vs rebuilt from the stream, differences, rebuiltToNothing), the metadata filters and orderByMetadata (a type that does not capture a column refuses the filter; an older store ignores it, which metadataFilters says), and a table of the store version each feature needs.
  • CritterWatch 1.1 MCP safety rails (wolverine-integrations-critterwatch-setup and every skill that teaches an irreversible tool: dlq-triage, tenant-operations, projection-troubleshooting, stream-compaction, scheduled-messages, service-actions, document-explorer, wolverine-messaging-recurring-schedules, with mentions in critterstack-troubleshooting-multi-tenancy and wolverine-messaging-message-routing): the server-side two-step confirmation (CritterWatch#1478). The first call changes nothing and returns a preview and a single-use, five-minute confirmationToken bound to the caller, the tool and the arguments; the agent shows the preview to the user and repeats the call with the token. Which tools are covered, the three that are covered only conditionally, and ConfirmationMismatch / Expired / Consumed / Unavailable. Also the readOnlyHint / destructiveHint annotations and read-only mode (ReadOnly, CritterWatch:Mcp:ReadOnly, WithCritterWatchMcp(readOnly: true), the McpReadOnly refusal), the audit log's channel (Console, Mcp, System) and how to filter it, and a full 1.1 MCP catalog table (CritterWatch#1477, #1479, #1481). The MCP servers skill says those rails belong to CritterWatch.Mcp, and maps Polecat.Mcp with MapPolecatMcpServer (CritterWatch#1485).
  • CritterWatch dead-letter triage (wolverine-integrations-critterwatch-dlq-triage): fleet-wide failure groups (CritterWatch#1489). summarize_dead_letter_groups and its groupings, query_dead_lettersfailureGroup and replayCount, and the group actions replay_ / archive_ / restore_ / discard_dead_letter_group with a required reason, dlq.archive, and the Operations tab. Edit and Replay now needs dlq.edit (CritterWatch#1487).
  • CritterWatch high water tools (wolverine-integrations-critterwatch-projection-troubleshooting): what to do when every projection on a database stops at once (CritterWatch#1432, #1472). list_high_water_loops, restart_high_water_detection for a stale loop (HighWaterStale), and for a mark held behind a gap (HighWaterMarkFrozen) preview_high_water_advance then, only on the operator's yes, advance_high_water_mark: the frozen-mark gate, the compare-and-set on expectedCurrentMark, and why it takes no confirmation token.
  • CritterWatch alert triage (wolverine-integrations-critterwatch-alerts): AddCritterWatchAlertTriage with the host's own IChatClient, the CritterWatch:Ai keys applied after code (so Enabled=false stops it in an incident), the budget keys read only through the IConfiguration overload, and that the narrative is advisory, never executed, and not on the MCP surface (CritterWatch#1185, #1483).
  • Stoat setup (stoat-coordination-agent-workflow): the 0.5.0 preview's one-command install (stoat#174). stoat setup writes the stoat server into .mcp.json and five hooks into Claude Code's settings, backs up and records what it wrote, and reports the server and licence state; --dry-run, --uninstall, what it refuses to touch, and the licence behaviour. Both Stoat skills drop the stale note that Stoat binds :5525: it receives runs on :5527 (stoat#128).
  • Bobcat authoring (critterstack-sdd-bobcat-authoring): practice guidance on where a spec belongs (store, message, HTTP or UI, mapped onto CritterStackSpec, WolverineSpec, WolverineHttpSpec and a Playwright driver), declarative steps, and the driver pattern for UI specs (bobcat#574). A troubleshooting entry for a run that published nothing to a slow console: an explicit BOBCAT_MONITOR=1 now makes the probe wait 5 s instead of 250 ms (bobcat#589). The diagnostics table drops the retired BOBCAT030, 031 and 035, and the text no longer describes the retired [WaitFor]/[Approx] attributes (bobcat#550).
  • Bobcat authoring (critterstack-sdd-bobcat-authoring): bobcat resident <folder> on a spec project that references the executable app it tests now picks the test host (the folder's own project's AssemblyName, else the only executable carrying a test framework), and the "holds N executables" refusal says when it still fires (bobcat#797).
  • Bobcat authoring (critterstack-sdd-bobcat-authoring): the local commit-and-push gate (GateDeclaration, Track, Gate.Run, bobcat#729) in references/running-specs.md — resource tracks, the worker budget, newest-TFM-by-default, the per-machine duration record, and the abort messages a gate prints — and Supervisor.RunTag / TagRewritingSink (bobcat#768), the per-run override of BOBCAT_RUN_TAG that gives each unit of a gate its own run card.
  • Bobcat authoring, specs from model, code from specs: WolverineFx.Bobcat's scheduled-message support (wolverine#5091). WhenScheduledMessagesAreExecuted runs what the act scheduled; the only-scheduled guard fails absence steps that would otherwise pass vacuously after an act whose message was only scheduled, with a symptom, cause and fix table; ThenHandled / ThenNotHandled and how to read a ThenHandled failure; ThenMessagesScheduled; the Activity: line and the Message activity report; the body-less HTTP acts WhenPostedTo / WhenPutTo / WhenPatchedTo / WhenDeletedAt; GivenReceived; and the WhenTracked overload handed an IMessageBus. The Bobcat skills now point at Wolverine's Specifications with Bobcat page (wolverinefx.net/guide/testing-with-bobcat), which replaced Bobcat's integrations pages.
  • Async daemon memory at tenants x projections scale (marten-advanced-async-daemon-deep-dive, with pointers from marten-advanced-optimization, marten-advanced-load-distribution, critterstack-projection-troubleshooting and critterstack-troubleshooting-projections): daemon memory follows the shards that are behind times MaximumHopperSize, not the agent count. Set MaximumHopperSize to about 2 x BatchSize per projection, why shrinking BatchSize alone makes it worse, what the per-database throttles do and do not bound, and NodeRole.Warmup for blue/green (wolverine#5170, jasperfx#1076).
  • Recurring schedules (wolverine-messaging-recurring-schedules): the two execution paths since Wolverine 6.52 (wolverine#5168). A schedule firing more often than every 15 minutes runs on a timer agent of its own (wolverine-recurring-timer:///{name}) instead of a pre-scheduled inbox row: TimerThreshold, UseTimer() / UseScheduledMessages(), the one real difference in failure semantics (no queued envelope while an agent is reassigned), pause as an agent restriction, trigger published immediately from the calling node, why the 5 s floor still applies, and the upgrade behaviour change. The CritterWatch scheduled-messages skill says why a timer schedule's occurrences never appear in query_scheduled_messages.
  • Bobcat authoring and troubleshooting: the resident runner from both consoles, in a new references/resident-runner.md (bobcat#390, stoat#85). From bobcat ui: bobcat resident <host>, what Run again / Re-run failed / Run feature / Run this slice / Run all need, the runner page and its states, what the board says with no runner attached. From Stoat: stoat runner <project> keeping a runner rebuilt and relaunched under a file watch, the derived runner id, exit 75 versus 0, why no hot reload, the refusal of an agent's worktree, and that only people press the buttons. Troubleshooting both: refused at launch, the four refusals (busy means send again), run_finished not meaning free, cold versus warm and a faulted warm session, the five BOBCAT_* variables the child never inherits, the URL list versus the command origin.
  • Bobcat authoring (references/bobcat-ui-and-queries.md): reading a run back over HTTP (GET /api/runs?tag=, GET /api/runs/{runId} with every scenario and step, GET /api/runs/{runId}/export as CTRF, JUnit or NDJSON, the same routes on Stoat's receiver), the three ways to see the rendered specification rather than a pass count (the per-spec page and failing-spec --uid for any scenario, the results file and HTML page, the export), and why a {placeholder} in BobcatStepInterceptors.g.cs is the template and not a rendering failure (step text binds at run time, bobcat#339). The troubleshooting skill points at the same routes.
  • Bobcat authoring (references/vocabulary.md, references/tables-and-assertions.md): the refactor-friendly forms of a partial object (the lambda first, nameof wherever the member is text, and why a table with a runtime hole gives up BOBCAT032's build-time column check), and a symptom table for what a partial object's failures say: BOBCAT032 for a stale column, the read-only and no public constructor takes it refusal when a Given or When builds the object, a cell that cannot be read as its member, an indexer in a member path, why an any-order group has no ambiguity error (pairing is a maximum matching, with a same-type near match reported as a FAIL), and how to tell which fill policy (PredictableValues, DefaultValues, DeclaredDefaults) filled an unspecified member (bobcat#416).
  • Specs from model (critterstack-sdd-specs-from-model): renaming generated Bobcat specs to behaviour names once a slice is green. What each rename costs (the class is free, the method changes the identity and what follows from that, the [BobcatFeature] title never), the procedure (board first, snake(sentence) so the next write-specs adds nothing, fix or drop the definition's string link, run the suite and the SpecIdentityAudit), and the naming style with a before/after table from CritterCrush's two chapters. The import skill no longer says a rename unbinds the slice: since bobcat#449 the binding is by [BobcatSlice] and command type.
  • Named connections (wolverine-integrations-aspire, plus a mention in the Kafka, NATS, Azure Service Bus, AWS SQS/SNS, Pulsar, MQTT and Redis transport skills, critterstack-arch-new-project-wolverine-efcore and wolverine-handlers-efcore): the Aspire skill now leads with Wolverine 6.52's UseXUsingNamedConnection(name) and PersistMessagesWithXUsingNamedConnection(name) (wolverine#5126 / #5127), the data source from the container, static tenants by connection-string name, MissingNamedConnectionStringsException and describe's Named Connection Strings table, and corrects NATS (it has a named form), Azure Service Bus (a bare namespace connects with DefaultAzureCredential) and SQS/SNS (an emulator resource by name). The setup skills keep the plain connection-string form as their default and mention the named form for Aspire.
  • Modules as Event Model domains (critterstack-arch-modular-monolith, critterstack-sdd-specs-from-model, critterstack-sdd-code-from-specs, wolverine-integrations-critterwatch-lifecycle-diagnostics, the import skill's declaring-the-model.md): a module is a Domain, declared with [Domain] on a handler or endpoint or with model.Domain(name).Includes / IncludesNamespace / IncludesNamespaceOf / Includes<T> policies, never inferred (jasperfx#960, JasperFx 2.81); under MultipleHandlerBehavior.Separated each module's handler of one message is its own slice, OrderPlaced (Billing) (wolverine#4829, Wolverine 6.47); the two Domain: hotspot shapes, and the rule for an agent that meets one: ask the user which module owns the handler, then edit the declaration they pick. A slice publishing messages from two modules' namespaces is the pre-6.47 collapse, not a real slice.
  • Bobcat authoring and troubleshooting (critterstack-sdd-bobcat-authoring, critterstack-sdd-bobcat-troubleshooting): bobcat ui from Bobcat 1.0.0 (bobcat#784) orphans a run it hears nothing from for BOBCAT_MONITOR_ORPHAN_SECONDS while it is up, not only after a restart — what that looks like in await-run and on the board, that an orphaned run is ejectable, that its next event un-orphans it, and when to raise the interval. The board now loads in one request and is pushed the runners and build reports, and a spec's page shows the scenario's reports beneath its steps.
  • Bobcat authoring (references/bobcat-ui-and-queries.md): the run board grouped by suite (bobcat#786) -- a row per repository + suite with a five-run history strip and the runner's Run button in the row, the live run's overall progress bar (done of the planned total and where that total comes from, passed and failed so far, elapsed, the estimate from previous runs, green / amber / red), the retention the page states (GET /api/retention), and the status strip on every page (runner, a broken build turning the strip red, the live run, watch, the connection) that replaced the runner panel, the build banner and the header's connection text. A symptom table for what each of those says.
  • CritterWatch conversations (new skill wolverine-integrations-critterwatch-conversations, CritterWatch#1499): the list_conversations / get_conversation MCP tools and the cw-conversations CLI. Finding a conversation by correlation id, conversation id or W3C trace id (matchedBy), reading the hops, observed versus inferred edges and the timeline's gapBeforeMs, and reading completeness before the chain (pruned hops, uncaptured parents, inferred links, envelopes never seen received). The mcp.conversations.read capability and its per-service scope. Two flows between Bobcat and CritterWatch: from a failing spec to its causal chain across the fleet, and from a failed production conversation to a reproducing spec with anonymised data. Pointers from the CritterWatch setup, CLI (cw-conversations), routing and lifecycle diagnostics ("what did happen" versus "what can happen"), DLQ triage (from a dead letter to its conversation, joining its id to a hop's messageId), specs from model and code from specs skills.
  • Stoat coordination (stoat-coordination-agent-workflow, stoat-coordination-plan-authoring): what a stoat run-plan worker starts with (stoat#178) -- its worker MCP profile and the tools in it, the model it runs on (node model: > --model > plan model: > claude-sonnet-5-5), --lean, and the run's reported cost with --max-total-usd -- and, for a lead, the runner's state and each ready node's launch reason on plan_status / next_ready_nodes (stoat#176), so a paused runner is read rather than waited on.
  • CritterWatch conversations, failed versus recovered (wolverine-integrations-critterwatch-conversations, CritterWatch#1511): hasFailure and failedOnly now mean a message in the conversation is still failed, judged by its latest attempt, so one retried or replayed into success no longer counts. Each timeline envelope carries recovered, and an Error hop on a recovered envelope is history: nothing is in the dead-letter queue to replay for it. The skill also adds the OpenTelemetry trace tools beside conversations: query_recent_traces (requiredTagsJson, an unparseable since refused with InvalidSince), get_trace and check_trace_provider_health, and NoProviderConfigured as a configuration answer rather than "no traces".
  • CritterWatch 1.1 corrections across the CritterWatch skills, checked against the 1.1 source:
    • There are six mcp.* read capabilities (mcp.dlq.read, mcp.projection.step, mcp.events.query, mcp.sql.query, mcp.documents.read, mcp.conversations.read), not one or two, and preview_high_water_advance is gated by projection.advance-high-water (dlq-triage, projection-troubleshooting, setup). The two eject tools are paid tier like every action tool.
    • A confirmed call repeats exactly the same arguments, reason included, because every argument is hashed into the token. The dead-letter group tools take from, to and tenantId, and without serviceName their capability check is one fleet-wide decision, not one per service (dlq-triage). The cancel_scheduled_message preview names only the message id and database, so read its type and due time with query_scheduled_messages first, and repeat databaseUri on the confirmed call; pageNumber / pageSize are named (scheduled-messages). run_compaction_policy is confirmed when the policy is armed or the console cannot tell (stream-compaction).
    • query_events combines tags with metadata filters from 1.1, with the pre-1.1 fallback (event-query). describe_lifecycle reads manifests from the console's cache, with no fan-out or per-service timeout; unreachableServices lists services with no cached manifest, and a blank typeName or no licence returns { "error": … } (lifecycle-diagnostics). The query_sql deny envelope is Forbidden, beside LicenseMissing and BadRequest / ServiceUnknown rows (sql-query). From CritterWatch 1.1.0, describe_lifecycle with no licence returns the LicenseMissing code with the prose in message, like every other tool.
    • Tool names are the snake_case names agents see, with their parameters, in the alerts, CLI and critterstack-projection-troubleshooting skills. The alerts skill lists the common alert types, including 1.1's AgentUnplaced, NodeOverloaded and HighWaterMarkFrozen, and points at AlertId.Types for the full set.
    • Recurring schedules (wolverine-messaging-recurring-schedules): the console now reports executionPath, owningNodeNumber (null when no node claims the timer agent), nextOccurrenceComputed, lastRunFailed, lastRunError, lastRunDurationMs and recentRuns, and how to read each (ai-skills#335's console half). A trigger on a timer schedule publishes at once and two triggers are two runs (Wolverine RecurringScheduleControl.triggerTimerAsync); the next-tick coalescing that trigger_recurring_schedule's description states is the scheduled-message path's only.
  • CritterWatch scheduled messages (wolverine-integrations-critterwatch-scheduled-messages): where a recurring schedule shows up instead of here, and a timer schedule in particular (CritterWatch#1457, ai-skills#335's console half): the Schedule Explorer's execution path and owning node under each schedule's name, the schedule's own page (Running on, Pause state), Pause / Resume as the operator's disable and enable on either path, and the Agents tab's Recurring Schedule Timer agent with its Schedule link and Paused pill being the same state. The recurring-schedules skill now says that trigger_recurring_schedule's description branches on executionPath from CritterWatch 1.1.0.
    • Setup (wolverine-integrations-critterwatch-setup): the current line is 1.1; nine packages, including CritterWatch.Aspire, whose AppHost calls (AddCritterWatch<TProject>, AsCritterWatch, WithCritterWatch, WithCritterWatchMcp(readOnly:), WithJasperFxLicense) replace the hand-rolled licence loop; the description routes Fisher/SQLite, read-only mode, confirmation tokens, the audit log's Mcp channel and CritterWatch.Aspire; a note on delete_metrics_samples (confirmed, destructive, fleet-wide when serviceName is omitted); and the RBAC capability catalog brought up to date.
    • Aspire (wolverine-integrations-aspire): "CritterWatch on Aspire" uses CritterWatch.Aspire instead of hand-rolled AddProject / WaitFor / licence environment (ai-skills#330's CritterWatch half).
    • CLI (wolverine-integrations-critterwatch-cli): cw-event-model (--json, --url, --name) and Fisher in applies_to.
    • Coverage: the health and backlog reads (summarize_cluster_health, get_service_health, list_degraded_surfaces, list_backlog_hotspots) in the alerts skill, and the listener tools (pause_listener durable and cluster-wide, restart_listener, drain_listener on one node, all by endpointUri) and the chaos-monkey tools (whose rates only affect code that reads ChaosMonkeySettings) in wolverine-integrations-critterwatch-service-actions.

New skills ​

1.15.0 ​

Released 2026-10-15. The headline is the spec-driven development (SDD) skill set rewritten around Bobcat's projected, code-first model, plus a round of product catch-ups across Wolverine, CritterWatch, Stoat and the three stores.

Improved skills ​

  • Spec-driven development (critterstack-sdd-bobcat-authoring, critterstack-sdd-event-model-import, critterstack-sdd-specs-from-model, critterstack-sdd-code-from-specs): rewritten for Bobcat 0.60's projected model, where a spec is an ordinary xUnit v3 or TUnit test method rendered as Given/When/Then. bobcat import-event-model writes the stubs, the EventModelDefinitions, the spec project and (with --specs) one spec per board example; --strong-typed-ids writes the identity types; the additive re-import and its callout codes say what to do when the board changes a slice. Collection expectations (Expect.Exactly / InAnyOrder / Containing, MISSING and EXTRA rows as wrongs), WolverineHttpSpec read and verb acts, the BOBCAT037 interceptor opt-in, embedded CritterWatch beside a spec run, and BOBCAT_MONITOR_URL as a list so one run lands on the run console and on Stoat at once. Corrections from the CritterCrush v8 rehearsal throughout.
  • Stoat coordination (stoat-coordination-agent-workflow, stoat-coordination-plan-authoring): gate steps and stoat gate exec, briefs, re-verify, shared resources, review nodes with submit_review, ask_person with needs, leading a plan run (lead_plan, await_questions, answer_question, escalate_question), the integration branch, and that merge-on-green is a person's decision, never the agent's.
  • Testing (wolverine-testing-integration, wolverine-testing-test-parallelization, wolverine-testing-alba, wolverine-testing-integration-marten): tracked-session timeout guidance corrected against WolverineFx 6.45 (ProductSupport #38). The configuration-lambda overload that never existed is gone, Host.TrackActivity().Timeout(...) is the form to raise the 5-second default, there is no global setting, DoNotAssertOnTimeout() is the only way to suppress the timeout assertion since 6.30.1, and no example runs on the default any more. The integration skill now points at the Bobcat authoring skill for spec-style tests.
  • CritterWatch 1.1 (wolverine-integrations-critterwatch-setup, -cli, -projection-troubleshooting, -tenant-operations, -sql-query): the embedded console is back, with the caveats an agent needs (ProductSupport #44); eject_retired_projection_version; list_tenants, the reported hard-delete refusal and trigger_recurring_schedule; the document MCP tools' where / orderBy predicates.
  • Aspire (wolverine-integrations-aspire, wolverine-observability-command-line-diagnostics, wolverine-testing-with-aspire): JasperFx.Aspire startup gates (WithJasperFxStartup) and the dashboard command buttons (WithJasperFxCommands).
  • Messaging (wolverine-integrations-rabbitmq, -mqtt, -nats, wolverine-messaging-message-routing, wolverine-troubleshooting-transports): additive per-message topic and subject routing alongside local queues. wolverine-messaging-logical-deduplication teaches [DeduplicatedWithResponse] (6.45+). The endpoint-modes, routing and scheduling skills point at the new serverless skill.
  • SQL Server and Polecat (critterstack-arch-new-project-wolverine-efcore, critterstack-arch-new-project-wolverine-polecat, polecat-setup-and-decision-guide): SQL Server-ordered envelope ids are now automatic when SQL Server is the only message storage; the opt-out is documented.
  • Stores (marten-advanced-load-distribution, critterstack-troubleshooting-multi-tenancy, fisher-setup-and-decision-guide): capacity-aware agent assignment (Wolverine 6.40), TenantIds and the tenant write brake, and the Fisher 1.13.0 and 1.14.0 changes.
  • The license terms are now published on this site instead of linking to the private repository.

New skills ​

1.14.0 ​

1.11.0 ​

1.10.0 ​

1.8.0 ​

1.7.0 ​

1.6.0 ​

1.5.0 ​

1.4.0 ​

1.3.0 ​

1.2.0 ​

Proprietary. Copyright © JasperFx Software LLC. See the license for terms.