{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://www.michaeldariuseastwood.com/schemas/concept-question-policy.schema.json",
  "title": "Concept and question authority policy",
  "type": "object",
  "additionalProperties": false,
  "required": ["schemaVersion", "policyId", "dateModified", "description", "sources", "concepts", "questions", "outputs"],
  "properties": {
    "schemaVersion": {"const": 1},
    "policyId": {"type": "string", "minLength": 1},
    "dateModified": {"type": "string", "format": "date"},
    "description": {"type": "string", "minLength": 1},
    "sources": {
      "type": "object",
      "additionalProperties": false,
      "required": ["authorityGraph", "conceptRegistry", "conceptPages", "reconciliation", "pageContracts", "assertionQuarantine"],
      "properties": {
        "authorityGraph": {"type": "string", "minLength": 1},
        "conceptRegistry": {"type": "string", "minLength": 1},
        "conceptPages": {"type": "string", "minLength": 1},
        "reconciliation": {"type": "string", "minLength": 1},
        "pageContracts": {"type": "string", "minLength": 1},
        "assertionQuarantine": {"type": "string", "minLength": 1}
      }
    },
    "concepts": {
      "type": "object",
      "additionalProperties": false,
      "required": ["canonicalCount", "requiredType", "definedTermSetId"],
      "properties": {
        "canonicalCount": {"type": "integer", "minimum": 1},
        "requiredType": {"const": "DefinedTerm"},
        "definedTermSetId": {"type": "string", "format": "uri"}
      }
    },
    "questions": {
      "type": "object",
      "additionalProperties": false,
      "required": ["routeClass", "minimumAnswerWords", "minimumPublicSourceLinks", "requiredPageType", "requiredMainEntityType", "contentScopeClass", "excludedRoutePrefixes"],
      "properties": {
        "routeClass": {"const": "question"},
        "minimumAnswerWords": {"type": "integer", "minimum": 1},
        "minimumPublicSourceLinks": {"type": "integer", "minimum": 1},
        "requiredPageType": {"const": "WebPage"},
        "requiredMainEntityType": {"const": "Question"},
        "contentScopeClass": {"type": "string", "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"},
        "excludedRoutePrefixes": {
          "type": "array",
          "uniqueItems": true,
          "items": {"type": "string", "pattern": "^/"}
        }
      }
    },
    "outputs": {
      "type": "object",
      "additionalProperties": false,
      "required": ["conceptsJsonld", "aliases", "questionsJsonl", "questionAuthority"],
      "properties": {
        "conceptsJsonld": {"type": "string", "minLength": 1},
        "aliases": {"type": "string", "minLength": 1},
        "questionsJsonl": {"type": "string", "minLength": 1},
        "questionAuthority": {"type": "string", "minLength": 1}
      }
    }
  }
}
