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>
59 lines
5.1 KiB
Plaintext
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.
|