syntax = "proto3";

package cobalt;



option java_multiple_files = true;
option java_package = "com.google.cobalt";

////////////////////////////////////////////////////////////////////////////////
// NOTE: This file is used by the Cobalt client and the Cobalt servers.
// The source-of-truth of this file is located in Google's internal code
// repository, and the file is automatically copied to Cobalt's open source
// repo where it is used by the Cobalt client code. Do not edit the copy of this
// file in the open-source repo as those edits will be overwritten when the file
// is next copied.
////////////////////////////////////////////////////////////////////////////////

// A single experiment token with its associated experiments namespace.
message ExperimentToken {
  // The experiments namespace is the namespace containing the experiment ids to
  // fetch.

  string ns = 1;

  // An experiments token that can be decoded to a list of experiment ids and
  // experiment states.

  bytes token = 2;
}

// A SystemProfile describes the client system on which an Observation is
// collected.
message SystemProfile {
  reserved 3;

  enum OS {
    UNKNOWN_OS = 0;
    FUCHSIA = 1;
    LINUX = 2;
    ANDROID = 3;
  }

  enum ARCH {
    UNKNOWN_ARCH = 0;
    X86_64 = 1;
    ARM_64 = 2;
    X86 = 3 [deprecated = true];
    X86_32 = 4;
    ARM_32 = 5;
  }

  enum BuildType {
    UNKNOWN_TYPE = 0;
    OTHER_TYPE = 1;
    USER = 2;
    USER_DEBUG = 3;
    ENG = 4;
  }

  OS os = 1;
  ARCH arch = 2;

  // This is a string representing the board name of the device. If a board name
  // cannot be determined, then this field will be 'unknown:<cpu signature>'.
  string board_name = 4;

  // This is a string representing the type of Fuchsia product from which
  // an observation is collected.
  //
  // During development, this is going to refer to layers of the Fuchsia cake
  // such as "garnet", "zircon", "topaz", etc... In the future, we will use
  // something related to what sort of device we are running on, such as
  // "Acme Lightbulb X" or "Machine Corp. Laptop III".
  string product_name = 5;

  // This is a string representing the version of the currently running system.
  // The use of this field is system-specific. For example on Fuchsia it is the
  // build version (aka OS version) with a value that looks like
  // "0.20200114.1.1".
  string system_version = 8;

  // This is a string representation of the current channel. It is an arbitrary
  // string that depends on the system. For example on Fuchsia some possible
  // values are "qa-daily" and "fishfood".
  //
  // The value '<unset>' means the system did not notify Cobalt of the current
  // channel.
  //
  // The value '<unknown>' means the system explicitly notified Cobalt it did
  // not know the channel.

  string channel = 9;

  // This is a string representation of the current realm. Realm is a software-
  // distribution identifier that is more general than |channel|. A realm
  // corresponds to one or more channels. The values are system-specific. For
  // example on Fuchsia the "Dogfood" realm might contain the "fishood_release",
  // "teamfood_release", and "dogfood_release" channels.
  //
  // The value '<unset>' means the system did not notify Cobalt of the current
  // channel.
  //
  // The value '<unknown>' means the system explicitly notified Cobalt it did
  // not know the channel.
  //
  string realm = 10;

  // An enumerated representation of the current build type.
  //
  // The value `UNKNOWN_TYPE` means the system failed to supply a build type.
  // The value `OTHER_TYPE` indicates the system supplied a value that did not
  // match any of the enumerated values.
  BuildType build_type = 11;

  // Contains the experiment tokens which the shuffler can convert to experiment
  // ids.
  repeated ExperimentToken experiment_tokens = 12;

  // A list of experiments that are active on the device.
  //
  // This field should only contain experiments specified in the report
  // definition associated with this system profile.
  repeated int64 experiment_ids = 13
     ;

  reserved 6, 7;
  reserved "build_level", "experiments";
}
