Files
document-haness/docs/clean-architecture-backend-template/final/evidence/raw/a14-f018-webplatformstartupvalidator.txt
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

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.