{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://semver-trust.dev/schemas/review-v0.2.json",
  "$comment": "SPDX-License-Identifier: Apache-2.0",
  "title": "SemVer-Trust Review Attestation Statement (v0.2)",
  "description": "A complete in-toto Statement carrying the SemVer-Trust review successor predicate. Predicate type https://semver-trust.dev/review/v0.2.",
  "type": "object",
  "required": ["_type", "subject", "predicateType", "predicate"],
  "additionalProperties": false,
  "properties": {
    "_type": { "const": "https://in-toto.io/Statement/v1" },
    "subject": {
      "type": "array",
      "minItems": 1,
      "items": { "$ref": "#/$defs/subject" }
    },
    "predicateType": { "const": "https://semver-trust.dev/review/v0.2" },
    "predicate": {
      "type": "object",
      "required": [
        "profile",
        "repository",
        "review_target",
        "reviewers",
        "merge",
        "timestamp"
      ],
      "additionalProperties": false,
      "properties": {
        "profile": { "$ref": "#/$defs/reviewProfile" },
        "repository": { "$ref": "#/$defs/repositoryIdentity" },
        "review_target": { "$ref": "#/$defs/reviewTarget" },
        "reviewers": {
          "type": "array",
          "minItems": 1,
          "items": { "$ref": "#/$defs/reviewer" }
        },
        "merge": { "$ref": "#/$defs/mergeState" },
        "timestamp": { "$ref": "#/$defs/dateTime" },
        "extensions": { "$ref": "#/$defs/extensions" }
      }
    }
  },
  "$defs": {
    "dateTime": { "type": "string", "format": "date-time" },
    "digestSet": {
      "type": "object",
      "minProperties": 1,
      "additionalProperties": { "type": "string", "minLength": 1 }
    },
    "subject": {
      "type": "object",
      "required": ["name", "digest"],
      "additionalProperties": false,
      "properties": {
        "name": { "type": "string", "minLength": 1 },
        "digest": { "$ref": "#/$defs/digestSet" }
      }
    },
    "profile": {
      "type": "object",
      "required": ["name", "version"],
      "additionalProperties": false,
      "properties": {
        "name": { "type": "string", "minLength": 1 },
        "version": { "type": "string", "minLength": 1 },
        "digest": { "$ref": "#/$defs/digestSet" }
      }
    },
    "reviewProfile": {
      "type": "object",
      "required": [
        "specification",
        "predicate_contract",
        "evaluator",
        "repository_identity",
        "actor_identity",
        "source_control",
        "verification_time",
        "verification_instant"
      ],
      "additionalProperties": false,
      "properties": {
        "specification": { "$ref": "#/$defs/profile" },
        "predicate_contract": { "$ref": "#/$defs/profile" },
        "evaluator": { "$ref": "#/$defs/profile" },
        "repository_identity": { "$ref": "#/$defs/profile" },
        "actor_identity": { "$ref": "#/$defs/profile" },
        "source_control": { "$ref": "#/$defs/profile" },
        "verification_time": { "$ref": "#/$defs/profile" },
        "verification_instant": { "$ref": "#/$defs/dateTime" }
      }
    },
    "repositoryIdentity": {
      "type": "object",
      "required": ["id", "digest"],
      "additionalProperties": false,
      "properties": {
        "id": { "type": "string", "minLength": 1 },
        "origin": { "type": "string", "minLength": 1 },
        "digest": { "$ref": "#/$defs/digestSet" }
      }
    },
    "objectIdentity": {
      "type": "object",
      "required": ["id"],
      "additionalProperties": false,
      "properties": {
        "id": { "type": "string", "minLength": 1 },
        "digest": { "$ref": "#/$defs/digestSet" }
      }
    },
    "reviewTarget": {
      "type": "object",
      "required": ["change", "merge_context", "source_revisions", "target_revision"],
      "additionalProperties": false,
      "properties": {
        "change": { "type": "string", "minLength": 1 },
        "merge_context": { "type": "string", "minLength": 1 },
        "source_revisions": {
          "type": "array",
          "minItems": 1,
          "items": { "$ref": "#/$defs/objectIdentity" }
        },
        "target_revision": { "$ref": "#/$defs/objectIdentity" }
      }
    },
    "reviewer": {
      "type": "object",
      "required": [
        "actor",
        "credential_identity",
        "class",
        "verdict",
        "approval_state",
        "coverage",
        "approved_revision",
        "effective_at_merge"
      ],
      "additionalProperties": false,
      "properties": {
        "actor": { "$ref": "#/$defs/actorIdentity" },
        "credential_identity": { "type": "string", "minLength": 1 },
        "class": { "type": "string", "enum": ["human", "agent"] },
        "verdict": { "type": "string", "enum": ["approved", "changes_requested", "commented"] },
        "approval_state": {
          "type": "string",
          "enum": ["active", "withdrawn", "dismissed", "stale"]
        },
        "coverage": { "type": "string", "enum": ["final_revision", "final_diff"] },
        "approved_revision": {
          "oneOf": [{ "type": "null" }, { "$ref": "#/$defs/objectIdentity" }]
        },
        "approved_diff": {
          "oneOf": [{ "type": "null" }, { "$ref": "#/$defs/digestSet" }]
        },
        "effective_at_merge": { "type": "boolean" },
        "independent_context": {
          "oneOf": [{ "type": "null" }, { "$ref": "#/$defs/independentContext" }]
        },
        "agent": { "type": "string", "minLength": 1 },
        "model": { "type": "string", "minLength": 1 }
      }
    },
    "actorIdentity": {
      "type": "object",
      "required": ["id", "class", "digest"],
      "additionalProperties": false,
      "properties": {
        "id": { "type": "string", "minLength": 1 },
        "class": { "type": "string", "enum": ["human", "agent"] },
        "digest": { "$ref": "#/$defs/digestSet" }
      }
    },
    "independentContext": {
      "type": "object",
      "required": ["separate_execution", "evidence"],
      "additionalProperties": false,
      "properties": {
        "separate_execution": { "type": "boolean" },
        "evidence": { "type": "string", "minLength": 1 }
      }
    },
    "mergeState": {
      "type": "object",
      "required": ["strategy", "capture_mode", "result_revision", "source_to_result"],
      "additionalProperties": false,
      "properties": {
        "strategy": { "type": "string", "enum": ["merge", "squash", "rebase"] },
        "capture_mode": { "type": "string", "enum": ["native", "pre_rewrite"] },
        "result_revision": { "$ref": "#/$defs/objectIdentity" },
        "source_to_result": { "$ref": "#/$defs/digestSet" }
      }
    },
    "extensions": {
      "type": "object",
      "additionalProperties": true
    }
  }
}
