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>
85 lines
5.6 KiB
Plaintext
85 lines
5.6 KiB
Plaintext
# 검증기가 자기 실행 시점과 이유를 적어 둔 자리
|
|
/**
|
|
* Refuses to start when a declared control is not actually wired.
|
|
*
|
|
* <p>At startup, because the alternative is finding out from an incident. A control that is
|
|
* configured and not installed behaves exactly like one that is working right up until the moment
|
|
* it is needed — the rate limiter that never limits, the budget that never bounds, the problem
|
|
* catalog that nothing consults. This session found the third of those by accident, through a
|
|
* parity recording; a startup check is what finds the next one on purpose.
|
|
*
|
|
* <p>Fail-closed. A validator that logged a warning would be read by nobody: the deployment starts,
|
|
* the dashboards are green, and the warning scrolls past in the first thirty seconds of a log
|
|
* nobody keeps.
|
|
*/
|
|
|
|
# admin/platform 두 파일의 이름이 자기 파일 밖에 나오는 줄 (시험 클래스 선언 포함)
|
|
WebPlatformStartupValidator :
|
|
test · WebPlatformStartupValidatorTest.java:106
|
|
test · WebPlatformStartupValidatorTest.java:20
|
|
test · WebPlatformStartupValidatorTest.java:30
|
|
test · WebPlatformStartupValidatorTest.java:48
|
|
test · WebPlatformStartupValidatorTest.java:69
|
|
test · WebPlatformStartupValidatorTest.java:83
|
|
WebPlatformSnapshot :
|
|
main · WebPlatformStartupValidator.java:39
|
|
test · WebPlatformStartupValidatorTest.java:108
|
|
test · WebPlatformStartupValidatorTest.java:129
|
|
test · WebPlatformStartupValidatorTest.java:130
|
|
|
|
# 그 검증기를 가리키는 운영 문서
|
|
web/runbook.md:27 - **Check first:** the platform snapshot's `uninstalledControls()`. `WebPlatformStartupValidator`
|
|
- **Check first:** the platform snapshot's `uninstalledControls()`. `WebPlatformStartupValidator`
|
|
fails startup on a missing required control, so a running instance with one missing means it was
|
|
not in the required list.
|
|
|
|
# 원문이 인용한 근거가 실제로 걸린 자리
|
|
NginxInternalUriMapper:30: * file. Better to refuse to start.
|
|
FileserverStartupConfiguration:87: return uriMapper.attestMapping();
|
|
|
|
# 같은 저장소가 시작 검증기를 실제로 거는 방식
|
|
FileserverStartupConfiguration:37: FileserverStartupValidator fileserverStartupValidator() {
|
|
FileserverStartupConfiguration:38- return new FileserverStartupValidator();
|
|
FileserverStartupConfiguration:39- }
|
|
FileserverStartupConfiguration:40-
|
|
HttpClientProfileAutoConfiguration:47: HttpClientStartupValidator httpClientStartupValidator(TlsPolicyValidator tlsPolicyValidator) {
|
|
HttpClientProfileAutoConfiguration:48- // Injected rather than constructed, so a deployment that replaces the TlsPolicyValidator bean
|
|
HttpClientProfileAutoConfiguration:49- // replaces the one startup validation uses too.
|
|
HttpClientProfileAutoConfiguration:50- return new HttpClientStartupValidator(tlsPolicyValidator);
|
|
|
|
# 이 리프가 자동설정으로 올리는 것
|
|
dev.caskeleton.adapter.inbound.web.mvc.autoconfigure.WebMvcPlatformAutoConfiguration
|
|
dev.caskeleton.adapter.inbound.web.webflux.autoconfigure.WebFluxPlatformAutoConfiguration
|
|
그 목록에서 admin 이라는 문자열을 담은 항목 : 0
|
|
검증기 클래스에 스프링 스테레오타입이 붙어 있는가 : 0
|
|
|
|
# src 에 선언된 *StartupValidator 를 모두 찾아, 자기 파일 밖 main 파일 수를 센다
|
|
FileserverStartupValidator main 파일 1 (자바독 언급 포함)
|
|
GraphQlPlatformStartupValidator main 파일 2 (자바독 언급 포함)
|
|
GrpcPlatformStartupValidator main 파일 0 (자바독 언급 포함)
|
|
GrpcServletStartupValidator main 파일 0 (자바독 언급 포함)
|
|
HttpClientStartupValidator main 파일 2 (자바독 언급 포함)
|
|
MongoStartupValidator main 파일 2 (자바독 언급 포함)
|
|
WebPlatformStartupValidator main 파일 0 (자바독 언급 포함)
|
|
WebSocketPlatformStartupValidator main 파일 0 (자바독 언급 포함)
|
|
|
|
# 런북이 백틱으로 지목한 이름 중, main 에 그 이름의 파일이 있으면서 자기 파일 밖 main 참조가 0 인 것
|
|
GrpcAdvancedSupportMatrix main 참조 0 · docs/runbooks/grpc-advanced-capabilities.md
|
|
GrpcCompletionReconciler main 참조 0 · docs/runbooks/grpc-platform-operations.md
|
|
GrpcHedgingBudget main 참조 0 · docs/runbooks/grpc-advanced-capabilities.md
|
|
GrpcHedgingResult main 참조 0 · docs/runbooks/grpc-advanced-capabilities.md
|
|
GrpcPlatformSnapshotService main 참조 0 · docs/runbooks/grpc-platform-operations.md
|
|
GrpcServletStartupValidator main 참조 0 · docs/runbooks/grpc-advanced-capabilities.md
|
|
GrpcWebCompatibilityGate main 참조 0 · docs/runbooks/grpc-advanced-capabilities.md
|
|
GrpcXdsFailurePolicy main 참조 0 · docs/runbooks/grpc-advanced-capabilities.md
|
|
GrpcXdsStartupGuard main 참조 0 · docs/runbooks/grpc-advanced-capabilities.md
|
|
WebCorsPolicyValidator main 참조 0 · docs/web/runbook.md
|
|
WebPlatformStartupValidator main 참조 0 · docs/web/runbook.md
|
|
그중 이 리프 런북이 같은 추론을 거는 자리 :
|
|
- **Check first:** the platform snapshot's `uninstalledControls()`. `WebPlatformStartupValidator`
|
|
fails startup on a missing required control, so a running instance with one missing means it was
|
|
not in the required list.
|
|
The API answers correctly and the browser refuses the response. Everything below is refused at
|
|
startup by `WebCorsPolicyValidator`, so a running instance with one of these means the profile was
|
|
built somewhere that does not validate.
|