{
  "definitions": {
    "application_schema": {
      "properties": {
        "name": {
          "title": "Application under performance test",
          "enum": [
            "firefox",
            "chrome",
            "chrome-m",
            "fennec",
            "geckoview",
            "refbrow",
            "fenix",
            "focus",
            "safari",
            "safari-tp",
            "custom-car",
            "cstm-car-m"
          ],
          "maxLength": 10,
          "type": "string"
        },
        "version": {
          "title": "Application's version",
          "maxLength": 40,
          "type": "string"
        }
      },
      "required": ["name"],
      "type": "object"
    },
    "os_schema": {
      "type": "object",
      "properties": {
        "name": {
          "title": "Operating system name",
          "type": "string",
          "minLength": 1,
          "maxLength": 100
        },
        "platform_version": {
          "title": "Operating system version",
          "type": "string",
          "minLength": 1,
          "maxLength": 100
        }
      }
    },
    "framework_schema": {
      "properties": {
        "name": {
          "title": "Framework name",
          "type": "string"
        }
      },
      "type": "object"
    },
    "subtest_schema": {
      "properties": {
        "name": {
          "title": "Subtest name",
          "type": "string",
          "maxLength": 80
        },
        "publicName": {
          "title": "Public subtest name",
          "description": "Allows renaming test's name, without breaking existing performance data series",
          "maxLength": 30,
          "type": "string"
        },
        "value": {
          "description": "Summary value for subtest",
          "title": "Subtest value",
          "type": "number",
          "minimum": -1000000000000.0,
          "maximum": 1000000000000.0
        },
        "unit": {
          "title": "Measurement unit",
          "type": "string",
          "minLength": 1,
          "maxLength": 20
        },
        "lowerIsBetter": {
          "description": "Whether lower values are better for subtest",
          "title": "Lower is better",
          "type": "boolean"
        },
        "shouldAlert": {
          "description": "Whether we should alert",
          "title": "Should alert",
          "type": "boolean"
        },
        "alertThreshold": {
          "description": "% change threshold before alerting",
          "title": "Alert threshold",
          "type": "number",
          "minimum": 0.0,
          "maximum": 1000.0
        },
        "minBackWindow": {
          "description": "Minimum back window to use for alerting",
          "title": "Minimum back window",
          "type": "number",
          "minimum": 1,
          "maximum": 255
        },
        "maxBackWindow": {
          "description": "Maximum back window to use for alerting",
          "title": "Maximum back window",
          "type": "number",
          "minimum": 1,
          "maximum": 255
        },
        "foreWindow": {
          "description": "Fore window to use for alerting",
          "title": "Fore window",
          "type": "number",
          "minimum": 1,
          "maximum": 255
        }
      },
      "required": ["name", "value"],
      "type": "object"
    },
    "suite_schema": {
      "properties": {
        "name": {
          "title": "Suite name",
          "type": "string",
          "maxLength": 80
        },
        "publicName": {
          "title": "Public suite name",
          "description": "Allows renaming suite's name, without breaking existing performance data series",
          "maxLength": 30,
          "type": "string"
        },
        "tags": {
          "type": "array",
          "title": "Free form tags, which ease the grouping & searching of performance tests",
          "description": "Similar to extraOptions, except it does not break existing performance data series",
          "items": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-]{1,24}$"
          },
          "uniqueItems": true,
          "maxItems": 14
        },
        "extraOptions": {
          "type": "array",
          "title": "Extra options used in running suite",
          "items": {
            "type": "string",
            "maxLength": 100
          },
          "uniqueItems": true,
          "maxItems": 8
        },
        "subtests": {
          "items": {
            "$ref": "#/definitions/subtest_schema"
          },
          "title": "Subtests",
          "type": "array"
        },
        "value": {
          "title": "Suite value",
          "type": "number",
          "minimum": -1000000000000.0,
          "maximum": 1000000000000.0
        },
        "unit": {
          "title": "Measurement unit",
          "type": "string",
          "minLength": 1,
          "maxLength": 20
        },
        "replicates": {
          "title": "Suite replicates",
          "type": "array",
          "items": {
            "type": "number",
            "minimum": -1000000000000.0,
            "maximum": 1000000000000.0
          }
        },
        "lowerIsBetter": {
          "description": "Whether lower values are better for suite",
          "title": "Lower is better",
          "type": "boolean"
        },
        "shouldAlert": {
          "description": "Whether we should alert on this suite (overrides default behaviour)",
          "title": "Should alert",
          "type": "boolean"
        },
        "alertThreshold": {
          "description": "% change threshold before alerting",
          "title": "Alert threshold",
          "type": "number",
          "minimum": 0.0,
          "maximum": 1000.0
        },
        "minBackWindow": {
          "description": "Minimum back window to use for alerting",
          "title": "Minimum back window",
          "type": "integer",
          "minimum": 1,
          "maximum": 255
        },
        "maxBackWindow": {
          "description": "Maximum back window to use for alerting",
          "title": "Maximum back window",
          "type": "integer",
          "minimum": 1,
          "maximum": 255
        },
        "foreWindow": {
          "description": "Fore window to use for alerting",
          "title": "Fore window",
          "type": "integer",
          "minimum": 1,
          "maximum": 255
        },
        "monitor": {
          "description": "Enable non-sheriffed alerting (ignores shouldAlert settings)",
          "title": "Monitor",
          "type": "boolean"
        },
        "alertNotifyEmails": {
          "type": "array",
          "title": "Notify these emails for any alerts produced",
          "items": {
            "type": "string",
            "maxLength": 100
          },
          "uniqueItems": true,
          "maxItems": 8
        }
      },
      "required": ["name", "subtests"],
      "type": "object"
    }
  },
  "description": "Structure for submitting performance data as part of a job",
  "id": "https://treeherder.mozilla.org/schemas/v1/performance-artifact.json#",
  "properties": {
    "application": {
      "$ref": "#/definitions/application_schema"
    },
    "os": {
      "$ref": "#/definitions/os_schema"
    },
    "framework": {
      "$ref": "#/definitions/framework_schema"
    },
    "suites": {
      "description": "List of suite-level data submitted as part of this structure",
      "items": {
        "$ref": "#/definitions/suite_schema"
      },
      "title": "Performance suites",
      "type": "array"
    }
  },
  "required": ["framework", "suites"],
  "title": "Perfherder Schema",
  "type": "object"
}
