# 게이트 javadoc 의 등급 모형 — 둘
 * <p>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"
