{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://botlandscape.com/source-observations.schema.json",
  "title": "Bot Landscape source-observation review projection",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "$schema",
    "schema_version",
    "disclaimer",
    "counts",
    "queues",
    "claims_requiring_attention",
    "observations",
    "decisions"
  ],
  "properties": {
    "$schema": {"const": "https://botlandscape.com/source-observations.schema.json"},
    "schema_version": {"const": 1},
    "disclaimer": {
      "const": "Machine retrieval records document identity only. It is not verification of a claim."
    },
    "counts": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "sources",
        "observations",
        "changed",
        "unavailable",
        "unchanged",
        "never_observed",
        "decisions",
        "claims_requiring_attention"
      ],
      "properties": {
        "sources": {"type": "integer", "minimum": 0},
        "observations": {"type": "integer", "minimum": 0},
        "changed": {"type": "integer", "minimum": 0},
        "unavailable": {"type": "integer", "minimum": 0},
        "unchanged": {"type": "integer", "minimum": 0},
        "never_observed": {"type": "integer", "minimum": 0},
        "decisions": {"type": "integer", "minimum": 0},
        "claims_requiring_attention": {"type": "integer", "minimum": 0}
      }
    },
    "queues": {
      "type": "object",
      "additionalProperties": false,
      "required": ["changed", "unavailable", "unchanged", "never_observed"],
      "properties": {
        "changed": {"type": "array", "items": {"$ref": "#/$defs/observed-source"}},
        "unavailable": {"type": "array", "items": {"$ref": "#/$defs/unavailable-source"}},
        "unchanged": {"type": "array", "items": {"$ref": "#/$defs/observed-source"}},
        "never_observed": {"type": "array", "items": {"$ref": "#/$defs/never-observed-source"}}
      }
    },
    "claims_requiring_attention": {
      "type": "array",
      "uniqueItems": true,
      "items": {"type": "string", "minLength": 1}
    },
    "observations": {
      "type": "array",
      "items": {"$ref": "#/$defs/observation"}
    },
    "decisions": {
      "type": "array",
      "items": {"$ref": "#/$defs/decision"}
    }
  },
  "$defs": {
    "digest": {"type": "string", "pattern": "^[0-9a-f]{64}$"},
    "source-id": {"type": "string", "pattern": "^[a-z0-9-]+-[mfapr][0-9]+$"},
    "datetime": {"type": "string", "minLength": 20},
    "claim-ids": {
      "type": "array",
      "uniqueItems": true,
      "items": {"type": "string", "minLength": 1}
    },
    "never-observed-source": {
      "type": "object",
      "additionalProperties": false,
      "required": ["source_id"],
      "properties": {
        "source_id": {"$ref": "#/$defs/source-id"}
      }
    },
    "claim-ref": {
      "type": "object",
      "additionalProperties": false,
      "required": ["id", "status"],
      "properties": {
        "id": {"type": "string", "minLength": 1},
        "status": {"enum": ["current", "historical"]}
      }
    },
    "observed-source": {
      "type": "object",
      "additionalProperties": false,
      "required": ["source_id", "observation_id", "observed_at", "claim_ids", "claims"],
      "properties": {
        "source_id": {"$ref": "#/$defs/source-id"},
        "observation_id": {"$ref": "#/$defs/digest"},
        "previous_observation_id": {"$ref": "#/$defs/digest"},
        "observed_at": {"$ref": "#/$defs/datetime"},
        "document_digest": {"$ref": "#/$defs/digest"},
        "previous_document_digest": {"$ref": "#/$defs/digest"},
        "content_type": {"type": "string", "minLength": 3},
        "claim_ids": {"$ref": "#/$defs/claim-ids"},
        "claims": {"type": "array", "items": {"$ref": "#/$defs/claim-ref"}}
      }
    },
    "unavailable-source": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "source_id",
        "observation_id",
        "observed_at",
        "claim_ids",
        "claims",
        "retrieval_outcome"
      ],
      "properties": {
        "source_id": {"$ref": "#/$defs/source-id"},
        "observation_id": {"$ref": "#/$defs/digest"},
        "previous_observation_id": {"$ref": "#/$defs/digest"},
        "previous_document_digest": {"$ref": "#/$defs/digest"},
        "observed_at": {"$ref": "#/$defs/datetime"},
        "retrieval_outcome": {"const": "unavailable"},
        "claim_ids": {"$ref": "#/$defs/claim-ids"},
        "claims": {"type": "array", "items": {"$ref": "#/$defs/claim-ref"}}
      }
    },
    "observation": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "id",
        "source_id",
        "retrieval_outcome",
        "content_type",
        "document_digest",
        "observed_at",
        "claim_ids",
        "claims"
      ],
      "properties": {
        "id": {"$ref": "#/$defs/digest"},
        "source_id": {"$ref": "#/$defs/source-id"},
        "retrieval_outcome": {"enum": ["retrieved", "unavailable"]},
        "content_type": {"type": ["string", "null"], "minLength": 3},
        "document_digest": {"oneOf": [{"$ref": "#/$defs/digest"}, {"type": "null"}]},
        "observed_at": {"$ref": "#/$defs/datetime"},
        "claim_ids": {"$ref": "#/$defs/claim-ids"},
        "claims": {"type": "array", "items": {"$ref": "#/$defs/claim-ref"}},
        "landscape_digest": {"$ref": "#/$defs/digest"}
      }
    },
    "decision": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "id",
        "claim_id",
        "decision",
        "observation_id",
        "evidence_locator",
        "decided_at",
        "note",
        "prior_value",
        "prior_release",
        "claim_status"
      ],
      "properties": {
        "id": {"$ref": "#/$defs/digest"},
        "claim_id": {"type": "string", "minLength": 1},
        "claim_status": {"enum": ["current", "historical"]},
        "decision": {"enum": ["retain", "revise", "retire"]},
        "observation_id": {"$ref": "#/$defs/digest"},
        "evidence_locator": {"type": "string", "minLength": 1},
        "decided_at": {"$ref": "#/$defs/datetime"},
        "note": {"type": ["string", "null"]},
        "prior_release": {"type": ["string", "null"], "pattern": "^[0-9a-f]{64}$"},
        "prior_value": {
          "type": "object",
          "additionalProperties": false,
          "required": ["state", "text"],
          "properties": {
            "state": {"enum": ["reported", "missing"]},
            "text": {"type": "string"}
          }
        }
      }
    }
  }
}
