Claude Code Plugins

Community-maintained marketplace

Feedback

diagnosticar-errores

@mattnigh/skills_collection
0
0

>

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

name diagnosticar-errores
description Ejecuta FASE 3 del Ciclo de Validación - Diagnostica errores, clasifica por categoría, activa SUBFASE 3A (corrección ejemplos), SUBFASE 3B (revalidación FASE 1). Usa automáticamente cuando FASE 1 o FASE 2 detectan errores, o cuando compilación falla. Loop hasta resolver TODOS los errores.
allowed-tools Read, Write, Edit, Grep, Glob, Bash(grep:*), Bash(find:*), Bash(cat:*)

Diagnosticador de Errores R/exams - FASE 3

🎯 Propósito de este Skill

Este skill ejecuta la FASE 3: DECISIÓN Y ACCIÓN del Ciclo de Validación. Es el skill de debugging crítico que analiza errores, los clasifica, propone soluciones y activa las SUBFASES de corrección.

Cuándo usar este skill

Triggers automáticos (Claude lo usa cuando detecta):

  • FASE 1 (validar-renderizado) reporta errores en cualquier formato
  • FASE 2 (validar-coherencia) detecta incoherencias
  • Usuario reporta "error de compilación", "no renderiza", "sale error"
  • Mensaje de error R/exams en conversación
  • Advertencias (warnings) críticas acumuladas

Invocación manual:

/diagnosticar-errores archivo.Rmd
/diagnosticar-errores  # Diagnostica último error reportado

Invocación automática:

  • Se ejecuta automáticamente si FASE 1 o FASE 2 detectan errores
  • Parte integral del Ciclo de Validación

📋 Contexto: Ciclo de Validación Completo

Este skill es la FASE 3 del ciclo de 3 fases:

🔄 FASE 1: RENDERIZADO INICIAL (validar-renderizado)
    ↓
🔍 FASE 2: VALIDACIÓN VISUAL Y FUNCIONAL (validar-coherencia)
    ↓
⚡ FASE 3: DECISIÓN Y ACCIÓN ← ESTE SKILL
    │
    ├── ❌ SIN ERRORES → ✅ Aprobar para producción
    │
    └── ✓ CON ERRORES:
            │
            ├── 📚 SUBFASE 3A: Corrección basada en ejemplos
            │      ├─→ Consultar /A-Produccion/Ejemplos-Funcionales-Rmd/
            │      ├─→ Identificar patrón de solución
            │      └─→ Aplicar corrección
            │
            ├── 🔄 SUBFASE 3B: Revalidación OBLIGATORIA
            │      └─→ Volver a FASE 1 (LOOP)
            │
            └── 📊 SUBFASE 3C: Documentar solución (si éxito)
                   └─→ Actualizar patrones-errores-conocidos.md

Ver ciclo completo en: @.claude/rules/ciclo-validacion.md

📊 Categorías de Errores (4 Tipos)

Categoría 1: ERRORES DE GRÁFICOS (ERR_G)

Prefijo: ERR_G

Código Error Síntomas Patrón Detección Solución
ERR_G1 Gráficas no visualizadas Espacio en blanco donde debe ir gráfico File '*.png' not found include_tikz() condicional
ERR_G2 Gráficas solapadas Gráficos se superponen Inspección visual Ajustar posicionamiento
ERR_G3 Renderizado incorrecto Gráfico visible pero distorsionado Valores incorrectos en plot Revisar código TikZ/Python/R
ERR_G4 Tamaño inadecuado Gráfico muy grande/pequeño Desborda página / ilegible Ajustar scale/width/height
ERR_G5 Leyenda faltante/incorrecta Sin leyenda o valores mal Inspección visual Agregar/corregir legend()
ERR_G6 Ejes sin labels Ejes sin nombre de variable Inspección visual Agregar xlab(), ylab()

Skill de corrección: corregir-graficos (SUBFASE 3A)

Categoría 2: ERRORES DE TEXTO (ERR_T)

Prefijo: ERR_T

Código Error Síntomas Patrón Detección Solución
ERR_T1 LaTeX no compila PDF falla LaTeX Error: ! Undefined control sequence Revisar sintaxis LaTeX
ERR_T2 Encoding incorrecto Caracteres raros (é, ñ) invalid multibyte string encoding = "UTF-8"
ERR_T3 Metadatos faltantes Advertencia missing exname exname, extype ausentes Completar Meta-information
ERR_T4 Ecuaciones mal formateadas Ecuación no renderiza $ $ sin cerrar, sintaxis LaTeX Revisar delimitadores LaTeX
ERR_T5 Caracteres especiales Error LaTeX por %, _, # ! LaTeX Error: Missing \begin Escapar: %, _, #

