{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://taftcompliance.com/data/exam-prep-toolkit/v1.schema.json",
  "title": "Exam-prep toolkit",
  "description": "A blank tracker template (original editorial fields), Taft-authored practice questions with sourced relevance, and selected regulatory deadline references with official sources and conditions. Not legal advice. Nothing a user types into the tracker is part of this dataset.",
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "schemaVersion": {
      "type": "string",
      "minLength": 5,
      "maxLength": 20,
      "description": "Semantic version of this schema.",
      "x-format": "plain-text"
    },
    "releaseVersion": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 40,
          "description": "Public release version; null while draft.",
          "x-format": "plain-text"
        },
        {
          "type": "null"
        }
      ]
    },
    "status": {
      "type": "string",
      "enum": [
        "draft",
        "reviewed"
      ],
      "description": "File state. Not a substitute for the private approval ledger."
    },
    "publishedAt": {
      "anyOf": [
        {
          "type": "string",
          "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
          "format": "date",
          "description": "First public release date; null while draft."
        },
        {
          "type": "null"
        }
      ]
    },
    "updatedAt": {
      "anyOf": [
        {
          "type": "string",
          "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
          "format": "date",
          "description": "Latest release date; null while draft."
        },
        {
          "type": "null"
        }
      ]
    },
    "notice": {
      "type": "string",
      "minLength": 1,
      "maxLength": 600,
      "x-format": "plain-text"
    },
    "attribution": {
      "type": "string",
      "minLength": 1,
      "maxLength": 600,
      "x-format": "plain-text"
    },
    "reuseTerms": {
      "type": "string",
      "minLength": 1,
      "maxLength": 600,
      "description": "Reuse terms. \"Undecided\" blocks release.",
      "x-format": "plain-text"
    },
    "scope": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "audiences": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 2,
            "maxLength": 80,
            "x-format": "plain-text"
          },
          "maxItems": 20
        },
        "regulators": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 2,
            "maxLength": 80,
            "x-format": "plain-text"
          },
          "maxItems": 20
        },
        "inclusions": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300,
            "x-format": "plain-text"
          },
          "maxItems": 50
        },
        "exclusions": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300,
            "x-format": "plain-text"
          },
          "maxItems": 50
        }
      },
      "required": [
        "audiences",
        "regulators",
        "inclusions",
        "exclusions"
      ]
    },
    "sources": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "minLength": 2,
            "maxLength": 80,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "description": "Stable source id, referenced by records as sourceIds."
          },
          "url": {
            "type": "string",
            "maxLength": 2048,
            "format": "uri",
            "description": "Exact official HTTPS URL of the document, on an allowlisted host.",
            "x-allowlist": "OFFICIAL_HOSTS, exact hostname match"
          },
          "publisher": {
            "type": "string",
            "minLength": 2,
            "maxLength": 160,
            "description": "The official publisher, as it names itself.",
            "x-format": "plain-text"
          },
          "title": {
            "type": "string",
            "minLength": 2,
            "maxLength": 300,
            "description": "The document title as published.",
            "x-format": "plain-text"
          },
          "sourceKind": {
            "type": "string",
            "enum": [
              "law",
              "rule",
              "regulator-guidance",
              "official-fee-schedule",
              "official-service-standard",
              "official-register",
              "official-order",
              "official-release",
              "official-index"
            ],
            "description": "Reviewed classification of the instrument. A label, not a legal conclusion."
          },
          "publishedDate": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
                "format": "date",
                "description": "Date the document was published, if stated."
              },
              {
                "type": "null"
              }
            ]
          },
          "effectiveDate": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
                "format": "date",
                "description": "Effective date, if stated. May lie in the future when officially published."
              },
              {
                "type": "null"
              }
            ]
          },
          "checkedAt": {
            "type": "string",
            "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
            "format": "date",
            "description": "The date a person last opened this source and confirmed the passage. Never a fetch or build time."
          },
          "locator": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "description": "Where in the document: section, rule, page or table.",
            "x-format": "plain-text"
          },
          "passage": {
            "type": "string",
            "minLength": 1,
            "maxLength": 1200,
            "description": "The supporting passage, quoted as published, or a precise paraphrase marked as such.",
            "x-format": "plain-text"
          }
        },
        "required": [
          "id",
          "url",
          "publisher",
          "title",
          "sourceKind",
          "publishedDate",
          "effectiveDate",
          "checkedAt",
          "locator",
          "passage"
        ],
        "title": "Source"
      },
      "maxItems": 2000,
      "uniqueItems": true
    },
    "trackerTemplate": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "fields": {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "key": {
                "type": "string",
                "minLength": 2,
                "maxLength": 40,
                "description": "Immutable camelCase key, also the CSV column.",
                "x-format": "plain-text"
              },
              "label": {
                "type": "string",
                "minLength": 1,
                "maxLength": 80,
                "x-format": "plain-text"
              },
              "type": {
                "type": "string",
                "enum": [
                  "text",
                  "date",
                  "workflow-status"
                ]
              },
              "required": {
                "type": "boolean"
              },
              "maxLength": {
                "anyOf": [
                  {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 4000
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "helpText": {
                "type": "string",
                "maxLength": 300,
                "x-format": "plain-text"
              },
              "sensitivityWarning": {
                "type": "string",
                "maxLength": 300,
                "description": "Shown next to the field when entries could carry confidential or personal data.",
                "x-format": "plain-text"
              },
              "provenance": {
                "const": "original-editorial"
              },
              "reviewRef": {
                "type": "string",
                "maxLength": 80,
                "description": "Private review ledger reference; no reviewer name.",
                "x-format": "plain-text"
              }
            },
            "required": [
              "key",
              "label",
              "type",
              "required",
              "maxLength",
              "helpText",
              "sensitivityWarning",
              "provenance",
              "reviewRef"
            ],
            "title": "TrackerField"
          },
          "maxItems": 30,
          "uniqueItems": true
        },
        "statuses": {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "value": {
                "type": "string",
                "minLength": 2,
                "maxLength": 80,
                "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
                "description": "Status value as stored."
              },
              "label": {
                "type": "string",
                "minLength": 1,
                "maxLength": 60,
                "x-format": "plain-text"
              },
              "meaning": {
                "type": "string",
                "minLength": 1,
                "maxLength": 300,
                "description": "An editorial workflow meaning, never a regulatory outcome.",
                "x-format": "plain-text"
              }
            },
            "required": [
              "value",
              "label",
              "meaning"
            ],
            "title": "TrackerStatus"
          },
          "maxItems": 12,
          "uniqueItems": true
        },
        "instructions": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 600,
            "x-format": "plain-text"
          },
          "maxItems": 20
        },
        "review": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "status": {
              "type": "string",
              "enum": [
                "unreviewed",
                "in-review",
                "approved"
              ],
              "description": "Public review state. The reviewer is named only in the private ledger."
            },
            "approvedAt": {
              "anyOf": [
                {
                  "type": "string",
                  "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
                  "format": "date",
                  "description": "Date of approval; null unless approved."
                },
                {
                  "type": "null"
                }
              ]
            },
            "revisionHash": {
              "anyOf": [
                {
                  "type": "string",
                  "minLength": 64,
                  "maxLength": 64,
                  "pattern": "^[0-9a-f]{64}$",
                  "description": "SHA-256 of the record without this review block; must match the current content for a release."
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "required": [
            "status",
            "approvedAt",
            "revisionHash"
          ],
          "title": "Review"
        }
      },
      "required": [
        "fields",
        "statuses",
        "instructions",
        "review"
      ],
      "title": "TrackerTemplate"
    },
    "questions": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "minLength": 2,
            "maxLength": 80,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "description": "Stable lowercase identifier; never changes once published."
          },
          "audiences": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 2,
              "maxLength": 80,
              "x-format": "plain-text"
            },
            "minItems": 1,
            "maxItems": 10
          },
          "regulator": {
            "type": "string",
            "minLength": 2,
            "maxLength": 80,
            "x-format": "plain-text"
          },
          "jurisdiction": {
            "type": "string",
            "minLength": 2,
            "maxLength": 80,
            "x-format": "plain-text"
          },
          "topic": {
            "type": "string",
            "minLength": 2,
            "maxLength": 80,
            "x-format": "plain-text"
          },
          "evidenceCategory": {
            "type": "string",
            "minLength": 2,
            "maxLength": 80,
            "x-format": "plain-text"
          },
          "prompt": {
            "type": "string",
            "minLength": 10,
            "maxLength": 1200,
            "description": "The original Taft-authored practice prompt.",
            "x-format": "plain-text"
          },
          "authoredBy": {
            "const": "Taft",
            "description": "Always Taft; never a named person."
          },
          "provenance": {
            "const": "original-practice"
          },
          "relevance": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "text": {
                "type": "string",
                "maxLength": 1200,
                "description": "The statement, or for unknown statuses the explanation.",
                "x-format": "plain-text"
              },
              "status": {
                "type": "string",
                "enum": [
                  "known",
                  "unknown",
                  "not-published",
                  "not-applicable"
                ]
              },
              "sourceIds": {
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 2,
                  "maxLength": 80,
                  "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
                  "description": "Stable lowercase identifier; never changes once published."
                },
                "maxItems": 20
              },
              "evidenceLocators": {
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 200,
                  "x-format": "plain-text"
                },
                "maxItems": 20,
                "description": "Section, page or table per source, in the same order as sourceIds."
              }
            },
            "required": [
              "text",
              "status",
              "sourceIds",
              "evidenceLocators"
            ],
            "title": "SourcedFact"
          },
          "evidenceCues": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "text": {
                  "type": "string",
                  "maxLength": 1200,
                  "description": "The statement, or for unknown statuses the explanation.",
                  "x-format": "plain-text"
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "known",
                    "unknown",
                    "not-published",
                    "not-applicable"
                  ]
                },
                "sourceIds": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "minLength": 2,
                    "maxLength": 80,
                    "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
                    "description": "Stable lowercase identifier; never changes once published."
                  },
                  "maxItems": 20
                },
                "evidenceLocators": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "x-format": "plain-text"
                  },
                  "maxItems": 20,
                  "description": "Section, page or table per source, in the same order as sourceIds."
                }
              },
              "required": [
                "text",
                "status",
                "sourceIds",
                "evidenceLocators"
              ],
              "title": "SourcedFact"
            },
            "maxItems": 20,
            "description": "Suggested evidence to locate; not a mandatory regulator request list."
          },
          "followUps": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 600,
              "x-format": "plain-text"
            },
            "maxItems": 10
          },
          "applicability": {
            "type": "string",
            "maxLength": 1200,
            "x-format": "plain-text"
          },
          "exclusions": {
            "type": "string",
            "maxLength": 1200,
            "x-format": "plain-text"
          },
          "nonOfficialLabel": {
            "const": "Taft practice question: not an official regulator question."
          },
          "sourceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 2,
              "maxLength": 80,
              "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
              "description": "Stable lowercase identifier; never changes once published."
            },
            "minItems": 1,
            "maxItems": 20
          },
          "lastChecked": {
            "type": "string",
            "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
            "format": "date"
          },
          "review": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "status": {
                "type": "string",
                "enum": [
                  "unreviewed",
                  "in-review",
                  "approved"
                ],
                "description": "Public review state. The reviewer is named only in the private ledger."
              },
              "approvedAt": {
                "anyOf": [
                  {
                    "type": "string",
                    "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
                    "format": "date",
                    "description": "Date of approval; null unless approved."
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "revisionHash": {
                "anyOf": [
                  {
                    "type": "string",
                    "minLength": 64,
                    "maxLength": 64,
                    "pattern": "^[0-9a-f]{64}$",
                    "description": "SHA-256 of the record without this review block; must match the current content for a release."
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "status",
              "approvedAt",
              "revisionHash"
            ],
            "title": "Review"
          }
        },
        "required": [
          "id",
          "audiences",
          "regulator",
          "jurisdiction",
          "topic",
          "evidenceCategory",
          "prompt",
          "authoredBy",
          "provenance",
          "relevance",
          "evidenceCues",
          "followUps",
          "applicability",
          "exclusions",
          "nonOfficialLabel",
          "sourceIds",
          "lastChecked",
          "review"
        ],
        "title": "PracticeQuestion"
      },
      "maxItems": 2000,
      "uniqueItems": true
    },
    "deadlines": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "minLength": 2,
            "maxLength": 80,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "description": "Stable lowercase identifier; never changes once published."
          },
          "obligationTitle": {
            "type": "string",
            "minLength": 3,
            "maxLength": 200,
            "x-format": "plain-text"
          },
          "regulator": {
            "type": "string",
            "minLength": 2,
            "maxLength": 80,
            "x-format": "plain-text"
          },
          "jurisdiction": {
            "type": "string",
            "minLength": 2,
            "maxLength": 80,
            "x-format": "plain-text"
          },
          "audiences": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 2,
              "maxLength": 80,
              "x-format": "plain-text"
            },
            "minItems": 1,
            "maxItems": 10
          },
          "obligationCategory": {
            "type": "string",
            "minLength": 2,
            "maxLength": 80,
            "x-format": "plain-text"
          },
          "legalStatus": {
            "type": "string",
            "enum": [
              "binding-rule",
              "staff-guidance",
              "proposal"
            ]
          },
          "instrumentCitation": {
            "type": "string",
            "minLength": 2,
            "maxLength": 200,
            "description": "The rule or statute citation as published.",
            "x-format": "plain-text"
          },
          "applicability": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "text": {
                "type": "string",
                "maxLength": 1200,
                "description": "The statement, or for unknown statuses the explanation.",
                "x-format": "plain-text"
              },
              "status": {
                "type": "string",
                "enum": [
                  "known",
                  "unknown",
                  "not-published",
                  "not-applicable"
                ]
              },
              "sourceIds": {
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 2,
                  "maxLength": 80,
                  "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
                  "description": "Stable lowercase identifier; never changes once published."
                },
                "maxItems": 20
              },
              "evidenceLocators": {
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 200,
                  "x-format": "plain-text"
                },
                "maxItems": 20,
                "description": "Section, page or table per source, in the same order as sourceIds."
              }
            },
            "required": [
              "text",
              "status",
              "sourceIds",
              "evidenceLocators"
            ],
            "title": "SourcedFact"
          },
          "exclusions": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "text": {
                  "type": "string",
                  "maxLength": 1200,
                  "description": "The statement, or for unknown statuses the explanation.",
                  "x-format": "plain-text"
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "known",
                    "unknown",
                    "not-published",
                    "not-applicable"
                  ]
                },
                "sourceIds": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "minLength": 2,
                    "maxLength": 80,
                    "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
                    "description": "Stable lowercase identifier; never changes once published."
                  },
                  "maxItems": 20
                },
                "evidenceLocators": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "x-format": "plain-text"
                  },
                  "maxItems": 20,
                  "description": "Section, page or table per source, in the same order as sourceIds."
                }
              },
              "required": [
                "text",
                "status",
                "sourceIds",
                "evidenceLocators"
              ],
              "title": "SourcedFact"
            },
            "maxItems": 20
          },
          "deadlineType": {
            "type": "string",
            "enum": [
              "fixed",
              "recurring",
              "event-relative"
            ]
          },
          "officialText": {
            "type": "string",
            "minLength": 1,
            "maxLength": 1200,
            "description": "The published period or date, quoted.",
            "x-format": "plain-text"
          },
          "fixedDate": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
                "format": "date"
              },
              {
                "type": "null"
              }
            ]
          },
          "recurrenceText": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 600,
                "x-format": "plain-text"
              },
              {
                "type": "null"
              }
            ]
          },
          "triggerText": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 600,
                "x-format": "plain-text"
              },
              {
                "type": "null"
              }
            ]
          },
          "publishedPeriod": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "value": {
                "anyOf": [
                  {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 100000
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "unit": {
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "business-days",
                      "calendar-days",
                      "weeks",
                      "months",
                      "years"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "businessOrCalendar": {
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "business",
                      "calendar"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "value",
              "unit",
              "businessOrCalendar"
            ]
          },
          "effectiveFrom": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
                "format": "date"
              },
              {
                "type": "null"
              }
            ]
          },
          "effectiveTo": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
                "format": "date"
              },
              {
                "type": "null"
              }
            ]
          },
          "conditions": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 600,
              "x-format": "plain-text"
            },
            "maxItems": 20
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "unknown",
              "superseded",
              "withdrawn"
            ]
          },
          "sourceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 2,
              "maxLength": 80,
              "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
              "description": "Stable lowercase identifier; never changes once published."
            },
            "minItems": 1,
            "maxItems": 20
          },
          "locators": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200,
              "x-format": "plain-text"
            },
            "minItems": 1,
            "maxItems": 20
          },
          "lastChecked": {
            "type": "string",
            "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
            "format": "date"
          },
          "review": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "status": {
                "type": "string",
                "enum": [
                  "unreviewed",
                  "in-review",
                  "approved"
                ],
                "description": "Public review state. The reviewer is named only in the private ledger."
              },
              "approvedAt": {
                "anyOf": [
                  {
                    "type": "string",
                    "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
                    "format": "date",
                    "description": "Date of approval; null unless approved."
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "revisionHash": {
                "anyOf": [
                  {
                    "type": "string",
                    "minLength": 64,
                    "maxLength": 64,
                    "pattern": "^[0-9a-f]{64}$",
                    "description": "SHA-256 of the record without this review block; must match the current content for a release."
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "status",
              "approvedAt",
              "revisionHash"
            ],
            "title": "Review"
          }
        },
        "required": [
          "id",
          "obligationTitle",
          "regulator",
          "jurisdiction",
          "audiences",
          "obligationCategory",
          "legalStatus",
          "instrumentCitation",
          "applicability",
          "exclusions",
          "deadlineType",
          "officialText",
          "fixedDate",
          "recurrenceText",
          "triggerText",
          "publishedPeriod",
          "effectiveFrom",
          "effectiveTo",
          "conditions",
          "status",
          "sourceIds",
          "locators",
          "lastChecked",
          "review"
        ],
        "title": "DeadlineReference"
      },
      "maxItems": 2000,
      "uniqueItems": true
    },
    "changelog": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "minLength": 2,
            "maxLength": 80,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "description": "Stable change id."
          },
          "releaseVersion": {
            "type": "string",
            "minLength": 1,
            "maxLength": 40,
            "description": "Release this change shipped in.",
            "x-format": "plain-text"
          },
          "date": {
            "type": "string",
            "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
            "format": "date",
            "description": "The date the change was released."
          },
          "type": {
            "type": "string",
            "enum": [
              "initial-release",
              "correction",
              "update",
              "withdrawal"
            ]
          },
          "affectedIds": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 2,
              "maxLength": 80,
              "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
              "description": "Affected record id."
            },
            "maxItems": 500,
            "description": "Records this change touched; empty only for initial-release."
          },
          "fields": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 80,
              "x-format": "plain-text"
            },
            "maxItems": 50,
            "description": "Field names changed, dotted paths."
          },
          "before": {
            "type": "string",
            "maxLength": 1200,
            "description": "What the record said before, in words.",
            "x-format": "plain-text"
          },
          "after": {
            "type": "string",
            "maxLength": 1200,
            "description": "What it says now, in words.",
            "x-format": "plain-text"
          },
          "reason": {
            "type": "string",
            "minLength": 1,
            "maxLength": 600,
            "description": "Why: the official change, the error, or the withdrawal ground.",
            "x-format": "plain-text"
          },
          "sourceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 2,
              "maxLength": 80,
              "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
              "description": "Stable lowercase identifier; never changes once published."
            },
            "maxItems": 50,
            "description": "Sources that support the change."
          }
        },
        "required": [
          "id",
          "releaseVersion",
          "date",
          "type",
          "affectedIds",
          "fields",
          "before",
          "after",
          "reason",
          "sourceIds"
        ],
        "title": "Change"
      },
      "maxItems": 5000,
      "uniqueItems": true
    }
  },
  "required": [
    "schemaVersion",
    "releaseVersion",
    "status",
    "publishedAt",
    "updatedAt",
    "notice",
    "attribution",
    "reuseTerms",
    "scope",
    "sources",
    "trackerTemplate",
    "questions",
    "deadlines",
    "changelog"
  ]
}
