# 검사가 선언하는 범위
 * <p>The check is structural and conservative: records, enums, strings, boxed primitives and
 * immutable collection views replay; anything else is treated as one-shot, so the retry engine
 * refuses rather than gambling. A caller who knows better can freeze the value itself — serialize
 * it to a {@code byte[]} body — which states the guarantee instead of asserting it.
 */

# 첫 분기
  private static boolean deeplyImmutable(Object candidate) {
    if (candidate == null) {
      return true;
    }
    if (candidate instanceof String
        || candidate instanceof Number
        || candidate instanceof Boolean
        || candidate instanceof Character
        || candidate instanceof Enum<?>
        || candidate instanceof java.util.UUID
        || candidate instanceof java.time.temporal.Temporal) {
      return true;
    }

# 이 검사가 존재하는 이유 (test 클래스 javadoc)
/**
 * Replayability is a property of the value, not a promise in a javadoc.
 *
 * <p>Every {@code ObjectBody} used to report {@code REPLAYABLE}. A caller who reused a builder or
 * kept a reference to a list therefore got a retry that re-encoded the value <em>as it was at retry
 * time</em> — different bytes, same idempotency key, which is precisely what a replay must never
 * be.
 */

# 그 이유를 고정하는 test 넷
  28:  @DisplayName("a record of immutable components replays")
  29:  void anImmutableRecordReplays() {
  41:  @DisplayName("a value the caller can still mutate does not replay")
  42:  void aMutableValueIsOneShot() {
  51:  @DisplayName("a record wrapping a mutable component does not replay")
  52:  void aRecordWrappingMutableStateIsOneShot() {
  66:  @DisplayName("an uninspectable value is one-shot")
  67:  void anArbitraryBeanIsOneShot() {
