Consolidate Interrupted failure detail codes into INTERRUPTED

We don't really need an enum for each command or call-site, that info can be put
in the error message. With this change we remove an excess of choices so that
it's easier for devs to do the right thing and to remove some cognitive burden
from the already tricky exercise of interrupt handling.

PiperOrigin-RevId: 342933703
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/commands/FetchCommand.java b/src/main/java/com/google/devtools/build/lib/bazel/commands/FetchCommand.java
index 832f02f..f92ee16 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/commands/FetchCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/commands/FetchCommand.java
@@ -38,7 +38,6 @@
 import com.google.devtools.build.lib.server.FailureDetails;
 import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
 import com.google.devtools.build.lib.server.FailureDetails.FetchCommand.Code;
-import com.google.devtools.build.lib.server.FailureDetails.Interrupted;
 import com.google.devtools.build.lib.util.AbruptExitException;
 import com.google.devtools.build.lib.util.DetailedExitCode;
 import com.google.devtools.build.lib.util.ExitCode;
@@ -79,8 +78,7 @@
       String errorMessage = "Fetch interrupted: " + e.getMessage();
       env.getReporter().handle(Event.error(errorMessage));
       return BlazeCommandResult.detailedExitCode(
-          InterruptedFailureDetails.detailedExitCode(
-              errorMessage, Interrupted.Code.PACKAGE_LOADING_SYNC));
+          InterruptedFailureDetails.detailedExitCode(errorMessage));
 
     } catch (AbruptExitException e) {
       env.getReporter().handle(Event.error(null, "Unknown error: " + e.getMessage()));
@@ -153,8 +151,7 @@
               new NoBuildRequestFinishedEvent(
                   ExitCode.COMMAND_LINE_ERROR, env.getRuntime().getClock().currentTimeMillis()));
       return BlazeCommandResult.detailedExitCode(
-          InterruptedFailureDetails.detailedExitCode(
-              e.getMessage(), Interrupted.Code.FETCH_COMMAND));
+          InterruptedFailureDetails.detailedExitCode(e.getMessage()));
     } catch (QueryException e) {
       // Keep consistent with reportBuildFileError()
       env.getReporter().handle(Event.error(e.getMessage()));
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java b/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java
index 6a37672..3b78846 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java
@@ -40,7 +40,6 @@
 import com.google.devtools.build.lib.runtime.LoadingPhaseThreadsOption;
 import com.google.devtools.build.lib.server.FailureDetails;
 import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
-import com.google.devtools.build.lib.server.FailureDetails.Interrupted;
 import com.google.devtools.build.lib.server.FailureDetails.SyncCommand.Code;
 import com.google.devtools.build.lib.skyframe.PackageLookupValue;
 import com.google.devtools.build.lib.skyframe.PrecomputedValue;
@@ -212,8 +211,7 @@
     } catch (InterruptedException e) {
       reportNoBuildRequestFinished(env, ExitCode.INTERRUPTED);
       BlazeCommandResult.detailedExitCode(
-          InterruptedFailureDetails.detailedExitCode(
-              e.getMessage(), Interrupted.Code.SYNC_COMMAND));
+          InterruptedFailureDetails.detailedExitCode(e.getMessage()));
     } catch (AbruptExitException e) {
       env.getReporter().handle(Event.error(e.getMessage()));
       reportNoBuildRequestFinished(env, ExitCode.LOCAL_ENVIRONMENTAL_ERROR);
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 91d48f8..5b3c385 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
@@ -54,7 +54,6 @@
 import com.google.devtools.build.lib.server.FailureDetails.ActionQuery;
 import com.google.devtools.build.lib.server.FailureDetails.BuildConfiguration;
 import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
-import com.google.devtools.build.lib.server.FailureDetails.Interrupted.Code;
 import com.google.devtools.build.lib.skyframe.SequencedSkyframeExecutor;
 import com.google.devtools.build.lib.skyframe.actiongraph.v2.ActionGraphDump;
 import com.google.devtools.build.lib.skyframe.actiongraph.v2.AqueryOutputHandler;
@@ -417,7 +416,7 @@
       AbruptExitException environmentPendingAbruptExitException = env.getPendingException();
       if (environmentPendingAbruptExitException == null) {
         String message = "build interrupted";
-        detailedExitCode = InterruptedFailureDetails.detailedExitCode(message, Code.BUILD);
+        detailedExitCode = InterruptedFailureDetails.detailedExitCode(message);
         env.getReporter().handle(Event.error(message));
         env.getEventBus().post(new BuildInterruptedEvent());
       } else {
@@ -557,7 +556,7 @@
       if (detailedExitCode.isSuccess()) {
         result.setDetailedExitCode(
             InterruptedFailureDetails.detailedExitCode(
-                "Build interrupted during command completion", Code.BUILD_COMPLETION));
+                "Build interrupted during command completion"));
       } else if (!detailedExitCode.getExitCode().equals(ExitCode.INTERRUPTED)) {
         logger.atWarning().withCause(ie).log(
             "Suppressed interrupted exception during stop request because already failing with: %s",
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java
index a379166..9a60c06 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java
@@ -50,7 +50,6 @@
 import com.google.devtools.build.lib.runtime.proto.InvocationPolicyOuterClass.InvocationPolicy;
 import com.google.devtools.build.lib.server.FailureDetails;
 import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
-import com.google.devtools.build.lib.server.FailureDetails.Interrupted.Code;
 import com.google.devtools.build.lib.util.AbruptExitException;
 import com.google.devtools.build.lib.util.AnsiStrippingOutputStream;
 import com.google.devtools.build.lib.util.DebugLoggerConfigurator;
@@ -542,8 +541,7 @@
           Thread.currentThread().interrupt();
           String message = "command interrupted while syncing package loading";
           reporter.handle(Event.error(message));
-          earlyExitCode =
-              InterruptedFailureDetails.detailedExitCode(message, Code.PACKAGE_LOADING_SYNC);
+          earlyExitCode = InterruptedFailureDetails.detailedExitCode(message);
         } catch (AbruptExitException e) {
           logger.atInfo().withCause(e).log("Error package loading");
           reporter.handle(Event.error(e.getMessage()));
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeOptionHandler.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeOptionHandler.java
index 9d144ca..d0464ff 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeOptionHandler.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeOptionHandler.java
@@ -345,7 +345,7 @@
           FailureDetail.newBuilder()
               .setInterrupted(
                   FailureDetails.Interrupted.newBuilder()
-                      .setCode(FailureDetails.Interrupted.Code.OPTIONS_PARSING))
+                      .setCode(FailureDetails.Interrupted.Code.INTERRUPTED))
               .build());
     } catch (AbruptExitException e) {
       return e.getDetailedExitCode();
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
index e6e7a61..173ea31 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
@@ -75,7 +75,6 @@
 import com.google.devtools.build.lib.server.CommandProtos.ExecRequest;
 import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
 import com.google.devtools.build.lib.server.FailureDetails.Filesystem;
-import com.google.devtools.build.lib.server.FailureDetails.Interrupted.Code;
 import com.google.devtools.build.lib.server.GrpcServerImpl;
 import com.google.devtools.build.lib.server.PidFileWatcher;
 import com.google.devtools.build.lib.server.RPCServer;
@@ -653,8 +652,7 @@
       logger.atInfo().withCause(e).log("Interrupted in afterCommand");
       afterCommandResult =
           BlazeCommandResult.detailedExitCode(
-              InterruptedFailureDetails.detailedExitCode(
-                  "executor completion interrupted", Code.EXECUTOR_COMPLETION));
+              InterruptedFailureDetails.detailedExitCode("executor completion interrupted"));
       Thread.currentThread().interrupt();
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/CanonicalizeCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/CanonicalizeCommand.java
index 2a949f6..cb4ec6c 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/CanonicalizeCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/CanonicalizeCommand.java
@@ -29,7 +29,6 @@
 import com.google.devtools.build.lib.server.FailureDetails.CanonicalizeFlags;
 import com.google.devtools.build.lib.server.FailureDetails.CanonicalizeFlags.Code;
 import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
