# revision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 ## A. the six public types, referenced outside the owning leaf DefaultMessagePublisher 2 DefaultDeliveryProcessor 0 DestinationProfileRegistry 1 RegisteredMessageCodecs 1 TransportMessagingRuntime 1 DeclaredDestinationAccess 1 ## B. publish path: assembled src/messaging/messaging-runtime-core/src/main/java/dev/caskeleton/messaging/runtime/DestinationProfileRegistry.java:29: return new DestinationProfileRegistry( src/messaging/messaging-runtime-core/src/main/java/dev/caskeleton/messaging/runtime/DestinationProfileRegistry.java:35: return new DestinationProfileRegistry(Map.of()); src/messaging/messaging-runtime-core/src/main/java/dev/caskeleton/messaging/runtime/RegisteredMessageCodecs.java:63: return new RegisteredMessageCodecs(byContentType, defaultCodec); src/messaging/messaging-spring-boot-starter/src/main/java/dev/caskeleton/messaging/autoconfigure/MessagingCoreAutoConfiguration.java:396: return dev.caskeleton.messaging.runtime.DeclaredDestinationAccess.of(destinations.all()); src/messaging/messaging-spring-boot-starter/src/main/java/dev/caskeleton/messaging/autoconfigure/MessagingCoreAutoConfiguration.java:446: return new dev.caskeleton.messaging.runtime.DefaultMessagePublisher( src/messaging/messaging-spring-boot-starter/src/main/java/dev/caskeleton/messaging/autoconfigure/MessagingCoreAutoConfiguration.java:476: new dev.caskeleton.messaging.runtime.TransportMessagingRuntime( ## C. consume path: not assembled DefaultDeliveryProcessor src/main=0 src/test=1 ## D. observation: implementation, call site, and the missing wire --- the interface has one implementation src/messaging/messaging-observability/src/main/java/dev/caskeleton/messaging/observation/MessagingMetrics.java:29:public final class MessagingMetrics implements MessagingObservation { --- DefaultMessagePublisher takes it as a constructor argument, not a decorator 79: private final dev.caskeleton.messaging.observation.MessagingObservation observation; 146: dev.caskeleton.messaging.observation.MessagingObservation observation) { --- and defines a no-op for the shorter constructors 96: NO_OBSERVATION); 100: private static final dev.caskeleton.messaging.observation.MessagingObservation NO_OBSERVATION = 134: this(destinations, access, codecs, admission, runtimes, transport, nanoTime, NO_OBSERVATION); --- the starter calls the six-argument constructor MessagingRuntimeRegistry runtimes, dev.caskeleton.messaging.transport.MessagingTransport transport) { return new dev.caskeleton.messaging.runtime.DefaultMessagePublisher( destinations, access, codecs, admission, runtimes, transport); } --- is MessagingMetrics ever created as a bean or otherwise? src/messaging/messaging-observability/src/main/java/dev/caskeleton/messaging/observation/MessagingMetrics.java:29:public final class MessagingMetrics implements MessagingObservation { src/messaging/messaging-observability/src/test/java/dev/caskeleton/messaging/observation/MessagingMetricCardinalityTest.java:14: private MessagingMetrics metrics(int limit) { src/messaging/messaging-observability/src/test/java/dev/caskeleton/messaging/observation/MessagingMetricCardinalityTest.java:15: return new MessagingMetrics(registry, new CardinalityGuard(limit), new MessagingRedactor()); src/messaging/messaging-observability/src/test/java/dev/caskeleton/messaging/observation/MessagingMetricCardinalityTest.java:31: MessagingMetrics metrics = metrics(2); src/messaging/messaging-observability/src/test/java/dev/caskeleton/messaging/observation/MessagingMetricCardinalityTest.java:44: MessagingMetrics metrics = metrics(1); src/messaging/messaging-observability/src/test/java/dev/caskeleton/messaging/observation/MessagingMetricCardinalityTest.java:54: MessagingMetrics metrics = metrics(10); src/messaging/messaging-observability/src/test/java/dev/caskeleton/messaging/observation/MessagingMetricCardinalityTest.java:92: MessagingMetrics metrics = metrics(10); src/messaging/messaging-observability/src/test/java/dev/caskeleton/messaging/observation/MessagingMetricCardinalityTest.java:103: MessagingMetrics metrics = metrics(10); src/messaging/messaging-observability/src/test/java/dev/caskeleton/messaging/observation/MessagingSecretLeakTest.java:74: MessagingMetrics metrics = new MessagingMetrics(registry, new CardinalityGuard(100), redactor); src/messaging/messaging-observability/src/test/java/dev/caskeleton/messaging/observation/MessagingSecretLeakTest.java:105: MessagingMetrics metrics = new MessagingMetrics(registry, new CardinalityGuard(100), redactor); exit=0 (1 = never constructed anywhere) --- observability beans the starter DOES create 253: public MessagingRedactor messagingRedactor() { 264: public CardinalityGuard cardinalityGuard() { ## verdict The publish path records every outcome through MessagingObservation. MessagingMetrics implements that interface. The shipped composition uses the constructor that substitutes NO_OBSERVATION, and creates no MessagingObservation bean, so the recorded outcomes go nowhere.