# 게이트 javadoc 의 등급 모형 — 둘 *
Two thresholds rather than one. Reaching Advanced Stable means the capability works and is * documented; becoming a Stable default means every deployment gets it, which additionally puts its * dependencies on every classpath and its failure modes in every on-call rotation. The second needs * the first plus a longer soak, because a capability that has run in one deployment for a week is * not the same claim as one that ships to all of them. */ # 그리고 상수 둘 /** The soak a promotion to Advanced Stable requires. */ public static final Duration ADVANCED_STABLE_SOAK = Duration.ofDays(7); /** The soak a promotion to a Stable default requires. */ public static final Duration STABLE_DEFAULT_SOAK = Duration.ofDays(30); # 그런데 등급 열거형의 값은 넷이다 13: ADVANCED_STABLE(true, false), 15: EXPERIMENTAL(true, true), 17: WATCH(false, false), 19: DISABLED(false, false); # 그중 'Stable default' 에 해당하는 값: 0 # 증거 검사와 담금 선택 — 증거 쪽에는 목표 등급 조건이 없다 evidence.missing().stream() .sorted() .forEach(missing -> blockers.add(capability.flagName() + " has no " + missing)); Duration requiredSoak = to == GrpcCapabilityGrade.ADVANCED_STABLE ? ADVANCED_STABLE_SOAK : STABLE_DEFAULT_SOAK; # 증거 항목 수: 7 "compatibility evidence" "security review" "fault evidence" "performance evidence" "architecture decision record" "runbook" "real environment test" # 추적 등급은 중간 등급을 먼저 밟아야 한다 if (from == GrpcCapabilityGrade.WATCH && to != GrpcCapabilityGrade.EXPERIMENTAL) { blockers.add( capability.flagName() + " is WATCH, which is tracked rather than implemented; it becomes EXPERIMENTAL " + "before anything else"); } # 긴 갈래를 실행하는 테스트가 고른 전이 @DisplayName("becoming a Stable default needs a longer soak than becoming Advanced Stable") void theStableDefaultThresholdIsHigher() { GrpcAdvancedPromotionEvidence weekLongSoak = GrpcAdvancedPromotionEvidence.complete(GrpcAdvancedCapability.GRPC_WEB, Duration.ofDays(7)); .isTrue(); assertThat( GrpcAdvancedPromotionGate.evaluate( weekLongSoak, GrpcCapabilityGrade.ADVANCED_STABLE, GrpcCapabilityGrade.DISABLED) .blockers()) .anySatisfy(blocker -> assertThat(blocker).contains("requires 30")); # 중간 등급으로 올라가는 테스트가 준 담금 @DisplayName("a WATCH capability becomes EXPERIMENTAL before anything else") void watchPromotesOnlyToExperimental() { GrpcAdvancedPromotionGate.evaluate( GrpcAdvancedPromotionEvidence.complete( GrpcAdvancedCapability.EDITION_2026, Duration.ofDays(60)), GrpcCapabilityGrade.WATCH, GrpcCapabilityGrade.EXPERIMENTAL) .promoted()) .isTrue(); } # 그 테스트들을 실제로 돌린 결과 BUILD SUCCESSFUL in 984ms tests="8" skipped="0" failures="0" errors="0"