Files
document-haness/docs/clean-architecture-backend-template/final/evidence/meta/a14-f017-springmvcrouteinventorycollector.json
T
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.6 KiB
JSON

{
"assetKey": "a14-f017-springmvcrouteinventorycollector",
"kind": "terminal",
"command": "set -e\nset -o pipefail\nR=src/adapter/inbound/web/src/main/java/dev/caskeleton/adapter/inbound/web/admin/route\nT=src/adapter/inbound/web/src/test/java/dev/caskeleton/adapter/inbound/web/admin/route\necho \"# 이 패키지의 네 파일과, 자기 파일 밖에서 그 이름을 쓰는 파일 수\"\nfor f in WebRouteContract WebRouteInventory RouteInventoryMismatchException SpringMvcRouteInventoryCollector; do\n all=$(git grep -l \"$f\" -- \"src/**/*.java\" || true)\n m=$(printf '%s\\n' \"$all\" | awk -v self=\"/$f.java\" '$0 ~ /\\/src\\/main\\// && index($0, self) == 0 {n++} END {print n+0}')\n t=$(printf '%s\\n' \"$all\" | awk '$0 ~ /\\/src\\/test\\// {n++} END {print n+0}')\n printf ' %-34s %3s줄 main %2s test %2s\\n' \"$f\" \"$(grep -c '' $R/$f.java)\" \"$m\" \"$t\"\ndone\necho \" 그 파일들이 어디에 있는가 :\"\ngit grep -l 'WebRouteContract\\|WebRouteInventory\\|RouteInventoryMismatchException\\|SpringMvcRouteInventoryCollector' -- \"src/**/*.java\" \\\n | sed -E 's#^src/[^/]+/[^/]+/[^/]+/src/(main|test)/java/dev/caskeleton/adapter/inbound/web/(.*)/([^/]+)$# \\1 · \\2/\\3#' | sort -u\necho\necho \"# 수집기가 스스로 적은 역할\"\nsed -n '16,22p' $R/SpringMvcRouteInventoryCollector.java\necho\necho \"# 그 이름이 git 추적 파일 전체에 나오는 자리\"\ngit grep -n 'SpringMvcRouteInventoryCollector' -- . \\\n | sed -E 's#^(docs|src)/[^:]*/([^:/]+):([0-9]+):(.{0,72}).*# \\2:\\3 \\4#'\necho\necho \"# 계획 문서가 같은 자리에 적은 수집기는 둘이었다\"\ngit grep -n 'RouteInventoryCollector.java' -- docs/ | head -2 \\\n | sed -E 's#^docs/[^:]*/([^:/]+):([0-9]+):.*(Spring[A-Za-z]*RouteInventoryCollector)\\.java.*# \\1:\\2 \\3#'\necho -n \" 그중 이 저장소 소스에 실제로 있는 것 : \"\nfind src -name 'Spring*RouteInventoryCollector.java' -not -path '*/build/*' -printf '%f ' 2>/dev/null\necho \"(끝)\"\necho\necho \"# 목록을 만드는 자리와 예외를 던지는 자리\"\necho -n \" main 에서 WebRouteInventory 를 새로 만드는 파일 : \"\n{ git grep -ln 'new WebRouteInventory()' -- \"src/**/*.java\" | grep '/src/main/' | sed -E 's#^.*/([^/]+)$#\\1#' | tr '\\n' ' ' || true; }\necho \"(끝)\"\necho -n \" main 에서 RouteInventoryMismatchException 을 던지는 파일 : \"\n{ git grep -ln 'throw new RouteInventoryMismatchException' -- \"src/**/*.java\" | grep '/src/main/' | sed -E 's#^.*/([^/]+)$#\\1#' | tr '\\n' ' ' || true; }\necho \"(끝)\"\necho \" requireRegisteredOperations 가 나오는 자리 :\"\ngit grep -n 'requireRegisteredOperations' -- \"src/**/*.java\" \\\n | sed -E 's#^src/[^:]*/(src/(main|test))/[^:]*/([^:/]+):([0-9]+):.*# \\2 · \\3:\\4#'\necho -n \" 네 클래스에 스프링 애너테이션이 붙은 줄 수 : \"\ngrep -chE '^@' $R/*.java 2>/dev/null | awk '{s+=$1} END {print s+0}' || true\necho\necho \"# versionOf 가 찾는 모양을 선언한 main 자리 전부\"\ngit grep -n '\"/api/v' -- \"src/**/*.java\" | grep '/src/main/' \\\n | sed -E 's#^src/[^:]*/([^:/]+):([0-9]+):(.*)# \\1:\\2 \\3#'\necho \" 그 둘을 가두는 조건 :\"\nsed -n '31,38p' src/adapter/inbound/web/src/main/java/dev/caskeleton/adapter/inbound/web/mvc/operation/OperationHttpController.java \\\n | sed 's#^# #'\necho \" 그 속성이 저장소에 나오는 자리 전부 :\"\ngit grep -n 'durable-operations' -- . \\\n | sed -E 's#^src/[^:]*/([^:/]+):([0-9]+):.*# \\1:\\2#'\necho\necho \"# 경로 접두를 정하는 자리 전부 (src 안의 리소스와 시험)\"\ngit grep -n 'api-base-path' -- \"src/**\" | grep -v 'README\\|^src/[^:]*\\.md' \\\n | sed -E 's#^src/([^:]+):([0-9]+):[^:]*(api-base-path[^,)\"]*)\"?.*# \\1:\\2 \\3#' | head -12\necho \" 배포 레인이 고르는 프로파일 :\"\ngrep -n 'SPRING_PROFILES_ACTIVE' docker-compose.dev.yml docker-compose.prod-smoke.yml src/.env \\\n | sed -E 's#^([^:]+):([0-9]+):[[:space:]]*# \\1:\\2 #'\necho\necho \"# 접두 /api 에서 정규식에 걸릴 수 있는 컨트롤러와 그 조건\"\necho -n \" 게이트된 web main 파일 중 /v1 경로를 선언한 것 : \"\ngit grep -ln 'app.fileserver-platform' -- \"src/adapter/inbound/web/src/main/**/*.java\" \\\n | xargs grep -ln '\"/v1' 2>/dev/null | sed -E 's#^.*/([^/]+)$#\\1#' | tr '\\n' ' ' || true\necho\necho -n \" 같은 속성을 참조하는 web main 파일 / 저장소 전체 main 파일 : \"\nw=$(git grep -ln 'app.fileserver-platform' -- \"src/adapter/inbound/web/src/main/**/*.java\" | wc -l)\nr=$(git grep -ln 'app.fileserver-platform' -- \"src/**/src/main/**/*.java\" | wc -l)\necho \"$w / $r\"\ngrep -n 'APP_FILESERVER_PLATFORM_ENABLED' src/.env src/.env.example | sed 's#^# #'\ngrep -n 'enabled: \\${APP_FILESERVER_PLATFORM_ENABLED' src/app-bootstrap/src/main/resources/application.yml | sed 's#^# application.yml:#'\necho\necho \"# 시험은 목록을 무엇으로 채우는가\"\ngrep -n 'private static WebRouteContract route' -A6 $T/WebRouteInventoryTest.java | sed 's#^# #'\necho -n \" 그 시험이 RequestMappingHandlerMapping 을 쓰는가 : \"\n{ grep -c 'RequestMappingHandlerMapping' $T/WebRouteInventoryTest.java || true; }\n",
"cwd": "/shared/codebase/clean-architecture-backend-template",
"exitCode": 0,
"executedAt": "2026-09-03T07:54:50+00:00",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"raw": "evidence/raw/a14-f017-springmvcrouteinventorycollector.txt",
"svg": "evidence/rendered/a14-f017-springmvcrouteinventorycollector.svg",
"rawSha256": "3fb56ec7439c90e01d68f834096102d19c83dd2083a6789689ad4da75d2eabe6",
"lines": 91,
"redaction": "접두 자리 전수와 레인 프로파일, 게이트된 컨트롤러 다섯 명시"
}