{
  "$schema": "../../schemas/skill-evals.schema.json",
  "skill_name": "revisor-codigo-swl",
  "artifact_type": "agent",
  "schema_version": 1,
  "description": "Evals para revisor-codigo-swl — revisión de código senior con criterios no negociables: dos capas (Spec Compliance + Code Quality), score por 6 dimensiones, detección de code smells con nombre técnico, hallazgos con archivo:línea y ejemplo de corrección.",
  "evals": [
    {
      "id": "primary-flow-aprobado",
      "prompt": "Revisa este código Python que cumple la spec: una función pura que calcula el IVA con tasa configurable, complejidad ciclomática 2, nombres descriptivos, 12 líneas. La spec pedía 'función que calcule IVA'. ¿Cuál es el veredicto de la revisión de 2 capas y qué debe incluir el reporte?",
      "files": [],
      "expectations": [
        "Capa 1 Spec Compliance: CUMPLE — la spec pedía la función, el código la implementa sin scope creep.",
        "Capa 2 Code Quality: APROBADO — complejidad 2 (<=10), 12 líneas (<=30), nombres descriptivos.",
        "El reporte incluye tabla de Métricas objetivas con valores numéricos (complejidad, mantenibilidad, líneas).",
        "El reporte incluye Score por dimensión (6 dimensiones de 1 a 10) con justificación breve.",
        "No inventa hallazgos — reporta explícitamente 'ninguna duplicación significativa' o 'ningún code smell detectado' si es el caso.",
        "El veredicto final es APROBADO (score >= 8.5), no CON OBSERVACIONES."
      ],
      "grading_guidance": "Failure si inventa problemas para parecer riguroso o si omite las métricas numéricas. La regla del agente: 'los reportes vacíos de problemas son tan valiosos como los reportes con 10 problemas'.",
      "tags": ["primary-flow", "dos-capas", "sin-hallazgos"],
      "weight": 1.0
    },
    {
      "id": "edge-case-complejidad-alta",
      "prompt": "Revisa este código Python: función `procesar_pedido(pedido, usuario, config, ctx)` de 78 líneas con 11 ramas condicionales (complejidad ciclomática 11), 5 niveles de anidamiento y mezcla validación + acceso a BD + logging en la misma función. La spec pedía 'procesar un pedido'. ¿Qué hallazgos detecta la revisión y cómo se clasifican?",
      "files": [],
      "expectations": [
        "Detecta complejidad ciclomática 11 > 10 objetivo — hallazgo MAYOR citando Fase 1 métricas.",
        "Detecta Long Method con nombre técnico exacto (78 líneas > 30) — hallazgo MAYOR.",
        "Detecta mezcla de niveles de abstracción (validación + BD + logging) — hallazgo MAYOR citando violación de SRP (Single Responsibility).",
        "Cada hallazgo incluye archivo:línea (o identifica que hace falta el path) y un ejemplo de corrección — función extraída, separación de capas.",
        "El score de la dimensión Complejidad cae claramente (ej: 4/10) y SOLID también (violación de SRP).",
        "El veredicto es APROBADO CON CORRECCIONES o RECHAZADO según si los hallazgos son MAYORES o CRÍTICOS.",
        "No emite veredicto APROBADO con hallazgos MAYORES sin resolver."
      ],
      "grading_guidance": "Failure si usa lenguaje vago ('podría mejorarse', 'quizás') en lugar de citar la regla concreta (archivo:línea, complejidad=11, 78 líneas). Failure si aprueba con CRÍTICO no resuelto.",
      "tags": ["edge-case", "complejidad", "code-smell", "solid"],
      "weight": 1.5
    },
    {
      "id": "anti-pattern-speculative-generality",
      "prompt": "Revisa este código que implementa una feature simple (enviar email de bienvenida) pero introduce: AbstractNotificationStrategy (interfaz), EmailNotificationStrategy, SMSNotificationStrategy (no implementada, lanza NotImplementedError), NotificationFactory con diccionario de strategies, y un configurador por reflexión. Solo se usa el email. La spec pedía 'enviar email de bienvenida al registrarse'. ¿Cómo se clasifica este patrón y qué recomienda el revisor?",
      "files": [],
      "expectations": [
        "Detecta Speculative Generality con ese nombre técnico exacto — abstracciones sin uso real (SMSNotificationStrategy no usada).",
        "Detecta Lazy Class para NotificationFactory si solo delega sin añadir valor.",
        "Verifica Capa 1 Spec Compliance: hay scope creep — la spec pedía email de bienvenida, el código añade framework multi-canal no solicitado.",
        "El veredicto de Capa 1 es NO CUMPLE o PARCIAL por scope creep; si es NO CUMPLE, Capa 2 NO se ejecuta.",
        "El hallazgo cita la regla 'prevencion-sobreingenieria' o el principio: 'tres usos concretos justifican una abstracción; menos de tres, no'.",
        "El ejemplo de corrección muestra la solución directa: una función `enviar_email_bienvenida(usuario)` de <30 líneas sin abstracciones.",
        "NO aprueba el código argumentando que 'es extensible' o 'es buena práctica' — las abstracciones especulativas son deuda, no calidad."
      ],
      "grading_guidance": "Failure si aprueba alegando extensibilidad futura. Failure si omite detectar scope creep en Capa 1. El agente debe citar Speculative Generality por su nombre técnico y recomendar simplificar.",
      "tags": ["anti-pattern", "speculative-generality", "scope-creep", "spec-compliance"],
      "weight": 1.5
    }
  ]
}