-import com.google.devtools.build.lib.server.FailureDetails.Interrupted;
 import com.google.devtools.build.lib.util.AbruptExitException;
 import com.google.devtools.build.lib.util.DetailedExitCode;
 import com.google.devtools.build.lib.util.InterruptedFailureDetails;
@@ -172,8 +171,7 @@
       String message = "canonicalization interrupted";
       env.getReporter().handle(Event.error(message));
       return BlazeCommandResult.detailedExitCode(
-          InterruptedFailureDetails.detailedExitCode(
-              message, Interrupted.Code.PACKAGE_LOADING_SYNC));
+          InterruptedFailureDetails.detailedExitCode(message));
     } catch (AbruptExitException e) {
       env.getReporter().handle(Event.error(null, "Unknown error: " + e.getMessage()));
       return BlazeCommandResult.detailedExitCode(e.getDetailedExitCode());
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java
index 78f8e77..db1503d 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java
@@ -159,8 +159,7 @@
       String message = "clean interrupted";
       env.getReporter().handle(Event.error(message));
       return BlazeCommandResult.detailedExitCode(
-          InterruptedFailureDetails.detailedExitCode(
-              message, FailureDetails.Interrupted.Code.CLEAN_COMMAND));
+          InterruptedFailureDetails.detailedExitCode(message));
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java
index 43b117a..281933e 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java
@@ -61,7 +61,6 @@
 import com.google.devtools.build.lib.runtime.commands.info.WorkspaceInfoItem;
 import com.google.devtools.build.lib.server.FailureDetails;
 import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
