{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://automatizalabs.com/datos/monitorizacion.schema.json",
  "title": "Medición mensual de visibilidad en IA — Automatiza Labs",
  "description": "Contrato de datos de la Monitorización · Visibilidad en IA. Cada medición mensual de un cliente produce un documento con este formato. Reglas de honestidad: cada sistema se mide por separado y nunca se mezclan como un ranking común; toda cifra de presencia se acompaña del tamaño de muestra; no se afirma que una fuente fue utilizada sin evidencia; los documentos de ejemplo llevan tipo 'ejemplo-ilustrativo' y jamás se presentan como mediciones reales.",
  "type": "object",
  "required": ["tipo", "dominio", "periodo", "muestra", "sistemas", "evolucion", "calidad_mencion", "consultas", "oportunidades"],
  "properties": {
    "tipo": {
      "type": "string",
      "enum": ["ejemplo-ilustrativo", "medicion"],
      "description": "'medicion' solo cuando los datos proceden de consultas reales realizadas y registradas; cualquier otro contenido es 'ejemplo-ilustrativo'."
    },
    "dominio": { "type": "string", "description": "Dominio del cliente monitorizado." },
    "empresa": { "type": "string", "description": "Nombre de la empresa monitorizada." },
    "periodo": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}$", "description": "Mes de la medición, AAAA-MM." },
    "muestra": {
      "type": "object",
      "required": ["consultas_analizadas"],
      "properties": {
        "consultas_analizadas": { "type": "integer", "minimum": 1, "description": "Tamaño de la muestra del mes. Siempre visible junto a cualquier porcentaje." },
        "sistemas": { "type": "integer", "description": "Número de sistemas monitorizados." }
      }
    },
    "sistemas": {
      "type": "array",
      "description": "Presencia por sistema, por separado. Índice = con_presencia ÷ consultas × 100.",
      "items": {
        "type": "object",
        "required": ["nombre", "consultas", "con_presencia"],
        "properties": {
          "nombre": { "type": "string" },
          "consultas": { "type": "integer", "minimum": 1 },
          "con_presencia": { "type": "integer", "minimum": 0 }
        }
      }
    },
    "evolucion": {
      "type": "array",
      "description": "Serie mensual del índice global, calculado sobre todas las observaciones (consulta × sistema) para que la fórmula sea estable entre meses.",
      "items": {
        "type": "object",
        "required": ["etiqueta", "observaciones", "con_presencia"],
        "properties": {
          "etiqueta": { "type": "string", "description": "Nombre del mes mostrado." },
          "periodo": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}$" },
          "observaciones": { "type": "integer", "minimum": 1 },
          "con_presencia": { "type": "integer", "minimum": 0 }
        }
      }
    },
    "calidad_mencion": {
      "type": "object",
      "description": "Clasificación de las consultas del mes. correcta: la IA identifica bien empresa, actividad y contexto · parcial: aparece pero con información incompleta · incorrecta: información desactualizada, errónea o confusa · no_aparece: sin mención.",
      "required": ["correcta", "parcial", "incorrecta", "no_aparece"],
      "properties": {
        "correcta": { "type": "integer", "minimum": 0 },
        "parcial": { "type": "integer", "minimum": 0 },
        "incorrecta": { "type": "integer", "minimum": 0 },
        "no_aparece": { "type": "integer", "minimum": 0 }
      }
    },
    "consultas": {
      "type": "array",
      "description": "El registro: una entrada por consulta y sistema, con la evidencia que permite comparar meses.",
      "items": {
        "type": "object",
        "required": ["consulta", "intencion", "sistema", "fecha", "presencia", "calidad"],
        "properties": {
          "consulta": { "type": "string", "description": "Texto exacto de la consulta realizada." },
          "intencion": {
            "type": "string",
            "enum": ["descubrimiento", "comparacion", "recomendacion", "necesidad", "servicio", "marca", "contratacion", "compra", "reserva"],
            "description": "Categoría de intención; las tres últimas son transaccionales."
          },
          "sistema": { "type": "string" },
          "fecha": { "type": "string", "format": "date" },
          "presencia": { "type": "boolean" },
          "posicion_explicita": {
            "type": ["integer", "null"],
            "description": "Solo cuando el sistema devuelve un orden explícito; si no, null (nunca se inventa una posición)."
          },
          "calidad": { "type": "string", "enum": ["correcta", "parcial", "incorrecta", "no_aparece"] },
          "fuente_utilizada": {
            "type": ["string", "null"],
            "description": "URL de la fuente que el sistema usó, solo si hay evidencia; si no, null."
          },
          "pagina_citada": {
            "type": ["string", "null"],
            "description": "Página de la web del cliente citada por el sistema, si la hay."
          },
          "competidores": { "type": "array", "items": { "type": "string" } }
        }
      }
    },
    "oportunidades": {
      "type": "array",
      "description": "Oportunidades detectadas en el mes. Cada una lleva sus cinco campos.",
      "items": {
        "type": "object",
        "required": ["consulta", "sistema", "evidencia", "impacto", "recomendacion"],
        "properties": {
          "consulta": { "type": "string" },
          "sistema": { "type": "string" },
          "evidencia": { "type": "string", "description": "Dato observado, no interpretación." },
          "impacto": { "type": "string", "enum": ["alto", "medio", "bajo"] },
          "recomendacion": { "type": "string", "description": "Acción concreta, sin lenguaje de garantía." }
        }
      }
    }
  }
}