Skill de corrección: Manual (Edit tool)

Categoría 3: ERRORES DE ESTRUCTURA (ERR_S)

Prefijo: ERR_S

Código Error Síntomas Patrón Detección Solución
ERR_S1 Opciones incorrectas <4 opciones o duplicados length(answerlist) < 4 Regenerar opciones
ERR_S2 Solución no coincide exsolution incorrecto Manual verification Recalcular respuesta
ERR_S3 Answerlist faltante Sin lista de respuestas Grep Answerlist → not found Agregar Answerlist
ERR_S4 CLOZE gaps incorrectos ##ANSWER1## mal numerados Gaps salteados (1, 3, 4) Renumerar secuencial
ERR_S5 extol/exclozetype desincronizado Número elementos ≠ gaps Count mismatch Igualar longitudes

Skill de corrección: Manual (Edit tool) + validación

Categoría 4: ERRORES DE COHERENCIA (ERR_C)

Prefijo: ERR_C

Código Error Síntomas Patrón Detección Solución
ERR_C1 Coherencia matemática Cálculo incorrecto Manual verification Revisar lógica
ERR_C2 Coherencia imagen-texto Descripción ≠ gráfico Inspección visual Alinear texto/visual
ERR_C3 Coherencia de código Variables R/Python desincronizadas non-numeric argument Sincronizar parámetros
ERR_C4 Coherencia opciones Distractores ilógicos Todas opciones cercanas Diversificar distractores
ERR_C5 Coherencia metadatos Metadatos ≠ contenido Nivel 1 pero problema complejo Alinear clasificación

Skill de corrección: Manual (revisión completa)

🔍 Algoritmo de Diagnóstico (Decision Tree)

Diagrama de Decisión

Error reportado
    │
    ├─→ ¿Contiene "File.*png.*not found"?
    │    └─→ SÍ → ERR_G1 (Gráficas no visualizadas)
    │
    ├─→ ¿Contiene "LaTeX Error" o "! Undefined"?
    │    └─→ SÍ → ERR_T1 (LaTeX no compila)
    │
    ├─→ ¿Contiene "invalid multibyte"?
    │    └─→ SÍ → ERR_T2 (Encoding incorrecto)
    │
    ├─→ ¿Contiene "object.*not found"?
    │    └─→ SÍ → ERR_C3 (Variable R no definida)
    │
    ├─→ ¿Contiene "exercise type 'cloze'.*not supported"?
    │    └─→ SÍ → ERR_S5 (CLOZE incompatible con NOPS)
    │
    ├─→ ¿Contiene "non-numeric argument"?
    │    └─→ SÍ → ERR_C3 (Coherencia de código)
    │
    ├─→ ¿Contiene "exsolution"?
    │    └─→ SÍ → ERR_S2 (Solución incorrecta)
    │
    └─→ NO → Analizar archivo .Rmd completo
            │
            ├─→ ¿Falta "exname:"? → ERR_T3
            ├─→ ¿Answerlist < 4 items? → ERR_S1
            ├─→ ¿Gaps CLOZE no secuenciales? → ERR_S4
            └─→ Categorizar como ERR_X (Desconocido)

Código de Diagnóstico Completo

#!/usr/bin/env Rscript

