Files
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

15 lines
5.0 KiB
JSON

{
"assetKey": "a14-f011-maxarrayelements",
"kind": "terminal",
"command": "set -e\nset -o pipefail\nW=adapter/inbound/web/src/main/java/dev/caskeleton/adapter/inbound/web\necho \"# 프로파일이 선언하는 세 상한\"\nsed -n '17,19p;26,29p;38,41p' $W/json/WebJsonProfile.java\necho -n \" maxArrayElements() 를 부르는 자리 : \"\n{ grep -rn '\\.maxArrayElements()' --include=*.java . || echo \"(0)\"; }\necho\necho \"# 같은 이름의 필드가 예산 타입에도 있다\"\ngrep -n 'maxArrayElements\\|ABSOLUTE_ARRAY_ELEMENTS_MAX' $W/budget/WebRequestBudget.java\necho \" 프로덕션이 등록하는 값과 그 필드 순서 :\"\nsed -n '24,34p;90,93p' $W/budget/WebRequestBudget.java\necho -n \" 절대 상한을 쓰는 술어를 프로덕션에서 부르는 자리 : \"\n{ grep -rn 'registerOverride\\|withinPlatformMaximum' --include=*.java . | grep -v 'WebRequestBudget.java\\|WebBudgetCatalog.java' \\\n | sed -E 's#^\\./[^:]*/src/([a-zA-Z]+)/[^:]*/([^:/]+):([0-9]+):#\\1 · \\2:\\3 #' | tr '\\n' ' ' || echo \"(0)\"; }\necho\necho \" 그 예산 목록은 프로덕션 자동설정이 만들고, 등록하는 예산은 하나다 :\"\ngrep -rn 'new WebBudgetCatalog()\\|catalog.register(' --include=*.java . \\\n | grep -v '/test/' | grep -v 'GraphQl' | sed -E 's#^\\./[^:]*/([^:/]+):([0-9]+):# \\1:\\2 #'\necho -n \" WebRequestBudget 의 공개 팩토리 : \"\n{ grep -c 'public static WebRequestBudget' $W/budget/WebRequestBudget.java; }\necho\necho \"# 그 예산을 강제하는 필터가 실제로 읽는 필드\"\ngrep -o 'budget\\.[a-zA-Z]*()' $W/mvc/budget/WebMvcBudgetFilter.java | sort -u | sed 's#^# #'\necho \" 반응형 필터가 자기 파일에서 읽는 필드 :\"\ngrep -o 'budget\\.[a-zA-Z]*()' $W/webflux/budget/WebFluxBudgetFilter.java | sort -u | sed 's#^# #'\necho \" 나머지 둘은 이 감싼 교환에 넘겨 잰다 :\"\ngrep -n 'BoundedServerWebExchange' $W/webflux/budget/WebFluxBudgetFilter.java\ngrep -o 'budget\\.[a-zA-Z]*()' $W/webflux/budget/BoundedServerWebExchange.java | sort -u | sed 's#^# #'\necho \" 두 필터를 등록하는 자리 :\"\n{ grep -rln 'new WebMvcBudgetFilter\\|new WebFluxBudgetFilter' --include=*.java . \\\n | sed -E 's#^\\./[^:]*/src/([a-zA-Z]+)/.*/([^/]+)$# \\1 · \\2#' || echo \" (0)\"; }\necho\necho \"# 유계 팩토리가 파서에 거는 것과 그 이유\"\nsed -n '9,15p' $W/json/BoundedJsonFactory.java\nsed -n '33,43p' $W/json/BoundedJsonFactory.java\necho\necho \"# 파서가 실제로 제공하는 상한 전부\"\nCACHE=/root/.gradle/caches/modules-2/files-2.1\nJ=$(find $CACHE/tools.jackson.core/jackson-core -name '*.jar' ! -name '*sources*' ! -name '*javadoc*' | head -1)\necho \" $(basename \"$J\")\"\nX=$(mktemp -d)\n( cd \"$X\" && jar xf \"$J\" 'tools/jackson/core/StreamReadConstraints$Builder.class' \\\n && javap -p 'tools/jackson/core/StreamReadConstraints$Builder.class' \\\n | grep 'Builder max' | sed -E 's#.*Builder (max[A-Za-z]+\\(.*\\));# \\1#' )\nrm -rf \"$X\"\necho \" 유계 팩토리를 부르는 자리와 그것을 부르는 자동설정 :\"\ngrep -rn 'BoundedJsonFactory.create\\|WebObjectMapperFactory.jsonMapper' --include=*.java . \\\n | grep -v '/test/' | sed -E 's#^\\./[^:]*/([^:/]+):([0-9]+):# \\1:\\2 #'\necho \" 그중 이 저장소가 이미 쓰는 것 :\"\ngrep -rn 'maxDocumentLength\\|maxTokenCount' --include=*.java . \\\n | sed -E 's#^\\./[^:]*/([^:/]+):([0-9]+):# \\1:\\2 #'\necho \" 같은 어댑터의 두 자리가 받는 예산 타입과 그 출하값 :\"\ngrep -n 'create(CodecBudget' $W/advanced/codec/WebCborMapperFactory.java $W/advanced/codec/WebXmlMapperFactory.java \\\n | sed -E 's#^[^:]*/([^:/]+):([0-9]+):# \\1:\\2 #'\ngrep -n 'int maxBodyBytes\\|conventional' $W/advanced/codec/CodecBudget.java | head -4\necho \" 여섯 자리를 실제로 만드는 곳 :\"\ngrep -rn 'WebCborMapperFactory\\.\\|WebXmlMapperFactory\\.\\|new StrictWebSocketJsonCodec\\|new WebSocketCborCodec\\|JacksonMessageCodec.of\\|new LocalJsonSchemaRegistry' --include=*.java . \\\n | sed -E 's#^\\./[^:]*/src/([a-zA-Z]+)/[^:]*/([^:/]+):([0-9]+):# \\1 · \\2:\\3#' | sort -u\necho \" 그 백엔드 잠금 항목이 실린 구성 :\"\ngrep -o 'tools.jackson.dataformat:jackson-dataformat-[a-z]*:[0-9.]*=[a-zA-Z,]*' \\\n adapter/inbound/web/gradle.lockfile | sed 's#^# #'\necho\necho \"# 표본 애플리케이션은 컬렉션 본문에 크기 제약을 건다\"\ngrep -n -B2 '@Size(max = MAX_BATCH_SIZE' \\\n sample-portfolio/src/main/java/dev/caskeleton/sample/portfolio/adapter/inbound/web/controller/WorkLogController.java\n",
"cwd": "/shared/codebase/clean-architecture-backend-template/src",
"exitCode": 0,
"executedAt": "2026-09-03T01:52:44+00:00",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"raw": "evidence/raw/a14-f011-maxarrayelements.txt",
"svg": "evidence/rendered/a14-f011-maxarrayelements.svg",
"rawSha256": "8914f09c68c2e63b822d9436f497e40882c9b3e0a28be9db82be177b64d43ca8",
"lines": 145,
"redaction": "none — 값은 저장소와 이 프로브가 만든 것이다"
}