Files
document-haness/docs/clean-architecture-backend-template/final/evidence/raw/a19-f015-compatibilitymatrix-extension.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

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());