-import com.google.devtools.build.lib.server.FailureDetails.Interrupted;
 import com.google.devtools.build.lib.util.AbruptExitException;
 import com.google.devtools.build.lib.util.DetailedExitCode;
 import com.google.devtools.build.lib.util.ExitCode;
@@ -175,8 +174,7 @@
                 env.getReporter().handle(Event.error("interrupted"));
                 throw new AbruptExitRuntimeException(
                     InterruptedFailureDetails.detailedExitCode(
-                        "command interrupted while syncing package loading",
-                        Interrupted.Code.PACKAGE_LOADING_SYNC));
+                        "command interrupted while syncing package loading"));
               }
             });
 
@@ -258,8 +256,7 @@
           FailureDetails.InfoCommand.Code.ALL_INFO_WRITE_FAILURE);
     } catch (InterruptedException e) {
       return BlazeCommandResult.detailedExitCode(
-          InterruptedFailureDetails.detailedExitCode(
-              "info interrupted", Interrupted.Code.INFO_ITEM));
+          InterruptedFailureDetails.detailedExitCode("info interrupted"));
     }
     return BlazeCommandResult.success();
   }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryCommand.java
index d166163..11fdad3 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryCommand.java
@@ -40,7 +40,6 @@
 import com.google.devtools.build.lib.runtime.QueryRuntimeHelper;
 import com.google.devtools.build.lib.server.FailureDetails;
 import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
-import com.google.devtools.build.lib.server.FailureDetails.Interrupted;
 import com.google.devtools.build.lib.server.FailureDetails.Query;
 import com.google.devtools.build.lib.server.FailureDetails.Query.Code;
 import com.google.devtools.build.lib.util.DetailedExitCode;