diagnosticar_error <- function(mensaje_error, archivo_rmd = NULL, contexto = NULL) {

  # PASO 1: Diagnóstico por patrón de mensaje

  # Gráficos
  if (grepl("File.*\\.png.*not found|include_tikz.*failed", mensaje_error, ignore.case = TRUE)) {
    return(list(
      categoria = "GRÁFICOS",
      codigo = "ERR_G1",
      descripcion = "Gráficas no visualizadas",
      causa = "include_tikz() no funciona o ruta incorrecta",
      skill_correccion = "corregir-graficos",
      prioridad = "ALTA",
      solucion_sugerida = "Usar renderizado condicional: if (knitr::is_latex_output())"
    ))
  }

  # LaTeX
  if (grepl("LaTeX Error|! Undefined control sequence|! Missing", mensaje_error)) {
    # Detectar tipo específico de error LaTeX
    if (grepl("tikz\\.sty|pgfplots\\.sty", mensaje_error)) {
      return(list(
        categoria = "TEXTO",
        codigo = "ERR_T1",
        descripcion = "Paquete LaTeX faltante",
        causa = "header-includes no tiene \\usepackage{tikz}",
        skill_correccion = "manual-edit",
        prioridad = "CRÍTICA",
        solucion_sugerida = "Agregar en YAML:\nheader-includes:\n  - \\usepackage{tikz}"
      ))
    } else if (grepl("babel.*spanish", mensaje_error)) {
      return(list(
        categoria = "TEXTO",
        codigo = "ERR_T1",
        descripcion = "Babel/Spanish no configurado",
        causa = "Paquete babel español faltante",
        skill_correccion = "manual-edit",
        prioridad = "CRÍTICA",
        solucion_sugerida = "Agregar:\n\\usepackage[spanish]{babel}\n\\decimalpoint"
      ))
    } else {
      return(list(
        categoria = "TEXTO",
        codigo = "ERR_T1",
        descripcion = "LaTeX no compila",
        causa = "Error genérico de sintaxis LaTeX",
        skill_correccion = "manual-edit",
        prioridad = "ALTA",
        solucion_sugerida = "Revisar log de LaTeX, verificar caracteres especiales"
      ))
    }
  }

  # Encoding
  if (grepl("invalid multibyte|UTF-8|encoding", mensaje_error, ignore.case = TRUE)) {
    return(list(
      categoria = "TEXTO",
      codigo = "ERR_T2",
      descripcion = "Encoding incorrecto",
      causa = "Archivo no está en UTF-8 o falta especificar encoding",
      skill_correccion = "manual-edit",
      prioridad = "MEDIA",
      solucion_sugerida = "Agregar encoding = 'UTF-8' en exams2*() calls"
    ))
  }

  # Variables R no definidas
  if (grepl("object.*not found|Error in eval", mensaje_error)) {
    # Extraer nombre de variable si es posible
    variable <- sub(".*object '(.*)' not found.*", "\\1", mensaje_error)
    return(list(
      categoria = "COHERENCIA",
      codigo = "ERR_C3",
      descripcion = "Variable R no definida",
      causa = sprintf("Variable '%s' no está calculada o no está en la lista retornada", variable),
      skill_correccion = "manual-edit",
      prioridad = "CRÍTICA",
      solucion_sugerida = sprintf("Verificar que '%s' está en generar_datos() y se retorna en la lista", variable)
    ))
  }

  # CLOZE incompatible con NOPS
  if (grepl("exercise type 'cloze'.*not supported|exams2nops.*cloze", mensaje_error, ignore.case = TRUE)) {
    return(list(
      categoria = "ESTRUCTURA",
      codigo = "ERR_S5",
      descripcion = "CLOZE incompatible con NOPS",
      causa = "NOPS solo soporta schoice/mchoice, no CLOZE con num/string",
      skill_correccion = "none",
      prioridad = "BAJA",
      solucion_sugerida = "Aceptar que NOPS fallará para este ejercicio CLOZE (es esperado)"
    ))
  }

  # Argumentos non-numeric
  if (grepl("non-numeric argument|NaN produced", mensaje_error)) {
    return(list(
      categoria = "COHERENCIA",
      codigo = "ERR_C3",
      descripcion = "Operación matemática con valores no numéricos",
      causa = "Variable formateada (string) usada en cálculo numérico",
      skill_correccion = "manual-edit",
      prioridad = "ALTA",
      solucion_sugerida = "Usar variable numérica original, no formateada (formatear solo al mostrar)"
    ))
  }

  # PASO 2: Si hay archivo .Rmd, analizar contenido
  if (!is.null(archivo_rmd) && file.exists(archivo_rmd)) {
    contenido <- readLines(archivo_rmd, warn = FALSE)

    # Verificar metadatos
    if (!any(grepl("^exname:", contenido))) {
      return(list(
        categoria = "TEXTO",
        codigo = "ERR_T3",
        descripcion = "Metadatos faltantes (exname)",
        causa = "No hay sección Meta-information completa",
        skill_correccion = "manual-edit",
        prioridad = "CRÍTICA",
        solucion_sugerida = "Agregar al final:\nMeta-information\n================\nexname: Nombre Ejercicio"
      ))
    }

    # Verificar Answerlist
    answerlist_lines <- grep("^\\* ", contenido, value = TRUE)
    if (length(answerlist_lines) < 4) {
      return(list(
        categoria = "ESTRUCTURA",
        codigo = "ERR_S1",
        descripcion = "Menos de 4 opciones en Answerlist",
        causa = sprintf("Solo %d opciones detectadas", length(answerlist_lines)),
        skill_correccion = "manual-edit",
        prioridad = "ALTA",
        solucion_sugerida = "Agregar opciones hasta tener mínimo 4"
      ))
    }

    # Verificar gaps CLOZE secuenciales (si es CLOZE)
    if (any(grepl("extype: cloze", contenido, ignore.case = TRUE))) {
      gaps <- grep("##ANSWER[0-9]+##", contenido, value = TRUE)
      gap_nums <- as.numeric(sub(".*##ANSWER([0-9]+)##.*", "\\1", gaps))
      if (length(gap_nums) > 0) {
        esperado <- 1:max(gap_nums)
        if (!all(esperado %in% gap_nums)) {
          return(list(
            categoria = "ESTRUCTURA",
            codigo = "ERR_S4",
            descripcion = "Gaps CLOZE no secuenciales",
            causa = sprintf("Gaps detectados: %s, esperado: 1 a %d",
                          paste(sort(unique(gap_nums)), collapse = ", "),
                          max(gap_nums)),
            skill_correccion = "manual-edit",
            prioridad = "ALTA",
            solucion_sugerida = "Renumerar gaps secuencialmente sin saltos"
          ))
        }
      }
    }
  }

  # PASO 3: Error no clasificado
  return(list(
    categoria = "DESCONOCIDO",
    codigo = "ERR_X",
    descripcion = "Error no clasificado",
    causa = "Patrón no reconocido",
    skill_correccion = "manual-analysis",
    prioridad = "MEDIA",
    solucion_sugerida = "Revisar log completo, consultar patrones-errores-conocidos.md"
  ))
}

