{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://swl-ses.dev/schemas/skill-evals.schema.json",
  "title": "SWL Skill Evals",
  "description": "Artefacto de evaluación estructurada para skills y agentes SWL. Inspirado en el formato de skills Anthropic (LikeC4 likec4-dsl). Permite ejecutar evaluaciones reproducibles y auditables con /swl:evaluar-skill.",
  "type": "object",
  "required": ["skill_name", "schema_version", "evals"],
  "additionalProperties": false,
  "properties": {
    "skill_name": {
      "type": "string",
      "description": "Nombre del skill o agente evaluado. Debe coincidir con el campo `name` del frontmatter del artefacto evaluado.",
      "minLength": 1
    },
    "artifact_type": {
      "type": "string",
      "description": "Tipo de artefacto. Informativo; el validador usa el mismo schema para ambos.",
      "enum": ["skill", "agent", "command", "rule"],
      "default": "skill"
    },
    "schema_version": {
      "type": "integer",
      "description": "Versión del schema. Incrementar al introducir cambios incompatibles.",
      "minimum": 1
    },
    "description": {
      "type": "string",
      "description": "Descripción corta (<200 chars) de qué cubre este set de evals."
    },
    "evals": {
      "type": "array",
      "description": "Lista de casos de evaluación. Cada caso tiene un prompt, expectativas testables y guía de grading.",
      "minItems": 1,
      "items": {
        "$ref": "#/$defs/eval"
      }
    }
  },
  "$defs": {
    "eval": {
      "type": "object",
      "required": ["id", "prompt", "expectations"],
      "additionalProperties": false,
      "properties": {
        "id": {
          "description": "Identificador único del caso. Entero secuencial o slug descriptivo.",
          "oneOf": [
            { "type": "integer", "minimum": 0 },
            { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]{0,63}$" }
          ]
        },
        "prompt": {
          "type": "string",
          "description": "Prompt exacto que se envía al modelo con el skill cargado. Debe ser autocontenido.",
          "minLength": 10
        },
        "files": {
          "type": "array",
          "description": "Archivos adicionales (paths relativos al eval) que el modelo debe poder leer durante la evaluación.",
          "items": { "type": "string" },
          "default": []
        },
        "expected_output": {
          "type": "string",
          "description": "Descripción narrativa breve de cómo debería verse una respuesta correcta. Opcional — las expectations[] son lo normativo."
        },
        "expectations": {
          "type": "array",
          "description": "Lista de invariantes testables. Cada una debe poder verificarse de forma no ambigua leyendo la respuesta del modelo.",
          "minItems": 1,
          "items": {
            "type": "string",
            "minLength": 10
          }
        },
        "grading_guidance": {
          "type": "string",
          "description": "Notas para el evaluador humano o LLM sobre variantes aceptables, flexibilidad en versiones, y qué es estrictamente obligatorio vs. recomendado."
        },
        "tags": {
          "type": "array",
          "description": "Tags opcionales para filtrar subsets (ej: ['regression', 'edge-case', 'anti-pattern']).",
          "items": { "type": "string" }
        },
        "weight": {
          "type": "number",
          "description": "Peso del eval en el score agregado. Default 1.0.",
          "minimum": 0,
          "exclusiveMaximum": 100,
          "default": 1.0
        }
      }
    }
  }
}
