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>
74 lines
5.1 KiB
Plaintext
74 lines
5.1 KiB
Plaintext
# Tier 열거값 셋과 EXTENSION 의 뜻
|
|
CompatibilityMatrix.java:23 public enum Tier {
|
|
CompatibilityMatrix.java:24 /** Passes the shared adapter contract unchanged. */
|
|
CompatibilityMatrix.java:25 STABLE,
|
|
CompatibilityMatrix.java:26
|
|
CompatibilityMatrix.java:27 /** Contract coverage is still being proven; disabled by default. */
|
|
CompatibilityMatrix.java:28 EXPERIMENTAL,
|
|
CompatibilityMatrix.java:29
|
|
CompatibilityMatrix.java:30 /** Adapter SPI only; outside the supported set. */
|
|
CompatibilityMatrix.java:31 EXTENSION
|
|
CompatibilityMatrix.java:32 }
|
|
|
|
# 표 밖에 있는 bridge leaf
|
|
messaging-spring-cloud-stream-bridge main 6 파일 · 507 줄
|
|
modules.json messaging-spring-cloud-stream-bridge runtime_memberships=[]
|
|
ENTRIES 에 bridge 이름이 있는가 : 0
|
|
|
|
# Entry 가 요구하는 것 — bridge 가 이 표의 행이 될 수 있는가
|
|
CompatibilityMatrix.java:66 Objects.requireNonNull(brokerVersions, "brokerVersions must not be null");
|
|
CompatibilityMatrix.java:67 if (adapter == null || adapter.isBlank()) {
|
|
CompatibilityMatrix.java:68 throw new IllegalArgumentException("adapter must not be blank");
|
|
CompatibilityMatrix.java:69 }
|
|
CompatibilityMatrix.java:70 if (brokerVersions.isEmpty()) {
|
|
CompatibilityMatrix.java:71 throw new IllegalArgumentException("an adapter must certify at least one broker version");
|
|
CompatibilityMatrix.java:72 }
|
|
CompatibilityMatrix.java:73 brokerVersions = List.copyOf(brokerVersions);
|
|
CompatibilityMatrix.java:74 }
|
|
CompatibilityMatrix.java:60 public boolean hasLiveBrokerCertification() {
|
|
|
|
# 미등록 이름을 조용히 지원으로 두지 않는 장치
|
|
CompatibilityMatrix.java:68 throw new IllegalArgumentException("adapter must not be blank");
|
|
CompatibilityMatrix.java:71 throw new IllegalArgumentException("an adapter must certify at least one broker version");
|
|
CompatibilityMatrix.java:126 public static Entry of(String adapter) {
|
|
CompatibilityMatrix.java:129 throw new IllegalArgumentException("adapter is not in the compatibility matrix: " + adapter);
|
|
test · CompatibilityMatrixTest.java:83 void anUnknownAdapterIsNotSilentlyTreatedAsSupported() {
|
|
그 시험이 미등록 이름의 예로 쓰는 것, 그리고 of 를 부르는 main 코드 :
|
|
test · CompatibilityMatrixTest.java:84 assertThatThrownBy(() -> CompatibilityMatrix.of("messaging-artemis"))
|
|
test · CompatibilityMatrixTest.java:122 "messaging-artemis", List.of("2.42"), CompatibilityMatrix.Tier.STABLE, true, false);
|
|
test · CrossBrokerContractSuite.java:118 assertThat(matrix.coverageOf("messaging-artemis", NetworkFaultScenario.CONFIRM_TIMEOUT))
|
|
CompatibilityMatrix 를 자기 파일 밖에서 쓰는 main 코드 : 0 건
|
|
|
|
# ENTRIES 다섯 항목이 각각 어떤 Tier 인가
|
|
CompatibilityMatrix.java:85 new Entry("messaging-kafka", List.of("4.1"), Tier.STABLE, true, true),
|
|
CompatibilityMatrix.java:92 new Entry("messaging-rabbit", List.of("4.3"), Tier.EXPERIMENTAL, true, false),
|
|
CompatibilityMatrix.java:97 Tier.EXPERIMENTAL,
|
|
CompatibilityMatrix.java:104 Tier.EXPERIMENTAL,
|
|
CompatibilityMatrix.java:109 "messaging-nats-experimental", List.of("2.14"), Tier.EXPERIMENTAL, false, false));
|
|
ENTRIES 안에서 Tier.STABLE 를 쓴 횟수 : 1
|
|
ENTRIES 안에서 Tier.EXPERIMENTAL 를 쓴 횟수 : 4
|
|
ENTRIES 안에서 Tier.EXTENSION 를 쓴 횟수 : 0
|
|
|
|
# 운영자용 문서에는 등급 표가 둘이다
|
|
docs/messaging/support-matrix.md:29:## 브로커 등급
|
|
docs/messaging/support-matrix.md:66:## 기능 등급
|
|
브로커 등급 표의 Extension 행 :
|
|
docs/messaging/support-matrix.md:37:| Artemis/JMS | Extension | 범위 밖 | adapter SPI만 | 별도 ADR + Contract Suite 통과 필요 |
|
|
그 문서가 이 leaf 를 언급하는 줄 (대소문자·구분자 무관) :
|
|
docs/messaging/support-matrix.md:78:| Spring Cloud Stream bridge | Optional |
|
|
|
|
# bridge 가 무엇이라고 스스로 적는가
|
|
MessagingBindingBridge.java:8 * <p>The bridge is an interoperability seam, not a second messaging API. Its whole reason to exist
|
|
StreamBridgePolicyGuard.java:17 * must go through the native adapter, where those are actually enforced.
|
|
StreamBridgePolicyGuard.java:30 if (!enabled) {
|
|
StreamBridgePolicyGuard.java:32 "STREAM_BRIDGE_DISABLED",
|
|
StreamBridgePolicyGuard.java:36 if (profile.isOrdered()) {
|
|
StreamBridgePolicyGuard.java:38 "STREAM_BRIDGE_ORDERING_UNSUPPORTED",
|
|
StreamBridgePolicyGuard.java:39 "an ordered destination must use the native adapter: " + profile.name().value());
|
|
StreamBridgePolicyGuard.java:41 if (profile.retry().mode() != dev.caskeleton.messaging.policy.RetryMode.NONE) {
|
|
StreamBridgePolicyGuard.java:43 "STREAM_BRIDGE_RETRY_UNSUPPORTED",
|
|
StreamBridgePolicyGuard.java:44 "the bridge does not apply the platform retry policy: " + profile.name().value());
|
|
StreamBridgePolicyGuard.java:46 if (profile.deadLetter().enabled()) {
|
|
StreamBridgePolicyGuard.java:48 "STREAM_BRIDGE_DLQ_UNSUPPORTED",
|
|
StreamBridgePolicyGuard.java:49 "the bridge does not apply confirmed dead lettering: " + profile.name().value());
|