# Función para generar reporte de diagnóstico
generar_reporte_diagnostico <- function(diagnostico) {
  cat("\n╔════════════════════════════════════════╗\n")
  cat("║     DIAGNÓSTICO DE ERROR               ║\n")
  cat("╠════════════════════════════════════════╣\n")
  cat(sprintf("║ Categoría: %-28s║\n", diagnostico$categoria))
  cat(sprintf("║ Código: %-31s║\n", diagnostico$codigo))
  cat(sprintf("║ Prioridad: %-28s║\n", diagnostico$prioridad))
  cat("║                                        ║\n")
  cat(sprintf("║ Descripción:                           ║\n"))
  cat(sprintf("║   %s\n", diagnostico$descripcion))
  cat("║                                        ║\n")
  cat(sprintf("║ Causa probable:                        ║\n"))
  cat(sprintf("║   %s\n", diagnostico$causa))
  cat("║                                        ║\n")
  cat(sprintf("║ Solución recomendada:                  ║\n"))
  # Imprimir solución multilínea
  solucion_lines <- strsplit(diagnostico$solucion_sugerida, "\n")[[1]]
  for (line in solucion_lines) {
    cat(sprintf("║   %s\n", line))
  }
  cat("║                                        ║\n")
  cat(sprintf("║ Skill a activar: %-21s║\n", diagnostico$skill_correccion))
  cat("╚════════════════════════════════════════╝\n\n")
}

# Ejemplo de uso
# diagnostico <- diagnosticar_error(
#   "Error: File 'grafico.png' not found",
#   archivo_rmd = "ejercicio.Rmd"
# )
# generar_reporte_diagnostico(diagnostico)

🔍 Proceso de Ejecución Paso a Paso

PASO 1: Recibir Errores de FASE 1 o FASE 2

Input esperado:

  1. De FASE 1 (validar-renderizado):

    • Lista de errores por formato (HTML, PDF, DOCX, NOPS)
    • Mensajes de error completos
    • Warnings acumulados
  2. De FASE 2 (validar-coherencia):

    • Incoherencias matemáticas detectadas
    • Problemas imagen-texto
    • Problemas de coherencia de código

Formato de input:

errores_fase1 <- list(
  html = NULL,  # Sin error
  pdf = "LaTeX Error: File `tikz.sty' not found",
  docx = NULL,
  nops = "LaTeX Error: File `tikz.sty' not found"
)

errores_fase2 <- list(
  coherencia_matematica = NULL,
  coherencia_imagen = "Gráfico muestra 5 barras pero texto menciona 6 meses",
  coherencia_codigo = NULL
)

PASO 2: Clasificar Errores por Categoría

Ejecutar algoritmo de diagnóstico para cada error:

diagnosticos <- list()

# Clasificar errores de FASE 1
for (formato in names(errores_fase1)) {
  if (!is.null(errores_fase1[[formato]])) {
    diag <- diagnosticar_error(
      mensaje_error = errores_fase1[[formato]],
      archivo_rmd = "ejercicio.Rmd"
    )
    diag$origen <- sprintf("FASE 1 (%s)", toupper(formato))
    diagnosticos <- c(diagnosticos, list(diag))
  }
}

# Clasificar errores de FASE 2
for (tipo in names(errores_fase2)) {
  if (!is.null(errores_fase2[[tipo]])) {
    diag <- diagnosticar_error(
      mensaje_error = errores_fase2[[tipo]],
      archivo_rmd = "ejercicio.Rmd",
      contexto = "FASE2"
    )
    diag$origen <- sprintf("FASE 2 (%s)", tipo)
    diagnosticos <- c(diagnosticos, list(diag))
  }
}

