{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://quantpragna.com/meru/data/engine.schema.json",
  "title": "QuantPragna Engine Registry",
  "description": "Canon QP99. One registry, ninety-nine canonical entries, MERU is engine 99. Cross-record rules (unique ids/numbers, resolvable references, MERU == 99, count consistency) are enforced by scripts/validate-meru-registry.mjs.",
  "type": "object",
  "required": ["registry_name", "canon", "canonical_engine_count", "meta_engine", "schema_version", "generated_at", "engines"],
  "properties": {
    "registry_name": {"type": "string"},
    "canon": {"type": "string", "const": "QP99"},
    "canonical_engine_count": {"type": "integer", "const": 99},
    "meta_engine": {"type": "string", "const": "MERU"},
    "schema_version": {"type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$"},
    "registry_version": {"type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$"},
    "generated_at": {"type": "string"},
    "source": {"type": "object"},
    "completeness": {"type": "object"},
    "engines": {"type": "array", "minItems": 1, "maxItems": 99, "items": {"$ref": "#/$defs/engine"}}
  },
  "$defs": {
    "engine": {
      "type": "object",
      "required": ["engine_number", "engine_id", "canonical_name", "display_name", "wing", "domain", "classification", "question_answered", "description", "does", "does_not_do", "primary_users", "secondary_users", "problem_signals", "keywords", "inputs", "outputs", "jurisdictions", "dependencies", "complements", "conflicts", "upstream_engines", "downstream_engines", "routing_examples", "deployment_url", "api_endpoint", "availability", "maturity", "version", "canon"],
      "properties": {
        "engine_number": {"type": "integer", "minimum": 1, "maximum": 99},
        "engine_id": {"type": "string", "pattern": "^[A-Z][A-Z0-9_]*$"},
        "catalogue_id": {"type": ["string", "null"]},
        "canonical_name": {"type": "string", "minLength": 1},
        "display_name": {"type": "string", "minLength": 1},
        "english_name": {"type": ["string", "null"]},
        "devanagari": {"type": ["string", "null"]},
        "wing": {"type": "string", "minLength": 1},
        "wing_id": {"type": "string"},
        "vertical": {"type": ["string", "null"]},
        "domain": {"type": "array", "items": {"type": "string"}},
        "classification": {"type": "string", "enum": ["META_ENGINE", "DOMAIN_ENGINE", "PROGRAMME", "PROPOSED_INFRASTRUCTURE"]},
        "question_answered": {"type": "string", "minLength": 1},
        "description": {"type": "string"},
        "does": {"type": "array", "items": {"type": "string"}},
        "does_not_do": {"type": "array", "items": {"type": "string"}},
        "primary_users": {"type": "array", "items": {"type": "string"}},
        "secondary_users": {"type": "array", "items": {"type": "string"}},
        "problem_signals": {"type": "array", "items": {"type": "string"}},
        "keywords": {"type": "array", "items": {"type": "string"}},
        "inputs": {"type": "array", "items": {"type": "string"}},
        "outputs": {"type": "array", "items": {"type": "string"}},
        "evidence_class": {"type": ["string", "null"]},
        "risk_class": {"type": ["string", "null"]},
        "jurisdictions": {"type": "array", "items": {"type": "string"}},
        "dependencies": {"type": "array", "items": {"type": "string"}},
        "complements": {"type": "array", "items": {"type": "string"}},
        "conflicts": {"type": "array", "items": {"type": "string"}},
        "upstream_engines": {"type": "array", "items": {"type": "string"}},
        "downstream_engines": {"type": "array", "items": {"type": "string"}},
        "routing_examples": {"type": "array", "items": {"type": "string"}},
        "deployment_url": {"type": ["string", "null"], "format": "uri", "pattern": "^https://"},
        "api_endpoint": {"type": ["string", "null"], "format": "uri", "pattern": "^https://"},
        "availability": {"type": "string", "enum": ["ACTIVE", "INTERNAL", "COMING", "RESEARCH", "PROPOSED", "UNKNOWN"]},
        "maturity": {"type": ["string", "null"]},
        "maturity_register": {"type": ["object", "null"]},
        "provenance": {"type": "object"},
        "version": {"type": "string", "pattern": "^\\d+\\.\\d+(\\.\\d+)?$"},
        "canon": {"type": "string", "const": "QP99"}
      }
    }
  }
}
