Files
document-haness/docs/clean-architecture-backend-template/final/evidence/raw/283-runtime-core-observation-noop.txt
T
DongHyeonkaandClaude Opus 5 b2963105a8 docs(keycloak-session-store): import the session-storage lab as a new project
The keycloak project ended with four open questions that design could not
settle. A two-VM lab was built to answer them by measurement, and this is
that material: 26 experiments, 125 raw command outputs, 22 browser captures.

Follows the import procedure in README.md.

  source/     the originating repository verbatim — 78 documents, 28 SVGs,
              8 manifests, plus .source-revision recording the commit
  final/      the SSOT
    document.md   729 lines written from the 29 experiment documents, not
                  concatenated: what was predicted, what was measured, and
                  where the measurement itself was wrong
    evidence/raw    125 outputs, flattened to <experiment>__<file> because
                    the originals collided (01-baseline.txt appeared three
                    times) and the audit only globs the top level
    evidence/meta   one per raw file; command and exitCode are null and the
                    README says why rather than inventing them
    evidence/browser  22 captures
    assets/       three diagrams through techviz
    .techviz/     their VizSpecs

A separate project rather than an addition to keycloak: the B-layer answers
that project's four questions, but the A, C and D layers are about cluster
failure, SSO and operations, and one document.md should hold one subject.
The four question records there can point here through 관계.

Recorded rather than papered over: only three of the 28 diagrams were
remade. The repository forbids hand-drawn SVG and forbids titles inside the
canvas; all 28 originals carry both, so converting them is redrawing, not
reformatting. They stay in source/ and the gap is written into the document.

verify-pipeline.py passes. audit-records.py reports no issues.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-04 22:51:59 +09:00

59 lines
5.1 KiB
Plaintext

# 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.