# 검증기가 자기 실행 시점과 이유를 적어 둔 자리
/**
 * 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.
