// Copyright 2020 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.

// This file's messages describe any failure(s) that occurred during Bazel's
// handling of a request. The intent is to provide more detail to a Bazel client
// than is conveyed with an exit code, to help those clients decide how to
// respond to, or classify, a failure.

syntax = "proto3";

package failure_details;

option java_package = "com.google.devtools.build.lib.server";

import "google/protobuf/descriptor.proto";

message FailureDetailMetadata {
  uint32 exit_code = 1;
}

extend google.protobuf.EnumValueOptions {
  FailureDetailMetadata metadata = 1078;
}

// The FailureDetail message type is designed such that consumers can extract a
// basic classification of a FailureDetail message even if the consumer was
// built with a stale definition. This forward compatibility is implemented via
// conventions on FailureDetail and its submessage types, as follows.
//
// *** FailureDetail field numbers
//
// Field numbers 1 through 100 (inclusive) are reserved for generally applicable
// values. Any number of these fields may be set on a FailureDetail message.
//
// Field numbers 101 through 10,000 (inclusive) are reserved for use inside the
// "oneof" structure. Only one of these values should be set on a FailureDetail
// message.
//
// Additional fields numbers are unlikely to be needed, but, for extreme future-
// proofing purposes, field numbers 10,001 through 1,000,000 (inclusive;
// excluding protobuf's reserved range 19000 through 19999) are reserved for
// additional generally applicable values.
//
// *** FailureDetail's "oneof" submessages
//
// Each field in the "oneof" structure is a submessage corresponding to a
// category of failure.
//
// In each of these submessage types, field number 1 is an enum whose values
// correspond to a subcategory of the failure. Generally, the enum's constant
// which maps to 0 should be interpreted as "unspecified", though this is not
// required.
//
// *** Recommended forward compatibility strategy
//
// The recommended forward compatibility strategy is to reduce a FailureDetail
// message to a pair of integers.
//
// The first integer corresponds to the field number of the submessage set
// inside FailureDetail's "oneof", which corresponds with the failure's
// category.
//
// The second integer corresponds to the value of the enum at field number 1
// within that submessage, which corresponds with the failure's subcategory.
//
// WARNING: This functionality is experimental and should not be relied on at
// this time.
// TODO(mschaller): remove experimental warning
message FailureDetail {
  // A short human-readable message describing the failure, for debugging.
  //
  // This value is *not* intended to be used algorithmically.
  string message = 1;

  // Reserved for future generally applicable values. Any of these may be set.
  reserved 2 to 100;

  oneof category {
    Interrupted interrupted = 101;
    ExternalRepository external_repository = 103;
    BuildProgress build_progress = 104;
    RemoteOptions remote_options = 106;
    ClientEnvironment client_environment = 107;
    Crash crash = 108;
    SymlinkForest symlink_forest = 110;
    PackageOptions package_options = 114;
    RemoteExecution remote_execution = 115;
    Execution execution = 116;
    Workspaces workspaces = 117;
    CrashOptions crash_options = 118;
    Filesystem filesystem = 119;
    ExecutionOptions execution_options = 121;
    Command command = 122;
    Spawn spawn = 123;
    GrpcServer grpc_server = 124;
    CanonicalizeFlags canonicalize_flags = 125;
    BuildConfiguration build_configuration = 126;
    InfoCommand info_command = 127;
    MemoryOptions memory_options = 129;
    Query query = 130;
    LocalExecution local_execution = 132;
    ActionCache action_cache = 134;
    FetchCommand fetch_command = 135;
    SyncCommand sync_command = 136;
    Sandbox sandbox = 137;
    IncludeScanning include_scanning = 139;
    TestCommand test_command = 140;
    ActionQuery action_query = 141;
    TargetPatterns target_patterns = 142;
    CleanCommand clean_command = 144;
    ConfigCommand config_command = 145;
    ConfigurableQuery configurable_query = 146;
    DumpCommand dump_command = 147;
    HelpCommand help_command = 148;
    MobileInstall mobile_install = 150;
    ProfileCommand profile_command = 151;
    RunCommand run_command = 152;
    VersionCommand version_command = 153;
    PrintActionCommand print_action_command = 154;
    WorkspaceStatus workspace_status = 158;
    JavaCompile java_compile = 159;
    ActionRewinding action_rewinding = 160;
    CppCompile cpp_compile = 161;
    StarlarkAction starlark_action = 162;
    NinjaAction ninja_action = 163;
    DynamicExecution dynamic_execution = 164;
    FailAction fail_action = 166;
    SymlinkAction symlink_action = 167;
    CppLink cpp_link = 168;
    LtoAction lto_action = 169;
    TestAction test_action = 172;
    Worker worker = 173;
    Analysis analysis = 174;
    PackageLoading package_loading = 175;
    Toolchain toolchain = 177;
    StarlarkLoading starlark_loading = 179;
    ExternalDeps external_deps = 181;
    DiffAwareness diff_awareness = 182;
  }

  reserved 102;         // For internal use
  reserved 105;         // For internal use
  reserved 109;         // For internal use
  reserved 111 to 113;  // For internal use
  reserved 120;         // For internal use
  reserved 128;         // For internal use
  reserved 131;         // For internal use
  reserved 133;         // For internal use
  reserved 138;         // For internal use
  reserved 143;         // For internal use
  reserved 149;         // For internal use
  reserved 155 to 157;  // For internal use
  reserved 165;         // For internal use
  reserved 170 to 171;  // For internal use
  reserved 176;         // For internal use
  reserved 178;         // For internal use
  reserved 180;         // For internal use
}

