Pull FrontierNodeVersion out of SkyValueRetriever into its own library.

PiperOrigin-RevId: 803929424
Change-Id: I5f4d5dbe06b51e774d2541aaea206a499ab99b25
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index 8281c78..c244c9b 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -500,6 +500,7 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe/config",
         "//src/main/java/com/google/devtools/build/lib/skyframe/rewinding:action_rewound_event",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
+        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization:frontier_node_version",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis:analysis_cache_invalidator",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis:client_id",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis:dependencies_provider",
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java
index ec5c0eb..7d22b1e 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java
@@ -119,10 +119,10 @@
 import com.google.devtools.build.lib.skyframe.actiongraph.v2.InvalidAqueryOutputFormatException;
 import com.google.devtools.build.lib.skyframe.serialization.FingerprintValueService;
 import com.google.devtools.build.lib.skyframe.serialization.FingerprintValueStore;
+import com.google.devtools.build.lib.skyframe.serialization.FrontierNodeVersion;
 import com.google.devtools.build.lib.skyframe.serialization.ObjectCodecRegistry;
 import com.google.devtools.build.lib.skyframe.serialization.ObjectCodecs;
 import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
-import com.google.devtools.build.lib.skyframe.serialization.SkyValueRetriever.FrontierNodeVersion;
 import com.google.devtools.build.lib.skyframe.serialization.SkyValueRetriever.RetrievalResult;
 import com.google.devtools.build.lib.skyframe.serialization.SkycacheMetadataParams;
 import com.google.devtools.build.lib.skyframe.serialization.analysis.AnalysisCacheInvalidator;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
index b18c91c..deaffbd 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
@@ -349,6 +349,8 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe/config:sky_functions",
         "//src/main/java/com/google/devtools/build/lib/skyframe/rewinding",
         "//src/main/java/com/google/devtools/build/lib/skyframe/rewinding:rewindable_graph_inconsistency_receiver",
+        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
+        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization:frontier_node_version",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis:client_id",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis:dependencies_provider",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis:options",
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index f02f735..8f16737 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -231,7 +231,7 @@
 import com.google.devtools.build.lib.skyframe.config.PlatformMappingKey;
 import com.google.devtools.build.lib.skyframe.config.PlatformMappingValue;
 import com.google.devtools.build.lib.skyframe.rewinding.ActionRewindStrategy;
-import com.google.devtools.build.lib.skyframe.serialization.SkyValueRetriever.FrontierNodeVersion;
+import com.google.devtools.build.lib.skyframe.serialization.FrontierNodeVersion;
 import com.google.devtools.build.lib.skyframe.serialization.analysis.ClientId;
 import com.google.devtools.build.lib.skyframe.serialization.analysis.RemoteAnalysisCachingDependenciesProvider;
 import com.google.devtools.build.lib.skyframe.serialization.analysis.RemoteAnalysisCachingDependenciesProvider.DisabledDependenciesProvider;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/BUILD