@@ -223,8 +222,7 @@
     String message = "query interrupted";
     env.getReporter().handle(Event.error(message));
     return Either.ofLeft(
-        BlazeCommandResult.detailedExitCode(
-            InterruptedFailureDetails.detailedExitCode(message, Interrupted.Code.QUERY)));
+        BlazeCommandResult.detailedExitCode(InterruptedFailureDetails.detailedExitCode(message)));
   }
 
   private static Either<BlazeCommandResult, QueryEvalResult> reportAndCreateIOExceptionResult(
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryEnvironmentBasedCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryEnvironmentBasedCommand.java
index ce1c68d..030d958 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryEnvironmentBasedCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryEnvironmentBasedCommand.java
@@ -40,7 +40,6 @@
 import com.google.devtools.build.lib.runtime.QueryRuntimeHelper.QueryRuntimeHelperException;
 import com.google.devtools.build.lib.runtime.TargetProviderForQueryEnvironment;
 import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
-import com.google.devtools.build.lib.server.FailureDetails.Interrupted;
 import com.google.devtools.build.lib.server.FailureDetails.Query;
 import com.google.devtools.build.lib.skyframe.LoadingPhaseStartedEvent;
 import com.google.devtools.build.lib.skyframe.PackageProgressReceiver;
@@ -98,8 +97,7 @@
     try {
       env.syncPackageLoading(options);
     } catch (InterruptedException e) {
-      return reportAndCreateInterruptResult(
-          env, "query interrupted", Interrupted.Code.PACKAGE_LOADING_SYNC);
+      return reportAndCreateInterruptResult(env, "query interrupted");
     } catch (AbruptExitException e) {
       env.getReporter().handle(Event.error(null, "Unknown error: " + e.getMessage()));
       return BlazeCommandResult.detailedExitCode(e.getDetailedExitCode());
@@ -191,8 +189,7 @@
               env.getReporter().handle(Event.error(e.getMessage()));
               return BlazeCommandResult.detailedExitCode(DetailedExitCode.of(e.getFailureDetail()));
             } catch (InterruptedException e) {
-              return reportAndCreateInterruptResult(
-                  env, "query interrupted", Interrupted.Code.AFTER_QUERY);
+              return reportAndCreateInterruptResult(env, "query interrupted");
             }
             if (queryEvalResult.getSuccess()) {
               return BlazeCommandResult.success();
@@ -291,10 +288,9 @@
   }
 
   private static BlazeCommandResult reportAndCreateInterruptResult(
-      CommandEnvironment env, String message, Interrupted.Code detailedCode) {
+      CommandEnvironment env, String message) {
     env.getReporter().handle(Event.error(message));
-    return BlazeCommandResult.detailedExitCode(
-        InterruptedFailureDetails.detailedExitCode(message, detailedCode));
+    return BlazeCommandResult.detailedExitCode(InterruptedFailureDetails.detailedExitCode(message));
   }
 
   private static BlazeCommandResult reportAndCreateFailureResult(
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/RunCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/RunCommand.java
index bd586a8..684134d 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/RunCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/RunCommand.java
@@ -390,7 +390,7 @@
         env.getReporter().handle(Event.error("Interrupted"));
         return BlazeCommandResult.failureDetail(
             FailureDetail.newBuilder()
-                .setInterrupted(Interrupted.newBuilder().setCode(Interrupted.Code.RUN_COMMAND))
+                .setInterrupted(Interrupted.newBuilder().setCode(Interrupted.Code.INTERRUPTED))
                 .build());
       }
     }
@@ -750,7 +750,7 @@
       String message = "run command interrupted";
       env.getReporter().handle(Event.error(message));
       return BlazeCommandResult.detailedExitCode(
-          InterruptedFailureDetails.detailedExitCode(message, Interrupted.Code.RUN_COMMAND));
+          InterruptedFailureDetails.detailedExitCode(message));
     } catch (NoSuchTargetException | NoSuchPackageException e) {
       env.getReporter().handle(Event.error("Failed to find a target to validate. " + e));
       throw new IllegalStateException("Failed to find a target to validate", e);
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/mobileinstall/MobileInstallCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/mobileinstall/MobileInstallCommand.java
index 88d6046..23f8dac 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/mobileinstall/MobileInstallCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/mobileinstall/MobileInstallCommand.java
@@ -39,7 +39,6 @@
 import com.google.devtools.build.lib.runtime.ProjectFileSupport;
 import com.google.devtools.build.lib.runtime.commands.BuildCommand;
 import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
-import com.google.devtools.build.lib.server.FailureDetails.Interrupted;
 import com.google.devtools.build.lib.server.FailureDetails.MobileInstall;
 import com.google.devtools.build.lib.server.FailureDetails.MobileInstall.Code;
 import com.google.devtools.build.lib.shell.BadExitStatusException;
@@ -325,8 +324,7 @@
       return createFailureResult(message, Code.ERROR_RUNNING_PROGRAM);
     } catch (InterruptedException e) {
       return BlazeCommandResult.detailedExitCode(
-          InterruptedFailureDetails.detailedExitCode(
-              "mobile install interrupted", Interrupted.Code.MOBILE_INSTALL_COMMAND));
+          InterruptedFailureDetails.detailedExitCode("mobile install interrupted"));
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/server/GrpcServerImpl.java b/src/main/java/com/google/devtools/build/lib/server/GrpcServerImpl.java
index e606f4c..aef68c3 100644
--- a/src/main/java/com/google/devtools/build/lib/server/GrpcServerImpl.java
+++ b/src/main/java/com/google/devtools/build/lib/server/GrpcServerImpl.java
@@ -41,7 +41,6 @@
 import com.google.devtools.build.lib.server.FailureDetails.Filesystem;
 import com.google.devtools.build.lib.server.FailureDetails.Filesystem.Code;
 import com.google.devtools.build.lib.server.FailureDetails.GrpcServer;
