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.0 KiB
JSON
15 lines
4.0 KiB
JSON
{
|
|
"assetKey": "a19-f022-messagingpublicsurfacecontracttest",
|
|
"kind": "terminal",
|
|
"command": "#!/bin/bash\ncd /shared/codebase/clean-architecture-backend-template\nnt() { sed -E 's# in [0-9hms ]+$##'; }\n\necho \"# 가족 지침이 이 계약의 주인으로 지목한 것\"\nawk 'NR>=36 && NR<=44 {printf \" src/messaging/CLAUDE.md:%d %s\\n\", NR, $0}' src/messaging/CLAUDE.md\n\necho\necho \"# 그 시험 클래스가 놓인 트리\"\ngit grep -l 'class MessagingPublicSurfaceContractTest' -- 'src/**/*.java' | sed 's#^# #'\nF=src/app-bootstrap/src/test/java/dev/caskeleton/bootstrap/contract/messaging/MessagingPublicSurfaceContractTest.java\necho \" src/messaging 아래 동명 파일 : $(find src/messaging -name 'MessagingPublicSurfaceContractTest.java' | wc -l) 개\"\necho \" 가족 test 트리 : $(ls -d src/messaging/*/src/test 2>/dev/null | wc -l) 개 · 이 파일의 트리 : src/app-bootstrap/src/test\"\necho \" 이 파일의 @Test $(grep -c '@Test' $F) · @Tag $(grep -c '@Tag' $F) · @Disabled $(grep -c '@Disabled' $F)\"\ngrep -n 'void .*(' $F | sed -E 's#^([0-9]+): *# :\\1 #'\n\necho\necho \"# 가족 경로에서 도는 워크플로의 트리거 전부와 실행 명령\"\nW=.github/workflows/messaging-certification.yml\nawk 'NR>=15 && NR<=22 {printf \" messaging-certification.yml:%d %s\\n\", NR, $0}' $W\ngrep -n 'gradlew' $W | sed -E 's#^([0-9]+): *# messaging-certification.yml:\\1 #'\n\necho\necho \"# 경로 필터가 없는 워크플로\"\nawk 'NR>=1 && NR<=9 {printf \" ci-quality-gates.yml:%d %s\\n\", NR, $0}' .github/workflows/ci-quality-gates.yml\necho \" on 블록(1-9)의 paths 필터 : $(awk 'NR<=9' .github/workflows/ci-quality-gates.yml | grep -c 'paths') 건\"\nawk 'NR>=19 && NR<=22 {printf \" ci-quality-gates.yml:%d %s\\n\", NR, $0}' .github/workflows/ci-quality-gates.yml\nawk 'NR>=48 && NR<=55 {printf \" ci-quality-gates.yml:%d %s\\n\", NR, $0}' .github/workflows/ci-quality-gates.yml\n\necho\necho \"# check 가 정말 이 프로젝트의 test 를 포함하는가\"\ncd src\necho \" \\$ ./gradlew :app-bootstrap:check --dry-run\"\ntimeout 900 ./gradlew --offline --no-daemon :app-bootstrap:check --dry-run 2>/dev/null \\\n | grep -E '^:app-bootstrap:(test|functionalTest|check) ' | sed 's#^# #'\necho \" 루트 test 규약이 거는 유일한 필터 :\"\nawk 'NR>=549 && NR<=553 {printf \" src/build.gradle:%d %s\\n\", NR, $0}' build.gradle\n\necho\necho \"# 이름으로 골라 실제로 돌리면\"\ntimeout 900 ./gradlew --offline --no-daemon :app-bootstrap:test \\\n --tests 'dev.caskeleton.bootstrap.contract.messaging.MessagingPublicSurfaceContractTest' > /tmp/t1.out 2>&1\necho \" \\$ ./gradlew :app-bootstrap:test --tests '...MessagingPublicSurfaceContractTest'\"\ngrep -E 'BUILD (SUCCESSFUL|FAILED)' /tmp/t1.out | nt | sed 's#^# #'\npython3 -c \"\nimport glob, xml.etree.ElementTree as ET\nfor p in glob.glob('app-bootstrap/build/test-results/test/TEST-*MessagingPublicSurfaceContractTest.xml'):\n r = ET.parse(p).getroot()\n print(f\\\" 결과 디렉터리 test/ · {r.get('name').split('.')[-1]} tests={r.get('tests')} failures={r.get('failures')} skipped={r.get('skipped')}\\\")\n\"\n\necho\necho \"# 가족 태스크로 같은 이름을 고르면\"\ntimeout 900 ./gradlew --offline --no-daemon :messaging:messaging-kafka:test \\\n --tests 'dev.caskeleton.bootstrap.contract.messaging.MessagingPublicSurfaceContractTest' > /tmp/t2.out 2>&1\necho \" \\$ ./gradlew :messaging:messaging-kafka:test --tests '...MessagingPublicSurfaceContractTest'\"\ngrep -E 'No tests found|BUILD (SUCCESSFUL|FAILED)' /tmp/t2.out | nt | head -2 | sed 's#^# #'\n",
|
|
"cwd": "/shared/codebase/clean-architecture-backend-template",
|
|
"exitCode": 0,
|
|
"executedAt": "2026-09-04T02:02:28+00:00",
|
|
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
|
|
"raw": "evidence/raw/a19-f022-messagingpublicsurfacecontracttest.txt",
|
|
"svg": "evidence/rendered/a19-f022-messagingpublicsurfacecontracttest.svg",
|
|
"rawSha256": "350649393cfe95fb9539672d2275c8dea0875accdfbff364e8c6f2e4125b6247",
|
|
"lines": 76,
|
|
"redaction": "비밀값 없음"
|
|
}
|