index 6ac10d9..f3ff2ad 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/BUILD
@@ -78,14 +78,25 @@
 )
 
 java_library(
+    name = "frontier_node_version",
+    srcs = ["FrontierNodeVersion.java"],
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis:client_id",
+        "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
+        "//third_party:guava",
+    ],
+)
+
+java_library(
     name = "serialization",
     srcs = glob(
         ["**/*.java"],
         exclude = [
             "AbstractExportedStarlarkSymbolCodec.java",
-            "ModuleCodec.java",
             "CodecScanningConstants.java",
             "DependOnFutureShim.java",
+            "FrontierNodeVersion.java",
+            "ModuleCodec.java",
             "SerializationRegistrySetupHelpers.java",
             "SerializationConstants.java",
             "SerializationModule.java",
@@ -99,9 +110,9 @@
         ":codec-scanning-constants",
         ":constants",
         ":depend_on_future_shim",
+        ":frontier_node_version",
         "//src/main/java/com/google/devtools/build/lib/bugreport",
         "//src/main/java/com/google/devtools/build/lib/concurrent",
-        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis:client_id",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis:remote_analysis_cache_client",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec:serialization-constant",
         "//src/main/java/com/google/devtools/build/lib/unsafe:string",
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/FrontierNodeVersion.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/FrontierNodeVersion.java
new file mode 100644
index 0000000..d82dfc8
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/FrontierNodeVersion.java
@@ -0,0 +1,150 @@
+// Copyright 2025 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package com.google.devtools.build.lib.skyframe.serialization;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.hash.HashCode;
+import com.google.common.primitives.Bytes;
+import com.google.common.primitives.Longs;
+import com.google.devtools.build.lib.skyframe.serialization.analysis.ClientId;
+import com.google.devtools.build.lib.skyframe.serialization.analysis.ClientId.SnapshotClientId;
+import com.google.devtools.build.skyframe.IntVersion;
+import java.util.Arrays;
+import java.util.Optional;
+
+/** A tuple representing the version of a cached SkyValue in the frontier. */
+public final class FrontierNodeVersion {
+  public static final FrontierNodeVersion CONSTANT_FOR_TESTING =
+      new FrontierNodeVersion(
+          "123",
+          HashCode.fromInt(42),
+          IntVersion.of(9000),
+          "distinguisher",
+          /* useFakeStampData= */ true,
+          Optional.of(new SnapshotClientId("for_testing", 123)));
+
+  // Fingerprints of version components.
+  private final String topLevelConfigChecksum;
+  private final byte[] topLevelConfigFingerprint;
+  private final HashCode blazeInstallMD5;
+  private final byte[] blazeInstallMD5Fingerprint;
+  private final long evaluatingVersion;
+  private final byte[] evaluatingVersionFingerprint;
+
+  // Fingerprint of the distinguisher for allowing test cases to share a
+  // static cache.
+  private final byte[] distinguisherBytesForTesting;
+
+  private final boolean useFakeStampData;
+
+  // Fingerprint of the full version.
+  private final byte[] precomputedFingerprint;
+
+  private final Optional<ClientId> clientId;
+
+  public FrontierNodeVersion(
+      String topLevelConfigChecksum,
+      HashCode blazeInstallMD5,
+      IntVersion evaluatingVersion,
+      String distinguisherBytesForTesting,
+      boolean useFakeStampData,
+      Optional<ClientId> clientId) {
+    this.topLevelConfigChecksum = topLevelConfigChecksum;
+    this.topLevelConfigFingerprint = topLevelConfigChecksum.getBytes(UTF_8);
+    this.blazeInstallMD5 = blazeInstallMD5;
+    this.blazeInstallMD5Fingerprint = blazeInstallMD5.asBytes();
+    this.evaluatingVersion = evaluatingVersion.getVal();
+    this.evaluatingVersionFingerprint = Longs.toByteArray(evaluatingVersion.getVal());
+    this.distinguisherBytesForTesting = distinguisherBytesForTesting.getBytes(UTF_8);
+    this.useFakeStampData = useFakeStampData;
+    this.precomputedFingerprint =
+        Bytes.concat(
+            this.topLevelConfigFingerprint,
+            this.blazeInstallMD5Fingerprint,
+            this.evaluatingVersionFingerprint,
+            this.distinguisherBytesForTesting,
+            this.useFakeStampData ? new byte[] {1} : new byte[] {0});
+
+    // This is undigested.
+    this.clientId = clientId;
+  }
+
+  /**
+   * Returns the snapshot of the workspace.
+   *
+   * <p>Can be empty if snapshots are not supported by the workspace.
+   */
+  @SuppressWarnings("unused") // to be integrated
+  public Optional<ClientId> getClientId() {
+    return clientId;
+  }
+
+  public byte[] getTopLevelConfigFingerprint() {
+    return topLevelConfigFingerprint;
+  }
+
+  public byte[] getPrecomputedFingerprint() {
+    return precomputedFingerprint;
+  }
+
+  public byte[] concat(byte[] input) {
+    return Bytes.concat(precomputedFingerprint, input);
+  }
+
+  @Override
+  public String toString() {
+    return MoreObjects.toStringHelper(this)
+        .add("topLevelConfig", Arrays.hashCode(topLevelConfigFingerprint))
+        .add("blazeInstall", Arrays.hashCode(blazeInstallMD5Fingerprint))
+        .add("evaluatingVersion", Arrays.hashCode(evaluatingVersionFingerprint))
+        .add("distinguisherBytesForTesting", Arrays.hashCode(distinguisherBytesForTesting))
+        .add("useFakeStampData", useFakeStampData)
+        .add("precomputed", hashCode())
+        .toString();
+  }
+
+  @Override
+  public int hashCode() {
+    return Arrays.hashCode(precomputedFingerprint);
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (this == obj) {
+      return true;
+    }
+    if (!(obj instanceof FrontierNodeVersion that)) {
+      return false;
+    }
+    return Arrays.equals(precomputedFingerprint, that.precomputedFingerprint);
+  }
+
+  public HashCode getBlazeInstallMD5() {
+    return blazeInstallMD5;
+  }
+
+  public long getEvaluatingVersion() {
+    return evaluatingVersion;
+  }
+
+  public boolean getUseFakeStampData() {
+    return useFakeStampData;
+  }
+
+  public String getTopLevelConfigChecksum() {
+    return topLevelConfigChecksum;
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SkyKeySerializationHelper.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SkyKeySerializationHelper.java
index 38f735e..48b5289 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SkyKeySerializationHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SkyKeySerializationHelper.java
@@ -19,7 +19,6 @@
 
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
-import com.google.devtools.build.lib.skyframe.serialization.SkyValueRetriever.FrontierNodeVersion;
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.protobuf.ByteString;
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SkyValueRetriever.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SkyValueRetriever.java
index 1d6dbda..5a44fb3 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SkyValueRetriever.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SkyValueRetriever.java
@@ -15,21 +15,13 @@
 
 import static com.google.common.base.Throwables.getRootCause;
 import static com.google.common.util.concurrent.Futures.getDone;
-import static java.nio.charset.StandardCharsets.UTF_8;
 
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.MoreObjects;
-import com.google.common.hash.HashCode;
-import com.google.common.primitives.Bytes;
-import com.google.common.primitives.Longs;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.devtools.build.lib.skyframe.serialization.FingerprintValueStore.MissingFingerprintValueException;
 import com.google.devtools.build.lib.skyframe.serialization.SharedValueDeserializationContext.StateEvictedException;
-import com.google.devtools.build.lib.skyframe.serialization.analysis.ClientId;
-import com.google.devtools.build.lib.skyframe.serialization.analysis.ClientId.SnapshotClientId;
 import com.google.devtools.build.lib.skyframe.serialization.analysis.RemoteAnalysisCacheClient;
 import com.google.devtools.build.lib.skyframe.serialization.proto.DataType;
-import com.google.devtools.build.skyframe.IntVersion;
 import com.google.devtools.build.skyframe.SkyFunction.Environment.SkyKeyComputeState;
 import com.google.devtools.build.skyframe.SkyFunction.LookupEnvironment;
 import com.google.devtools.build.skyframe.SkyKey;
@@ -37,9 +29,7 @@
 import com.google.protobuf.ByteString;
 import com.google.protobuf.CodedInputStream;
 import java.io.IOException;
-import java.util.Arrays;
 import java.util.HexFormat;
-import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import javax.annotation.Nullable;
 
@@ -399,128 +389,4 @@
   record WaitingForFutureResult(ListenableFuture<?> futureResult) implements SerializationState {}
 
   private SkyValueRetriever() {}
-
-  /** A tuple representing the version of a cached SkyValue in the frontier. */
-  public static final class FrontierNodeVersion {
-    public static final FrontierNodeVersion CONSTANT_FOR_TESTING =
-        new FrontierNodeVersion(
-            "123",
-            HashCode.fromInt(42),
-            IntVersion.of(9000),
-            "distinguisher",
-            /* useFakeStampData= */ true,
-            Optional.of(new SnapshotClientId("for_testing", 123)));
-
-    // Fingerprints of version components.
-    private final String topLevelConfigChecksum;
-    private final byte[] topLevelConfigFingerprint;
-    private final HashCode blazeInstallMD5;
-    private final byte[] blazeInstallMD5Fingerprint;
-    private final long evaluatingVersion;
-    private final byte[] evaluatingVersionFingerprint;
-
-    // Fingerprint of the distinguisher for allowing test cases to share a
-    // static cache.
-    private final byte[] distinguisherBytesForTesting;
-
-    private final boolean useFakeStampData;
-
-    // Fingerprint of the full version.
-    private final byte[] precomputedFingerprint;
-
-    private final Optional<ClientId> clientId;
-
-    public FrontierNodeVersion(
-        String topLevelConfigChecksum,
-        HashCode blazeInstallMD5,
-        IntVersion evaluatingVersion,
-        String distinguisherBytesForTesting,
-        boolean useFakeStampData,
-        Optional<ClientId> clientId) {
-      this.topLevelConfigChecksum = topLevelConfigChecksum;
-      this.topLevelConfigFingerprint = topLevelConfigChecksum.getBytes(UTF_8);
-      this.blazeInstallMD5 = blazeInstallMD5;
-      this.blazeInstallMD5Fingerprint = blazeInstallMD5.asBytes();
-      this.evaluatingVersion = evaluatingVersion.getVal();
-      this.evaluatingVersionFingerprint = Longs.toByteArray(evaluatingVersion.getVal());
-      this.distinguisherBytesForTesting = distinguisherBytesForTesting.getBytes(UTF_8);
-      this.useFakeStampData = useFakeStampData;
-      this.precomputedFingerprint =
-          Bytes.concat(
-              this.topLevelConfigFingerprint,
-              this.blazeInstallMD5Fingerprint,
-              this.evaluatingVersionFingerprint,
-              this.distinguisherBytesForTesting,
-              this.useFakeStampData ? new byte[] {1} : new byte[] {0});
-
-      // This is undigested.
-      this.clientId = clientId;
-    }
-
-    /**
-     * Returns the snapshot of the workspace.
-     *
-     * <p>Can be empty if snapshots are not supported by the workspace.
-     */
-    @SuppressWarnings("unused") // to be integrated
-    public Optional<ClientId> getClientId() {
-      return clientId;
-    }
-
-    public byte[] getTopLevelConfigFingerprint() {
-      return topLevelConfigFingerprint;
-    }
-
-    public byte[] getPrecomputedFingerprint() {
-      return precomputedFingerprint;
-    }
-
-    public byte[] concat(byte[] input) {
-      return Bytes.concat(precomputedFingerprint, input);
-    }
-
-    @Override
-    public String toString() {
-      return MoreObjects.toStringHelper(this)
-          .add("topLevelConfig", Arrays.hashCode(topLevelConfigFingerprint))
-          .add("blazeInstall", Arrays.hashCode(blazeInstallMD5Fingerprint))
-          .add("evaluatingVersion", Arrays.hashCode(evaluatingVersionFingerprint))
-          .add("distinguisherBytesForTesting", Arrays.hashCode(distinguisherBytesForTesting))
-          .add("useFakeStampData", useFakeStampData)
-          .add("precomputed", hashCode())
-          .toString();
-    }
-
-    @Override
-    public int hashCode() {
-      return Arrays.hashCode(precomputedFingerprint);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-      if (this == obj) {
-        return true;
-      }
-      if (!(obj instanceof FrontierNodeVersion that)) {
-        return false;
-      }
-      return Arrays.equals(precomputedFingerprint, that.precomputedFingerprint);
-    }
-
-    public HashCode getBlazeInstallMD5() {
-      return blazeInstallMD5;
-    }
-
-    public long getEvaluatingVersion() {
-      return evaluatingVersion;
-    }
-
-    public boolean getUseFakeStampData() {
-      return useFakeStampData;
-    }
-
-    public String getTopLevelConfigChecksum() {
-      return topLevelConfigChecksum;
-    }
-  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/AnalysisCacheInvalidator.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/AnalysisCacheInvalidator.java
index 5427832..3a923b0 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/AnalysisCacheInvalidator.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/AnalysisCacheInvalidator.java
@@ -31,11 +31,11 @@
 import com.google.devtools.build.lib.profiler.Profiler;
 import com.google.devtools.build.lib.profiler.SilentCloseable;
 import com.google.devtools.build.lib.skyframe.serialization.FingerprintValueService;
+import com.google.devtools.build.lib.skyframe.serialization.FrontierNodeVersion;
 import com.google.devtools.build.lib.skyframe.serialization.ObjectCodecs;
 import com.google.devtools.build.lib.skyframe.serialization.PackedFingerprint;
 import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
 import com.google.devtools.build.lib.skyframe.serialization.SkyKeySerializationHelper;
-import com.google.devtools.build.lib.skyframe.serialization.SkyValueRetriever.FrontierNodeVersion;
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.protobuf.ByteString;
 import java.util.Objects;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/BUILD
index 0e88695..c5e6e01 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/BUILD
@@ -20,6 +20,7 @@
         ":remote_analysis_cache_client",
         "//src/main/java/com/google/devtools/build/lib/concurrent:thread_safety",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
+        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization:frontier_node_version",
         "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
         "//third_party:guava",
         "//third_party:jsr305",
@@ -47,6 +48,7 @@
         "//src/main/java/com/google/devtools/build/lib/analysis/config:build_options",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
+        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization:frontier_node_version",
         "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
         "//third_party:guava",
         "//third_party:jsr305",
@@ -77,8 +79,8 @@
         "//src/main/java/com/google/devtools/build/lib/profiler",
         "//src/main/java/com/google/devtools/build/lib/skyframe:action_execution_value",
         "//src/main/java/com/google/devtools/build/lib/skyframe:filesystem_keys",
-        "//src/main/java/com/google/devtools/build/lib/skyframe:skyframe_cluster",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
+        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization:frontier_node_version",
         "//src/main/java/com/google/devtools/build/lib/skyframe/toolchains:registered_execution_platforms_value",
         "//src/main/java/com/google/devtools/build/lib/skyframe/toolchains:registered_toolchains_value",
         "//src/main/java/com/google/devtools/build/lib/skyframe/toolchains:toolchain_context_key",
@@ -303,6 +305,7 @@
         "//src/main/java/com/google/devtools/build/lib/events",
         "//src/main/java/com/google/devtools/build/lib/profiler",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
+        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization:frontier_node_version",
         "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
         "//third_party:flogger",
         "//third_party:guava",
@@ -324,7 +327,7 @@
     deps = [
         ":client_id",
         ":deserialized_keys_sink",
-        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
+        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization:frontier_node_version",
         "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
         "//third_party:guava",
         "//third_party:jsr305",
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/FrontierSerializer.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/FrontierSerializer.java
index 4862428..ebff27b 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/FrontierSerializer.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/FrontierSerializer.java
@@ -46,10 +46,10 @@
 import com.google.devtools.build.lib.server.FailureDetails.RemoteAnalysisCaching.Code;
 import com.google.devtools.build.lib.skyframe.ActionExecutionValue.WithRichData;
 import com.google.devtools.build.lib.skyframe.serialization.FingerprintValueStore;
+import com.google.devtools.build.lib.skyframe.serialization.FrontierNodeVersion;
 import com.google.devtools.build.lib.skyframe.serialization.ObjectCodecs;
 import com.google.devtools.build.lib.skyframe.serialization.ProfileCollector;
 import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
-import com.google.devtools.build.lib.skyframe.serialization.SkyValueRetriever.FrontierNodeVersion;
 import com.google.devtools.build.lib.skyframe.serialization.analysis.RemoteAnalysisCachingOptions.RemoteAnalysisCacheMode;
 import com.google.devtools.build.lib.skyframe.toolchains.RegisteredExecutionPlatformsValue;
 import com.google.devtools.build.lib.skyframe.toolchains.RegisteredToolchainsValue;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/RemoteAnalysisCachingDependenciesProvider.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/RemoteAnalysisCachingDependenciesProvider.java
index d5280fe..b48d843 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/RemoteAnalysisCachingDependenciesProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/RemoteAnalysisCachingDependenciesProvider.java
@@ -17,9 +17,9 @@
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.skyframe.serialization.FingerprintValueService;
+import com.google.devtools.build.lib.skyframe.serialization.FrontierNodeVersion;
 import com.google.devtools.build.lib.skyframe.serialization.ObjectCodecs;
 import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
-import com.google.devtools.build.lib.skyframe.serialization.SkyValueRetriever.FrontierNodeVersion;
 import com.google.devtools.build.lib.skyframe.serialization.SkyValueRetriever.RetrievalResult;
 import com.google.devtools.build.lib.skyframe.serialization.analysis.RemoteAnalysisCachingOptions.RemoteAnalysisCacheMode;
 import com.google.devtools.build.skyframe.SkyKey;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/RemoteAnalysisCachingEventListener.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/RemoteAnalysisCachingEventListener.java
index b8337b2..478fa43 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/RemoteAnalysisCachingEventListener.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/RemoteAnalysisCachingEventListener.java
@@ -24,8 +24,8 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
 import com.google.devtools.build.lib.skyframe.serialization.FingerprintValueStore;
+import com.google.devtools.build.lib.skyframe.serialization.FrontierNodeVersion;
 import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
-import com.google.devtools.build.lib.skyframe.serialization.SkyValueRetriever.FrontierNodeVersion;
 import com.google.devtools.build.lib.skyframe.serialization.SkyValueRetriever.NoCachedData;
 import com.google.devtools.build.lib.skyframe.serialization.SkyValueRetriever.Restart;
 import com.google.devtools.build.lib.skyframe.serialization.SkyValueRetriever.RetrievalResult;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/RemoteAnalysisCachingServerState.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/RemoteAnalysisCachingServerState.java
index 910e0ed..36d8ccc 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/RemoteAnalysisCachingServerState.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/RemoteAnalysisCachingServerState.java
@@ -16,7 +16,7 @@
 import com.google.common.base.MoreObjects;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
-import com.google.devtools.build.lib.skyframe.serialization.SkyValueRetriever.FrontierNodeVersion;
+import com.google.devtools.build.lib.skyframe.serialization.FrontierNodeVersion;
 import com.google.devtools.build.skyframe.SkyKey;
 import java.util.Objects;
 import java.util.Set;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/SelectedEntrySerializer.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/SelectedEntrySerializer.java
index cb2607c..8413785 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/SelectedEntrySerializer.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/SelectedEntrySerializer.java
@@ -40,11 +40,11 @@
 import com.google.devtools.build.lib.skyframe.FileOpNodeOrFuture.FileOpNodeOrEmpty;
 import com.google.devtools.build.lib.skyframe.FileOpNodeOrFuture.FutureFileOpNode;
 import com.google.devtools.build.lib.skyframe.serialization.FingerprintValueService;
+import com.google.devtools.build.lib.skyframe.serialization.FrontierNodeVersion;
 import com.google.devtools.build.lib.skyframe.serialization.ObjectCodecs;
 import com.google.devtools.build.lib.skyframe.serialization.PackedFingerprint;
 import com.google.devtools.build.lib.skyframe.serialization.ProfileCollector;
 import com.google.devtools.build.lib.skyframe.serialization.SerializationResult;
-import com.google.devtools.build.lib.skyframe.serialization.SkyValueRetriever.FrontierNodeVersion;
 import com.google.devtools.build.lib.skyframe.serialization.analysis.InvalidationDataInfoOrFuture.FileInvalidationDataInfo;
 import com.google.devtools.build.lib.skyframe.serialization.analysis.InvalidationDataInfoOrFuture.FutureFileDataInfo;
 import com.google.devtools.build.lib.skyframe.serialization.analysis.InvalidationDataInfoOrFuture.FutureListingDataInfo;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/BUILD b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/BUILD
index 0c3694b..ac968e9 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/BUILD
@@ -429,6 +429,7 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe:precomputed_value",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization:depend_on_future_shim",
+        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization:frontier_node_version",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization:visible-for-serialization",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis:client_id",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis:remote_analysis_cache_client",
@@ -444,7 +445,6 @@
         "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
         "//src/main/protobuf:build_java_proto",
         "//src/test/java/com/google/devtools/build/lib/testutil:TestUtils",
-        "//third_party:auto_value",
         "//third_party:error_prone_annotations",
         "//third_party:guava",
         "//third_party:jsr305",
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/SkyValueRetrieverTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/SkyValueRetrieverTest.java
index 8d13095..7b54fb6 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/SkyValueRetrieverTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/SkyValueRetrieverTest.java
@@ -18,7 +18,7 @@
 import static com.google.devtools.build.lib.skyframe.serialization.DependOnFutureShim.ObservedFutureStatus.DONE;
 import static com.google.devtools.build.lib.skyframe.serialization.DependOnFutureShim.ObservedFutureStatus.NOT_DONE;
 import static com.google.devtools.build.lib.skyframe.serialization.ExampleValue.exampleValueCodec;
-import static com.google.devtools.build.lib.skyframe.serialization.SkyValueRetriever.FrontierNodeVersion.CONSTANT_FOR_TESTING;
+import static com.google.devtools.build.lib.skyframe.serialization.FrontierNodeVersion.CONSTANT_FOR_TESTING;
 import static com.google.devtools.build.lib.skyframe.serialization.SkyValueRetriever.NoCachedData.NO_CACHED_DATA;
 import static com.google.devtools.build.lib.skyframe.serialization.SkyValueRetriever.Restart.RESTART;
 import static com.google.devtools.build.lib.skyframe.serialization.testutils.FakeInvalidationDataHelper.prependFakeInvalidationData;
@@ -33,7 +33,6 @@
 import com.google.common.util.concurrent.SettableFuture;
 import com.google.devtools.build.lib.skyframe.serialization.DependOnFutureShim.ObservedFutureStatus;
 import com.google.devtools.build.lib.skyframe.serialization.SharedValueDeserializationContext.PeerFailedException;
-import com.google.devtools.build.lib.skyframe.serialization.SkyValueRetriever.FrontierNodeVersion;
 import com.google.devtools.build.lib.skyframe.serialization.SkyValueRetriever.RetrievalResult;
 import com.google.devtools.build.lib.skyframe.serialization.SkyValueRetriever.RetrievedValue;
 import com.google.devtools.build.lib.skyframe.serialization.SkyValueRetriever.SerializationState;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/analysis/AnalysisCacheInvalidatorTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/analysis/AnalysisCacheInvalidatorTest.java
index 56b9cac..0d083cc 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/analysis/AnalysisCacheInvalidatorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/analysis/AnalysisCacheInvalidatorTest.java
@@ -24,10 +24,10 @@
 import com.google.common.hash.HashCode;
 import com.google.devtools.build.lib.events.ExtendedEventHandler;
 import com.google.devtools.build.lib.skyframe.serialization.FingerprintValueService;
+import com.google.devtools.build.lib.skyframe.serialization.FrontierNodeVersion;
 import com.google.devtools.build.lib.skyframe.serialization.ObjectCodecs;
 import com.google.devtools.build.lib.skyframe.serialization.PackedFingerprint;
 import com.google.devtools.build.lib.skyframe.serialization.SkyKeySerializationHelper;
-import com.google.devtools.build.lib.skyframe.serialization.SkyValueRetriever.FrontierNodeVersion;
 import com.google.devtools.build.lib.skyframe.serialization.VisibleForSerialization;
 import com.google.devtools.build.lib.skyframe.serialization.analysis.ClientId.LongVersionClientId;
 import com.google.devtools.build.lib.skyframe.serialization.analysis.ClientId.SnapshotClientId;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/analysis/BUILD b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/analysis/BUILD
index 73c8be2..f327bd3 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/analysis/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/analysis/BUILD
@@ -28,6 +28,7 @@
     deps = [
         "//src/main/java/com/google/devtools/build/lib/events",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
+        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization:frontier_node_version",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization:visible-for-serialization",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis:analysis_cache_invalidator",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis:client_id",