-import com.google.devtools.build.lib.server.FailureDetails.Interrupted;
 import com.google.devtools.build.lib.util.AbruptExitException;
 import com.google.devtools.build.lib.util.DetailedExitCode;
 import com.google.devtools.build.lib.util.ExitCode;
@@ -564,8 +563,7 @@
     } catch (InterruptedException e) {
       result =
           BlazeCommandResult.detailedExitCode(
-              InterruptedFailureDetails.detailedExitCode(
-                  "Command dispatch interrupted", Interrupted.Code.COMMAND_DISPATCH));
+              InterruptedFailureDetails.detailedExitCode("Command dispatch interrupted"));
       commandId = ""; // The default value, the client will ignore it
     }
     RunResponse.Builder response = RunResponse.newBuilder()
diff --git a/src/main/java/com/google/devtools/build/lib/util/InterruptedFailureDetails.java b/src/main/java/com/google/devtools/build/lib/util/InterruptedFailureDetails.java
index 46fbe79..409c0a1 100644
--- a/src/main/java/com/google/devtools/build/lib/util/InterruptedFailureDetails.java
+++ b/src/main/java/com/google/devtools/build/lib/util/InterruptedFailureDetails.java
@@ -16,6 +16,7 @@
 
 import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
 import com.google.devtools.build.lib.server.FailureDetails.Interrupted;
