{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://taftcompliance.com/data/cco-100-day-plan/v1.schema.json",
  "title": "First 100 days as a new Chief Compliance Officer",
  "description": "A phased planning checklist for incoming CCOs and founders: firm-type and perspective tags express relevance, not legal applicability; day bands are suggested planning phases, not deadlines; tasks are practitioner guidance unless marked as a sourced requirement. Not legal advice. Session checkmarks are never part of this data.",
  "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": 120,
            "x-format": "plain-text"
          },
          "maxItems": 10
        },
        "inclusions": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300,
            "x-format": "plain-text"
          },
          "maxItems": 20
        },
        "exclusions": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300,
            "x-format": "plain-text"
          },
          "maxItems": 20
        },
        "geographyNote": {
          "type": "string",
          "maxLength": 400,
          "description": "Legal geography and registration scope remain open; this says so.",
          "x-format": "plain-text"
        }
      },
      "required": [
        "audiences",
        "inclusions",
        "exclusions",
        "geographyNote"
      ]
    },
    "firmTypes": {
      "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."
          },
          "label": {
            "type": "string",
            "minLength": 2,
            "maxLength": 40,
            "x-format": "plain-text"
          },
          "description": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300,
            "description": "Who this filter is for. Relevance, not legal applicability.",
            "x-format": "plain-text"
          }
        },
        "required": [
          "id",
          "label",
          "description"
        ],
        "title": "FirmType"
      },
      "minItems": 1,
      "maxItems": 10,
      "uniqueItems": true
    },
    "perspectives": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "enum": [
              "cco",
              "founder"
            ]
          },
          "label": {
            "type": "string",
            "minLength": 2,
            "maxLength": 40,
            "x-format": "plain-text"
          }
        },
        "required": [
          "id",
          "label"
        ],
        "title": "Perspective"
      },
      "minItems": 2,
      "maxItems": 2,
      "uniqueItems": true
    },
    "phases": {
      "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."
          },
          "order": {
            "type": "integer",
            "minimum": 1,
            "maximum": 3
          },
          "label": {
            "type": "string",
            "minLength": 2,
            "maxLength": 80,
            "x-format": "plain-text"
          },
          "dayStart": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          },
          "dayEnd": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          },
          "summary": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300,
            "description": "What the phase is for. A suggested planning band, not a deadline.",
            "x-format": "plain-text"
          }
        },
        "required": [
          "id",
          "order",
          "label",
          "dayStart",
          "dayEnd",
          "summary"
        ],
        "title": "Phase"
      },
      "minItems": 3,
      "maxItems": 3,
      "uniqueItems": true
    },
    "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": 500,
      "uniqueItems": true
    },
    "tasks": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "minLength": 2,
            "maxLength": 80,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "description": "Stable task id; also the page anchor."
          },
          "phaseId": {
            "type": "string",
            "minLength": 2,
            "maxLength": 80,
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
            "description": "Stable lowercase identifier; never changes once published."
          },
          "order": {
            "type": "integer",
            "minimum": 1,
            "maximum": 999
          },
          "title": {
            "type": "string",
            "minLength": 3,
            "maxLength": 120,
            "x-format": "plain-text"
          },
          "explanation": {
            "type": "string",
            "minLength": 10,
            "maxLength": 900,
            "description": "Plain explanation of the suggested work.",
            "x-format": "plain-text"
          },
          "output": {
            "type": "string",
            "minLength": 3,
            "maxLength": 400,
            "description": "The concrete output, prepared in the firm's own systems, never uploaded here.",
            "x-format": "plain-text"
          },
          "firmTypes": {
            "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": 10,
            "description": "Firm types this task is relevant to. Relevance, not applicability."
          },
          "perspectives": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "cco",
                "founder"
              ]
            },
            "minItems": 1,
            "maxItems": 2
          },
          "topics": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 2,
              "maxLength": 40,
              "x-format": "plain-text"
            },
            "minItems": 1,
            "maxItems": 6
          },
          "kind": {
            "type": "string",
            "enum": [
              "guidance",
              "requirement"
            ],
            "description": "guidance: original practitioner suggestion with no legal claim. requirement: a stated obligation, which needs a binding official source."
          },
          "applicability": {
            "type": "string",
            "maxLength": 600,
            "description": "Where applicability still needs confirmation; never an assumption that a label settles it.",
            "x-format": "plain-text"
          },
          "caveats": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 400,
              "x-format": "plain-text"
            },
            "maxItems": 8
          },
          "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": 10
          },
          "evidenceLocators": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200,
              "x-format": "plain-text"
            },
            "maxItems": 10
          },
          "lastChecked": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
                "format": "date",
                "description": "Null for original guidance; a real date for a sourced requirement."
              },
              {
                "type": "null"
              }
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "superseded",
              "withdrawn"
            ]
          },
          "withdrawalNotice": {
            "type": "string",
            "minLength": 1,
            "maxLength": 600,
            "x-format": "plain-text"
          },
          "offerPath": {
            "type": "string",
            "maxLength": 200,
            "pattern": "^\\/(?:products|solutions|resources|insights|talk-to-an-expert)(?:\\/[a-z0-9-]+)*$",
            "description": "A contextual Taft page relevant to the task, shown as a link, never a gate."
          },
          "dependsOn": {
            "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": 6,
            "description": "Suggested order only; nothing is locked."
          },
          "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",
          "phaseId",
          "order",
          "title",
          "explanation",
          "output",
          "firmTypes",
          "perspectives",
          "topics",
          "kind",
          "applicability",
          "caveats",
          "sourceIds",
          "evidenceLocators",
          "lastChecked",
          "status",
          "dependsOn",
          "review"
        ],
        "title": "Task"
      },
      "maxItems": 500,
      "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": 2000,
      "uniqueItems": true
    }
  },
  "required": [
    "schemaVersion",
    "releaseVersion",
    "status",
    "publishedAt",
    "updatedAt",
    "notice",
    "attribution",
    "reuseTerms",
    "scope",
    "firmTypes",
    "perspectives",
    "phases",
    "sources",
    "tasks",
    "changelog"
  ]
}