PASO 3: Priorizar Errores

Orden de prioridad:

  1. CRÍTICA (bloquea todo)
  2. ALTA (bloquea formatos principales)
  3. MEDIA (afecta calidad)
  4. BAJA (opcional/esperado)

Reordenar diagnósticos:

orden_prioridad <- c("CRÍTICA", "ALTA", "MEDIA", "BAJA")
diagnosticos <- diagnosticos[order(match(sapply(diagnosticos, function(d) d$prioridad), orden_prioridad))]

PASO 4: Generar Reporte de Diagnóstico

Reporte completo con todos los diagnósticos:

═══════════════════════════════════════════════════════════
⚡ FASE 3: DIAGNÓSTICO Y DECISIÓN
═══════════════════════════════════════════════════════════

Archivo: ecuacion_cuadratica_numerico_variacional_formulacion_ejecucion_n2_v1.Rmd
Errores detectados: 2
Prioridad máxima: CRÍTICA

╔════════════════════════════════════════╗
║     DIAGNÓSTICO DE ERROR #1            ║
╠════════════════════════════════════════╣
║ Origen: FASE 1 (PDF)                   ║
║ Categoría: TEXTO                       ║
║ Código: ERR_T1                         ║
║ Prioridad: CRÍTICA                     ║
║                                        ║
║ Descripción:                           ║
║   Paquete LaTeX faltante               ║
║                                        ║
║ Causa probable:                        ║
║   header-includes no tiene \usepackage{tikz}
║                                        ║
║ Solución recomendada:                  ║
║   Agregar en YAML:                     ║
║   header-includes:                     ║
║     - \usepackage{tikz}                ║
║                                        ║
║ Skill a activar: manual-edit           ║
╚════════════════════════════════════════╝

╔════════════════════════════════════════╗
║     DIAGNÓSTICO DE ERROR #2            ║
╠════════════════════════════════════════╣
║ Origen: FASE 2 (coherencia_imagen)    ║
║ Categoría: COHERENCIA                  ║
║ Código: ERR_C2                         ║
║ Prioridad: ALTA                        ║
║                                        ║
║ Descripción:                           ║
║   Coherencia imagen-texto              ║
║                                        ║
║ Causa probable:                        ║
║   Descripción ≠ gráfico                ║
║                                        ║
║ Solución recomendada:                  ║
║   Alinear número de barras en gráfico  ║
║   con texto del enunciado              ║
║                                        ║
║ Skill a activar: manual-edit           ║
╚════════════════════════════════════════╝

═══════════════════════════════════════════════════════════
→ SIGUIENTE: SUBFASE 3A - Corrección basada en ejemplos
═══════════════════════════════════════════════════════════

PASO 5: Ejecutar SUBFASE 3A - Corrección Basada en Ejemplos

OBLIGATORIO: Consultar ejemplos funcionales ANTES de cualquier corrección

Proceso detallado:

