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>
9.2 KiB
kind, slug, title, topic, project, status, sourceRevision, rootTreeNode, evidenceCapturedOn, assets, evidence, source
| kind | slug | title | topic | project | status | sourceRevision | rootTreeNode | evidenceCapturedOn | assets | evidence | source | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| CASE | a07-f006-claude | 사라진 가드가 문서에만 남았고 그 부재는 이미 승인된 결정이다 | identity-and-identifier | clean-architecture-backend-template | 게시 전 | 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 | case:a07-f006-claude | 2026-09-02 |
|
|
|
사라진 가드가 문서에만 남았고 그 부재는 이미 승인된 결정이다
리프 지침 문서가 금지 사항의 근거로 가드 둘을 든다. 아키텍처 규칙 쪽은 실재하고 CI 에서 돈다. 훅 스크립트 쪽은 이 저장소에 없고, 없는 이유가 다른 문서에 결정으로 적혀 있다.
관계
- 문서가 선언됐다는 둘은 없고, 선언된 하나는 그 문장에 없다 같은 문서의 다른 오류다.
- 산문이 선언한 게이트는 빌드에 있는 게이트가 아니다 이 사례가 그 규칙의 형태다.
- release gate가 실제로 차단하는 것은 hermetic test 3개이고, mongo용 CI workflow는 없다 릴리스 게이트가 실제로 무엇을 막는지 센 문서다.
문제
지침 문서가 이 리프에 금지된 것을 나열한다. 첫 항목은 퍼시스턴스와 웹 기술이고, 거기에 강제 근거가 둘 붙는다. 아키텍처 규칙 이름 하나와, 훅 스크립트의 규칙 번호 하나다.
결론
아키텍처 규칙은 실재하고 실제로 돈다. 시험 상수에 애너테이션이 붙어 있고 클래스 단위 분석 대상이 저장소 전체이며, 조립 루트가 이 리프를 물고 있어 검사 대상이 비어 있지 않다. CI 품질 게이트가 그 검사를 포함한 태스크를 돌린다.
다만 그 규칙이 막는 이름 목록에 Spring Web 이 없다. 같은 줄이 함께 금지한 기술이고, 사라진 쪽 가드가 덮기로 돼 있던 것이다.
그 기술들을 이 리프 밖에 두는 첫 방어선은 규칙이 아니다. 잠금 파일이 컴파일과 런타임 클래스패스가 비어 있다고 적는다. 컴파일에서 이미 불가능하고, 아키텍처 규칙은 그 뒤에 선다.
훅 스크립트 쪽은 저장소에 없다. 그 디렉터리 아래 추적되는 파일이 0 이고, 전 이력에서도 추적된 적이 없다. 무시 목록 셋째 줄이 그 디렉터리를 덮는다. 작업 트리에 남아 있는 것은 로컬 설정 파일 하나이고 훅 디렉터리는 만들어진 적이 없다.
규칙 번호 쪽도 해석되는 대상이 없다. 그 번호를 쓰는 곳은 자기 자신 말고 없다.
없는 이유는 무시 목록이 아니라 다른 문서에 있다. 그 스크립트를 고치겠다던 계획은 첫 줄에 폐기가 적혀 있고, 그것을 대체한 개정안의 목표 문장이 부재한 개발 하네스를 되살리지 않은 채 Gradle 과 아키텍처 규칙으로만 의존성 강제를 복구하겠다고 적는다. 계획이 약속한 디렉터리 역시 존재하지 않는다.
그러니 이것은 빠뜨린 파일이 아니라 이미 내려진 결정이다. 그 결정 이전의 문장을 그대로 들고 있는 것이 리프 지침 문서다. 판정은 P3 다.
검증 환경
확인 방식 : 지침 문서와 저장소 추적 목록·전 이력·무시 규칙·계획 문서 대조 소스 수정 : x
재현 조건
- 리프 지침 문서의 금지 절과 첫 항목에 붙은 근거 둘을 읽는다.
- 아키텍처 규칙의 선언과 그것이 막는 이름 목록을 읽는다.
- 그 규칙이 실행되는 경로와 검사 대상이 비어 있지 않은지 확인한다.
- 리프 잠금 파일의 빈 구성 표기를 읽는다.
- 훅이 있다는 디렉터리의 추적 파일 수와 전 이력 추적 여부와 무시 규칙을 확인한다.
- 문서가 특정한 규칙 번호가 저장소에서 해석되는지 센다.
- 그 훅을 고치겠다던 계획 문서의 첫 줄과 그것을 대체한 문서의 목표를 읽는다.
본문
지침 문서가 금지 사항 첫 항목에 강제 근거를 둘 붙인다.
금지 절과 근거 두 줄
:::evidence key="a07-f006-claude" alt="리프 지침 문서의 금지 절과 첫 항목에 붙은 근거 둘. 아키텍처 규칙의 선언과 그것이 막는 이름 목록, 그 규칙의 실행 경로와 검사 대상, 리프 잠금 파일의 빈 구성 표기. 훅이 있다는 디렉터리의 추적 파일 수와 전 이력 추적 여부, 작업 트리 내용, 무시 규칙 확인 결과. 문서가 특정한 규칙 번호가 저장소에 나오는 곳. 그리고 그 훅을 고치겠다던 계획 문서의 폐기 배너와 그것을 대체한 문서의 목표 문장을 출력한 터미널 기록." caption="아키텍처 규칙은 실재하고 CI 의 check 로 돌지만 막는 목록에 Spring Web 이 없음 · 리프의 컴파일·런타임 클래스패스는 잠긴 채 비어 있음 · 훅 디렉터리는 추적 0, 전 이력 0, 무시 목록에 포함 · 규칙 번호는 이 문장에만 나옴 · 그 훅을 고치겠다던 계획은 폐기됐고 대체 문서가 하네스 부재를 목표에 적음 — 54줄 · exit 0" zoom="true" :::
## Forbidden
- Persistence or web technology (JPA/Hibernate/Spring Data/Spring Web) — ArchUnit
`identifier_adapter_does_not_depend_on_other_adapters_or_bootstrap`;
`.claude/hooks/ca_import_gate.py` G4 가 쓰기 시점에 차단.
아키텍처 규칙은 있고 CI 에서 돈다
@ArchTest
static final ArchRule IDENTIFIER_ADAPTER_DOES_NOT_DEPEND_ON_OTHER_ADAPTERS_OR_BOOTSTRAP =
선언만으로는 돈다고 말할 수 없어 실행 경로도 봤다. 클래스에 @AnalyzeClasses(packages = "dev.caskeleton") 가 붙어 있고, 조립 루트가 이 리프를 implementation 으로 물고 있어 검사 대상이 비어 있지 않으며, CI 품질 게이트가 ./gradlew check 를 돌린다.
남은 규칙이 덮지 않는 것
"..adapter.inbound.web..",
"..adapter.outbound.persistence..",
"..bootstrap..",
"org.springframework.data.repository..",
"org.springframework.data.jpa.repository..",
"jakarta.persistence..",
"javax.persistence..",
"org.hibernate.."
금지 줄이 함께 든 Spring Web 이 이 목록에 없다. 사라진 가드가 덮기로 돼 있던 것 중 하나를 남은 가드가 덮지 않는다.
그리고 이 리프에 그 기술들이 들어오지 못하게 하는 첫 줄은 규칙이 아니다.
154:empty=compileClasspath,runtimeClasspath
프로덕션 클래스패스가 잠긴 채 비어 있으므로 컴파일에서 이미 불가능하다. 아키텍처 규칙은 그 뒤에 선 둘째 줄이다.
훅이 있다는 디렉터리
# git ls-files .claude : 0
# 전 이력에서 .claude 아래 추적된 적 : 0
# 작업 트리 : settings.local.json
.gitignore:3:.claude/ .claude/hooks/ca_import_gate.py
추적된 적이 한 번도 없고, 무시 목록이 그 디렉터리를 덮는다. 작업 트리에도 로컬 설정 파일 하나뿐이고 훅 하위 디렉터리 자체가 없다.
문서가 특정한 규칙 번호도 해석되지 않는다.
src/adapter/outbound/identifier/CLAUDE.md:39: `.claude/hooks/ca_import_gate.py` G4 가 쓰기 시점에 차단.
G4 가 임포트 게이트의 규칙 번호로 쓰인 곳은 이 문장 자신뿐이다. 없는 파일 안의, 정의되지 않은 번호를 특정한다.
없는 이유는 이미 적혀 있다
> **SUPERSEDED — HISTORICAL PROVENANCE ONLY (2026-07-25):** The user-approved harness-free
> Mode B amendment supersedes this plan. …
**Goal:** Restore Gradle bootstrap and Clean Architecture dependency enforcement without recreating
the absent development harness.
그 훅을 고치겠다던 계획은 폐기됐고, 대체한 개정안의 목표 문장이 부재한 개발 하네스를 되살리지 않겠다고 적는다. 그 계획이 만들겠다던 디렉터리도 없다.
무시 목록은 그 파일이 배포되지 않는 경로를 말할 뿐이다. 왜 없는지는 이 개정안이 말한다. 빠뜨린 파일이 아니라 승인된 결정이고, 그 결정 이전의 문장을 그대로 들고 있는 것이 리프 지침 문서다.
확인하지 못한 것
다른 개발자 머신에 그 스크립트가 있는지는 확인하지 않았다. 다만 여기서 본 것은 새 복제본이 아니라 로컬 브랜치와 작업 트리 이력을 가진 실제 작업 저장소이고, 그 한 대에도 훅은 없었다.