Files
document-haness/docs/clean-architecture-backend-template/final/evidence/raw/331-grpc-advanced-guard-not-single.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

78 lines
4.6 KiB
Plaintext

# 주제: "모든 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