+import com.google.devtools.build.lib.server.FailureDetails.Interrupted.Code;
 
 /** Factory method for producing {@link Interrupted}-type {@link FailureDetail} messages. */
 public class InterruptedFailureDetails {
@@ -23,14 +24,14 @@
   private InterruptedFailureDetails() {}
 
   /**
-   * Returns a {@link DetailedExitCode} with {@link ExitCode#INTERRUPTED} and {@link FailureDetail}
-   * having the provided message and {@link Interrupted.Code}.
+   * Returns a {@link DetailedExitCode} with {@link ExitCode#INTERRUPTED}, {@link
+   * Interrupted.Code#INTERRUPTED}, and the provided detail message.
    */
-  public static DetailedExitCode detailedExitCode(String message, Interrupted.Code detailedCode) {
+  public static DetailedExitCode detailedExitCode(String message) {
     return DetailedExitCode.of(
         FailureDetail.newBuilder()
             .setMessage(message)
-            .setInterrupted(Interrupted.newBuilder().setCode(detailedCode))
+            .setInterrupted(Interrupted.newBuilder().setCode(Code.INTERRUPTED))
             .build());
   }
 
@@ -38,13 +39,12 @@
    * Returns an {@link AbruptExitException} with a {@link DetailedExitCode} from {@link
    * #detailedExitCode}.
    */
-  public static AbruptExitException abruptExitException(
-      String message, Interrupted.Code detailedCode) {
+  public static AbruptExitException abruptExitException(String message) {
     return new AbruptExitException(
         DetailedExitCode.of(
             FailureDetail.newBuilder()
                 .setMessage(message)
-                .setInterrupted(Interrupted.newBuilder().setCode(detailedCode))
+                .setInterrupted(Interrupted.newBuilder().setCode(Code.INTERRUPTED))
                 .build()));
   }
 
@@ -52,13 +52,12 @@
    * Returns an {@link AbruptExitException} with a {@link DetailedExitCode} from {@link
    * #detailedExitCode} and the provided {@code cause}.
    */
-  public static AbruptExitException abruptExitException(
-      String message, Interrupted.Code detailedCode, Exception cause) {
+  public static AbruptExitException abruptExitException(String message, Exception cause) {
     return new AbruptExitException(
         DetailedExitCode.of(
             FailureDetail.newBuilder()
                 .setMessage(message)
-                .setInterrupted(Interrupted.newBuilder().setCode(detailedCode))
+                .setInterrupted(Interrupted.newBuilder().setCode(Code.INTERRUPTED))
                 .build()),
         cause);
   }
diff --git a/src/main/protobuf/failure_details.proto b/src/main/protobuf/failure_details.proto
index 463625b..afd6cdf 100644
--- a/src/main/protobuf/failure_details.proto
+++ b/src/main/protobuf/failure_details.proto
@@ -167,22 +167,28 @@
 
 message Interrupted {
   enum Code {
-    // Interrupted at an unspecified time.
+    // Unknown interrupt. Avoid using this code, instead use INTERRUPTED.
     INTERRUPTED_UNKNOWN = 0 [(metadata) = { exit_code: 8 }];
-    BUILD = 4 [(metadata) = { exit_code: 8 }];
-    BUILD_COMPLETION = 5 [(metadata) = { exit_code: 8 }];
-    PACKAGE_LOADING_SYNC = 6 [(metadata) = { exit_code: 8 }];
-    EXECUTOR_COMPLETION = 7 [(metadata) = { exit_code: 8 }];
-    COMMAND_DISPATCH = 8 [(metadata) = { exit_code: 8 }];
-    INFO_ITEM = 9 [(metadata) = { exit_code: 8 }];
-    AFTER_QUERY = 10 [(metadata) = { exit_code: 8 }];
-    FETCH_COMMAND = 17 [(metadata) = { exit_code: 8 }];
-    SYNC_COMMAND = 18 [(metadata) = { exit_code: 8 }];
-    CLEAN_COMMAND = 20 [(metadata) = { exit_code: 8 }];
-    MOBILE_INSTALL_COMMAND = 21 [(metadata) = { exit_code: 8 }];
-    QUERY = 22 [(metadata) = { exit_code: 8 }];
-    RUN_COMMAND = 23 [(metadata) = { exit_code: 8 }];
-    OPTIONS_PARSING = 27 [(metadata) = { exit_code: 8 }];
+
+    // Command was interrupted (cancelled).
+    INTERRUPTED = 28 [(metadata) = { exit_code: 8 }];
+
+    // The following more specific interrupt codes have been deprecated and
+    // consolidated into INTERRUPTED.
+    DEPRECATED_BUILD = 4 [(metadata) = { exit_code: 8 }];
+    DEPRECATED_BUILD_COMPLETION = 5 [(metadata) = { exit_code: 8 }];
+    DEPRECATED_PACKAGE_LOADING_SYNC = 6 [(metadata) = { exit_code: 8 }];
+    DEPRECATED_EXECUTOR_COMPLETION = 7 [(metadata) = { exit_code: 8 }];
+    DEPRECATED_COMMAND_DISPATCH = 8 [(metadata) = { exit_code: 8 }];
+    DEPRECATED_INFO_ITEM = 9 [(metadata) = { exit_code: 8 }];
+    DEPRECATED_AFTER_QUERY = 10 [(metadata) = { exit_code: 8 }];
+    DEPRECATED_FETCH_COMMAND = 17 [(metadata) = { exit_code: 8 }];
+    DEPRECATED_SYNC_COMMAND = 18 [(metadata) = { exit_code: 8 }];
+    DEPRECATED_CLEAN_COMMAND = 20 [(metadata) = { exit_code: 8 }];
+    DEPRECATED_MOBILE_INSTALL_COMMAND = 21 [(metadata) = { exit_code: 8 }];
+    DEPRECATED_QUERY = 22 [(metadata) = { exit_code: 8 }];
+    DEPRECATED_RUN_COMMAND = 23 [(metadata) = { exit_code: 8 }];
+    DEPRECATED_OPTIONS_PARSING = 27 [(metadata) = { exit_code: 8 }];
 
     reserved 1 to 3; // For internal use
     reserved 11 to 16; // For internal use
diff --git a/src/test/java/com/google/devtools/build/lib/server/GrpcServerTest.java b/src/test/java/com/google/devtools/build/lib/server/GrpcServerTest.java
index 3140e6f..ce0c1b1 100644
--- a/src/test/java/com/google/devtools/build/lib/server/GrpcServerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/server/GrpcServerTest.java
@@ -457,7 +457,7 @@
     assertThat(secondResponse.get().hasFailureDetail()).isTrue();
     assertThat(secondResponse.get().getFailureDetail().hasInterrupted()).isTrue();
     assertThat(secondResponse.get().getFailureDetail().getInterrupted().getCode())
-        .isEqualTo(Code.COMMAND_DISPATCH);
+        .isEqualTo(Code.INTERRUPTED);
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/util/InterruptedFailureDetailsTest.java b/src/test/java/com/google/devtools/build/lib/util/InterruptedFailureDetailsTest.java
index 5218dbe..a490b36 100644
--- a/src/test/java/com/google/devtools/build/lib/util/InterruptedFailureDetailsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/util/InterruptedFailureDetailsTest.java
@@ -28,36 +28,35 @@
 
   @Test
   public void detailedExitCode() {
-    DetailedExitCode detailedExitCode =
-        InterruptedFailureDetails.detailedExitCode("myMessage", Code.BUILD);
+    DetailedExitCode detailedExitCode = InterruptedFailureDetails.detailedExitCode("myMessage");
     assertThat(detailedExitCode)
         .isEqualTo(
             DetailedExitCode.of(
                 FailureDetail.newBuilder()
                     .setMessage("myMessage")
-                    .setInterrupted(Interrupted.newBuilder().setCode(Code.BUILD))
+                    .setInterrupted(Interrupted.newBuilder().setCode(Code.INTERRUPTED))
                     .build()));
   }
 
   @Test
   public void abruptExitException() {
     AbruptExitException abruptExitException =
-        InterruptedFailureDetails.abruptExitException("myMessage", Code.BUILD);
+        InterruptedFailureDetails.abruptExitException("myMessage");
     assertThat(abruptExitException).hasMessageThat().isEqualTo("myMessage");
     assertThat(abruptExitException.getExitCode()).isEqualTo(ExitCode.INTERRUPTED);
     assertThat(abruptExitException.getDetailedExitCode())
-        .isEqualTo(InterruptedFailureDetails.detailedExitCode("myMessage", Code.BUILD));
+        .isEqualTo(InterruptedFailureDetails.detailedExitCode("myMessage"));
   }
 
   @Test
   public void abruptExitExceptionWithCause() {
     Exception cause = new Exception();
     AbruptExitException abruptExitException =
-        InterruptedFailureDetails.abruptExitException("myMessage", Code.BUILD, cause);
+        InterruptedFailureDetails.abruptExitException("myMessage", cause);
     assertThat(abruptExitException).hasMessageThat().isEqualTo("myMessage");
     assertThat(abruptExitException).hasCauseThat().isSameInstanceAs(cause);
     assertThat(abruptExitException.getExitCode()).isEqualTo(ExitCode.INTERRUPTED);
     assertThat(abruptExitException.getDetailedExitCode())
-        .isEqualTo(InterruptedFailureDetails.detailedExitCode("myMessage", Code.BUILD));
+        .isEqualTo(InterruptedFailureDetails.detailedExitCode("myMessage"));
   }
 }