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": "a14-f015-virtualthreadprofile-propertyname",
|
|
"kind": "terminal",
|
|
"command": "set -e\nset -o pipefail\nW=src/adapter/inbound/web/src/main/java/dev/caskeleton/adapter/inbound/web\nS=src/adapter/inbound/websocket/src/main/java/dev/caskeleton/adapter/inbound/websocket\necho -n \"# 이 저장소에서 propertyName() 을 선언하는 자리를 세면 : \"\ngrep -rn 'String propertyName()' --include=*.java src | grep -c '/src/main/' || true\ngrep -rn 'String propertyName()' --include=*.java src | grep '/src/main/' \\\n | sed -E 's#^[^:]*/([^:/]+):([0-9]+):.*# \\1:\\2#'\necho\necho \"# 그 셋의 구현\"\necho \" WebAdvancedFeature.java:59-62\"\nsed -n '59,62p' $W/advanced/WebAdvancedFeature.java | sed 's#^# #'\necho \" WebSocketAdvancedCapability.java:74-79\"\nsed -n '74,79p' $S/advanced/WebSocketAdvancedCapability.java | sed 's#^# #'\necho \" VirtualThreadProfile.java:74-77\"\nsed -n '74,77p' $W/advanced/virtualthread/VirtualThreadProfile.java | sed 's#^# #'\necho\necho \"# 그 셋을 부르는 자리. 메서드 참조까지 센다\"\nfor n in WebAdvancedFeature WebSocketAdvancedCapability VirtualThreadProfile; do\n echo -n \" $n : \"\n { grep -rn \"$n\\(\\.[A-Z_]*\\)\\?\\.propertyName()\\|$n::propertyName\" --include=*.java src \\\n | sed -E \"s#^[^:]*/([^:/]+):([0-9]+):.*#\\1:\\2#\" | tr '\\n' ' ' || true; }\n echo \"(끝)\"\ndone\necho\necho \"# 발행된 이름 그대로 저장소에 나오는 자리 (git 추적 파일 전부)\"\ngit grep -n 'backend\\.web\\.advanced\\.virtual-threads\\.enabled' -- . \\\n | sed -E 's#^[^:]*/([^:/]+):([0-9]+):# \\1:\\2 #'\necho \"# 그 접두사만으로 찾으면 한 줄이 더 나온다\"\ngit grep -n 'backend\\.web\\.advanced\\.virtual-threads' -- . | sed 's#^# #'\necho \" 그 계획 문서가 접두사 다음 줄에 적은 것 :\"\ngit show HEAD:docs/web-superpowers-package/docs/superpowers/plans/2026-08-13-web-advanced-capabilities-expansion-plan.md \\\n | sed -n '203p' | sed 's#^# #'\necho \"# 운영자용 문서가 쓰는 이름\"\ngit grep -n 'mvc-virtual-threads' -- docs/ \\\n | sed -E 's#^docs/([^:]+):([0-9]+):.*(backend[a-z.-]*mvc-virtual-threads[a-z.]*|mvc-virtual-threads:).*# \\1:\\2 \\3#'\necho\necho \"# 같은 능력을 실제로 바인딩하고 게이트하는 이름\"\ngrep -n 'ConfigurationProperties(prefix' $W/advanced/mvc/VirtualThreadSettings.java \\\n | sed 's#^# VirtualThreadSettings:#'\nsed -n '30,36p' $W/advanced/mvc/VirtualThreadMvcConfiguration.java \\\n | sed 's#^# VirtualThreadMvcConfiguration #'\necho\necho \"# 게이트와 무관하게 이 설정을 등록하는 출하 조립 루트\"\nB=src/app-bootstrap/src/main/java/dev/caskeleton/bootstrap/CaSkeletonApplication.java\ngrep -n '^@ConfigurationPropertiesScan(' $B | sed 's#^# CaSkeletonApplication:#'\ngrep -n ' \"dev.caskeleton.adapter.inbound.web\",' $B | sed 's#^# CaSkeletonApplication:#'\necho -n \" 그 애너테이션이 거는 목록 : \"\nawk 'NR>=59 && /^ \\}\\)/ {print \"58-\" NR \" · \" n \" 개 패키지\"; exit} NR>=60 && /\"dev\\.caskeleton/ {n++}' $B\necho\necho \"# 이름을 잘못 발행하는 타입 자체는 배선되어 있다\"\ngrep -n 'toProfile()' $W/advanced/mvc/VirtualThreadSettings.java | sed 's#^# VirtualThreadSettings:#'\nsed -n '39,42p' $W/advanced/mvc/VirtualThreadMvcConfiguration.java \\\n | sed 's#^# VirtualThreadMvcConfiguration #'\necho\necho -n \"# 루트가 거는 그 패키지 아래의 @ConfigurationProperties 타입 : \"\ngrep -rl '@ConfigurationProperties' --include=*.java src/adapter/inbound/web/src/main | wc -l\necho \" 그중 값을 요구하는 하나. SecuritySettings.java:31-34 :\"\nsed -n '31,34p' src/adapter/inbound/web/src/main/java/dev/caskeleton/adapter/inbound/web/settings/SecuritySettings.java | sed 's#^# #'\necho\necho \"# 이 리프는 설정 메타데이터를 생성하도록 선언되어 있다\"\ngrep -n 'configuration-processor' src/adapter/inbound/web/build.gradle | sed 's#^# build.gradle:#'\necho \" 그 선언을 리프마다 강제하는 루트 빌드 자리 :\"\nsed -n '2201,2205p' src/build.gradle | sed 's#^# #'\n",
|
|
"cwd": "/shared/codebase/clean-architecture-backend-template",
|
|
"exitCode": 0,
|
|
"executedAt": "2026-09-03T06:15:15+00:00",
|
|
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
|
|
"raw": "evidence/raw/a14-f015-virtualthreadprofile-propertyname.txt",
|
|
"svg": "evidence/rendered/a14-f015-virtualthreadprofile-propertyname.svg",
|
|
"rawSha256": "badf45413cb8063f768caae82d111d5610745de0a16e146324a9b60a5b2d9c01",
|
|
"lines": 78,
|
|
"redaction": "이름 검색과 접두사 검색을 분리, 운영자 문서 줄 추가"
|
|
}
|