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>
78 lines
4.6 KiB
Plaintext
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
|