# 1. Listar ejemplos funcionales disponibles
ls -lh /A-Produccion/Ejemplos-Funcionales-Rmd/*.Rmd

# 2. Buscar ejemplos con patrón similar al error
# Ejemplo: ERR_T1 (paquete tikz faltante)
grep -l "usepackage{tikz}" /A-Produccion/Ejemplos-Funcionales-Rmd/*.Rmd

# Ejemplo: ERR_G1 (gráficas no visualizadas)
grep -l "include_tikz\|is_latex_output" /A-Produccion/Ejemplos-Funcionales-Rmd/*.Rmd

# 3. Leer ejemplo funcional completo
cat /A-Produccion/Ejemplos-Funcionales-Rmd/ejemplo_con_tikz.Rmd

# 4. Extraer patrón de solución
# Identificar sección específica que resuelve el error
grep -A 10 "header-includes" /A-Produccion/Ejemplos-Funcionales-Rmd/ejemplo_con_tikz.Rmd

# 5. Aplicar corrección basada en ejemplo
# Copiar patrón exacto del ejemplo funcional

Ejemplo de aplicación:

Antes (con error ERR_T1):

---
output:
  pdf_document:
    keep_tex: true
---

Después (basado en ejemplo funcional):

---
output:
  pdf_document:
    keep_tex: true
header-includes:
  - \usepackage{tikz}
  - \usepackage{pgfplots}
  - \pgfplotsset{compat=1.18}
  - \usepackage[spanish]{babel}
  - \decimalpoint
---

PASO 6: Ejecutar SUBFASE 3B - Revalidación OBLIGATORIA

⚠️ CRÍTICO: SIEMPRE volver a FASE 1 después de aplicar correcciones

Proceso:

# 1. Aplicar corrección (SUBFASE 3A completada)

# 2. OBLIGATORIO: Volver a FASE 1
validar-renderizado ejercicio.Rmd

# 3. Ejecutar FASE 2
validar-coherencia ejercicio.Rmd

# 4. Volver a FASE 3 (este skill)
diagnosticar-errores ejercicio.Rmd

# 5. Verificar resultado:
#    - SI errores persisten → Volver a SUBFASE 3A con solución alternativa
#    - SI errores nuevos → Diagnosticar y corregir
#    - SI sin errores → Continuar a SUBFASE 3C

Diagrama de loop:

SUBFASE 3A: Corregir
    ↓
SUBFASE 3B: Revalidar
    ↓
¿Errores resueltos?
    │
    ├─→ NO → Volver a SUBFASE 3A (solución alternativa)
    │         ↓
    │    [LOOP hasta resolver]
    │
    └─→ SÍ → Continuar a SUBFASE 3C

Regla Absoluta: NO terminar ciclo hasta resolver TODOS los errores.

PASO 7: Ejecutar SUBFASE 3C - Documentar Solución (Solo si éxito)

Solo después de revalidación 100% exitosa:

Proceso de documentación:

# 1. Abrir archivo de patrones de errores
nano .claude/docs/patrones-errores-conocidos.md

# 2. Agregar nueva entrada siguiendo formato

Formato de documentación:

## Error N: [Título descriptivo del error]

### ❌ Mensaje de Error

[Mensaje exacto del error]


### 🔍 Causa Raíz
[Explicación técnica del problema]

### ✅ Solución Verificada

**Código ANTES:**
```yaml
[Código con error]

Código DESPUÉS:

[Código corregido]

🧪 Validación de la Solución

[Comandos ejecutados y resultados]
- HTML: ✅
- PDF: ✅
- DOCX: ✅
- NOPS: ✅

📋 Checklist de Corrección

  • Paso 1: [acción específica]
  • Paso 2: [acción específica]
  • Paso 3: [acción específica]

📚 Ejemplo Funcional Utilizado

[Referencia a archivo en /A-Produccion/Ejemplos-Funcionales-Rmd/]

  • Archivo: ejemplo_con_tikz.Rmd
  • Patrón copiado: header-includes con TikZ

📅 Historial

Fecha Archivo Resultado
2025-12-30 ecuacion_cuadratica_n2_v1.Rmd ✅ Resuelto

Ver principio completo en: @.claude/rules/documentacion-verificada.md

## 🎓 Ejemplos Completos de Diagnóstico

### Ejemplo 1: ERR_T1 - Paquete LaTeX Faltante

**Contexto:**
- FASE 1 reporta: PDF y NOPS fallan
- Error: `! LaTeX Error: File 'tikz.sty' not found`

**Diagnóstico:**

╔════════════════════════════════════════╗ ║ DIAGNÓSTICO DE ERROR ║ ╠════════════════════════════════════════╣ ║ Categoría: TEXTO ║ ║ Código: ERR_T1 ║ ║ Prioridad: CRÍTICA ║ ║ Descripción: Paquete LaTeX faltante ║ ║ Causa: header-includes sin \usepackage{tikz} ║ ║ Solución: Agregar en YAML ║ ║ Skill: manual-edit ║ ╚════════════════════════════════════════╝


**SUBFASE 3A - Corrección:**
```bash
# Consultar ejemplo funcional
grep -l "usepackage{tikz}" /A-Produccion/Ejemplos-Funcionales-Rmd/*.Rmd
# Resultado: ejemplo_geometria_triangulo.Rmd

# Leer header del ejemplo
head -20 /A-Produccion/Ejemplos-Funcionales-Rmd/ejemplo_geometria_triangulo.Rmd

# Copiar patrón

Aplicar corrección:

header-includes:
  - \usepackage{tikz}
  - \usepackage{pgfplots}
  - \pgfplotsset{compat=1.18}

SUBFASE 3B - Revalidar:

Rscript validar_fase1.R ejercicio.Rmd
# Resultado: 4/4 formatos OK ✅

SUBFASE 3C - Documentar: Agregar a patrones-errores-conocidos.md (patrón ya documentado, solo actualizar historial)

Ejemplo 2: ERR_G1 - Gráficas No Visualizadas

Contexto:

  • FASE 2 reporta: Gráfico no se ve en PDF
  • Advertencia FASE 1: File 'grafico.png' not found

Diagnóstico:

╔════════════════════════════════════════╗
║ Categoría: GRÁFICOS                    ║
║ Código: ERR_G1                         ║
║ Prioridad: ALTA                        ║
║ Descripción: Gráficas no visualizadas  ║
║ Causa: include_tikz en chunk incorrecto║
║ Solución: Renderizado condicional      ║
║ Skill: corregir-graficos               ║
╚════════════════════════════════════════╝

SUBFASE 3A - Corrección:

# Consultar ejemplos con renderizado condicional
grep -l "is_latex_output\|include_tikz" /A-Produccion/Ejemplos-Funcionales-Rmd/*.Rmd
# Resultado: grafico_barras_ggplot2.Rmd, grafico_lineas_poblacion.Rmd

Antes (código con error):

```{r data_generation, include=FALSE}
# ... generar gráfico ...
include_tikz("grafico.tex")  # ❌ Falla en HTML

**Después (basado en ejemplo funcional):**
```r
```{r data_generation, include=FALSE}
# ... generar gráfico ...

# Renderizado condicional
if (knitr::is_latex_output()) {
  include_tikz("grafico.tex")
} else {
  knitr::include_graphics("grafico.png")
}

**SUBFASE 3B - Revalidar:**
```bash
Rscript validar_fase1.R ejercicio.Rmd
# Resultado: 4/4 formatos OK ✅

Ejemplo 3: ERR_C3 - Variable R No Definida

Contexto:

  • FASE 1 reporta: HTML, PDF, DOCX, NOPS todos fallan (0/4)
  • Error: object 'resultado' not found

Diagnóstico:

╔════════════════════════════════════════╗
║ Categoría: COHERENCIA                  ║
║ Código: ERR_C3                         ║
║ Prioridad: CRÍTICA                     ║
║ Descripción: Variable R no definida    ║
║ Causa: 'resultado' no en generar_datos()║
║ Solución: Agregar a lista retornada    ║
║ Skill: manual-edit                     ║
╚════════════════════════════════════════╝

SUBFASE 3A - Corrección:

# Revisar función generar_datos()

# Antes (código con error):
generar_datos <- function() {
  a <- sample(2:10, 1)
  b <- sample(5:15, 1)
  resultado <- a * b  # ✓ Calculado

  list(
    a = a,
    b = b
    # ❌ 'resultado' NO retornado
  )
}

# Después (corregido):
generar_datos <- function() {
  a <- sample(2:10, 1)
  b <- sample(5:15, 1)
  resultado <- a * b

  list(
    a = a,
    b = b,
    resultado = resultado  # ✅ Agregado
  )
}

SUBFASE 3B - Revalidar:

Rscript validar_fase1.R ejercicio.Rmd
# Resultado: 4/4 formatos OK ✅

⚠️ Patrones de Errores Conocidos

Patrón 1: TikZ No Renderiza en HTML

Síntomas:

  • PDF OK, HTML muestra espacio en blanco

Diagnóstico:

  • ERR_G1

Solución verificada:

if (knitr::is_latex_output()) {
  include_tikz("grafico.tex")
} else {
  knitr::include_graphics("grafico.png")
}

Ejemplo funcional:

  • /A-Produccion/Ejemplos-Funcionales-Rmd/grafico_lineas_poblacion.Rmd

Patrón 2: Caracteres Especiales Rompen LaTeX

Síntomas:

  • PDF falla con ! LaTeX Error: Missing \begin{document}
  • HTML OK

Diagnóstico:

  • ERR_T5

Solución verificada: Escapar caracteres: _\_, %\%, #\#, &\&

Ejemplo funcional:

  • Ver patrones-errores-conocidos.md (Error 7)

Patrón 3: CLOZE Falla en NOPS

Síntomas:

  • HTML/PDF/DOCX OK (3/4)
  • NOPS falla: exercise type 'cloze' with 'num' not supported

Diagnóstico:

  • ERR_S5

Solución: Aceptar que NOPS fallará. Es comportamiento esperado para CLOZE con gaps num/string.

Acción: Ninguna. Marcar error como BAJA prioridad y continuar.

Patrón 4: Operación con Variable Formateada

Síntomas:

  • Error: non-numeric argument to binary operator

Diagnóstico:

  • ERR_C3

Causa:

# Incorrecto:
poblacion <- formatear_entero(poblacion_inicial)  # "150.000" (string)
incremento <- poblacion * 1.05  # ❌ Error: string * number

Solución:

# Correcto:
poblacion <- poblacion_inicial  # 150000 (numeric)
poblacion_formateada <- formatear_entero(poblacion)  # "150.000" (solo para mostrar)
incremento <- poblacion * 1.05  # ✅ OK: numeric * number

⛔ CONDICIONES CRÍTICAS

Obligatorio ANTES de iniciar diagnóstico

  1. ✓ Recibir lista completa de errores de FASE 1 y/o FASE 2
  2. ✓ Tener archivo .Rmd accesible para análisis
  3. ✓ Acceso a /A-Produccion/Ejemplos-Funcionales-Rmd/
  4. ✓ Acceso a patrones-errores-conocidos.md

Obligatorio DURANTE el diagnóstico

  1. ✓ Clasificar TODOS los errores (no omitir ninguno)
  2. ✓ Priorizar por nivel crítico
  3. ✓ SIEMPRE consultar ejemplos funcionales ANTES de corregir
  4. ✓ Aplicar soluciones basadas en ejemplos, NO improvisar
  5. ✓ Documentar diagnóstico completo

Obligatorio DESPUÉS de aplicar correcciones

  1. ✓ SIEMPRE ejecutar SUBFASE 3B (revalidación FASE 1)
  2. ✓ NUNCA marcar como "completado" si quedan errores
  3. ✓ Si errores persisten → Volver a SUBFASE 3A con solución alternativa
  4. ✓ Solo si éxito 100% → Ejecutar SUBFASE 3C (documentar)
  5. ✓ NO terminar ciclo hasta resolver TODOS los errores

Regla Absoluta: LOOP hasta éxito total. NO hay alternativa a resolver los errores.

🔗 Referencias y Documentación

Archivos de Referencia Obligatorios

  • Ciclo Validación: @.claude/rules/ciclo-validacion.md (FASE 1→2→3 + SUBFASES)
  • Ejemplos Funcionales: @A-Produccion/Ejemplos-Funcionales-Rmd/ (FUENTE DE VERDAD)
  • Patrones Errores: @.claude/docs/patrones-errores-conocidos.md
  • Reglas Código: @.claude/rules/codigo-rmd.md

Reglas del Proyecto (OBLIGATORIAS)

  • @.claude/rules/ciclo-validacion.md - FASE 1→2→3 + SUBFASES
  • @.claude/rules/codigo-rmd.md - Pre-edit/write checks
  • @.claude/rules/documentacion-verificada.md - Solo documentar verificado

Documentación Técnica

  • @.claude/docs/WORKFLOW_PASO_A_PASO.md - Flujo completo
  • @.claude/docs/TROUBLESHOOTING.md - Solución problemas
  • @.claude/docs/TRES_NIVELES_VALIDACION.md - Detalle 3 niveles

🚀 Integración con Otros Skills

Este skill se integra en el Ciclo de Validación:

generar-schoice / generar-cloze
    ↓
validar-renderizado (FASE 1)
    ↓
validar-coherencia (FASE 2)
    ↓
diagnosticar-errores ← ESTE SKILL (FASE 3)
    ↓
    ├─→ [Sin errores] → promover-ejercicio
    │
    └─→ [Con errores]:
            │
            ├─→ SUBFASE 3A: corregir-graficos (si ERR_G*)
            │                manual-edit (otros errores)
            │
            ├─→ SUBFASE 3B: validar-renderizado (LOOP)
            │                ↓
            │           validar-coherencia
            │                ↓
            │           [Volver aquí] diagnosticar-errores
            │
            └─→ SUBFASE 3C: Actualizar patrones-errores-conocidos.md
                           (solo si éxito)

Skills relacionados:

  • Prerequisito: validar-renderizado (FASE 1) y/o validar-coherencia (FASE 2)
  • SUBFASE 3A: corregir-graficos (si ERR_G*), manual Edit (otros)
  • SUBFASE 3B: Volver a validar-renderizado → LOOP
  • Final: promover-ejercicio (si sin errores)

📊 Output Final Esperado

Después de usar este skill, debes tener:

Si hay errores:

outputs/
├── diagnostico_fase3.txt (reporte completo de diagnóstico)
├── correcion_aplicada.log (log de correcciones)
└── revalidacion_fase1.txt (resultado de SUBFASE 3B)

Reporte de FASE 3 debe contener:

  • ✓ Lista de errores clasificados (código, categoría, prioridad)
  • ✓ Diagnóstico detallado de cada error
  • ✓ Solución recomendada basada en ejemplos
  • ✓ Skill de corrección a activar
  • ✓ Ejemplo funcional utilizado
  • ✓ Resultado de revalidación (SUBFASE 3B)

Si sin errores:

═══════════════════════════════════════════════════════════
⚡ FASE 3: SIN ERRORES DETECTADOS
═══════════════════════════════════════════════════════════
✅ Ejercicio aprobado para promoción
→ SIGUIENTE: promover-ejercicio
═══════════════════════════════════════════════════════════

Última actualización: 2025-12-30 Versión: 2.0 (Progressive Disclosure) Basado en: Ciclo de Validación oficial + Claude Code best practices (nov 2025)