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>
15 lines
4.2 KiB
JSON
15 lines
4.2 KiB
JSON
{
|
|
"assetKey": "a19-f015-compatibilitymatrix-extension",
|
|
"kind": "terminal",
|
|
"command": "set -e\nset -o pipefail\nM=src/messaging/messaging-testkit/src/main/java/dev/caskeleton/messaging/testkit/CompatibilityMatrix.java\nstrip() { sed -E 's#^src/[^:]*/src/(main|test)/[^:]*/([^:/]+):([0-9]+):# \\1 · \\2:\\3 #'; }\ncut_range() { awk -v f=\"$2\" -v a=\"$3\" -v b=\"$4\" 'NR>=a && NR<=b {printf \" %s:%d %s\\n\", f, NR, $0}' \"$1\"; }\n\necho \"# Tier 열거값 셋과 EXTENSION 의 뜻\"\ncut_range $M CompatibilityMatrix.java 23 32\n\necho\necho \"# 표 밖에 있는 bridge leaf\"\nprintf \" %-42s main %s 파일 · %s 줄\\n\" \"messaging-spring-cloud-stream-bridge\" \\\n \"$(find src/messaging/messaging-spring-cloud-stream-bridge/src/main -name '*.java' | wc -l)\" \\\n \"$(find src/messaging/messaging-spring-cloud-stream-bridge/src/main -name '*.java' -exec cat {} + | wc -l)\"\npython3 - <<'PY'\nimport json\nd = json.load(open('src/config/architecture/modules.json'))\ndef walk(o):\n if isinstance(o, dict):\n if 'bridge' in str(o.get('id', '')):\n print(f\" modules.json {o['id']} runtime_memberships={o.get('runtime_memberships')}\")\n for v in o.values(): walk(v)\n elif isinstance(o, list):\n for v in o: walk(v)\nwalk(d)\nPY\nn=$(grep -c 'stream-bridge' $M || true); echo \" ENTRIES 에 bridge 이름이 있는가 : $n\"\n\necho\necho \"# Entry 가 요구하는 것 — bridge 가 이 표의 행이 될 수 있는가\"\nawk 'NR>=66 && NR<=74 {printf \" CompatibilityMatrix.java:%d %s\\n\", NR, $0}' $M\ngrep -n 'hasLiveBrokerCertification' $M | head -2 | sed -E 's#^([0-9]+): *# CompatibilityMatrix.java:\\1 #'\n\necho\necho \"# 미등록 이름을 조용히 지원으로 두지 않는 장치\"\ngrep -n 'public static Entry of\\|throw new' $M | head -4 | sed -E 's#^([0-9]+): *# CompatibilityMatrix.java:\\1 #'\ngit grep -n 'anUnknownAdapterIsNotSilentlyTreatedAsSupported' -- 'src/**/*.java' | strip\necho \" 그 시험이 미등록 이름의 예로 쓰는 것, 그리고 of 를 부르는 main 코드 :\"\ngit grep -ni 'artemis' -- 'src/**/*.java' | strip\nm=$(git grep -n 'CompatibilityMatrix\\.' -- 'src/**/*.java' | grep '/main/' | grep -v '/CompatibilityMatrix.java' | wc -l || true)\necho \" CompatibilityMatrix 를 자기 파일 밖에서 쓰는 main 코드 : ${m:-0} 건\"\n\necho\necho \"# ENTRIES 다섯 항목이 각각 어떤 Tier 인가\"\ngrep -n 'Tier\\.' $M | grep -v 'enum\\|EXTENSION$' | sed -E 's#^([0-9]+): *# CompatibilityMatrix.java:\\1 #'\nfor t in STABLE EXPERIMENTAL EXTENSION; do\n n=$(grep -c \"Tier\\.$t\" $M || true); echo \" ENTRIES 안에서 Tier.$t 를 쓴 횟수 : $n\"\ndone\n\necho\necho \"# 운영자용 문서에는 등급 표가 둘이다\"\ngrep -n '^## .*등급' docs/messaging/support-matrix.md | sed 's#^# docs/messaging/support-matrix.md:#'\necho \" 브로커 등급 표의 Extension 행 :\"\ngrep -n 'Extension' docs/messaging/support-matrix.md | cut -c1-140 | sed 's#^# docs/messaging/support-matrix.md:#'\necho \" 그 문서가 이 leaf 를 언급하는 줄 (대소문자·구분자 무관) :\"\ngrep -n -iE 'stream[- ]bridge' docs/messaging/support-matrix.md | sed 's#^# docs/messaging/support-matrix.md:#' || echo \" 0 건\"\n\necho\necho \"# bridge 가 무엇이라고 스스로 적는가\"\nb=$(find src/messaging/messaging-spring-cloud-stream-bridge/src/main -name 'MessagingBindingBridge.java')\ngrep -n 'interoperability seam\\|not a second' $b | cut -c1-140 | sed -E 's#^([0-9]+): *# MessagingBindingBridge.java:\\1 #'\ng=$(find src/messaging/messaging-spring-cloud-stream-bridge/src/main -name 'StreamBridgePolicyGuard.java')\ngrep -nE 'if \\(|STREAM_BRIDGE_|native adapter|does not apply' $g | cut -c1-140 | sed -E 's#^([0-9]+): *# StreamBridgePolicyGuard.java:\\1 #'\n",
|
|
"cwd": "/shared/codebase/clean-architecture-backend-template",
|
|
"exitCode": 0,
|
|
"executedAt": "2026-09-04T01:29:31+00:00",
|
|
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
|
|
"raw": "evidence/raw/a19-f015-compatibilitymatrix-extension.txt",
|
|
"svg": "evidence/rendered/a19-f015-compatibilitymatrix-extension.svg",
|
|
"rawSha256": "dbc3f5f10eaf1260c3096b9fef414439192fcfb72ffc1e4241ea5545a4f4db8b",
|
|
"lines": 73,
|
|
"redaction": "코드베이스 측정으로 교체"
|
|
}
|