CritterWatch Integration: Agent Health, Source Generators, Causation Tracking, HTTP Descriptors#2393
Merged
jeremydmiller merged 11 commits intomainfrom Mar 31, 2026
Merged
CritterWatch Integration: Agent Health, Source Generators, Causation Tracking, HTTP Descriptors#2393jeremydmiller merged 11 commits intomainfrom
jeremydmiller merged 11 commits intomainfrom
Conversation
…nces for CritterWatch development
EventSubscriptionAgent stall detection with auto-restart, observer health check timer with configurable interval and logging - IAgent extends IHealthCheck with default healthy implementation - DurabilityAgent tracks success/exception counts per cycle - Listener agents check ListeningStatus (TooBusy=Degraded, Latched=Unhealthy) - EventSubscriptionAgent: stall detection, 3-cycle auto-restart, configurable thresholds, OnRestarted callback - CritterWatchObserver: 60s periodic health check loop (configurable), Info logging for non-healthy, Debug for healthy, restart callback wiring - AgentHealthReport and SubscriptionOrProjectionRestarted messages Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ion and disabled column
…tor cold start optimization - IWolverineTypeLoader interface for compile-time type discovery - WolverineTypeManifestAttribute for assembly-level marking - HandlerGraph.Compile split: typeLoader path vs runtime scanning - WolverineRuntime checks DI and assembly attributes for loader - HandlerChain.AttachTypesSynchronously uses O(1) loader lookup Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…or (fixing output)
…oller is null Return empty array instead of throwing when NodeController hasn't been initialized (Solo/MediatorOnly modes or before agent startup). Also hardened RequestAgentHealthReportHandler and observer health check loop with null-safe calls. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…xtension discovery Phase D: - IWolverineTypeLoader.PreGeneratedHandlerTypes dictionary for O(1) lookup - Source generator scans WolverineHandlers namespace for pre-gen types - AttachTypesSynchronously uses dictionary before linear scan fallback Phase E: - Generator discovers IWolverineExtension implementors - ExtensionLoader checks type loader before AssemblyFinder scanning - TryFindTypeLoader from assembly attribute Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ageStoreDiscovered - ICapabilityDescriptor interface for frameworks to contribute to ServiceCapabilities - HttpCapabilityDescriptor in Wolverine.HTTP (routes, options) - Periodic state snapshot timer in CritterWatchObserver (60s) - MessageStoreDiscovered published on RuntimeIsFullyStarted - StateSnapshotInterval configurable for testing Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- WolverineOptions.EnableMessageCausationTracking flag - IWolverineObserver.MessageCausedBy() with default interface no-op - MessageHandler.RecordCauseAndEffect() with ConcurrentDictionary latching - Executor wires causation recording before FlushOutgoingMessages in both InvokeInlineAsync and ExecuteAsync paths - _runtime field added to Executor for options/observer access Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…or + string overloads for testing Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This was referenced Apr 1, 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.
Summary
10 commits with comprehensive CritterWatch monitoring infrastructure:
Agent Health Monitoring
IAgentextendsIHealthCheckwith default healthy implementationDurabilityAgenttracks success/exception counts per recovery cycleEventSubscriptionAgent(Marten + Polecat): stall detection, auto-restart after 3 consecutive checks, configurable thresholdsListeningStatusfor TooBusy/LatchedCritterWatchObserver: 60s health check timer + state snapshot timerAgentHealthReportmessage type for health status batchingSource Generators (Cold Start Optimization)
Wolverine.SourceGenerationproject withIIncrementalGeneratorIWolverineTypeLoaderinterface withPreGeneratedHandlerTypesO(1) dictionaryWolverineTypeManifestAttributefor assembly-level markingExtensionLoaderchecks type loader beforeAssemblyFinderscanningHandlerGraph.compileWithTypeLoader()path bypasses runtime scanningRuntime Message Causation Tracking
WolverineOptions.EnableMessageCausationTrackingflagIWolverineObserver.MessageCausedBy()with default interface no-opMessageHandler.RecordCauseAndEffect()withConcurrentDictionarylatchingExecutorwires causation recording beforeFlushOutgoingMessagesHTTP Capability Descriptors
ICapabilityDescriptorextensibility interfaceHttpCapabilityDescriptorin Wolverine.HTTP (routes + options)ServiceCapabilities.AdditionalCapabilitiesfor framework contributionsCircuit Breaker Observer Hooks
CircuitBreakerTripped/CircuitBreakerResetonIWolverineObserverDead Letter Queue Recovery
EnableDeadLetterQueueRecovery()with custom queue name overloadBug Fixes
AllRunningAgentUriswhenNodeControlleris nullTest plan
🤖 Generated with Claude Code