message Interrupted {
  enum Code {
    // Unknown interrupt. Avoid using this code, instead use INTERRUPTED.
    INTERRUPTED_UNKNOWN = 0 [(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
    reserved 19;        // For internal use
    reserved 24 to 26;  // For internal use
  }

  Code code = 1;
}

message Spawn {
  enum Code {
    SPAWN_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    // See the SpawnResult.Status Java enum for definitions of the following
    // Spawn failure codes.
    NON_ZERO_EXIT = 1 [(metadata) = { exit_code: 1 }];
    TIMEOUT = 2 [(metadata) = { exit_code: 1 }];
    // Note: Spawn OUT_OF_MEMORY leads to a BUILD_FAILURE exit_code because the
    // build tool itself did not run out of memory.
    OUT_OF_MEMORY = 3 [(metadata) = { exit_code: 1 }];
    EXECUTION_FAILED = 4 [(metadata) = { exit_code: 34 }];
    EXECUTION_DENIED = 5 [(metadata) = { exit_code: 1 }];
    REMOTE_CACHE_FAILED = 6 [(metadata) = { exit_code: 34 }];
    COMMAND_LINE_EXPANSION_FAILURE = 7 [(metadata) = { exit_code: 1 }];
    EXEC_IO_EXCEPTION = 8 [(metadata) = { exit_code: 36 }];
    INVALID_TIMEOUT = 9 [(metadata) = { exit_code: 1 }];
    INVALID_REMOTE_EXECUTION_PROPERTIES = 10 [(metadata) = { exit_code: 1 }];
    NO_USABLE_STRATEGY_FOUND = 11 [(metadata) = { exit_code: 1 }];
    // TODO(b/138456686): this code should be deprecated when SpawnResult is
    //   refactored to prohibit undetailed failures
    UNSPECIFIED_EXECUTION_FAILURE = 12 [(metadata) = { exit_code: 1 }];
    FORBIDDEN_INPUT = 13 [(metadata) = { exit_code: 1 }];
  }
  Code code = 1;

  // For Codes describing generic failure to spawn (eg. EXECUTION_FAILED and
  // EXECUTION_DENIED) the `catastrophic` field may be set to true indicating a
  // failure that immediately terminated the entire build tool.
  bool catastrophic = 2;

  // If Code is NON_ZERO_EXIT, the `spawn_exit_code` field may be set to the
  // non-zero exit code returned by the spawned process to the OS.
  //
  // NOTE: This field must not be confused with the build tool's overall
  // exit code.
  int32 spawn_exit_code = 3;
}

message ExternalRepository {
  enum Code {
    EXTERNAL_REPOSITORY_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    OVERRIDE_DISALLOWED_MANAGED_DIRECTORIES = 1 [(metadata) = { exit_code: 2 }];
    BAD_DOWNLOADER_CONFIG = 2 [(metadata) = { exit_code: 2 }];
  }
  Code code = 1;
  // Additional data could include external repository names.
}

message BuildProgress {
  enum Code {
    BUILD_PROGRESS_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    OUTPUT_INITIALIZATION = 3 [(metadata) = { exit_code: 36 }];
    BES_RUNS_PER_TEST_LIMIT_UNSUPPORTED = 4 [(metadata) = { exit_code: 2 }];
    BES_LOCAL_WRITE_ERROR = 5 [(metadata) = { exit_code: 36 }];
    BES_INITIALIZATION_ERROR = 6 [(metadata) = { exit_code: 36 }];
    BES_UPLOAD_TIMEOUT_ERROR = 7 [(metadata) = { exit_code: 38 }];
    BES_FILE_WRITE_TIMEOUT = 8 [(metadata) = { exit_code: 38 }];
    BES_FILE_WRITE_IO_ERROR = 9 [(metadata) = { exit_code: 38 }];
    BES_FILE_WRITE_INTERRUPTED = 10 [(metadata) = { exit_code: 38 }];
    BES_FILE_WRITE_CANCELED = 11 [(metadata) = { exit_code: 38 }];
    BES_FILE_WRITE_UNKNOWN_ERROR = 12 [(metadata) = { exit_code: 38 }];
    BES_UPLOAD_LOCAL_FILE_ERROR = 13 [(metadata) = { exit_code: 38 }];
    BES_STREAM_NOT_RETRYING_FAILURE = 14 [(metadata) = { exit_code: 45 }];
    BES_STREAM_COMPLETED_WITH_UNACK_EVENTS_ERROR = 15
        [(metadata) = { exit_code: 45 }];
    BES_STREAM_COMPLETED_WITH_UNSENT_EVENTS_ERROR = 16
        [(metadata) = { exit_code: 45 }];
    BES_STREAM_COMPLETED_WITH_REMOTE_ERROR = 19
        [(metadata) = { exit_code: 45 }];
    BES_UPLOAD_RETRY_LIMIT_EXCEEDED_FAILURE = 17
        [(metadata) = { exit_code: 38 }];
    reserved 1, 2, 18;  // For internal use
  }
  Code code = 1;
  // Additional data could include the build progress upload endpoint.
}

message RemoteOptions {
  enum Code {
    REMOTE_OPTIONS_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    REMOTE_DEFAULT_EXEC_PROPERTIES_LOGIC_ERROR = 1
        [(metadata) = { exit_code: 2 }];
    // Credentials could not be read from the requested file/socket/process/etc.
    CREDENTIALS_READ_FAILURE = 2 [(metadata) = { exit_code: 36 }];
    // Credentials could not be written to a shared, temporary file.
    CREDENTIALS_WRITE_FAILURE = 3 [(metadata) = { exit_code: 36 }];
    DOWNLOADER_WITHOUT_GRPC_CACHE = 4 [(metadata) = { exit_code: 2 }];
    EXECUTION_WITH_INVALID_CACHE = 5 [(metadata) = { exit_code: 2 }];
  }

  Code code = 1;
}

message ClientEnvironment {
  enum Code {
    CLIENT_ENVIRONMENT_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    CLIENT_CWD_MALFORMED = 1 [(metadata) = { exit_code: 2 }];
  }

  Code code = 1;
}

message Crash {
  enum Code {
    CRASH_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    CRASH_OOM = 1 [(metadata) = { exit_code: 33 }];
  }

  Code code = 1;

  // The cause chain of the crash, with the outermost throwable first. Limited
  // to the outermost exception and at most 4 nested causes (so, max size of 5).
  repeated Throwable causes = 2;
}

message Throwable {
  // The class name of the java.lang.Throwable.
  string throwable_class = 1;
  // The throwable's message.
  string message = 2;
  // The result of calling toString on the deepest (i.e. closest to the
  // throwable's construction site) 1000 (or fewer) StackTraceElements.
  // Unstructured to simplify string matching.
  repeated string stack_trace = 3;
}

message SymlinkForest {
  enum Code {
    SYMLINK_FOREST_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    TOPLEVEL_OUTDIR_PACKAGE_PATH_CONFLICT = 1 [(metadata) = { exit_code: 2 }];
    TOPLEVEL_OUTDIR_USED_AS_SOURCE = 2 [(metadata) = { exit_code: 2 }];
    CREATION_FAILED = 3 [(metadata) = { exit_code: 2 }];
  }

  Code code = 1;
}

message PackageOptions {
  enum Code {
    reserved 2, 3;  // For internal use

    PACKAGE_OPTIONS_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    PACKAGE_PATH_INVALID = 1 [(metadata) = { exit_code: 2 }];
  }

  Code code = 1;
}

message RemoteExecution {
  // The association of some of these options with exit code 2, "command line
  // error", seems sketchy. Especially worth reconsidering are the channel init
  // failure modes, which can correspond to failures occurring in gRPC setup.
  // These all correspond with current Bazel behavior.
  enum Code {
    REMOTE_EXECUTION_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    CAPABILITIES_QUERY_FAILURE = 1 [(metadata) = { exit_code: 34 }];
    CREDENTIALS_INIT_FAILURE = 2 [(metadata) = { exit_code: 2 }];
    CACHE_INIT_FAILURE = 3 [(metadata) = { exit_code: 2 }];
    RPC_LOG_FAILURE = 4 [(metadata) = { exit_code: 2 }];
    EXEC_CHANNEL_INIT_FAILURE = 5 [(metadata) = { exit_code: 2 }];
    CACHE_CHANNEL_INIT_FAILURE = 6 [(metadata) = { exit_code: 2 }];
    DOWNLOADER_CHANNEL_INIT_FAILURE = 7 [(metadata) = { exit_code: 2 }];
    LOG_DIR_CLEANUP_FAILURE = 8 [(metadata) = { exit_code: 36 }];
    CLIENT_SERVER_INCOMPATIBLE = 9 [(metadata) = { exit_code: 34 }];
    DOWNLOADED_INPUTS_DELETION_FAILURE = 10 [(metadata) = { exit_code: 34 }];
    REMOTE_DOWNLOAD_OUTPUTS_MINIMAL_WITHOUT_INMEMORY_DOTD = 11
        [(metadata) = { exit_code: 2 }];
    REMOTE_DOWNLOAD_OUTPUTS_MINIMAL_WITHOUT_INMEMORY_JDEPS = 12
        [(metadata) = { exit_code: 2 }];
    INCOMPLETE_OUTPUT_DOWNLOAD_CLEANUP_FAILURE = 13
        [(metadata) = { exit_code: 36 }];
    REMOTE_DEFAULT_PLATFORM_PROPERTIES_PARSE_FAILURE = 14
        [(metadata) = { exit_code: 1 }];
    ILLEGAL_OUTPUT = 15 [(metadata) = { exit_code: 1 }];
    INVALID_EXEC_AND_PLATFORM_PROPERTIES = 16 [(metadata) = { exit_code: 1 }];
  }

  Code code = 1;
}

message Execution {
  enum Code {
    EXECUTION_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    EXECUTION_LOG_INITIALIZATION_FAILURE = 1 [(metadata) = { exit_code: 2 }];
    EXECUTION_LOG_WRITE_FAILURE = 2 [(metadata) = { exit_code: 36 }];
    EXECROOT_CREATION_FAILURE = 3 [(metadata) = { exit_code: 36 }];
    TEMP_ACTION_OUTPUT_DIRECTORY_DELETION_FAILURE = 4
        [(metadata) = { exit_code: 36 }];
    TEMP_ACTION_OUTPUT_DIRECTORY_CREATION_FAILURE = 5
        [(metadata) = { exit_code: 36 }];
    PERSISTENT_ACTION_OUTPUT_DIRECTORY_CREATION_FAILURE = 6
        [(metadata) = { exit_code: 36 }];
    LOCAL_OUTPUT_DIRECTORY_SYMLINK_FAILURE = 7 [(metadata) = { exit_code: 36 }];
    reserved 8;  // was ACTION_INPUT_FILES_MISSING, now mostly
                 // SOURCE_INPUT_MISSING
    LOCAL_TEMPLATE_EXPANSION_FAILURE = 9 [(metadata) = { exit_code: 36 }];
    INPUT_DIRECTORY_CHECK_IO_EXCEPTION = 10 [(metadata) = { exit_code: 36 }];
    EXTRA_ACTION_OUTPUT_CREATION_FAILURE = 11 [(metadata) = { exit_code: 36 }];
    TEST_RUNNER_IO_EXCEPTION = 12 [(metadata) = { exit_code: 36 }];
    FILE_WRITE_IO_EXCEPTION = 13 [(metadata) = { exit_code: 36 }];
    TEST_OUT_ERR_IO_EXCEPTION = 14 [(metadata) = { exit_code: 36 }];
    SYMLINK_TREE_MANIFEST_COPY_IO_EXCEPTION = 15
        [(metadata) = { exit_code: 36 }];
    SYMLINK_TREE_MANIFEST_LINK_IO_EXCEPTION = 16
        [(metadata) = { exit_code: 36 }];
    SYMLINK_TREE_CREATION_IO_EXCEPTION = 17 [(metadata) = { exit_code: 36 }];
    SYMLINK_TREE_CREATION_COMMAND_EXCEPTION = 18
        [(metadata) = { exit_code: 36 }];
    ACTION_INPUT_READ_IO_EXCEPTION = 19 [(metadata) = { exit_code: 36 }];
    ACTION_NOT_UP_TO_DATE = 20 [(metadata) = { exit_code: 1 }];
    PSEUDO_ACTION_EXECUTION_PROHIBITED = 21 [(metadata) = { exit_code: 1 }];
    DISCOVERED_INPUT_DOES_NOT_EXIST = 22 [(metadata) = { exit_code: 36 }];
    ACTION_OUTPUTS_DELETION_FAILURE = 23 [(metadata) = { exit_code: 1 }];
    ACTION_OUTPUTS_NOT_CREATED = 24 [(metadata) = { exit_code: 1 }];
    ACTION_FINALIZATION_FAILURE = 25 [(metadata) = { exit_code: 1 }];
    ACTION_INPUT_LOST = 26 [(metadata) = { exit_code: 1 }];
    FILESYSTEM_CONTEXT_UPDATE_FAILURE = 27 [(metadata) = { exit_code: 1 }];
    ACTION_OUTPUT_CLOSE_FAILURE = 28 [(metadata) = { exit_code: 1 }];
    INPUT_DISCOVERY_IO_EXCEPTION = 29 [(metadata) = { exit_code: 1 }];
    TREE_ARTIFACT_DIRECTORY_CREATION_FAILURE = 30
        [(metadata) = { exit_code: 1 }];
    ACTION_OUTPUT_DIRECTORY_CREATION_FAILURE = 31
        [(metadata) = { exit_code: 1 }];
    ACTION_FS_OUTPUT_DIRECTORY_CREATION_FAILURE = 32
        [(metadata) = { exit_code: 1 }];
    ACTION_FS_OUT_ERR_DIRECTORY_CREATION_FAILURE = 33
        [(metadata) = { exit_code: 1 }];
    NON_ACTION_EXECUTION_FAILURE = 34 [(metadata) = { exit_code: 1 }];
    CYCLE = 35 [(metadata) = { exit_code: 1 }];
    SOURCE_INPUT_MISSING = 36 [(metadata) = { exit_code: 1 }];
    UNEXPECTED_EXCEPTION = 37 [(metadata) = { exit_code: 1 }];
    reserved 38;
    SOURCE_INPUT_IO_EXCEPTION = 39 [(metadata) = { exit_code: 1 }];
  }

  Code code = 1;
}

// Failure details about Bazel's WORKSPACE features.
message Workspaces {
  enum Code {
    WORKSPACES_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    WORKSPACES_LOG_INITIALIZATION_FAILURE = 1 [(metadata) = { exit_code: 2 }];
    WORKSPACES_LOG_WRITE_FAILURE = 2 [(metadata) = { exit_code: 36 }];

    // See `managed_directories` in
    // https://docs.bazel.build/versions/main/skylark/lib/globals.html#workspace.
    ILLEGAL_WORKSPACE_FILE_SYMLINK_WITH_MANAGED_DIRECTORIES = 3
        [(metadata) = { exit_code: 1 }];
    WORKSPACE_FILE_READ_FAILURE_WITH_MANAGED_DIRECTORIES = 4
        [(metadata) = { exit_code: 1 }];
  }

  Code code = 1;
}

message CrashOptions {
  enum Code {
    CRASH_OPTIONS_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    reserved 1;  // For internal use
  }

  Code code = 1;
}

message Filesystem {
  enum Code {
    FILESYSTEM_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    reserved 1;
    reserved 2;
    EMBEDDED_BINARIES_ENUMERATION_FAILURE = 3 [(metadata) = { exit_code: 36 }];
    SERVER_PID_TXT_FILE_READ_FAILURE = 4 [(metadata) = { exit_code: 36 }];
    SERVER_FILE_WRITE_FAILURE = 5 [(metadata) = { exit_code: 36 }];
    DEFAULT_DIGEST_HASH_FUNCTION_INVALID_VALUE = 6
        [(metadata) = { exit_code: 2 }];

    reserved 7;  // For internal use
  }

  Code code = 1;
}

message ExecutionOptions {
  // All numerical exit code associations correspond to pre-existing Bazel
  // behavior. These associations are suspicious:
  // - REQUESTED_STRATEGY_INCOMPATIBLE_WITH_SANDBOXING (instead: 2?)
  // - DEPRECATED_LOCAL_RESOURCES_USED (instead: 2?)
  // TODO(b/138456686): Revise these after the (intentionally non-breaking)
  //  initial rollout of FailureDetail-based encoding.
  enum Code {
    EXECUTION_OPTIONS_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    INVALID_STRATEGY = 3 [(metadata) = { exit_code: 2 }];
    REQUESTED_STRATEGY_INCOMPATIBLE_WITH_SANDBOXING = 4
        [(metadata) = { exit_code: 36 }];
    DEPRECATED_LOCAL_RESOURCES_USED = 5 [(metadata) = { exit_code: 36 }];
    INVALID_CYCLIC_DYNAMIC_STRATEGY = 6 [(metadata) = { exit_code: 36 }];
    RESTRICTION_UNMATCHED_TO_ACTION_CONTEXT = 7 [(metadata) = { exit_code: 2 }];
    REMOTE_FALLBACK_STRATEGY_NOT_ABSTRACT_SPAWN = 8
        [(metadata) = { exit_code: 2 }];
    STRATEGY_NOT_FOUND = 9 [(metadata) = { exit_code: 2 }];
    DYNAMIC_STRATEGY_NOT_SANDBOXED = 10 [(metadata) = { exit_code: 2 }];

    reserved 1, 2;  // For internal use
  }

  Code code = 1;
}

message Command {
  enum Code {
    // The name "COMMAND_UNKNOWN" might reasonably be interpreted as "command
    // not found". The enum's default value should represent a lack of knowledge
    // about the failure instead.
    COMMAND_FAILURE_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    COMMAND_NOT_FOUND = 1 [(metadata) = { exit_code: 2 }];
    ANOTHER_COMMAND_RUNNING = 2 [(metadata) = { exit_code: 9 }];
    PREVIOUSLY_SHUTDOWN = 3 [(metadata) = { exit_code: 36 }];
    STARLARK_CPU_PROFILE_FILE_INITIALIZATION_FAILURE = 4
        [(metadata) = { exit_code: 36 }];
    STARLARK_CPU_PROFILING_INITIALIZATION_FAILURE = 5
        [(metadata) = { exit_code: 36 }];
    STARLARK_CPU_PROFILE_FILE_WRITE_FAILURE = 6
        [(metadata) = { exit_code: 36 }];
    INVOCATION_POLICY_PARSE_FAILURE = 7 [(metadata) = { exit_code: 2 }];
    INVOCATION_POLICY_INVALID = 8 [(metadata) = { exit_code: 2 }];
    OPTIONS_PARSE_FAILURE = 9 [(metadata) = { exit_code: 2 }];
    STARLARK_OPTIONS_PARSE_FAILURE = 10 [(metadata) = { exit_code: 2 }];
    ARGUMENTS_NOT_RECOGNIZED = 11 [(metadata) = { exit_code: 2 }];
    NOT_IN_WORKSPACE = 12 [(metadata) = { exit_code: 2 }];
    SPACES_IN_WORKSPACE_PATH = 13 [(metadata) = { exit_code: 36 }];
    IN_OUTPUT_DIRECTORY = 14 [(metadata) = { exit_code: 2 }];
  }

  Code code = 1;
}

message GrpcServer {
  enum Code {
    GRPC_SERVER_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    GRPC_SERVER_NOT_COMPILED_IN = 1 [(metadata) = { exit_code: 37 }];
    SERVER_BIND_FAILURE = 2 [(metadata) = { exit_code: 1 }];
    BAD_COOKIE = 3 [(metadata) = { exit_code: 36 }];
    NO_CLIENT_DESCRIPTION = 4 [(metadata) = { exit_code: 36 }];
    reserved 5;  // For internal use
  }

  Code code = 1;
}

message CanonicalizeFlags {
  enum Code {
    CANONICALIZE_FLAGS_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    FOR_COMMAND_INVALID = 1 [(metadata) = { exit_code: 2 }];
  }

  Code code = 1;
}

// Failure modes described by this category pertain to the Bazel invocation
// configuration consumed by Bazel's analysis phase. This category is not
// intended as a grab-bag for all Bazel flag value constraint violations, which
// instead generally belong in the category for the subsystem whose flag values
// participate in the constraint.
message BuildConfiguration {
  enum Code {
    BUILD_CONFIGURATION_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    PLATFORM_MAPPING_EVALUATION_FAILURE = 1 [(metadata) = { exit_code: 2 }];
    PLATFORM_MAPPINGS_FILE_IS_DIRECTORY = 2 [(metadata) = { exit_code: 1 }];
    PLATFORM_MAPPINGS_FILE_NOT_FOUND = 3 [(metadata) = { exit_code: 1 }];
    TOP_LEVEL_CONFIGURATION_CREATION_FAILURE = 4
        [(metadata) = { exit_code: 1 }];
    INVALID_CONFIGURATION = 5 [(metadata) = { exit_code: 2 }];
    INVALID_BUILD_OPTIONS = 6 [(metadata) = { exit_code: 2 }];
    MULTI_CPU_PREREQ_UNMET = 7 [(metadata) = { exit_code: 2 }];
    HEURISTIC_INSTRUMENTATION_FILTER_INVALID = 8
        [(metadata) = { exit_code: 2 }];
    CYCLE = 9 [(metadata) = { exit_code: 2 }];
    CONFLICTING_CONFIGURATIONS = 10 [(metadata) = { exit_code: 2 }];
    // This can come from either an invalid user-specified option or a
    // configuration transition. There's no sure-fire way to distinguish the two
    // possibilities in Bazel, so we go with the more straightforward
    // command-line error exit code 2.
    INVALID_OUTPUT_DIRECTORY_MNEMONIC = 11 [(metadata) = { exit_code: 2 }];
  }

  Code code = 1;
}

message InfoCommand {
  // The distinction between a failure to write a single info item and a failure
  // to write them all seems sketchy. Why do they have different exit codes?
  // This reflects current Bazel behavior, but deserves more thought.
  enum Code {
    INFO_COMMAND_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    TOO_MANY_KEYS = 1 [(metadata) = { exit_code: 2 }];
    KEY_NOT_RECOGNIZED = 2 [(metadata) = { exit_code: 2 }];
    INFO_BLOCK_WRITE_FAILURE = 3 [(metadata) = { exit_code: 7 }];
    ALL_INFO_WRITE_FAILURE = 4 [(metadata) = { exit_code: 36 }];
  }

  Code code = 1;
}

message MemoryOptions {
  enum Code {
    MEMORY_OPTIONS_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    EXPERIMENTAL_OOM_MORE_EAGERLY_THRESHOLD_INVALID_VALUE = 1
        [(metadata) = { exit_code: 2 }];
    EXPERIMENTAL_OOM_MORE_EAGERLY_NO_TENURED_COLLECTORS_FOUND = 2
        [(metadata) = { exit_code: 2 }];
  }

  Code code = 1;
}

message Query {
  enum Code {
    QUERY_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    QUERY_FILE_WITH_COMMAND_LINE_EXPRESSION = 1 [(metadata) = { exit_code: 2 }];
    QUERY_FILE_READ_FAILURE = 2 [(metadata) = { exit_code: 2 }];
    COMMAND_LINE_EXPRESSION_MISSING = 3 [(metadata) = { exit_code: 2 }];
    OUTPUT_FORMAT_INVALID = 4 [(metadata) = { exit_code: 2 }];
    GRAPHLESS_PREREQ_UNMET = 5 [(metadata) = { exit_code: 2 }];
    QUERY_OUTPUT_WRITE_FAILURE = 6 [(metadata) = { exit_code: 36 }];
    QUERY_STDOUT_FLUSH_FAILURE = 13 [(metadata) = { exit_code: 36 }];
    ANALYSIS_QUERY_PREREQ_UNMET = 14 [(metadata) = { exit_code: 2 }];
    QUERY_RESULTS_FLUSH_FAILURE = 15 [(metadata) = { exit_code: 36 }];
    // Deprecated - folded into SYNTAX_ERROR.
    DEPRECATED_UNCLOSED_QUOTATION_EXPRESSION_ERROR = 16
        [(metadata) = { exit_code: 2 }];
    VARIABLE_NAME_INVALID = 17 [(metadata) = { exit_code: 7 }];
    VARIABLE_UNDEFINED = 18 [(metadata) = { exit_code: 7 }];
    BUILDFILES_AND_LOADFILES_CANNOT_USE_OUTPUT_LOCATION_ERROR = 19
        [(metadata) = { exit_code: 2 }];
    BUILD_FILE_ERROR = 20 [(metadata) = { exit_code: 7 }];
    CYCLE = 21 [(metadata) = { exit_code: 7 }];
    UNIQUE_SKYKEY_THRESHOLD_EXCEEDED = 22 [(metadata) = { exit_code: 7 }];
    TARGET_NOT_IN_UNIVERSE_SCOPE = 23 [(metadata) = { exit_code: 2 }];
    INVALID_FULL_UNIVERSE_EXPRESSION = 24 [(metadata) = { exit_code: 7 }];
    UNIVERSE_SCOPE_LIMIT_EXCEEDED = 25 [(metadata) = { exit_code: 7 }];
    INVALIDATION_LIMIT_EXCEEDED = 26 [(metadata) = { exit_code: 7 }];
    OUTPUT_FORMAT_PREREQ_UNMET = 27 [(metadata) = { exit_code: 2 }];
    ARGUMENTS_MISSING = 28 [(metadata) = { exit_code: 7 }];
    RBUILDFILES_FUNCTION_REQUIRES_SKYQUERY = 29 [(metadata) = { exit_code: 7 }];
    FULL_TARGETS_NOT_SUPPORTED = 30 [(metadata) = { exit_code: 7 }];
    // Deprecated - folded into SYNTAX_ERROR.
    DEPRECATED_UNEXPECTED_TOKEN_ERROR = 31 [(metadata) = { exit_code: 2 }];
    // Deprecated - folded into SYNTAX_ERROR.
    DEPRECATED_INTEGER_LITERAL_MISSING = 32 [(metadata) = { exit_code: 2 }];
    // Deprecated - folded into SYNTAX_ERROR.
    DEPRECATED_INVALID_STARTING_CHARACTER_ERROR = 33
        [(metadata) = { exit_code: 2 }];
    // Deprecated - folded into SYNTAX_ERROR.
    DEPRECATED_PREMATURE_END_OF_INPUT_ERROR = 34
        [(metadata) = { exit_code: 2 }];
    // Indicates the user specified invalid query syntax.
    SYNTAX_ERROR = 35 [(metadata) = { exit_code: 2 }];
    OUTPUT_FORMATTER_IO_EXCEPTION = 36 [(metadata) = { exit_code: 36 }];
    SKYQUERY_TRANSITIVE_TARGET_ERROR = 37 [(metadata) = { exit_code: 7 }];
    SKYQUERY_TARGET_EXCEPTION = 38 [(metadata) = { exit_code: 7 }];
    INVALID_LABEL_IN_TEST_SUITE = 39 [(metadata) = { exit_code: 7 }];
    // Indicates any usage of flags that must not be combined.
    ILLEGAL_FLAG_COMBINATION = 40 [(metadata) = { exit_code: 2 }];

    reserved 7 to 12;  // For internal use
  }

  Code code = 1;
}

message LocalExecution {
  enum Code {
    LOCAL_EXECUTION_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    LOCKFREE_OUTPUT_PREREQ_UNMET = 1 [(metadata) = { exit_code: 2 }];
  }

  Code code = 1;
}

message ActionCache {
  enum Code {
    ACTION_CACHE_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    INITIALIZATION_FAILURE = 1 [(metadata) = { exit_code: 36 }];
  }

  Code code = 1;
}

message FetchCommand {
  enum Code {
    FETCH_COMMAND_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    EXPRESSION_MISSING = 1 [(metadata) = { exit_code: 2 }];
    OPTIONS_INVALID = 2 [(metadata) = { exit_code: 2 }];
    QUERY_PARSE_ERROR = 3 [(metadata) = { exit_code: 2 }];
    QUERY_EVALUATION_ERROR = 4 [(metadata) = { exit_code: 2 }];
  }

  Code code = 1;
}

message SyncCommand {
  enum Code {
    SYNC_COMMAND_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    PACKAGE_LOOKUP_ERROR = 1 [(metadata) = { exit_code: 7 }];
    WORKSPACE_EVALUATION_ERROR = 2 [(metadata) = { exit_code: 7 }];
    REPOSITORY_FETCH_ERRORS = 3 [(metadata) = { exit_code: 7 }];
    REPOSITORY_NAME_INVALID = 4 [(metadata) = { exit_code: 7 }];
  }

  Code code = 1;
}

message Sandbox {
  enum Code {
    SANDBOX_FAILURE_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    INITIALIZATION_FAILURE = 1 [(metadata) = { exit_code: 36 }];
    EXECUTION_IO_EXCEPTION = 2 [(metadata) = { exit_code: 36 }];
    DOCKER_COMMAND_FAILURE = 3 [(metadata) = { exit_code: 1 }];
    NO_DOCKER_IMAGE = 4 [(metadata) = { exit_code: 1 }];
    DOCKER_IMAGE_PREPARATION_FAILURE = 5 [(metadata) = { exit_code: 1 }];
    BIND_MOUNT_ANALYSIS_FAILURE = 6 [(metadata) = { exit_code: 1 }];
    MOUNT_SOURCE_DOES_NOT_EXIST = 7 [(metadata) = { exit_code: 1 }];
    MOUNT_SOURCE_TARGET_TYPE_MISMATCH = 8 [(metadata) = { exit_code: 1 }];
    MOUNT_TARGET_DOES_NOT_EXIST = 9 [(metadata) = { exit_code: 1 }];
    SUBPROCESS_START_FAILED = 10 [(metadata) = { exit_code: 36 }];
    FORBIDDEN_INPUT = 11 [(metadata) = { exit_code: 1 }];
  }

  Code code = 1;
}

message IncludeScanning {
  enum Code {
    INCLUDE_SCANNING_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    INITIALIZE_INCLUDE_HINTS_ERROR = 1 [(metadata) = { exit_code: 36 }];
    SCANNING_IO_EXCEPTION = 2 [(metadata) = { exit_code: 36 }];
    INCLUDE_HINTS_FILE_NOT_IN_PACKAGE = 3 [(metadata) = { exit_code: 36 }];
    INCLUDE_HINTS_READ_FAILURE = 4 [(metadata) = { exit_code: 36 }];
    ILLEGAL_ABSOLUTE_PATH = 5 [(metadata) = { exit_code: 1 }];
    // TODO(b/166268889): this code should be deprecated in favor of more finely
    //  resolved loading-phase codes.
    PACKAGE_LOAD_FAILURE = 6 [(metadata) = { exit_code: 1 }];
    USER_PACKAGE_LOAD_FAILURE = 7 [(metadata) = { exit_code: 1 }];
    SYSTEM_PACKAGE_LOAD_FAILURE = 8 [(metadata) = { exit_code: 36 }];
    UNDIFFERENTIATED_PACKAGE_LOAD_FAILURE = 9 [(metadata) = { exit_code: 1 }];
  }

  Code code = 1;
  PackageLoading.Code package_loading_code = 2;
}

message TestCommand {
  enum Code {
    TEST_COMMAND_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    NO_TEST_TARGETS = 1 [(metadata) = { exit_code: 4 }];
    TEST_WITH_NOANALYZE = 2 [(metadata) = { exit_code: 1 }];
    TESTS_FAILED = 3 [(metadata) = { exit_code: 3 }];
  }

  Code code = 1;
}

message ActionQuery {
  // All numerical exit code associations correspond to pre-existing Bazel
  // behavior. These associations are suspicious:
  // - COMMAND_LINE_EXPANSION_FAILURE: this is associated with 2, the numerical
  //     exit code for "bad Bazel command line", but is generated when an
  //     action's command line fails to expand, which sounds similar but is
  //     completely different.
  // - OUTPUT_FAILURE: this is associated with 6, an undocumented exit code.
  // - INVALID_AQUERY_EXPRESSION: this is associate with 1, which is not
  //    documented for (a)query.
  // TODO(b/138456686): Revise these after the (intentionally non-breaking)
  //  initial rollout of FailureDetail-based encoding.
  enum Code {
    ACTION_QUERY_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    COMMAND_LINE_EXPANSION_FAILURE = 1 [(metadata) = { exit_code: 2 }];
    OUTPUT_FAILURE = 2 [(metadata) = { exit_code: 6 }];
    COMMAND_LINE_EXPRESSION_MISSING = 3 [(metadata) = { exit_code: 2 }];
    EXPRESSION_PARSE_FAILURE = 4 [(metadata) = { exit_code: 2 }];
    SKYFRAME_STATE_WITH_COMMAND_LINE_EXPRESSION = 5
        [(metadata) = { exit_code: 2 }];
    INVALID_AQUERY_EXPRESSION = 6 [(metadata) = { exit_code: 1 }];
    SKYFRAME_STATE_PREREQ_UNMET = 7 [(metadata) = { exit_code: 2 }];
    AQUERY_OUTPUT_TOO_BIG = 8 [(metadata) = { exit_code: 7 }];
    ILLEGAL_PATTERN_SYNTAX = 9 [(metadata) = { exit_code: 2 }];
    INCORRECT_ARGUMENTS = 10 [(metadata) = { exit_code: 2 }];
    TOP_LEVEL_TARGETS_WITH_SKYFRAME_STATE_NOT_SUPPORTED = 11
        [(metadata) = { exit_code: 2 }];
    SKYFRAME_STATE_AFTER_EXECUTION = 12 [(metadata) = { exit_code: 1 }];
    LABELS_FUNCTION_NOT_SUPPORTED = 13 [(metadata) = { exit_code: 2 }];
  }

  Code code = 1;
}

message TargetPatterns {
  enum Code {
    TARGET_PATTERNS_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    TARGET_PATTERN_FILE_WITH_COMMAND_LINE_PATTERN = 1
        [(metadata) = { exit_code: 2 }];
    TARGET_PATTERN_FILE_READ_FAILURE = 2 [(metadata) = { exit_code: 2 }];
    TARGET_PATTERN_PARSE_FAILURE = 3 [(metadata) = { exit_code: 1 }];
    PACKAGE_NOT_FOUND = 4 [(metadata) = { exit_code: 1 }];
    TARGET_FORMAT_INVALID = 5 [(metadata) = { exit_code: 1 }];
    ABSOLUTE_TARGET_PATTERN_INVALID = 6 [(metadata) = { exit_code: 1 }];
    CANNOT_DETERMINE_TARGET_FROM_FILENAME = 7 [(metadata) = { exit_code: 1 }];
    LABEL_SYNTAX_ERROR = 8 [(metadata) = { exit_code: 1 }];
    TARGET_CANNOT_BE_EMPTY_STRING = 9 [(metadata) = { exit_code: 1 }];
    PACKAGE_PART_CANNOT_END_IN_SLASH = 10 [(metadata) = { exit_code: 1 }];
    CYCLE = 11 [(metadata) = { exit_code: 1 }];
    CANNOT_PRELOAD_TARGET = 12 [(metadata) = { exit_code: 1 }];
    TARGETS_MISSING = 13 [(metadata) = { exit_code: 1 }];
    RECURSIVE_TARGET_PATTERNS_NOT_ALLOWED = 14 [(metadata) = { exit_code: 1 }];
    UP_LEVEL_REFERENCES_NOT_ALLOWED = 15 [(metadata) = { exit_code: 1 }];
    NEGATIVE_TARGET_PATTERN_NOT_ALLOWED = 16 [(metadata) = { exit_code: 1 }];
    TARGET_MUST_BE_A_FILE = 17 [(metadata) = { exit_code: 1 }];
    DEPENDENCY_NOT_FOUND = 18 [(metadata) = { exit_code: 1 }];
    PACKAGE_NAME_INVALID = 19 [(metadata) = { exit_code: 1 }];
  }

  Code code = 1;
}

message CleanCommand {
  enum Code {
    CLEAN_COMMAND_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    OUTPUT_SERVICE_CLEAN_FAILURE = 1 [(metadata) = { exit_code: 6 }];
    ACTION_CACHE_CLEAN_FAILURE = 2 [(metadata) = { exit_code: 36 }];
    OUT_ERR_CLOSE_FAILURE = 3 [(metadata) = { exit_code: 36 }];
    OUTPUT_BASE_DELETE_FAILURE = 4 [(metadata) = { exit_code: 36 }];
    OUTPUT_BASE_TEMP_MOVE_FAILURE = 5 [(metadata) = { exit_code: 36 }];
    ASYNC_OUTPUT_BASE_DELETE_FAILURE = 6 [(metadata) = { exit_code: 6 }];
    EXECROOT_DELETE_FAILURE = 7 [(metadata) = { exit_code: 36 }];
    EXECROOT_TEMP_MOVE_FAILURE = 8 [(metadata) = { exit_code: 36 }];
    ASYNC_EXECROOT_DELETE_FAILURE = 9 [(metadata) = { exit_code: 6 }];
    ARGUMENTS_NOT_RECOGNIZED = 10 [(metadata) = { exit_code: 2 }];
  }

  Code code = 1;
}

message ConfigCommand {
  enum Code {
    CONFIG_COMMAND_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    TOO_MANY_CONFIG_IDS = 1 [(metadata) = { exit_code: 2 }];
    CONFIGURATION_NOT_FOUND = 2 [(metadata) = { exit_code: 2 }];
  }

  Code code = 1;
}

message ConfigurableQuery {
  enum Code {
    CONFIGURABLE_QUERY_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    COMMAND_LINE_EXPRESSION_MISSING = 1 [(metadata) = { exit_code: 2 }];
    EXPRESSION_PARSE_FAILURE = 2 [(metadata) = { exit_code: 2 }];
    FILTERS_NOT_SUPPORTED = 3 [(metadata) = { exit_code: 2 }];
    BUILDFILES_FUNCTION_NOT_SUPPORTED = 4 [(metadata) = { exit_code: 2 }];
    SIBLINGS_FUNCTION_NOT_SUPPORTED = 5 [(metadata) = { exit_code: 2 }];
    VISIBLE_FUNCTION_NOT_SUPPORTED = 6 [(metadata) = { exit_code: 2 }];
    ATTRIBUTE_MISSING = 7 [(metadata) = { exit_code: 2 }];
    INCORRECT_CONFIG_ARGUMENT_ERROR = 8 [(metadata) = { exit_code: 2 }];
    TARGET_MISSING = 9 [(metadata) = { exit_code: 2 }];
    STARLARK_SYNTAX_ERROR = 10 [(metadata) = { exit_code: 2 }];
    STARLARK_EVAL_ERROR = 11 [(metadata) = { exit_code: 2 }];
    // Indicates failure to correctly define a format function
    FORMAT_FUNCTION_ERROR = 12 [(metadata) = { exit_code: 2 }];
  }

  Code code = 1;
}

message DumpCommand {
  enum Code {
    DUMP_COMMAND_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    NO_OUTPUT_SPECIFIED = 1 [(metadata) = { exit_code: 7 }];
    ACTION_CACHE_DUMP_FAILED = 2 [(metadata) = { exit_code: 7 }];
    COMMAND_LINE_EXPANSION_FAILURE = 3 [(metadata) = { exit_code: 7 }];
    ACTION_GRAPH_DUMP_FAILED = 4 [(metadata) = { exit_code: 7 }];
    STARLARK_HEAP_DUMP_FAILED = 5 [(metadata) = { exit_code: 8 }];
    reserved 6;  // For internal use
  }

  Code code = 1;
}

message HelpCommand {
  enum Code {
    HELP_COMMAND_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    MISSING_ARGUMENT = 1 [(metadata) = { exit_code: 2 }];
    COMMAND_NOT_FOUND = 2 [(metadata) = { exit_code: 2 }];
  }

  Code code = 1;
}

message MobileInstall {
  enum Code {
    MOBILE_INSTALL_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    CLASSIC_UNSUPPORTED = 1 [(metadata) = { exit_code: 2 }];
    NO_TARGET_SPECIFIED = 2 [(metadata) = { exit_code: 2 }];
    MULTIPLE_TARGETS_SPECIFIED = 3 [(metadata) = { exit_code: 2 }];
    TARGET_TYPE_INVALID = 4 [(metadata) = { exit_code: 6 }];
    NON_ZERO_EXIT = 5 [(metadata) = { exit_code: 6 }];
    ERROR_RUNNING_PROGRAM = 6 [(metadata) = { exit_code: 6 }];
  }

  Code code = 1;
}

message ProfileCommand {
  enum Code {
    PROFILE_COMMAND_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    OLD_BINARY_FORMAT_UNSUPPORTED = 1 [(metadata) = { exit_code: 1 }];
    FILE_READ_FAILURE = 2 [(metadata) = { exit_code: 1 }];
  }

  Code code = 1;
}

message RunCommand {
  enum Code {
    RUN_COMMAND_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    NO_TARGET_SPECIFIED = 1 [(metadata) = { exit_code: 2 }];
    TOO_MANY_TARGETS_SPECIFIED = 2 [(metadata) = { exit_code: 2 }];
    TARGET_NOT_EXECUTABLE = 3 [(metadata) = { exit_code: 2 }];
    TARGET_BUILT_BUT_PATH_NOT_EXECUTABLE = 4 [(metadata) = { exit_code: 1 }];
    TARGET_BUILT_BUT_PATH_VALIDATION_FAILED = 5
        [(metadata) = { exit_code: 36 }];
    RUN_UNDER_TARGET_NOT_BUILT = 6 [(metadata) = { exit_code: 2 }];
    RUN_PREREQ_UNMET = 7 [(metadata) = { exit_code: 2 }];
    TOO_MANY_TEST_SHARDS_OR_RUNS = 8 [(metadata) = { exit_code: 2 }];
    TEST_ENVIRONMENT_SETUP_FAILURE = 9 [(metadata) = { exit_code: 36 }];
    COMMAND_LINE_EXPANSION_FAILURE = 10 [(metadata) = { exit_code: 36 }];
    NO_SHELL_SPECIFIED = 11 [(metadata) = { exit_code: 2 }];
    SCRIPT_WRITE_FAILURE = 12 [(metadata) = { exit_code: 6 }];
    RUNFILES_DIRECTORIES_CREATION_FAILURE = 13 [(metadata) = { exit_code: 36 }];
    RUNFILES_SYMLINKS_CREATION_FAILURE = 14 [(metadata) = { exit_code: 36 }];
    TEST_ENVIRONMENT_SETUP_INTERRUPTED = 15 [(metadata) = { exit_code: 8 }];
  }

  Code code = 1;
}

message VersionCommand {
  enum Code {
    VERSION_COMMAND_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    NOT_AVAILABLE = 1 [(metadata) = { exit_code: 2 }];
  }

  Code code = 1;
}

message PrintActionCommand {
  enum Code {
    PRINT_ACTION_COMMAND_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    TARGET_NOT_FOUND = 1 [(metadata) = { exit_code: 1 }];
    COMMAND_LINE_EXPANSION_FAILURE = 2 [(metadata) = { exit_code: 1 }];
    TARGET_KIND_UNSUPPORTED = 3 [(metadata) = { exit_code: 1 }];
    ACTIONS_NOT_FOUND = 4 [(metadata) = { exit_code: 1 }];
  }

  Code code = 1;
}

message WorkspaceStatus {
  enum Code {
    WORKSPACE_STATUS_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    NON_ZERO_EXIT = 1 [(metadata) = { exit_code: 1 }];
    ABNORMAL_TERMINATION = 2 [(metadata) = { exit_code: 1 }];
    EXEC_FAILED = 3 [(metadata) = { exit_code: 1 }];
    PARSE_FAILURE = 4 [(metadata) = { exit_code: 36 }];
    VALIDATION_FAILURE = 5 [(metadata) = { exit_code: 1 }];
    CONTENT_UPDATE_IO_EXCEPTION = 6 [(metadata) = { exit_code: 1 }];
    STDERR_IO_EXCEPTION = 7 [(metadata) = { exit_code: 1 }];
  }

  Code code = 1;
}

message JavaCompile {
  enum Code {
    JAVA_COMPILE_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    REDUCED_CLASSPATH_FAILURE = 1 [(metadata) = { exit_code: 1 }];
    COMMAND_LINE_EXPANSION_FAILURE = 2 [(metadata) = { exit_code: 1 }];
    JDEPS_READ_IO_EXCEPTION = 3 [(metadata) = { exit_code: 36 }];
    REDUCED_CLASSPATH_FALLBACK_CLEANUP_FAILURE = 4
        [(metadata) = { exit_code: 36 }];
  }

  Code code = 1;
}

message ActionRewinding {
  enum Code {
    ACTION_REWINDING_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    LOST_INPUT_TOO_MANY_TIMES = 1 [(metadata) = { exit_code: 1 }];
    LOST_INPUT_IS_SOURCE = 2 [(metadata) = { exit_code: 1 }];
  }

  Code code = 1;
}

message CppCompile {
  enum Code {
    CPP_COMPILE_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    FIND_USED_HEADERS_IO_EXCEPTION = 1 [(metadata) = { exit_code: 36 }];
    COPY_OUT_ERR_FAILURE = 2 [(metadata) = { exit_code: 36 }];
    D_FILE_READ_FAILURE = 3 [(metadata) = { exit_code: 36 }];
    COMMAND_GENERATION_FAILURE = 4 [(metadata) = { exit_code: 1 }];
    MODULE_EXPANSION_TIMEOUT = 5 [(metadata) = { exit_code: 1 }];
    INCLUDE_PATH_OUTSIDE_EXEC_ROOT = 6 [(metadata) = { exit_code: 1 }];
    FAKE_COMMAND_GENERATION_FAILURE = 7 [(metadata) = { exit_code: 1 }];
    UNDECLARED_INCLUSIONS = 8 [(metadata) = { exit_code: 1 }];
    D_FILE_PARSE_FAILURE = 9 [(metadata) = { exit_code: 1 }];
    COVERAGE_NOTES_CREATION_FAILURE = 10 [(metadata) = { exit_code: 1 }];
    MODULE_EXPANSION_MISSING_DATA = 11 [(metadata) = { exit_code: 1 }];
  }

  Code code = 1;
}

message StarlarkAction {
  enum Code {
    STARLARK_ACTION_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    UNUSED_INPUT_LIST_READ_FAILURE = 1 [(metadata) = { exit_code: 36 }];
    UNUSED_INPUT_LIST_FILE_NOT_FOUND = 2 [(metadata) = { exit_code: 1 }];
  }

  Code code = 1;
}

message NinjaAction {
  enum Code {
    NINJA_ACTION_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    INVALID_DEPFILE_DECLARED_DEPENDENCY = 1 [(metadata) = { exit_code: 36 }];
    D_FILE_PARSE_FAILURE = 2 [(metadata) = { exit_code: 36 }];
  }

  Code code = 1;
}

message DynamicExecution {
  enum Code {
    DYNAMIC_EXECUTION_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    XCODE_RELATED_PREREQ_UNMET = 1 [(metadata) = { exit_code: 36 }];
    ACTION_LOG_MOVE_FAILURE = 2 [(metadata) = { exit_code: 1 }];
    RUN_FAILURE = 3 [(metadata) = { exit_code: 1 }];
    NO_USABLE_STRATEGY_FOUND = 4 [(metadata) = { exit_code: 2 }];
  }

  Code code = 1;
}

message FailAction {
  enum Code {
    FAIL_ACTION_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    INTENTIONAL_FAILURE = 1 [(metadata) = { exit_code: 1 }];
    INCORRECT_PYTHON_VERSION = 2 [(metadata) = { exit_code: 1 }];
    PROGUARD_SPECS_MISSING = 3 [(metadata) = { exit_code: 1 }];
    DYNAMIC_LINKING_NOT_SUPPORTED = 4 [(metadata) = { exit_code: 1 }];
    SOURCE_FILES_MISSING = 5 [(metadata) = { exit_code: 1 }];
    INCORRECT_TOOLCHAIN = 6 [(metadata) = { exit_code: 1 }];
    FRAGMENT_CLASS_MISSING = 7 [(metadata) = { exit_code: 1 }];
    reserved 8, 9;  // For internal use
    CANT_BUILD_INCOMPATIBLE_TARGET = 10 [(metadata) = { exit_code: 1 }];
  }

  Code code = 1;
}

message SymlinkAction {
  enum Code {
    SYMLINK_ACTION_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    EXECUTABLE_INPUT_NOT_FILE = 1 [(metadata) = { exit_code: 1 }];
    EXECUTABLE_INPUT_IS_NOT = 2 [(metadata) = { exit_code: 1 }];
    EXECUTABLE_INPUT_CHECK_IO_EXCEPTION = 3 [(metadata) = { exit_code: 1 }];
    LINK_CREATION_IO_EXCEPTION = 4 [(metadata) = { exit_code: 1 }];
    LINK_TOUCH_IO_EXCEPTION = 5 [(metadata) = { exit_code: 1 }];
  }

  Code code = 1;
}

message CppLink {
  enum Code {
    CPP_LINK_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    COMMAND_GENERATION_FAILURE = 1 [(metadata) = { exit_code: 1 }];
    FAKE_COMMAND_GENERATION_FAILURE = 2 [(metadata) = { exit_code: 1 }];
  }

  Code code = 1;
}

message LtoAction {
  enum Code {
    LTO_ACTION_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    INVALID_ABSOLUTE_PATH_IN_IMPORTS = 1 [(metadata) = { exit_code: 1 }];
    MISSING_BITCODE_FILES = 2 [(metadata) = { exit_code: 1 }];
    IMPORTS_READ_IO_EXCEPTION = 3 [(metadata) = { exit_code: 1 }];
  }

  Code code = 1;
}

message TestAction {
  enum Code {
    TEST_ACTION_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    NO_KEEP_GOING_TEST_FAILURE = 1 [(metadata) = { exit_code: 1 }];
    LOCAL_TEST_PREREQ_UNMET = 2 [(metadata) = { exit_code: 1 }];
    COMMAND_LINE_EXPANSION_FAILURE = 3 [(metadata) = { exit_code: 1 }];
    DUPLICATE_CPU_TAGS = 4 [(metadata) = { exit_code: 1 }];
    INVALID_CPU_TAG = 5 [(metadata) = { exit_code: 1 }];
  }

  Code code = 1;
}

message Worker {
  enum Code {
    WORKER_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    MULTIPLEXER_INSTANCE_REMOVAL_FAILURE = 1 [(metadata) = { exit_code: 1 }];
    MULTIPLEXER_DOES_NOT_EXIST = 2 [(metadata) = { exit_code: 1 }];
    NO_TOOLS = 3 [(metadata) = { exit_code: 1 }];
    NO_FLAGFILE = 4 [(metadata) = { exit_code: 1 }];
    VIRTUAL_INPUT_MATERIALIZATION_FAILURE = 5 [(metadata) = { exit_code: 1 }];
    BORROW_FAILURE = 6 [(metadata) = { exit_code: 1 }];
    PREFETCH_FAILURE = 7 [(metadata) = { exit_code: 36 }];
    PREPARE_FAILURE = 8 [(metadata) = { exit_code: 1 }];
    REQUEST_FAILURE = 9 [(metadata) = { exit_code: 1 }];
    PARSE_RESPONSE_FAILURE = 10 [(metadata) = { exit_code: 1 }];
    NO_RESPONSE = 11 [(metadata) = { exit_code: 1 }];
    FINISH_FAILURE = 12 [(metadata) = { exit_code: 1 }];
    FORBIDDEN_INPUT = 13 [(metadata) = { exit_code: 1 }];
  }

  Code code = 1;
}

message Analysis {
  enum Code {
    ANALYSIS_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    LOAD_FAILURE = 1 [(metadata) = { exit_code: 1 }];
    // TODO(b/138456686): this code should be deprecated in favor of more finely
    //   resolved loading-phase codes.
    GENERIC_LOADING_PHASE_FAILURE = 2 [(metadata) = { exit_code: 1 }];
    NOT_ALL_TARGETS_ANALYZED = 3 [(metadata) = { exit_code: 1 }];
    CYCLE = 4 [(metadata) = { exit_code: 1 }];
    PARAMETERIZED_TOP_LEVEL_ASPECT_INVALID = 5 [(metadata) = { exit_code: 1 }];
    ASPECT_LABEL_SYNTAX_ERROR = 6 [(metadata) = { exit_code: 1 }];
    ASPECT_PREREQ_UNMET = 7 [(metadata) = { exit_code: 1 }];
    ASPECT_NOT_FOUND = 8 [(metadata) = { exit_code: 1 }];
    ACTION_CONFLICT = 9 [(metadata) = { exit_code: 1 }];
    ARTIFACT_PREFIX_CONFLICT = 10 [(metadata) = { exit_code: 1 }];
    UNEXPECTED_ANALYSIS_EXCEPTION = 11 [(metadata) = { exit_code: 1 }];
    TARGETS_MISSING_ENVIRONMENTS = 12 [(metadata) = { exit_code: 1 }];
    INVALID_ENVIRONMENT = 13 [(metadata) = { exit_code: 1 }];
    ENVIRONMENT_MISSING_FROM_GROUPS = 14 [(metadata) = { exit_code: 1 }];
    EXEC_GROUP_MISSING = 15 [(metadata) = { exit_code: 1 }];
    INVALID_EXECUTION_PLATFORM = 16 [(metadata) = { exit_code: 1 }];
    ASPECT_CREATION_FAILED = 17 [(metadata) = { exit_code: 1 }];
    CONFIGURED_VALUE_CREATION_FAILED = 18 [(metadata) = { exit_code: 1 }];
    INCOMPATIBLE_TARGET_REQUESTED = 19 [(metadata) = { exit_code: 1 }];
  }

  Code code = 1;
}

message PackageLoading {
  enum Code {
    PACKAGE_LOADING_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    WORKSPACE_FILE_ERROR = 1 [(metadata) = { exit_code: 1 }];
    MAX_COMPUTATION_STEPS_EXCEEDED = 2 [(metadata) = { exit_code: 1 }];
    BUILD_FILE_MISSING = 3 [(metadata) = { exit_code: 1 }];
    REPOSITORY_MISSING = 4 [(metadata) = { exit_code: 1 }];
    PERSISTENT_INCONSISTENT_FILESYSTEM_ERROR = 5
        [(metadata) = { exit_code: 36 }];
    TRANSIENT_INCONSISTENT_FILESYSTEM_ERROR = 6
        [(metadata) = { exit_code: 36 }];
    INVALID_NAME = 7 [(metadata) = { exit_code: 1 }];
    // was: PRELUDE_FILE_READ_ERROR. Replaced by IMPORT_STARLARK_FILE_ERROR
    // when the prelude was changed to be loaded as a Starlark module.
    reserved 8;
    EVAL_GLOBS_SYMLINK_ERROR = 9 [(metadata) = { exit_code: 1 }];
    IMPORT_STARLARK_FILE_ERROR = 10 [(metadata) = { exit_code: 1 }];
    PACKAGE_MISSING = 11 [(metadata) = { exit_code: 1 }];
    TARGET_MISSING = 12 [(metadata) = { exit_code: 1 }];
    NO_SUCH_THING = 13 [(metadata) = { exit_code: 1 }];
    GLOB_IO_EXCEPTION = 14 [(metadata) = { exit_code: 36 }];
    DUPLICATE_LABEL = 15 [(metadata) = { exit_code: 1 }];
    INVALID_PACKAGE_SPECIFICATION = 16 [(metadata) = { exit_code: 1 }];
    SYNTAX_ERROR = 17 [(metadata) = { exit_code: 1 }];
    ENVIRONMENT_IN_DIFFERENT_PACKAGE = 18 [(metadata) = { exit_code: 1 }];
    DEFAULT_ENVIRONMENT_UNDECLARED = 19 [(metadata) = { exit_code: 1 }];
    ENVIRONMENT_IN_MULTIPLE_GROUPS = 20 [(metadata) = { exit_code: 1 }];
    ENVIRONMENT_DOES_NOT_EXIST = 21 [(metadata) = { exit_code: 1 }];
    ENVIRONMENT_INVALID = 22 [(metadata) = { exit_code: 1 }];
    ENVIRONMENT_NOT_IN_GROUP = 23 [(metadata) = { exit_code: 1 }];
    PACKAGE_NAME_INVALID = 24 [(metadata) = { exit_code: 1 }];
    STARLARK_EVAL_ERROR = 25 [(metadata) = { exit_code: 1 }];
    LICENSE_PARSE_FAILURE = 26 [(metadata) = { exit_code: 1 }];
    DISTRIBUTIONS_PARSE_FAILURE = 27 [(metadata) = { exit_code: 1 }];
    LABEL_CROSSES_PACKAGE_BOUNDARY = 28 [(metadata) = { exit_code: 1 }];
    // Failure while evaluating or applying @_builtins injection. Since the
    // builtins .bzl files are always packaged with Blaze in production, a
    // failure here generally indicates a bug in Blaze.
    BUILTINS_INJECTION_FAILURE = 29 [(metadata) = { exit_code: 1 }];
    SYMLINK_CYCLE_OR_INFINITE_EXPANSION = 30 [(metadata) = { exit_code: 1 }];
    OTHER_IO_EXCEPTION = 31 [(metadata) = { exit_code: 36 }];
  }

  Code code = 1;
}

message Toolchain {
  enum Code {
    TOOLCHAIN_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    MISSING_PROVIDER = 1 [(metadata) = { exit_code: 1 }];
    INVALID_CONSTRAINT_VALUE = 2 [(metadata) = { exit_code: 1 }];
    INVALID_PLATFORM_VALUE = 3 [(metadata) = { exit_code: 1 }];
    INVALID_TOOLCHAIN = 4 [(metadata) = { exit_code: 1 }];
    NO_MATCHING_EXECUTION_PLATFORM = 5 [(metadata) = { exit_code: 1 }];
    NO_MATCHING_TOOLCHAIN = 6 [(metadata) = { exit_code: 1 }];
    INVALID_TOOLCHAIN_TYPE = 7 [(metadata) = { exit_code: 1 }];
  }

  Code code = 1;
}

message StarlarkLoading {
  enum Code {
    STARLARK_LOADING_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    CYCLE = 1 [(metadata) = { exit_code: 1 }];
    COMPILE_ERROR = 2 [(metadata) = { exit_code: 1 }];
    PARSE_ERROR = 3 [(metadata) = { exit_code: 1 }];
    EVAL_ERROR = 4 [(metadata) = { exit_code: 1 }];
    CONTAINING_PACKAGE_NOT_FOUND = 5 [(metadata) = { exit_code: 1 }];
    PACKAGE_NOT_FOUND = 6 [(metadata) = { exit_code: 1 }];
    IO_ERROR = 7 [(metadata) = { exit_code: 1 }];
    LABEL_CROSSES_PACKAGE_BOUNDARY = 8 [(metadata) = { exit_code: 1 }];
    BUILTINS_ERROR = 9 [(metadata) = { exit_code: 1 }];
  }

  Code code = 1;
}

message ExternalDeps {
  enum Code {
    EXTERNAL_DEPS_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    MODULE_NOT_FOUND = 1 [(metadata) = { exit_code: 48 }];
    BAD_MODULE = 2 [(metadata) = { exit_code: 48 }];
    VERSION_RESOLUTION_ERROR = 3 [(metadata) = { exit_code: 48 }];
    INVALID_REGISTRY_URL = 4 [(metadata) = { exit_code: 48 }];
    ERROR_ACCESSING_REGISTRY = 5 [(metadata) = { exit_code: 32 }];
  }

  Code code = 1;
}

message DiffAwareness {
  enum Code {
    DIFF_AWARENESS_UNKNOWN = 0 [(metadata) = { exit_code: 37 }];
    DIFF_STAT_FAILED = 1 [(metadata) = { exit_code: 36 }];
  }

  Code code = 1;
}
