{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1
    },
    "description": {
      "type": "string",
      "minLength": 1
    },
    "schemaVersion": {
      "type": "string",
      "pattern": "^\\d+\\.\\d+\\.\\d+$"
    },
    "dateModified": {
      "type": "string",
      "format": "date",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
      "description": "The newest check, change or retirement date in the file."
    },
    "url": {
      "type": "string",
      "format": "uri",
      "description": "The page that presents this dataset."
    },
    "license": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "minLength": 1
        },
        "url": {
          "type": "string",
          "format": "uri"
        }
      },
      "required": [
        "name",
        "url"
      ],
      "additionalProperties": false
    },
    "attribution": {
      "type": "string",
      "minLength": 1
    },
    "platforms": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "enum": [
              "claude",
              "chatgpt",
              "cursor",
              "mcp-registry"
            ]
          },
          "name": {
            "type": "string",
            "minLength": 1
          },
          "vendor": {
            "type": "string",
            "minLength": 1
          },
          "surfaceName": {
            "type": "string",
            "minLength": 1
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "The platform's requirements page."
          }
        },
        "required": [
          "id",
          "name",
          "vendor",
          "surfaceName",
          "url"
        ],
        "additionalProperties": false
      }
    },
    "facts": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[a-z0-9]+(?:[.-][a-z0-9]+)*$",
            "description": "Stable id, e.g. claude.rule-annotations. Never reused; a removed id is listed in `retired`."
          },
          "platform": {
            "type": "string",
            "enum": [
              "claude",
              "chatgpt",
              "cursor",
              "mcp-registry",
              "ecosystem"
            ],
            "description": "The platform the requirement belongs to; `ecosystem` for protocol facts."
          },
          "productSurface": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "claude-connectors",
                "claude-plugins",
                "chatgpt",
                "codex",
                "cursor-marketplace",
                "mcp-registry"
              ]
            },
            "description": "Every product surface the fact holds for, named as the vendor names it."
          },
          "category": {
            "type": "string",
            "enum": [
              "submission",
              "eligibility",
              "tiers",
              "auth",
              "rules",
              "limits",
              "analytics",
              "extensions",
              "distribution",
              "ecosystem",
              "protocol"
            ]
          },
          "categoryLabel": {
            "type": "string",
            "minLength": 1,
            "description": "The category's heading on the site, e.g. 'Who can submit'."
          },
          "text": {
            "type": "string",
            "minLength": 1,
            "description": "The requirement, as shown on the site."
          },
          "evidence": {
            "type": "string",
            "enum": [
              "V",
              "3P",
              "V/3P",
              "CC",
              "INF",
              "carried"
            ],
            "description": "V verified, 3P third-party, CC company claim, INF inference."
          },
          "sourceKind": {
            "type": "string",
            "enum": [
              "official",
              "official-and-third-party",
              "third-party",
              "none",
              "inference",
              "company-claim"
            ]
          },
          "sources": {
            "minItems": 1,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "label": {
                  "type": "string",
                  "minLength": 1
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "accessed": {
                  "type": "string",
                  "format": "date",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
                  "description": "The date the source was last read."
                }
              },
              "required": [
                "label",
                "url",
                "accessed"
              ],
              "additionalProperties": false
            }
          },
          "status": {
            "type": "string",
            "enum": [
              "verified",
              "conflict"
            ]
          },
          "conflictNote": {
            "description": "Present when sources disagree: what they disagree about.",
            "type": "string",
            "minLength": 1
          },
          "verifiedAt": {
            "type": "string",
            "format": "date",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
            "description": "The date the fact was last checked against its sources."
          },
          "verifiedBy": {
            "type": "string",
            "enum": [
              "founder",
              "recheck",
              "audit",
              "research"
            ]
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "The requirement's row on its platform page."
          }
        },
        "required": [
          "id",
          "platform",
          "productSurface",
          "category",
          "categoryLabel",
          "text",
          "evidence",
          "sourceKind",
          "sources",
          "status",
          "verifiedAt",
          "verifiedBy",
          "url"
        ],
        "additionalProperties": false
      }
    },
    "changes": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string",
            "pattern": "^[a-z0-9]+(?:[.-][a-z0-9]+)*$"
          },
          "title": {
            "type": "string",
            "minLength": 1
          },
          "summary": {
            "type": "string",
            "minLength": 1
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "markdownUrl": {
            "type": "string",
            "format": "uri",
            "description": "The change note as Markdown."
          },
          "published": {
            "type": "string",
            "format": "date",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
          },
          "updated": {
            "type": "string",
            "format": "date",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
          },
          "lastVerified": {
            "type": "string",
            "format": "date",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
          },
          "platforms": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "claude",
                "chatgpt",
                "cursor",
                "mcp-registry"
              ]
            }
          },
          "sources": {
            "minItems": 1,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "label": {
                  "type": "string",
                  "minLength": 1
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "accessed": {
                  "type": "string",
                  "format": "date",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
                  "description": "The date the source was last read."
                }
              },
              "required": [
                "label",
                "url",
                "accessed"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "slug",
          "title",
          "summary",
          "url",
          "markdownUrl",
          "published",
          "updated",
          "lastVerified",
          "platforms",
          "sources"
        ],
        "additionalProperties": false
      }
    },
    "retired": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[a-z0-9]+(?:[.-][a-z0-9]+)*$"
          },
          "retiredAt": {
            "type": "string",
            "format": "date",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
          },
          "replacedBy": {
            "type": "string",
            "pattern": "^[a-z0-9]+(?:[.-][a-z0-9]+)*$"
          }
        },
        "required": [
          "id",
          "retiredAt"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "name",
    "description",
    "schemaVersion",
    "dateModified",
    "url",
    "license",
    "attribution",
    "platforms",
    "facts",
    "changes",
    "retired"
  ],
  "additionalProperties": false,
  "$id": "https://invokary.com/data/platform-requirements.schema.json",
  "title": "Platform Requirements dataset"
}
