{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:ojja:contract:coverage:1.0",
  "title": "Matrice de couverture d'Ojja",
  "description": "Format ouvert de la matrice de couverture (contrat site et espace, section 3 bis). Produite depuis la même source que le manifeste de permissions, les manifestes de lecture, et versionnée avec lui. Seule source des promesses de couverture et de cadence sur /watch, /confiance et /releve : un outil lu l'est par une application de lecture du manifeste de permissions ; un outil qui n'est pas lu ne promet aucune lecture. Un événement qui ne se lit pas chaque jour s'affiche « lu chaque semaine ».",
  "type": "object",
  "additionalProperties": false,
  "required": ["schema_version", "manifest_version", "published_on", "locale", "tools"],
  "properties": {
    "schema_version": {
      "title": "version du format",
      "description": "Version de ce format.",
      "type": "string",
      "const": "1.0"
    },
    "manifest_version": {
      "title": "version du manifeste",
      "description": "Numéro lisible (1.0, 1.1…) du manifeste de permissions produit avec cette matrice.",
      "type": "string",
      "pattern": "^[0-9]+\\.[0-9]+$"
    },
    "published_on": {
      "title": "date de publication",
      "$ref": "#/$defs/CalendarDate"
    },
    "locale": {
      "title": "langue",
      "description": "Langue des libellés.",
      "type": "string",
      "pattern": "^[a-z]{2}$"
    },
    "tools": {
      "title": "outils",
      "type": "array",
      "items": { "$ref": "#/$defs/Tool" }
    }
  },
  "$defs": {
    "CalendarDate": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "Ref": {
      "type": "string",
      "pattern": "^[a-z][a-z0-9_.-]*$"
    },
    "RefLabel": {
      "description": "Une référence du dictionnaire et son libellé.",
      "type": "object",
      "additionalProperties": false,
      "required": ["ref", "label"],
      "properties": {
        "ref": { "$ref": "#/$defs/Ref" },
        "label": { "type": "string", "minLength": 1 }
      }
    },
    "Cadence": {
      "description": "daily : lu chaque jour. weekly : lu chaque semaine, et affiché comme tel.",
      "enum": ["daily", "weekly"]
    },
    "Tool": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "tool_id",
        "name",
        "vendor_id",
        "status",
        "available_in",
        "regime",
        "reads",
        "cadence",
        "fallback"
      ],
      "properties": {
        "tool_id": {
          "title": "outil",
          "type": "string",
          "pattern": "^[a-z][a-z0-9-]{0,63}$"
        },
        "name": {
          "title": "nom",
          "type": "string",
          "minLength": 1
        },
        "vendor_id": {
          "title": "éditeur",
          "description": "Identifiant de l'éditeur ; pour un outil lu, celui de son application de lecture dans le manifeste de permissions.",
          "type": "string",
          "pattern": "^[a-z][a-z0-9-]{0,31}$"
        },
        "status": {
          "title": "statut",
          "description": "read : lu par une application de lecture du manifeste de permissions. declared : déclaré, sans lecture. planned : prévu, pas encore lu.",
          "enum": ["read", "declared", "planned"]
        },
        "available_in": {
          "title": "disponible en",
          "description": "Version d'Ojja où la lecture arrive (v0.9, v1.0, v1.2…).",
          "type": "string",
          "pattern": "^v\\d+\\.\\d+$"
        },
        "regime": {
          "title": "régime",
          "description": "never_access : nous n'y avons jamais accès. never_touch : nous n'y touchons jamais.",
          "enum": ["never_access", "never_touch"]
        },
        "reads": {
          "title": "ce qui est lu",
          "type": "array",
          "items": { "$ref": "#/$defs/RefLabel" }
        },
        "cadence": {
          "title": "cadence",
          "description": "La cadence de chacun des cinq événements du contrat, section 2.",
          "type": "object",
          "additionalProperties": false,
          "required": ["new_ai_app", "usage_billing", "vendor_terms", "new_model", "data_access"],
          "properties": {
            "new_ai_app": {
              "title": "Nouvelle application IA connectée",
              "$ref": "#/$defs/Cadence"
            },
            "usage_billing": {
              "title": "Facturation à l'usage activée",
              "$ref": "#/$defs/Cadence"
            },
            "vendor_terms": {
              "title": "Conditions d'un éditeur modifiées",
              "description": "Suit la publication du catalogue (zone B) : on_publication, à chaque publication.",
              "enum": ["daily", "weekly", "on_publication"]
            },
            "new_model": {
              "title": "Nouveau modèle derrière une fonction",
              "$ref": "#/$defs/Cadence"
            },
            "data_access": {
              "title": "Nouvel accès aux données",
              "$ref": "#/$defs/Cadence"
            }
          }
        },
        "fallback": {
          "title": "à défaut",
          "description": "Ce qui remplace la lecture quand elle n'est pas possible ; null quand rien ne la remplace.",
          "anyOf": [{ "$ref": "#/$defs/RefLabel" }, { "type": "null" }]
        }
      }
    }
  }
}
