{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://dnascreening.mohithkodavati.com/schema.json",
  "title": "DNA Synthesis Provider Screening Disclosure Record",
  "description": "Schema for providers.json. This dataset documents PUBLIC DISCLOSURE, not behavior. See the enum descriptions below -- the distinction between 'not_stated' and 'no' is the methodological core of the project and must not be collapsed.",
  "type": "object",
  "required": ["dataset", "providers"],
  "properties": {
    "dataset": {
      "type": "object",
      "required": ["name", "version", "license", "last_updated"],
      "properties": {
        "name": { "type": "string" },
        "version": { "type": "string" },
        "description": { "type": "string" },
        "license": { "type": "string" },
        "maintainer": { "type": "string" },
        "last_updated": { "type": "string", "format": "date" },
        "update_cadence": { "type": "string" },
        "coverage_note": { "type": "string" },
        "sources": {
          "type": "object",
          "description": "Citations for the columns that are NOT sourced from the provider's own site. igsc_member comes from the consortium's published roster; legal_mandate_in_jurisdiction is a fact about a jurisdiction. Requiring a provider policy_url for either would force a fake citation onto something the provider never stated, so they are sourced once here instead.",
          "additionalProperties": {
            "type": "object",
            "required": ["url", "retrieved"],
            "properties": {
              "name": { "type": "string" },
              "url": { "type": "string", "format": "uri" },
              "retrieved": { "type": "string", "format": "date" },
              "note": { "type": "string" }
            }
          }
        }
      }
    },
    "providers": {
      "type": "array",
      "items": { "$ref": "#/definitions/provider" }
    }
  },
  "definitions": {
    "provider": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "id",
        "name",
        "hq_country",
        "hq_region",
        "igsc_member",
        "screens_sequences",
        "screens_customers",
        "cites_us_framework",
        "legal_mandate_in_jurisdiction",
        "policy_url",
        "source_note",
        "last_verified"
      ],
      "properties": {
        "id": {
          "type": "string",
          "pattern": "^[a-z0-9-]+$",
          "description": "Stable kebab-case slug. Never change it once published -- it is the anchor URL other people will link to."
        },
        "name": {
          "type": "string",
          "description": "Provider name as it appears on the company's own site."
        },
        "hq_country": { "type": "string" },
        "hq_region": {
          "type": "string",
          "enum": ["North America", "Europe", "Asia-Pacific", "Latin America", "Middle East", "Africa"]
        },
        "igsc_member": {
          "type": "string",
          "enum": ["yes", "no", "unverified"],
          "description": "Whether the provider appears on the International Gene Synthesis Consortium public member list. 'no' IS permitted for this field only, because IGSC publishes an authoritative membership roster -- absence from a published list is a checkable fact, unlike absence of a screening claim."
        },
        "screens_sequences": {
          "type": "string",
          "enum": ["stated", "not_stated", "unverified"],
          "description": "'stated' = the provider publicly says it screens incoming order sequences against hazard databases. 'not_stated' = a maintainer read the provider's public materials and found no such claim. THIS IS NOT 'no'. A company may screen rigorously and never publish a page about it. 'unverified' = nobody has checked yet."
        },
        "screens_customers": {
          "type": "string",
          "enum": ["stated", "not_stated", "unverified"],
          "description": "'stated' = the provider publicly says it verifies customer identity or institutional affiliation. Same not_stated rule as above."
        },
        "cites_us_framework": {
          "type": "string",
          "enum": ["stated", "not_stated", "unverified"],
          "description": "'stated' = the provider explicitly references a US nucleic acid synthesis screening framework -- either the HHS Screening Framework Guidance for Providers and Users of Synthetic Nucleic Acids (2010/2023) or the OSTP/NSTC Framework for Nucleic Acid Synthesis Screening (April 2024). Both are covered by one field because providers cite them interchangeably and the 2024 framework supersedes the earlier guidance in practice; the source_note records which one a given provider actually names."
        },
        "legal_mandate_in_jurisdiction": {
          "type": "string",
          "enum": ["none", "partial", "binding", "unverified"],
          "description": "Whether the provider's HQ jurisdiction imposes a legal requirement to screen synthetic nucleic acid orders. 'partial' = requirement attaches only to some transactions (e.g. federally funded purchasers, export-controlled agents) rather than to all commercial sales. This field describes the JURISDICTION, not the company."
        },
        "policy_url": {
          "type": ["string", "null"],
          "format": "uri",
          "description": "Direct URL to the provider's own biosecurity or gene synthesis policy page. Null until verified. This URL is what the monthly diff monitor watches."
        },
        "source_note": {
          "type": ["string", "null"],
          "description": "Where on the page the claim appears, precise enough to re-find it, e.g. 'Biosecurity page, para 3'. Every non-unverified cell must have one."
        },
        "last_verified": {
          "type": ["string", "null"],
          "format": "date",
          "description": "ISO date a human last read the source page and confirmed the values. Null means never verified."
        }
      }
    }
  }
}
