# 결과 재생 저장소 — 항목 하나의 크기만 제한한다
  private final ConcurrentMap<String, byte[]> storedOutcomes = new ConcurrentHashMap<>();
  private final int maxInlineBytes;
    if (serializedResponse.length > maxInlineBytes) {
      throw new IllegalArgumentException(
          "response of "
              + serializedResponse.length
              + " bytes exceeds the inline outcome limit of "
              + maxInlineBytes
              + "; store it behind an object reference instead");
    }
    storedOutcomes.put(outcomeReference, serializedResponse.clone());
#   remove / clear / evict / expire 매치: 0
#   개수를 볼 수 있는 유일한 창구
  public int size() {
    return storedOutcomes.size();
  }
#   그 값을 읽는 main 코드: 0
#   이 클래스를 잡는 main 코드: 0
#   javadoc 이 이 저장소를 부르는 이름
 * against whatever the deployment chose — a small inline store, an object store, or a re-read of
 * the committed resource.

# 형제 모듈의 중복 제거기 — 같은 형태를 자기 javadoc 이 비판한다
 * <p>Checkpoint-based rather than a set of seen keys. A set grows without bound for the life of a
 * session and answers "have I seen this" — which is not quite the question. The question is "has
 * this been applied", and a monotonic applied-sequence answers it in constant space and survives
 * the process restart that a set does not.
 *
 * <p>Replayed outcomes are kept for the small window after the checkpoint, so a duplicate that
 * arrives before the checkpoint advances gets the original answer rather than being reapplied.
#   비판을 지키는 쪽: 세션당 항목 하나
  private final ConcurrentMap<String, GrpcClientStreamCheckpoint> checkpoints =
      new ConcurrentHashMap<>();
  private final ConcurrentMap<String, String> replayableOutcomes = new ConcurrentHashMap<>();
#   지키지 않는 쪽: 적용된 메시지마다 한 항목
    if (outcomeReference != null && !outcomeReference.isBlank()) {
      replayableOutcomes.put(message.dedupKey(), outcomeReference);
    }
  }
#   재생 판정이 실제로 보는 것
54:    if (checkpoint.alreadyApplied(message.sequence())) {
#   이 파일의 remove / clear / removeIf 매치: 2
#   그 둘이 있는 자리
  /** Forgets a finished session. */
  public void endSession(GrpcClientStreamSessionId sessionId) {
    checkpoints.remove(sessionId.value());
    replayableOutcomes.keySet().removeIf(key -> key.startsWith(sessionId.value() + "|"));
  }
#   그 접두사가 실제로 무엇인가
  public String dedupKey(long sequence) {
    return value + "|" + generation + "|" + sequence;

# 두 모듈의 런타임 소속: grpc-policy=[] grpc-advanced-streaming=[]
