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.6 KiB
JSON
15 lines
4.6 KiB
JSON
{
|
|
"assetKey": "a20-f011-grpccompletionreconciler-arraylist",
|
|
"kind": "terminal",
|
|
"command": "#!/bin/bash\nset -euo pipefail\ncd /shared/codebase/clean-architecture-backend-template\nK=src/grpc/grpc-policy/src/main/java/dev/caskeleton/grpc/idempotency/GrpcCompletionReconciler.java\nC=src/grpc/grpc-policy/src/main/java/dev/caskeleton/grpc/deadline/GrpcCancellationCoordinator.java\nR=docs/runbooks/grpc-platform-operations.md\ntest -f \"$K\"; test -f \"$C\"; test -f \"$R\"\n\n# grep 오류(2)와 무매치(1)를 가른다. 오타난 패턴은 0 을 제조하지 못하고 죽는다.\ncnt() { local n; n=$(grep -c -- \"$1\" \"$2\") || [ $? -eq 1 ] || { echo \"GREP FAILED: $1\" >&2; exit 2; }; echo \"$n\"; }\n\necho \"# 클래스 자바독과 목록 선언 ($(wc -l < $K) 줄)\"\nawk 'NR>=8 && NR<=26 {printf \" GrpcCompletionReconciler.java:%d %s\\n\", NR, $0}' $K\n\necho\necho \"# pending 이 나오는 줄 전부\"\ngrep -n 'pending' $K | sed -E 's#^([0-9]+): *# GrpcCompletionReconciler.java:\\1 #'\n\necho\necho \"# 동기화 표시자 — 같은 검색을 같은 리프의 짝에도 건다\"\nprintf \" %-18s %10s %10s %10s\\n\" \"표시자\" \"이 파일\" \"짝 파일\" \"리프 전체\"\nfor w in synchronized volatile 'java.util.concurrent' ReentrantLock CopyOnWrite 'not thread' 'single-threaded'; do\n a=$(cnt \"$w\" $K); b=$(cnt \"$w\" $C)\n r=$({ git grep -l -- \"$w\" -- 'src/grpc/grpc-policy/**/*.java' || true; } | grep -c . || true)\n printf \" %-18s %10s %10s %10s\\n\" \"$w\" \"$a\" \"$b\" \"$r\"\ndone\n\necho \" 같은 검색을 리프 전체에 걸어 파일별로 :\"\nfor f in $(find src/grpc/grpc-policy/src/main -name '*.java' | sort); do\n n=$(grep -cE 'synchronized|volatile|ReentrantLock|CopyOnWrite|java\\.util\\.concurrent' $f) || [ $? -eq 1 ] || exit 2\n [ \"$n\" != \"0\" ] && printf \" %-38s %s 건\\n\" \"$(basename $f)\" \"$n\" || true\ndone\necho \" 리프 전체 $(find src/grpc/grpc-policy/src/main -name '*.java' | grep -c .) 파일\"\n\necho\necho \"# pending.add 가 실행되는 조건\"\nawk 'NR>=62 && NR<=82 {printf \" GrpcCompletionReconciler.java:%d %s\\n\", NR, $0}' $K\nS=src/grpc/grpc-policy/src/main/java/dev/caskeleton/grpc/idempotency/GrpcCompletionResolution.java\nawk 'NR>=46 && NR<=54 {printf \" GrpcCompletionResolution.java:%d %s\\n\", NR, $0}' $S\n\necho\necho \"# 같은 리프에서 같은 모양의 필드를 가진 클래스\"\ngrep -rnE 'private final (List|Map|Set|Deque|Queue)<.*> .* = new ' src/grpc/grpc-policy/src/main \\\n | sed 's#.*/main/java/dev/caskeleton/grpc/# #'\necho \" 그중 GrpcCancellationCoordinator 의 공개 메서드 :\"\ngrep -nE '^ public ' $C | sed -E 's#^([0-9]+): *# GrpcCancellationCoordinator.java:\\1 #'\n\necho\necho \"# 이 타입을 참조하는 자리 — 경로 제한 없이, 절단 없이\"\ngit grep -l 'GrpcCompletionReconciler' | sed 's/^/ /'\ngit grep -n 'GrpcCompletionReconciler' -- 'src/**/*.java' \\\n | sed -E 's#^src/[^:]*/src/(main|test)/java/dev/caskeleton/[^:]*/([^:/]+):([0-9]+):# \\1 · \\2:\\3 #'\nn=$({ git grep -l 'GrpcCompletionReconciler' -- 'src/**/*.java' || true; } | { grep '/main/' || true; } | { grep -v '/GrpcCompletionReconciler.java' || true; } | grep -c . || true)\np=$({ git grep -l 'GrpcCancellationCoordinator' -- 'src/**/*.java' || true; } | { grep '/main/' || true; } | { grep -v '/GrpcCancellationCoordinator.java' || true; } | grep -c . || true)\necho \" 자기 파일 밖 main 참조 : $n 개\"\necho \" [대조] GrpcCancellationCoordinator : $p 개 (0 이 아니어야 정상)\"\n\necho\necho \"# 운영 런북이 자기를 어떻게 규정하는가\"\nawk 'NR>=1 && NR<=9 {printf \" grpc-platform-operations.md:%d %s\\n\", NR, $0}' $R\necho \" 그 런북이 요구하는 스위치가 코드에 있는가 : $({ git grep -l 'grpc.platform.enabled' -- 'src' || true; } | grep -c . || true) 개 파일\"\necho \" 독립 문서의 같은 서술 :\"\ngrep -n 'Not released\\|build-only' docs/compatibility/grpc-support-matrix.md \\\n | sed -E 's#^([0-9]+): *# grpc-support-matrix.md:\\1 #'\n\necho\necho \"# 그 런북이 이 클래스에 기대하는 동작\"\nawk 'NR>=34 && NR<=42 {printf \" grpc-platform-operations.md:%d %s\\n\", NR, $0}' $R\n",
|
|
"cwd": "/shared/codebase/clean-architecture-backend-template",
|
|
"exitCode": 0,
|
|
"executedAt": "2026-09-04T03:24:35+00:00",
|
|
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
|
|
"raw": "evidence/raw/a20-f011-grpccompletionreconciler-arraylist.txt",
|
|
"svg": "evidence/rendered/a20-f011-grpccompletionreconciler-arraylist.svg",
|
|
"rawSha256": "515801cc849539fdd668bab15c948712ffe116d2633d1d90701d2ab5f4c6e24b",
|
|
"lines": 137,
|
|
"redaction": "비밀값 없음"
|
|
}
|