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).40001is 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; soConcurrentUpdateExceptionarrives un-retried and the only sound retry re-runs the handler. New entries forSessionTransactionUnusableException(a sticky, Serializable, caller-supplied or ambient-transaction session wrecked by an earlier failure: read the inner exception, discard the session) and foropts.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'sDefaultTenantUsageDisabledExceptionderives from the JasperFx.Events type since 9.41 and is no longer aMartenException(marten#5514), so one policy on the lifted type now covers Marten and Polecat and a blanketMartenExceptioncatch no longer sees it.TenantIdStylewas 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 registeringNpgsqlExceptionwholesale (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 underSkipApplyErrors, and pauses the shard withIsTransientfalse. The restart table now says that Wolverine's node sweep restarts a paused shard whose failure is transient (wolverine#4986, Wolverine 6.51), withTransientFailureRestartMaxBackoff, while the stall restart still keys on categoryOther. - 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)UseWolverineManagedEventSubscriptionDistributionon 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 besideAddAsyncDaemon(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 singleValuebinding withoutTryParse(wolverine#4978), an omitted query, header, form or optional route value binding the declared default (wolverine#5099),MultipartReaderfor streaming uploads and its startup refusals (wolverine#4674), per-endpointHttpChain.JsonSerializerOptionsthroughConfigureEndpoints(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 carriesmessage id,correlation id,causation id,saga id,trace idandactivity idsince 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 whatstoat setupprints about the licence and the/api/licensefields 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, andMapWolverineHttpTransportEndpoints()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 (UseHttpTransportmissing; a URI not naming the batch route, which is how/_wolverine/invokeis 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 inwolverine-messaging-recurring-schedules):MessageDeduplicationModereplaces the obsoleteEnableMessageDeduplicationbool (wolverine#4757, 6.45):CompareByHashand itswolverine_deduplication_hashedtable,CompareByStringand the original table, why a string comparison differs by engine collation, the upgrade path and the new warning text. AndClaimInTransactionon[DeduplicatedWithResponse]withDefaultClaimInTransaction(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 inmarten-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]); theEfCoreOpsset-based operations that force Eager by return type and[RequiresEagerTransaction](wolverine#4629), replacing the "run the whole app on Eager" advice; and conjoined tenancy withPartitionPerTenant, 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 anx-delivery-limiton 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-queueDeliveryLimit, 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 inwolverine-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 withFrameworkNamespacePrefixesor a customIDeadLetterFingerprinter,ArchivedDeadLetterRetention, theDeadLetterEnvelopeQueryfilters (FailureGroup,ExceptionMessageMatch,TenantId,Archived),ArchiveMatchingAsync/RestoreMatchingAsync,ReplayCountandIDeadLetters.Capabilities. AndDoThenRetry(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-insEnableDeterministicQueueOrdering, PostgreSQLEnableQueueNotificationsand SQL ServerOptimizeQueueThroughput(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 throughConfigureNatsOptsand the dropped-message warning (6.47),ConfigureJetStreamPublishandDeduplicateUsing(6.49),SendRejectedExceptionfor a refused publish (wolverine#4955, 6.49), a request with no responders failing at once (6.47), andTrustTenantIdHeader = falsefor subjects untrusted producers can reach (6.50). - Modular monolith and message batching (
critterstack-arch-modular-monolith,wolverine-handlers-message-batching):MultipleHandlerBehavior.ClassicCombineIntoOneLogicalHandleris 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, andAssertNoCombinedHandlers()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.51FailureLogLevel, 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,AgentRestrictionConfirmationTimeoutwithAgentRestrictionsNotConfirmedException,CompressAgentCommandsand its upgrade rule) and all fiveUnplacedReasonvalues 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, andUseContainer(6.45) gives each application its own; a Cosmos saga start is a conditional create since 6.55 (wolverine#5221), so a duplicate id isSagaConcurrencyExceptionlike the ETag failures. - Integration testing (
wolverine-testing-integration):IgnoreEnvelopeson 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 onWolverineOptions.Tracking(6.50). - Async daemon and subscriptions (
marten-advanced-async-daemon-deep-dive,marten-event-subscriptions, lines inmarten-advanced-ancillary-storesandcritterstack-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),AddMartenHighWaterHealthCheckwith its per-store overload and database filters (marten#5716), andSubscribeFromFirstRunwith themt_event_projection_floorstable (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;SnapshotRaceExceptionfrom 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 fromcritterstack-arch-new-project-wolverine-marten): the registrations an AOT publish needs (Marten 9.46 to 9.50):RegisterValueTypeId<TDoc, TWrapper, TInner>,RegisterScalarType<T>, the explicitRegisterTagType<TTag, TInner>overload (jasperfx#1012), each with the failure it prevents, and theUseTypeInfoResolverrule 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 whoseQueryIs()uses a value computed from the query object is refused since Marten 9.51 (marten#5711), with the message and the inline-array trap; andQueryEventData<T>(9.53) besideQueryStreamStates. - Schema and migrations (
critterstack-troubleshooting-schema-and-migrations):ApplyChangesLockTimeoutas the budget behind "Unable to attain the global lock in time" (marten#5529, 9.42), and the 63-character schema-name truncation with the42710symptom it ended (marten#5536). - Indexes and query optimization (
marten-advanced-indexes-and-query-optimization):FillFactorandStorageParameteron a document table andDcbTagVersionFillFactor(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):PreviewHighWaterAdvanceAsyncthenAdvanceHighWaterMarkToLatestAsyncwith the compare-and-set, themarten --advanceCLI, 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),MaxPushWireBytesas the push bound in the broker's units (CritterWatch#1267), and the DatadogSitevalues (CritterWatch#1494). - CritterWatch alerts (
wolverine-integrations-critterwatch-alerts): Slack posts from a standalone console only from 1.1.0 (CritterWatch#1516), as anIAlertNotificationSinkon 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), theNotSupportedByServicerefusal for a service that cannot, andOperationInFlightfor 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;.Httpstays-alpha.1while Alba 9 is a release candidate) replace the rc.2 pins, andwrite-specspins 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.NUnitas anITestAction,Bobcat.MSTestthrough 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 inwolverine-testing-with-aspire): selecting specs by Event Model coordinates (--slice,--chapter,--domain,--pattern,--trait, and theSlice/Chapter/Domain/Patterntraits 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):gitHubProblemon a plan's status and the token order (stoat#151, #168), the refusal for an unregistered repository slug, the.mcp.jsonsetup writes dirtying the tree until committed, theslug/idversusplan/nodesplit 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 toolsupdate_document(with adryRunpreview),delete_documentandundelete_document, and their read-first /expectedVersionprotocol, soft vs permanent delete fromisSoftDeleted, thedocuments.write/documents.deletecapabilities, theEnableDocumentEditingopt-in and the write error kinds (ConcurrencyConflict,EditingDisabled,NotFound,Refused,BadRequest, aTimeoutthat may still have written).query_documentsexplain(the store's plan: rows examined vs returned, indexes used, whether it scans, null meaning unknown,planUnavailable),get_documentrebuild(stored vs rebuilt from the stream,differences,rebuiltToNothing), the metadata filters andorderByMetadata(a type that does not capture a column refuses the filter; an older store ignores it, whichmetadataFilterssays), and a table of the store version each feature needs. - CritterWatch 1.1 MCP safety rails (
wolverine-integrations-critterwatch-setupand 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 incritterstack-troubleshooting-multi-tenancyandwolverine-messaging-message-routing): the server-side two-step confirmation (CritterWatch#1478). The first call changes nothing and returns apreviewand a single-use, five-minuteconfirmationTokenbound 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, andConfirmationMismatch/Expired/Consumed/Unavailable. Also thereadOnlyHint/destructiveHintannotations and read-only mode (ReadOnly,CritterWatch:Mcp:ReadOnly,WithCritterWatchMcp(readOnly: true), theMcpReadOnlyrefusal), 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 withMapPolecatMcpServer(CritterWatch#1485). - CritterWatch dead-letter triage (
wolverine-integrations-critterwatch-dlq-triage): fleet-wide failure groups (CritterWatch#1489).summarize_dead_letter_groupsand its groupings,query_dead_lettersfailureGroupandreplayCount, and the group actionsreplay_/archive_/restore_/discard_dead_letter_groupwith a required reason,dlq.archive, and the Operations tab. Edit and Replay now needsdlq.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_detectionfor a stale loop (HighWaterStale), and for a mark held behind a gap (HighWaterMarkFrozen)preview_high_water_advancethen, only on the operator's yes,advance_high_water_mark: the frozen-mark gate, the compare-and-set onexpectedCurrentMark, and why it takes no confirmation token. - CritterWatch alert triage (
wolverine-integrations-critterwatch-alerts):AddCritterWatchAlertTriagewith the host's ownIChatClient, theCritterWatch:Aikeys applied after code (soEnabled=falsestops it in an incident), the budget keys read only through theIConfigurationoverload, 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 setupwrites thestoatserver into.mcp.jsonand 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 ontoCritterStackSpec,WolverineSpec,WolverineHttpSpecand 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 explicitBOBCAT_MONITOR=1now 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'sAssemblyName, 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) inreferences/running-specs.md— resource tracks, the worker budget, newest-TFM-by-default, the per-machine duration record, and the abort messages a gate prints — andSupervisor.RunTag/TagRewritingSink(bobcat#768), the per-run override ofBOBCAT_RUN_TAGthat 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).
WhenScheduledMessagesAreExecutedruns 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/ThenNotHandledand how to read aThenHandledfailure;ThenMessagesScheduled; theActivity:line and the Message activity report; the body-less HTTP actsWhenPostedTo/WhenPutTo/WhenPatchedTo/WhenDeletedAt;GivenReceived; and theWhenTrackedoverload handed anIMessageBus. 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 frommarten-advanced-optimization,marten-advanced-load-distribution,critterstack-projection-troubleshootingandcritterstack-troubleshooting-projections): daemon memory follows the shards that are behind timesMaximumHopperSize, not the agent count. SetMaximumHopperSizeto about 2 xBatchSizeper projection, why shrinkingBatchSizealone makes it worse, what the per-database throttles do and do not bound, andNodeRole.Warmupfor 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 inquery_scheduled_messages. - Bobcat authoring and troubleshooting: the resident runner from both consoles, in a new
references/resident-runner.md(bobcat#390, stoat#85). Frombobcat 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 (busymeans send again),run_finishednot meaning free, cold versus warm and a faulted warm session, the fiveBOBCAT_*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}/exportas 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 andfailing-spec --uidfor any scenario, the results file and HTML page, the export), and why a{placeholder}inBobcatStepInterceptors.g.csis 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,nameofwherever 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, theread-only and no public constructor takes itrefusal 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 nextwrite-specsadds nothing, fix or drop the definition's string link, run the suite and theSpecIdentityAudit), 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-efcoreandwolverine-handlers-efcore): the Aspire skill now leads with Wolverine 6.52'sUseXUsingNamedConnection(name)andPersistMessagesWithXUsingNamedConnection(name)(wolverine#5126 / #5127), the data source from the container, static tenants by connection-string name,MissingNamedConnectionStringsExceptionanddescribe's Named Connection Strings table, and corrects NATS (it has a named form), Azure Service Bus (a bare namespace connects withDefaultAzureCredential) 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'sdeclaring-the-model.md): a module is aDomain, declared with[Domain]on a handler or endpoint or withmodel.Domain(name).Includes / IncludesNamespace / IncludesNamespaceOf / Includes<T>policies, never inferred (jasperfx#960, JasperFx 2.81); underMultipleHandlerBehavior.Separatedeach module's handler of one message is its own slice,OrderPlaced (Billing)(wolverine#4829, Wolverine 6.47); the twoDomain: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 uifrom Bobcat 1.0.0 (bobcat#784) orphans a run it hears nothing from forBOBCAT_MONITOR_ORPHAN_SECONDSwhile it is up, not only after a restart — what that looks like inawait-runand 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): thelist_conversations/get_conversationMCP tools and thecw-conversationsCLI. Finding a conversation by correlation id, conversation id or W3C trace id (matchedBy), reading the hops,observedversusinferrededges and the timeline'sgapBeforeMs, and readingcompletenessbefore the chain (pruned hops, uncaptured parents, inferred links, envelopes never seen received). Themcp.conversations.readcapability 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 itsidto a hop'smessageId), specs from model and code from specs skills. - Stoat coordination (
stoat-coordination-agent-workflow,stoat-coordination-plan-authoring): what astoat run-planworker starts with (stoat#178) -- its worker MCP profile and the tools in it, the model it runs on (nodemodel:>--model> planmodel:>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'slaunchreason onplan_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):hasFailureandfailedOnlynow 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 carriesrecovered, and anErrorhop 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 unparseablesincerefused withInvalidSince),get_traceandcheck_trace_provider_health, andNoProviderConfiguredas 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, andpreview_high_water_advanceis gated byprojection.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,
reasonincluded, because every argument is hashed into the token. The dead-letter group tools takefrom,toandtenantId, and withoutserviceNametheir capability check is one fleet-wide decision, not one per service (dlq-triage). Thecancel_scheduled_messagepreview names only the message id and database, so read its type and due time withquery_scheduled_messagesfirst, and repeatdatabaseUrion the confirmed call;pageNumber/pageSizeare named (scheduled-messages).run_compaction_policyis confirmed when the policy is armed or the console cannot tell (stream-compaction). query_eventscombines tags with metadata filters from 1.1, with the pre-1.1 fallback (event-query).describe_lifecyclereads manifests from the console's cache, with no fan-out or per-service timeout;unreachableServiceslists services with no cached manifest, and a blanktypeNameor no licence returns{ "error": … }(lifecycle-diagnostics). Thequery_sqldeny envelope isForbidden, besideLicenseMissingandBadRequest/ServiceUnknownrows (sql-query). From CritterWatch 1.1.0,describe_lifecyclewith no licence returns theLicenseMissingcode with the prose inmessage, like every other tool.- Tool names are the snake_case names agents see, with their parameters, in the alerts, CLI and
critterstack-projection-troubleshootingskills. The alerts skill lists the common alert types, including 1.1'sAgentUnplaced,NodeOverloadedandHighWaterMarkFrozen, and points atAlertId.Typesfor the full set. - Recurring schedules (
wolverine-messaging-recurring-schedules): the console now reportsexecutionPath,owningNodeNumber(null when no node claims the timer agent),nextOccurrenceComputed,lastRunFailed,lastRunError,lastRunDurationMsandrecentRuns, 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 (WolverineRecurringScheduleControl.triggerTimerAsync); the next-tick coalescing thattrigger_recurring_schedule's description states is the scheduled-message path's only.
- There are six
- 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 thattrigger_recurring_schedule's description branches onexecutionPathfrom CritterWatch 1.1.0.- Setup (
wolverine-integrations-critterwatch-setup): the current line is 1.1; nine packages, includingCritterWatch.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'sMcpchannel and CritterWatch.Aspire; a note ondelete_metrics_samples(confirmed, destructive, fleet-wide whenserviceNameis omitted); and the RBAC capability catalog brought up to date. - Aspire (
wolverine-integrations-aspire): "CritterWatch on Aspire" usesCritterWatch.Aspireinstead of hand-rolledAddProject/WaitFor/ licence environment (ai-skills#330's CritterWatch half). - CLI (
wolverine-integrations-critterwatch-cli):cw-event-model(--json,--url,--name) and Fisher inapplies_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_listenerdurable and cluster-wide,restart_listener,drain_listeneron one node, all byendpointUri) and the chaos-monkey tools (whose rates only affect code that readsChaosMonkeySettings) inwolverine-integrations-critterwatch-service-actions.
- Setup (
New skills
- Conversations over MCP: what actually happened to one request
- Migrating from Polecat 4 to Polecat 5
- Troubleshooting a red Bobcat specification
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-modelwrites the stubs, theEventModelDefinitions, the spec project and (with--specs) one spec per board example;--strong-typed-idswrites 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),WolverineHttpSpecread and verb acts, the BOBCAT037 interceptor opt-in, embedded CritterWatch beside a spec run, andBOBCAT_MONITOR_URLas 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 andstoat gate exec, briefs, re-verify, shared resources, review nodes withsubmit_review,ask_personwith 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 andtrigger_recurring_schedule; the document MCP tools'where/orderBypredicates. - 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-deduplicationteaches[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),TenantIdsand 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
- Batch message processing with
BatchMessagesOf<T> - CritterWatch tenant operations
- Logical message deduplication
- Marten operation side effects
- Recurring cron schedules: a message on a cadence, once per cluster
- Scheduled messages: one message, later
- SQL over the event store, through the console
- Stream compaction policies: bounded history without touching the read side
- Troubleshooting concurrency failures
- Troubleshooting LINQ across Marten, Polecat and Fisher
- Troubleshooting messaging transports
- Troubleshooting multi-tenancy
- Troubleshooting projection and daemon exceptions
- Troubleshooting schema management and migrations
- Troubleshooting stream identity and collisions
- Troubleshooting Wolverine.HTTP binding and responses
1.11.0
- Event-store querying over MCP: what actually happened
- Getting an Event Model into code
- Scheduled messages over MCP: defer, see, cancel, move
1.10.0
- AI features on the Critter Stack with
Marten.PgVector - Archiving and stream compaction
- CritterWatch alerts
- Event versioning and upcasting
- Full-text and NGram search
- gRPC with Wolverine
- MCP servers for your own Critter Stack app
- Projection troubleshooting over MCP: diagnose → step → read the Apply
- Sagas from HTTP endpoints
- Troubleshooting a projection
- Wolverine Sagas
1.8.0
1.7.0
- Authoring Critter Stack specs with Bobcat
- Authoring Stoat coordination plans
- Choosing and verifying a Wolverine endpoint mode
- From red specs to the implementation
- Introspecting a CritterWatch console from the CLI
- Specifications for a Critter Stack slice
- Verifying handler idempotency
- Working inside a Stoat coordination plan
1.6.0
- Dead-letter triage over MCP: investigate → explain → replay
- Service actions over MCP: evict, listeners, chaos monkey
- Store-Agnostic Critter Stack Code
- Tracing a message/event lifecycle with CritterWatch
- Troubleshooting Service Location & Codegen Failures
- Troubleshooting Wolverine Message Routing
- Wolverine with .NET Aspire
1.5.0
1.4.0
1.3.0
- Query Plans & Specifications in Wolverine Handlers
- Refactor to Batched Loads
- Refactor to Marten Compiled Query
- Refactor to Query Plan (Specification)
- Testing with .NET Aspire
1.2.0
- A-Frame Architecture: Compound Handlers
- Async Daemon Deep Dive
- Building Handlers in Wolverine
- Command Line Diagnostics
- Composite Projections
- Convert from ASP.NET Core Minimal API to Wolverine.HTTP
- Convert from ASP.NET Core MVC to Wolverine.HTTP
- Converting from EventStoreDB / Eventuous to Wolverine + Marten
- Converting from MassTransit to Wolverine
- Converting from MediatR to Wolverine
- Converting from NServiceBus to Wolverine
- Declarative Persistence
- Dynamic Consistency Boundary (DCB)
- EF Core Handlers & Transactional Support
- Event Enrichment in Projections
- Event Subscriptions with Wolverine + Marten
- Flat Table Projections
- Grafana Dashboard Templates for Wolverine
- HTTP + Marten Integration
- Hybrid HTTP/Message Handlers
- Integration Testing with Alba
- Integration Testing with Marten
- Integration Testing with MSTest
- Integration Testing with NUnit
- Integration Testing with TUnit
- Integration Testing with Wolverine
- Integration Testing with Wolverine and Marten
- IoC and Service Optimization in Wolverine
- Marten Aggregate Handler Workflow
- Marten Ancillary Stores
- Marten Cross-Stream Operations
- Marten Indexes & Query Optimization
- Marten Load Distribution
- Marten Optimization
- Marten RaiseSideEffects
- Message Routing in Wolverine
- Metrics, Prometheus & Custom Auditing
- Modular Monolith with Wolverine
- Multi-Stream Projections in Marten
- Multi-Tenancy with Wolverine + Marten
- New Project: Wolverine + Cosmos DB
- New Project: Wolverine + EF Core
- New Project: Wolverine + Marten
- New Project: Wolverine + Polecat
- OpenTelemetry Setup for the Critter Stack
- Polecat Cross-Stream Operations
- Polecat: Setup, Configuration & Decision Guide
- Pure Functions & Testability in Wolverine
- Railway Programming in Wolverine
- Resiliency Policies in Wolverine
- Setting Up CritterWatch
- Single Stream Projections in Marten
- Test Parallelization with Wolverine
- Testing with Testcontainers
- Vertical Slice Architecture with Wolverine
- Wolverine + Apache Pulsar
- Wolverine + AWS SQS & SNS
- Wolverine + Azure Service Bus
- Wolverine + Kafka
- Wolverine + MQTT
- Wolverine + NATS.io
- Wolverine + RabbitMQ
- Wolverine + Redis
- Wolverine + SignalR
- Wolverine Code Generation
- Wolverine Middleware
- Wolverine.HTTP Fundamentals
