# 주제: "모든 advanced capability 가 통과하는 단일 게이트" 를 5개 capability 리프 중 2개만 통과한다
# revision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916
# severity: P2

# ---- 선언 ----
# GrpcAdvancedModuleGuard.java:7-12 (클래스 javadoc)
#   "The single gate every advanced capability passes through.
#    Three conditions, checked in this order because each explains a different refusal: the flag is
#    not set, the grade cannot start at all, or production has not separately approved an
#    experimental capability. Collapsing them into one boolean produces a 'not enabled' message for
#    three situations with three different remedies."
# src/grpc-advanced/CLAUDE.md:35-37
#   "property key는 ca-skeleton.grpc.advanced.<capability>.enabled이고 **전부 기본 off**다.
#    GrpcAdvancedModuleGuard가 세 조건(flag 미설정 / grade가 시작 불가 / production 승인 없음)을
#    구분해서 거부하며, 세 경우의 조치가 다르므로 메시지도 다르다."

# ---- 선언된 capability 13개 (GrpcAdvancedCapability) ----
  CLIENT_STREAMING        ADVANCED_STABLE     (streaming 리프)
  BIDI_STREAMING          ADVANCED_STABLE     (streaming)
  MANUAL_FLOW_CONTROL     ADVANCED_STABLE     (streaming)
  HEDGING                 EXPERIMENTAL        (resilience)
  CUSTOM_RESOLVER         ADVANCED_STABLE     (resilience)
  CUSTOM_LOAD_BALANCER    EXPERIMENTAL        (resilience)
  XDS                     EXPERIMENTAL        (resilience)
  GRPC_WEB                ADVANCED_STABLE     (compat)
  SERVLET_COMPAT          ADVANCED_STABLE     (compat)
  INTEGRATION_BRIDGE      ADVANCED_STABLE     (compat)
  REACTOR                 ADVANCED_STABLE     (compat)
  KOTLIN                  ADVANCED_STABLE     (compat)
  CHANNEL_DIAGNOSTICS     ADVANCED_STABLE     (diagnostics)

# ---- 측정: 게이트를 부르는 곳 ----
# command: git grep -n "GrpcAdvancedModuleGuard|GrpcAdvancedFeatureFlags|GrpcAdvancedCapabilityDisabledException" \
#            -- src/grpc-advanced | grep -v "grpc-advanced-bootstrap/"
#
# src/main 에서 부르는 곳은 **둘뿐**이다:
#   grpc-advanced-diagnostics/…/GrpcChannelDiagnosticsPolicy.java:46-53
#       registerChannelz(flags) -> GrpcAdvancedModuleGuard.available(flags, CHANNEL_DIAGNOSTICS)
#       registerCsds(flags)     -> … && available(flags, XDS)
#   grpc-advanced-resilience/…/xds/GrpcXdsStartupGuard.java:28-33
#       …(profile, flags, applicationDefinesRetries)
#       if (!GrpcAdvancedModuleGuard.available(flags, XDS)) { … }
#
# 부르지 않는 리프:
#   grpc-advanced-streaming   (833 LOC, 14 main 파일)  — CLIENT_STREAMING/BIDI/MANUAL_FLOW_CONTROL
#   grpc-advanced-compat      (962 LOC, 17 main 파일)  — GRPC_WEB/SERVLET/INTEGRATION/REACTOR/KOTLIN
#   grpc-advanced-edition     (326 LOC,  6 main 파일)  — (capability enum 에 항목 자체가 없다)
#   그리고 resilience 의 HEDGING·CUSTOM_RESOLVER·CUSTOM_LOAD_BALANCER 도 게이트를 거치지 않는다
#   (xds 만 거친다).

# ---- 의도된 패턴은 두 곳에 존재한다 ----
# GrpcXdsStartupGuard 와 GrpcChannelDiagnosticsPolicy 가 보여주는 형태:
#   리프마다 진입점 하나가 flags 를 받아 available(...) 로 자기 capability 를 확인한다.
# streaming·compat 에는 그런 진입점이 없다. 각자 자체 게이트를 갖지만 성격이 다르다:
#   GrpcEdition2024Gate         — Edition 채택 가부 (릴리스 분리)
#   GrpcKotlinCompatibilityGate — Kotlin 어댑터를 supported 로 광고할 수 있는가 (fail-closed)
#   GrpcWebCompatibilityGate    — (compat)
#   GrpcClientStreamPolicy      — 스트림 경계값 (게이트 아님)
# 이들은 **capability 별 flag** 를 확인하지 않는다.

# ---- 판정 ----
# 13개 capability 가 각자 flag 를 갖고 "전부 기본 off" 로 선언되지만,
# 그 flag 를 확인하는 진입점을 가진 것은 CHANNEL_DIAGNOSTICS 와 XDS 둘뿐이다.
# 나머지 11개는 flag 를 켜지 않아도 타입을 쓸 수 있다 — 막는 코드가 없다.
#
# 완화 요인: grpc-advanced 블록 전체가 배포되지 않고(EVD-325), 이 리프들은 정책·계약 타입이라
# 호출하는 host 가 없다. flag 확인이 그 host 의 배선 지점에 놓일 계획일 수 있다.
# 그러나 그 계획을 서술한 문장이 없고, javadoc 은 현재형으로 "single gate every advanced
# capability passes through" 라고 쓴다.

# ---- 각 리프 테스트 수 (EVD-325 재확인) ----
  grpc-advanced-bootstrap      tests=17
  grpc-advanced-edition        tests=13
  grpc-advanced-streaming      tests=30
  grpc-advanced-resilience     tests=31
  grpc-advanced-compat         tests=27
  grpc-advanced-diagnostics    tests=11
