DeSumarIntegrar — Curso de Matemáticas Completo
Curso de matemáticas de Ntizar (David Antizar) que cubre desde 1º Primaria hasta 1º de Carrera universitaria. 107+ archivos HTML interactivos, ~1.2 MB.
Referencias
references/cron-course-generation-pattern.md — Patrón de generación de cursos educativos con crons encadenados: mega-plan + progress.json + cron generador auto-actualizable + cron verificador diario. Aplica a cualquier materia, no solo matemáticas.
references/progress-json-schema.md — Schema de progress.json, campos de scores, pitfall de conteo canvas
references/cron-mejora-continua-config.md — Configuración del cron de mejora continua, historial de ejecuciones
references/patch-escape-js-multiline.md — Pitfall: patch() escapa newlines al insertar JS multilinea en HTML
references/css-bar-chart-primaria.md
references/css-grid-cards-table.md — Patrón de tabla de tarjetas CSS con grid para mostrar tablas completas de resultados en primaria (reemplazo ligero de Plotly). Colores semánticos (verde/naranja/rojo). — Patrón de gráfico de barras CSS+emoji para primaria (sin Plotly). Plotly SOLO en Bachiller/Universidad (ver primaria-plotly-pattern.md para la excepción).
references/canvas-interactivo-primaria.md — Patrón canvas interactivo (pizarra mágica) para temas de figuras geométricas en primaria
references/canvas-figuras-compuestas.md — Patrón canvas de figuras compuestas seleccionables (L/T/H) con quiz integrado. Diferente de pizarra mágica: es evaluación, no dibujo libre.
references/canvas-balanza-peso.md — Patrón de balanza interactiva para temas de peso/masa en primaria: animales con pesos reales, click para revelar, comparación visual
references/primaria-plotly-pattern.md — Patrón para añadir Plotly a archivos de primaria: CDN, contenedor, JS con guard, verificación.
references/css-decimal-alignment-grid.md — Patrón de CSS grid para visualizar alineación de comas decimales (sin canvas). Útil para temas de sumar/restar decimales en primaria.
references/audit-completo.md — Script de auditoría completa del proyecto: cobertura de tecnologías (KaTeX, Plotly, ejercicios, interactividad), estado CSS (glassmorphism, variables, inline styles), por nivel, temas pendientes. Resultado 2026-06-13: 101 archivos, glassmorphism ausente en 97/101, 52/101 con >15 estilos inline, ESO sin Plotly, 17 pendientes (12 estadística).
references/problema-inverso-pista-contextual.md — Patrón de ejercicios inversos (hallar minuendo/sustraendo/factor) con pistas contextuales en feedback. Incluye tabla de 4 tipos de problema inverso.
references/write-file-python-escaping.md — Patrón de escape de comillas simples en write_file con Python triple-quoted strings para HTML con JS inline.
references/individual-feedback-functions-pattern.md — Patrón de funciones individuales con feedback rico (checkE6, checkE7...) vs funciones unificadas. Regla de decisión: usar individual solo cuando cada ejercicio necesita explicación específica del "por qué".
references/primaria-plotly-dynamic-chart.md — Patrón para gráficos Plotly de barras con botones interactivos (randomizar/ordenar) en primaria.
references/connection-box-pattern.md — Patrón de caja pedagógica "Conexión" que conecta el tema actual con algo ya aprendido.
references/connection-espejos-pattern.md — Patrón de conexión restar↔sumar como "espejos" (inversas). NUNCA usar multiplicación como analogía para restar en 1º Primaria.
references/mnemonic-trick-pattern.md — Patrón de caja "Truco mnemotécnico" con analogía visual para recordar conceptos abstractos.
references/complete-repeated-addition-pattern.md — Patrón de ejercicio "completar suma repetida" para introducción a multiplicación: 3 × 4 = __ + __ + __.
references/exercise-type-verification.md — Script Python para verificar programáticamente la variedad de ejercicios antes de commitear.
references/progress-filename-mapping.md
references/canvas-fracciones-equivalentes.md — Patrón canvas de barras divididas para visualizar equivalencia de fracciones (1/2 = 2/4 = misma área). — Las keys de progress.json NO son nombres de archivo reales. Mapeo conocido y regla de verificación.
references/svg-recta-numerica.md — Patrón de recta numérica interactiva con SVG (clic en números, muestra signo y valor absoluto). Ideal para temas de enteros en ESO. Diferente del canvas: accesible, escalable, estilizable con CSS.
references/bulk-html-insert-pattern.md — Patrón para insertar múltiples bloques HTML en posiciones específicas usando Python .replace() en execute_code. Útil cuando archivo > 20KB y necesitas 3+ inserciones.
references/exercise-variety-matrix.md — Matriz de tipos de ejercicio para archivos con 0 ejercicios. Enfoque de 2-3 ejercicios por capítulo, cada tipo diferente, con 1 caso real + 1 error común por capítulo.
references/order-radio-pattern.md — Patrón para ordenar con radio buttons (3+ items, sin tracking de estado global).
references/landing-page-improvement-pattern.md — Patrón para mejorar páginas landing/index: mini quiz interactivo (1-3 quizzes), caso real cotidiano, caja "¿Sabías que?", glassmorphism, tags por categoría. Diferente de páginas de lección.
references/quality-improvement-pattern.md — Patrón programático de mejora de calidad: análisis previo del HTML, mapeo progress.json→archivo real, funciones JS reutilizables (checkVF, checkOrden), verificación post-mejora. v1.3.0 con lecciones 2026-06-10. Incluye pitfall página índice vs lección con patrón de mejora para landing pages (multi-quiz 3 preguntas, caso real, caja ¿Sabías que?).
references/improvement-cron-workflow.md — Workflow programático para encontrar el primer tema pending que existe (mapeo progress.json → archivo real, código Python de referencia).
references/exercise-types-catalog.md — Catálogo completo de 19 tipos de ejercicio (quiz, completar hueco, V/F, ordenar click, ordenar texto, problema contextualizado, problema cálculo, input texto, sección intermedia, encontrar regla, identificar NO-patrón, crear patrón, completar ritmo, emparejar sumas iguales, conteo visual emojis, decidir operación, emparejar incorrecta, ordenar por resultado, completar hueco multi-pasos) con HTML/JS de referencia y patrón de análisis previo.
references/write-file-vs-patch.md — Cuándo usar write_file vs patch para HTML de DeSumarIntegrar. Regla: ≤20KB + 3+ cambios estructurales → write_file. Incluye patrón de JS unificado (checkE, checkVF, selectQuiz, checkOrder) descubierto 2026-06-10.
references/canvas-balanza-peso.md — Patrón de canvas para balanza interactiva (temas de peso/masa en primaria).
references/js-unified-functions-pattern.md — Patrón de funciones JS unificadas para mejoras de calidad: checkE(num, correct), checkVF(num, expected), selectQuiz(num, btn, selected), checkOrderN(). Diccionario interno de respuestas, reutilizable entre ejercicios.
references/calidad-sobre-cantidad.md — Criterios de calidad: variedad de ejercicios, vida real, visuales útiles, estructura clara.
references/eliminar-antes-anadir.md — Principio de eliminar ejercicios repetitivos ANTES de añadir nuevo contenido. Regla: ningún tipo >30% del total, ≥4 tipos diferentes.
references/exercise-types-session-2026-06-10.md — 3 tipos nuevos descubiertos 2026-06-10: completar hueco inverso (hallar dividendo), problema inverso con doble input (conectar ×÷), ordenar por texto libre (input con coma). Regla de variedad actualizada: ningún tipo >30% del total.
references/hueco-multi-pasos.md — Patrón de completar hueco con múltiples inputs inline (2-5) para enseñar procedimientos de varios pasos: descomposición de multiplicaciones, fracciones equivalentes, pasos intermedios. Diferente de completar hueco simple (1 input).
references/ejercicio-comparar.md — Patrón de ejercicio de comparar (mayor/menor resultado) para entrenar pensamiento relacional. No es cálculo, es comparación.
references/consistency-verification.md — Checklist para verificar que los enunciados de ejercicios coinciden con las funciones JS que los validan (IDs, números, booleanos).
references/canvas-linea-numerica-sapo.md — Patrón de canvas interactivo de línea numérica con "sapo que salta": dibujo línea 0-20, círculo verde en posición inicial, flecha naranja hacia atrás, círculo azul en resultado. Reemplazo ligero de Plotly para visualización de resta en primaria. Diferente de svg-recta-numerica.md (SVG para ESO) y canvas-balanza-peso.md (balanza para peso).
references/rapid-batch-improvement.md — patrón de MODO RÁPIDO: mejora batch de 4-6 temas por sesión con rotación obligatoria de niveles (Primaria → ESO → Bachiller). Diferente de mejora individual: selección por prioridad+nivel_rotado, plantilla uniforme por tema, git commit uno por tema.
references/css-audit-and-standarization.md — Patrón de auditoría CSS por niveles y estandarización. Los 4 niveles (Primaria, ESO, Bachiller, Universidad) tenían cobertura CSS desigual: Primaria 47 clases, ESO 34 clases, Bachiller 28 clases, Universidad 42 clases. Incluye lista de 20 clases esenciales, bloques CSS por nivel, patrón de auditoría Python y resultados post-estandarización.
references/css-visual-verification.md — Patrón de verificación visual completa con browser_vision(). No confundir "clases CSS existen" con "archivo se ve bien". Incluye umbrales mínimos por nivel y priorización (CRÍTICO <20, ALTO 20-30, MEDIO 30-35, BAJO 35+).
v1.11.0 (2026-06-13): Added references/audit-completo.md — patrón de auditoría completa del proyecto. Hallazgos: 101 archivos HTML, glassmorphism ausente en 97/101, 52/101 con >15 estilos inline, ESO sin Plotly, 17 pendientes (12 estadística). Added pitfall: "glassmorphism ausente como problema sistémico" — 97/101 archivos sin backdrop-filter, el sello visual de Aurora. Added pitfall: "estilos inline excesivos" — 52/101 con >15 inline styles. Added pitfall: "ESO sin Plotly" — 0/11 con gráficos. Added pitfall: "17 temas pendientes" — laguna de estadística. Added pitfall: "duplicado s04-4". Added sección "Auditoría programática completa" con patrón reutilizable.
v1.10.1 (2026-06-12): Added references/css-visual-verification.md — patrón de verificación visual completa con browser_vision(). Lección: David vio CSS "roto" en ESO 2º/3º a pesar de la estandarización. No confundir "clases CSS existen en el archivo" con "el archivo se ve bien". Incluye umbrales mínimos por nivel (Primaria 35+, ESO 40+, Bachiller 38+, Universidad 40+) y priorización (CRÍTICO <20, ALTO 20-30, MEDIO 30-35, BAJO 35+). Added pitfall: "CSS roto percibido por el usuario" en SKILL.md body.
v1.10.0 (2026-06-12): Added references/css-audit-and-standarization.md — patrón de auditoría CSS por niveles y estandarización. Descubierto que los 4 niveles del proyecto (Primaria, ESO, Bachiller, Universidad) tenían CSS con diferente cobertura de clases: Primaria 47 clases, ESO 34 clases, Bachiller 28 clases, Universidad 42 clases. Solución: script que añade bloques CSS faltantes (feedback, chart-container, connection-box, step-indicator, real-world-badge, svg-container, exercise-input, interactive) a cada nivel. Ver sección "Estandarización CSS" en SKILL.md.
v1.9.7 (2026-06-10): Added references/consistency-verification.md — pitfall de inconsistencia HTML↔JS descubierto 2026-06-10.
v1.9.8 (2026-06-10): Added references/canvas-linea-numerica-sapo.md — patrón canvas de línea numérica interactiva con sapo que salta para restar visualmente en primaria. Reemplaza Plotly cuando es excesivo.
v1.9.6 (2026-06-10): Added references/hueco-multi-pasos.md (patrón de completar hueco multi-pasos con 2-5 inputs inline para descomposición de multiplicaciones). Added exercise type 19 to references/exercise-types-catalog.md. Updated catalog count from 15 to 19 types.
Repositorio
GitHub: Ntizar/DeSumarIntegrar
Local: /root/workspace/DeSumarIntegrar/
URL: https://ntizar.github.io/DeSumarIntegrar/
Estado actual: 101 archivos HTML (8 índices + 93 lecciones), 62 ejecuciones cron, 17 pendientes (12 estadística), glassmorphism ausente en 97/101
v1.9.5 (2026-06-10): Added 3 new exercise types to references/exercise-types-catalog.md: tipo 16 (decidir operación), tipo 17 (emparejar: identificar pareja INCORRECTA), tipo 18 (ordenar por resultado). Added pitfall: "analogías confusas" — nunca usar multiplicación como analogía para restar en 1º Primaria; usar "espejos" (resta↔suma inversas) en su lugar.
v1.9.4 (2026-06-10): Added references/eliminar-antes-anadir.md (principio de eliminar ejercicios repetitivos ANTES de añadir nuevo contenido). Added "REGLA DE ELIMINACIÓN" section to SKILL.md body.
v1.9.3 (2026-06-10): Added references/css-decimal-alignment-grid.md (CSS grid para visualizar alineación de comas decimales, alternativa ligera a canvas). Added references/problema-inverso-pista-contextual.md (ejercicios inversos: hallar minuendo/sustraendo/factor con pistas contextuales).
v1.9.2 (2026-06-10): Updated references/landing-page-improvement-pattern.md — multi-quiz landing pages (3 quizzes covering different topics), real-world case box, "¿Sabías que?" curiosity box. Updated references/quality-improvement-pattern.md — added landing page multi-quiz pattern.
v1.9.0 (2026-06-10): Added references/quality-improvement-pattern.md patterns: input numérico con pista contextual (pista específica en vez de "intenta de nuevo"), conexión con el futuro (forward-looking, prepara para ESO), input-pattern CSS class.
v1.8.0 (2026-06-10): Added references/svg-recta-numerica.md (recta numérica SVG interactiva para enteros ESO).
v1.8.1 (2026-06-10): Added exercise types 14-15 (emparejar sumas iguales, conteo visual emojis) a references/exercise-types-catalog.md. Added canvas de línea numérica interactiva pattern a references/quality-improvement-pattern.md. Added checkMatch JS function pattern.
v1.7.0 (2026-06-10): Added references/canvas-fracciones-equivalentes.md (canvas de barras divididas para visualizar equivalencia de fracciones), added pitfalls: canvas fracciones equivalentes, quiz negativo (identificar NO-equivalente), index page detection.
v1.6.2 (2026-06-10): Added pitfall: index page vs lesson page detection — skip files without <div class="exercise"> or <div class="interactive">. Updated references/quality-improvement-pattern.md with same pitfall.
v1.6.1 (2026-06-10): Updated references/quality-improvement-pattern.md — added "eliminar contenido problemático" step, "problema inverso" exercise type, "caja de conexión" pattern, lecciones aprendidas (eliminar > añadir, coherencia temática, conexiones score 0→1+), pitfall de botones quiz con parámetro booleano. Updated scores objetivo: exercises 6-10 (variedad, no cantidad). Updated references/bulk-html-insert-pattern.md — added pitfall de duplicación por anclaje auto-referencial (insertar de abajo hacia arriba).
v1.5.0 (2026-06-10): Added references/canvas-balanza-peso.md (canvas de balanza para peso/masa), added pitfall about missing </div> after exercise insertion, added progress stats (105 temas, 20 ejecuciones).
v1.4.0 (2026-06-09): Added exercise types 10-13 (encontrar regla, identificar NO-patrón, crear patrón, completar ritmo), added variedad de ejercicios section, added bug duplicado opciones quiz.
Stack
- KaTeX (CDN) para fórmulas LaTeX
- Plotly.js (CDN) para gráficos interactivos
- Responsive (móvil + escritorio)
Filosofía pedagógica
- Intuición primero — ejemplo de vida real antes que fórmula
- Visualización siempre — gráfico interactivo para cada concepto clave
- Práctica con feedback — ejercicios interactivos con respuesta inmediata
- Progresión suave — cada sesión construye sobre la anterior
- Casos de uso reales — "¿Dónde encuentro esto en la vida real?"
Estructura del curso (10 niveles)
| Nivel |
Sesión |
Contenido |
Archivos |
| S01 |
1º-3º Primaria |
Contar, sumar, restar, multiplicar, dividir, patrones, medidas |
15 HTML |
| S02 |
2º Primaria |
Números grandes, fracciones intro, dinero |
15 HTML |
| S03 |
3º Primaria |
Multiplicar, dividir, fracciones, perímetro, estadística |
8 HTML |
| S04 |
4º Primaria |
Fracciones equivalentes, decimales, áreas, capacidades, problemas |
20 HTML |
| S05 |
5º Primaria |
Decimales, porcentajes, estadística, tiempo, probabilidad |
7 HTML |
| S06 |
6º Primaria |
Operaciones grandes, negativos, álgebra intro, potencias, ángulos |
7 HTML |
| S07 |
1º ESO |
Enteros, proporcionalidad, ecuaciones, sistemas, estadística |
1 HTML (index) |
| S08 |
2º-3º ESO |
Ecuaciones avanzadas, funciones, trigonometría, probabilidad |
1 HTML (index) |
| S09 |
Bachiller |
Límites, derivadas, integrales, probabilidad avanzada |
11 HTML |
| S10 |
1º Carrera |
Multivariable, EDOs, Fourier, álgebra lineal |
11 HTML |
Plantilla HTML de sesión
Cada sesión sigue esta estructura exacta:
<header class="header">
<h1>{title}</h1>
<p>{subtitle}</p>
<div class="progress-bar"><div class="progress-fill"></div></div>
</header>
<main class="container">
<section class="chapter">
<h2>🎯 ¿Qué vamos a aprender?</h2>
<div class="box box-idea">💡 Idea clave</div>
<ul>Objetivos de aprendizaje</ul>
</section>
<section class="chapter">
<h2>1️⃣ {theory_title}</h2>
<div class="box box-teoria">📖 Teoría</div>
<div class="box box-ejemplo">🔍 Ejemplo 1</div>
<div class="box box-ejemplo">🔍 Ejemplo 2</div>
<div class="box box-ejemplo">🔍 Ejemplo 3</div>
</section>
<section class="chapter">
<h2>2️⃣ {interactive_title}</h2>
<div class="interactive">
<h3>{interactive_desc}</h3>
{interactive_content}
<div class="result" id="interactiveResult"></div>
</div>
</section>
<section class="chapter">
<h2>📝 Ejercicios</h2>
<div class="exercises">
{exercises_html}
</div>
</section>
<div class="summary">📋 Resumen de lo aprendido</div>
<div class="nav">
<a href="{prev_link}">← Anterior</a>
<a href="{next_link}">Siguiente →</a>
</div>
</main>
<footer class="footer">Hecho con ❤️ por David Antizar</footer>
CSS variables (tokens)
--azul: #2563eb
--naranja: #f97316
--verde: #10b981
--rojo: #ef4444
--pura: #a855f7
--fondo: #fff
--texto: #1e293b
--gris: #94a3b8
Cajas de contenido
| Clase |
Color |
Uso |
box-teoria |
Azul claro |
Explicación teórica |
box-ejemplo |
Naranja claro |
Ejemplos resueltos |
box-error |
Rojo claro |
Errores comunes |
box-idea |
Púrpura claro |
Idea clave / intuición |
box-success |
Verde claro |
Confirmación / éxito |
Generador Python (generate_all.py)
El script usa un template string con placeholders y un array ALL_SESSIONS con la definición de cada sesión.
Campos de cada sesión:
file — nombre del archivo HTML
title / subtitle — título y subtítulo
key_idea — intuición principal
learning_goals[] — objetivos en formato <li>
theory_title / theory_text — sección de teoría
example_1/2/3 — ejemplos resueltos
interactive_title / interactive_desc / interactive_content — zona interactiva
exercises_html[] — array de {q, opts, correct}
summary_items[] — puntos clave del resumen
prev_link / next_link — navegación
js_code — JavaScript interactivo
Ejemplo de ejercicio:
{"q": "¿Cuánto es 240 ÷ 12?", "opts": ["20", "24", "12"], "correct": 0}
Criterio de "sesión hecha"
- ✅ KaTeX para fórmulas LaTeX (ESO+)
- ✅ Al menos 1 gráfico interactivo Plotly.js
- ✅ Al menos 3 ejercicios interactivos con feedback
- ✅ Caso de uso real explicado
- ✅ Resumen final con puntos clave
- ✅ Navegación Anterior/Siguiente
- ✅ Atribución "Hecho con ❤️ por David Antizar"
- ✅ Responsive (móvil + escritorio)
- ✅ Contenido matemático correcto y claro
- ✅ Intuición antes que fórmula
Generación con crons encadenados (patrón 2026-06-10)
Para cursos de 20+ temas, usar el patrón de crons auto-actualizables:
- Mega-plan — definir toda la estructura (temas, progresión, template)
- Cron generador — lee
progress.json, carga skill fuente, genera HTML, se actualiza para el siguiente tema
- Cron verificador — diario, revisa HTMLs generados (SVG, ejercicios, navegación, atribución)
Ver references/cron-course-generation-pattern.md para el patrón completo.
Este patrón aplica a cualquier materia, no solo matemáticas. Ejemplo: Dibujo Técnico (53 temas, 9 bloques) usa exactamente el mismo sistema.
Generación con crons (patrón histórico)
El sistema usaba crons once para generar sesiones automáticamente.
Auditoría y mantenimiento
El proyecto ha pasado 2 auditorías completas:
- Corrección de links rotos — s01-4primaria, s02-7primaria
- Índices faltantes — creados s01-1primaria-index, s02-2primaria-index, s03-3primaria-index
- KaTeX — añadido a todos los archivos ESO/Bachiller/Carrera
- Navegación — reconstruida para 73 sesiones detalladas (orden numérico, no alfabético)
- Transiciones entre niveles — s01-10 → s02-1, s06-10 → s07-1
- Atribución — añadida a todos los archivos
Mejora continua (cron nocturno)
Cada ejecución del cron mejora EXACTAMENTE UN tema, añadiendo ejercicios y contenido de calidad.
Procedimiento
- Leer
progress.json → buscar temas con status: "pending" primero, ordenados por priority (1 primero)
- Si no hay pending → buscar temas con
improvement_count < 4 y prioridad más baja
- Si todos complete → terminar con "Todos los temas están al máximo nivel"
- Leer el HTML del tema seleccionado
- Analizar conteo de: ejercicios (clase "exercise"), teoría (clase "box-teoria"), ejemplos (clase "box-ejemplo"), canvas/Plotly, casos reales, KaTeX
- Generar mejoras según nivel (ver tabla abajo)
- Insertar mejoras con
patch() ANTES del cierre </main> / ANTES de la navegación <div class="nav">
- Añadir funciones JS si faltan (
checkAnswer para quiz, checkExercise para input)
- Actualizar
progress.json: incrementa improvement_count, last_improved, status = improved_N o complete si >= 4
- Git commit + push
MODO RÁPIDO (batch — 4-6 temas por sesión)
Para sesiones con recursos suficientes (agentes manuales, cron especiales), existe un modo batch que mejora 4-6 temas en una ejecución. Ver references/rapid-batch-improvement.md para el procedimiento completo.
Diferencias clave:
- Selección con rotación de niveles obligatoria (P → ESO → B → P...)
- Plantilla uniforme por tema: explicación 4 pasos + 2-3 tipos de ejercicio + caso real + error común
- Git commit uno por tema, no al final
- Máximo 6 temas por sesión (límite de tokens)
Cuándo usar batch: sesiones de mejora rápida planificadas, cuando se quiere cobertura amplia de niveles en una ejecución.
Cuándo NO usar batch: cuando se necesita profundidad pedagógica en un tema específico, o cuando se está debuggeando un problema concreto.
Tabla de mejoras por nivel
| Nivel |
Ejercicios nuevos |
Explicaciones |
Visualizaciones |
Notas |
| Primaria (s01-s06) |
3-5 con emojis |
2-3 con analogías vida real |
1 canvas simple |
Objetos cotidianos (juguetes, comida, dinero) |
| ESO (eso1, eso2, s07, s08) |
3-5 con KaTeX |
2-3 con intuición antes fórmula |
1-2 gráficos Plotly |
Tablas resumen, conexiones con temas anteriores |
| Bachiller (s09) |
4-6 dificultad creciente |
3-4 conceptuales profundas |
2-3 Plotly (incl. interactivos) |
Problemas física/economía, tipo examen |
| Universidad (s10) |
3-5 notación avanzada |
2-3 profundas |
2-3 gráficos 3D Plotly |
Conexiones interdisciplinares, papers |
Formato de ejercicios
Primaria (quiz con botones):
<div class="exercise">
<p>🍎 Ejercicio X: [Descripción con emoji]</p>
<div class="quiz-options">
<button true)">Opción correcta</button>
<button false)">Opción incorrecta</button>
</div>
<p class="feedback"></p>
</div>
ESO/Bachiller/Uni (input de texto):
<div class="exercise">
<p>📝 Ejercicio X: [Descripción con KaTeX si necesario]</p>
<div class="exercise-input">
<input type="text" id="exX" placeholder="Tu respuesta">
<button 'respuesta', this)">Comprobar</button>
</div>
<p class="feedback"></p>
</div>
Funciones JS necesarias
function checkAnswer(btn, correct) {
const parent = btn.parentElement;
parent.querySelectorAll('button').forEach(b => {
b.disabled = true; b.classList.remove('correct','wrong');
});
btn.classList.add(correct ? 'correct' : 'wrong');
const feedback = parent.nextElementSibling;
if(feedback && feedback.classList.contains('feedback')) {
feedback.textContent = correct ? '✅ ¡Correcto! ¡Muy bien!' : '❌ ¡Intenta de nuevo!';
feedback.className = 'feedback ' + (correct ? 'correct' : 'incorrect');
}
}
function checkExercise(id, correct, btn) {
const input = document.getElementById(id);
const feedback = input.parentElement.nextElementSibling;
const userVal = input.value.trim().toLowerCase();
const correctVal = correct.toString().toLowerCase();
if(userVal === correctVal) {
feedback.textContent = '✅ ¡Correcto!';
feedback.className = 'feedback correct';
input.style.borderColor = 'var(--verde)';
} else {
feedback.textContent = '❌ Respuesta correcta: ' + correct;
feedback.className = 'feedback incorrect';
input.style.borderColor = 'var(--rojo)';
}
}
CSS para quiz-options (si no existe)
.quiz-options{display:flex;gap:.5rem;flex-wrap:wrap;margin:.8rem 0}
.quiz-options button{flex:1;min-width:100px;padding:.6rem 1rem;border:2px solid #e2e8f0;border-radius:8px;background:#fff;cursor:pointer;font-size:1rem;font-weight:600;transition:all .2s}
.quiz-options button:hover{border-color:var(--azul);background:var(--azul-claro)}
.quiz-options button.correct{background:var(--verde);color:#fff;border-color:var(--verde)}
.quiz-options button.wrong{background:var(--rojo);color:#fff;border-color:var(--rojo)}
.quiz-options button:disabled{opacity:.6;cursor:not-allowed}
Variedad de ejercicios (CRÍTICO)
Problema: Si no se fuerza explícitamente la variedad, el cron genera SIEMPRE el mismo tipo de ejercicio (quiz con 3 botones). David lo detectó y pidió revisión.
Solución: El prompt del cron debe incluir esta instrucción explícita:
"Cada tema debe tener AL MENOS 4 TIPOS diferentes de ejercicio:
- Quiz con botones (3-4 opciones) — para conceptos simples
- Completar hueco (input de texto) — para cálculos
- Verdadero/Falso (2 botones) — para afirmaciones conceptuales
- Problema con enunciado largo — para aplicar múltiples pasos
- Ordenar (drag/click para ordenar) — para comparar magnitudes
- Problema contextualizado (caso real con datos) — para aplicar pasos
NO repitas el mismo tipo más de 3 veces seguidas."
Catálogo de tipos de ejercicio: Ver references/exercise-types-catalog.md (13 tipos documentados con HTML/JS de referencia: quiz, completar hueco, V/F, ordenar click, ordenar texto, problema contextualizado, problema cálculo, input texto, sección intermedia, encontrar regla, identificar NO-patrón, crear patrón, completar ritmo).
Validación post-mejora: Contar tipos de ejercicio y verificar que hay ≥3 tipos diferentes. Si solo hay 1 tipo, la mejora es defectuosa.
Patrón de análisis previo (CRÍTICO — descubierto 2026-06-09):
Antes de añadir ejercicios, SIEMPRE leer el HTML y contar qué tipos YA existen. Solo añadir tipos que NO estén representados. Ejemplo: si ya hay 5 quizzes, añadir 1 completar hueco, 1 V/F, 1 ordenar, 1 problema contextualizado — NO añadir más quizzes.
Bug conocido: opciones duplicadas en quiz
Problema: Ejercicio 6 de s01-1primaria.html tenía DOS opciones "10 estrellas" — una marcada true y otra false. El alumno no puede distinguir.
Causa: El cron genera opciones sin verificar unicidad.
Solución: Añadir al prompt del cron:
"Verifica que TODAS las opciones de cada quiz sean textos ÚNICOS. Nunca repitas el mismo texto en opciones diferentes."
Actualización automática del README
El cron NO actualiza el README con el progreso. Para solucionarlo, añadir al prompt:
"Tras cada mejora, actualiza la sección '🔄 Mejora Continua' del README.md con el estado actual de progress.json."
Ver references/readme-auto-update-prompt.md para el template exacto.
REGLA DE ORO (User Preference — 2026-06-09)
David dice: "No implementes tantos ejercicios si son iguales y no aportan conocimiento. Centra todo en mejorarlo a mejor."
Esto significa:
- ❌ NO añadir 10 ejercicios del mismo tipo (5+5=?, 3+2=?, 4+1=?)
- ✅ SÍ añadir 3-5 ejercicios VARIADOS (quiz, completar hueco, verdadero/falso, problema)
- ❌ NO añadir dibujos solo por cumplir
- ✅ SÍ añadir visuales SOLO si aportan al aprendizaje
- ❌ NO asumir que "más contenido = mejor"
- ✅ SÍ verificar que cada elemento añadido APORTE algo nuevo
Criterio de calidad: Si un ejercicio no enseña algo nuevo al alumno, NO lo añadas.
Ver references/calidad-sobre-cantidad.md para los criterios completos.
REGLA DE ELIMINACIÓN (2026-06-10, actualizada 2026-06-10)
Antes de añadir, eliminar repetitivo.
Si un tema tiene >50% de ejercicios del mismo tipo, el problema NO es "falta contenido" — es "hay demasiado repetitivo".
Procedimiento:
- Contar tipos de ejercicio existentes (NO solo cantidad total)
- Si un tipo aparece >3 veces → eliminar los peores repetitivos
- Añadir SOLO tipos que falten
- Verificar: ningún tipo >30% del total, ≥4 tipos diferentes
Ver references/eliminar-antes-anadir.md para el procedimiento completo con ejemplos.
Ver references/exercise-types-session-2026-06-10.md para tipos nuevos (completar hueco inverso, problema inverso doble input, ordenar texto libre).
Reglas de mejora continua
- NO borrar contenido existente, SOLO añadir
- Respeta el CSS existente del archivo
- Usa las clases CSS que ya existen (
box-teoria, box-ejemplo, exercise, feedback)
- Mantén coherencia pedagógica (no saltar de dificultad)
- Contenido matemático debe ser CORRECTO
- Si tema tiene KaTeX, usar KaTeX en nuevos ejercicios
- Si tema NO tiene KaTeX, no añadirlo (primaria no lo necesita)
- SIEMPRE git commit + push al final
- Actualizar progress.json con scores reales tras la mejora
Auditoría programática completa
Cuando necesites un diagnóstico completo del proyecto (no solo mejora de un tema), usar el patrón de auditoría:
- Leer
progress.json → extraer todos los topics
- Listar archivos HTML del directorio
- Para cada archivo no-índice:
- Contar KaTeX (
katex en content)
- Contar Plotly (
plotly en content)
- Contar ejercicios (
class="exercise")
- Contar interactivos (
class="interactive")
- Verificar CSS:
--azul, --naranja, backdrop-filter, body class="nz"
- Contar estilos inline (
style="...")
- Contar reglas CSS (
<style> blocks)
- Agrupar por nivel (Primaria/ESO/Bachiller/Universidad)
- Generar resumen con estadísticas por nivel y lista de problemas
Resultado típico: tabla con todos los temas, estado por nivel, y lista de issues prioritarios.
Ver references/audit-completo.md para el patrón completo.
Pitfalls
- Orden alfabético vs numérico — archivos como
s01-10 aparecen antes que s01-2 en sorting alfabético. La navegación debe seguir orden numérico pedagógico.
- GitHub Pages — requiere
index.html (minúscula), no INDEX.html.
- CSS inline — el usuario rechazó CSS compartido. Cada archivo tiene su CSS inline para mantener personalidad visual por nivel.
- Semantic HTML — 54 archivos (indices) usan
<div> en lugar de <header>/<nav>/<main>. Mejora pendiente.
- progress.json scores inflados — al contar elementos HTML,
canvas aparece también en el JS embebido. Usar conteo manual o regex más preciso para evitar scores artificialmente altos.
patch() escapa newlines en JS multilinea — cuando patch() inserta JavaScript con múltiples líneas en un HTML, puede corromper el contenido insertando literales \n en lugar de saltos de línea reales. Solución: después de patchear JS, verificar el archivo con read_file y si encuentras \n literales, reemplazarlos con un segundo patch() que use el texto correctamente formateado con saltos de línea reales. O bien, escribir el bloque JS completo con write_file si el archivo es < 20KB.
- Plotly en primaria — La regla general es Plotly SOLO en Bachiller/Universidad. Sin embargo, desde la ronda 2 de mejora continua se añadió Plotly a
s01-6-restar-hasta-20.html con gráfico de barras simple. Decisión: Plotly se puede usar en primaria si se añade el CDN explícitamente y se usa if(typeof plotly !== 'undefined') como guard para evitar errores si el CDN falla. El patrón CSS+emoji sigue siendo preferible para primaria simple.
- Mapeo progress.json → nombre real de archivo — las keys en
progress.json (ej. s01-5primaria.html) NO son los nombres reales de los archivos HTML. Los archivos reales están en /root/workspace/DeSumarIntegrar/ y tienen nombres como s01-5-restar-hasta-10.html. Siempre haz ls o os.listdir() para mapear la key al archivo real. No asumas que la key de progress.json = nombre de archivo.
- Etiqueta
<script> anidada — al añadir <script src="https://cdn.plot.ly/..."> a un HTML que ya tiene un bloque <script>...</script>, la etiqueta CDN debe ir como hermano (fuera del bloque existente), no dentro. Si la pones dentro, se crea <script><script src=...></script> que es HTML inválido. Verifica siempre con read_file tras el patch.
- Ejercicios todos del mismo tipo (descubierto 2026-06-09) — Sin instrucción explícita, el cron genera SOLO quiz con botones. El prompt debe forzar al menos 4 tipos diferentes: quiz, completar hueco, verdadero/falso, problema largo. La variedad es CRÍTICA para la calidad percibida.
- Opciones duplicadas en quiz (descubierto 2026-06-09) — El cron puede generar dos opciones con el mismo texto (ej: dos "10 estrellas"). Añadir verificación de unicidad al prompt: "Cada opción de quiz debe tener texto ÚNICO".
- README desactualizado — El cron no actualiza el README con el progreso. Añadir paso de actualización. Ver
references/readme-auto-update-prompt.md.
- Revisión de calidad periódica — David pregunta "¿cómo va esto?" y espera ver diff concretos. Después de cada ronda, mostrar resumen de cambios y pedir feedback antes de continuar. No asumir que "más contenido = mejor".
- Funciones JS duplicadas en HTML (descubierto 2026-06-09) —
sortCheck aparecía dos veces en s01-7-figuras-basicas.html. Antes de patchear, verificar con grep -c "function nombre" archivo que no hay duplicados. Si hay duplicados, eliminar la segunda ocurrencia completa.
- HTML tags rotos:
<h2> sin <section> (descubierto 2026-06-09) — En s01-7-figuras-basicas.html, el <h2 class="chapter-title">2️⃣ ... aparecía sin su <section class="chapter"> envolvente. Antes de patchear, verificar la estructura de secciones con grep -n "section\|h2" archivo.
- Literal
\n en JS (descubierto 2026-06-09) — patch() puede dejar literales \n en lugar de saltos de línea reales en bloques JS. Verificar siempre con read_file tras patchear JS y reemplazar si es necesario.
- Ejercicio demasiado avanzado (descubierto 2026-06-09) — No añadir ejercicios que requieran conceptos no enseñados aún. Ejemplo: perímetro de triángulo es demasiado avanzado para 1º Primaria que solo acaba de aprender las figuras. Verificar que cada ejercicio use SOLO conceptos ya enseñados en el tema.
- Mejora manual vs cron (2026-06-09) — Cuando se mejora un archivo manualmente (no vía cron), el workflow es: leer progress.json → buscar key → verificar nombre real de archivo con
find o ls → leer HTML → analizar tipos existentes → patchear → commit + push + actualizar progress.json manualmente. El cron no actualiza progress.json en este caso.
- write_file vs patch para archivos pequeños con cambios estructurales (2026-06-09) — Cuando un archivo HTML es pequeño (< 20KB) y necesita múltiples cambios estructurales (nuevas secciones, nuevo CSS, nuevas funciones JS, nuevos ejercicios de tipos diferentes),
patch() es propenso a errores (múltiples patches encadenados, riesgo de conflicto). Solución: usar write_file para reescribir todo el archivo de una vez. Es más limpio, más rápido, y evita problemas de escape de newlines en JS. La regla general: si necesitas 3+ patches distintos, usa write_file.
- HTML tags rotos:
<li><li> anidados (2026-06-09) — Al generar HTML con bucles o templates, se pueden crear etiquetas <li> anidadas: <li><li>texto</li></li>. Esto rompe el renderizado. Solución: después de cualquier patch en HTML, verificar con grep -c '<li><li>' archivo. Si aparece, reemplazar con <li>texto</li> simple. También verificar con un script que cuente <li> y </li> para que sean iguales.
- Tipos de ejercicio profundos faltantes (descubierto 2026-06-09) — Los tipos "encontrar regla", "identificar NO-patrón", "crear patrón" y "completar ritmo" no estaban en el catálogo original. Añadidos en v1.4.0. Ver
references/exercise-types-catalog.md tipos 10-13.
- write_file + JS unificado para mejoras múltiples (2026-06-10) — Cuando se añaden múltiples tipos de ejercicio nuevos (VF, ordenar, quiz botones, completar hueco) en un tema, no usar patch() para cada función JS individual. Usar write_file una vez con TODO el contenido (HTML + CSS nuevo + JS unificado). Las funciones JS deben ser unificadas:
checkE(num, correct) para inputs numéricos, checkVF(num, expected) para V/F con diccionario interno, selectQuiz(num, btn, selected) para quiz botones, checkOrderN() para ordenar. Esto evita duplicación y hace las funciones reutilizables. Patrón visto en s02-5primaria.html (fracciones intro): antes tenía 2 funciones checkE separadas, después tiene checkE(num, correct), checkVF(num, expected), selectQuiz(num, btn, selected), checkOrder9() — todas unificadas.
- Bulk HTML insertion via Python
.replace() (2026-06-10) — Cuando necesitas insertar múltiples bloques HTML (ejercicios, casos reales, errores comunes) en posiciones específicas de un archivo existente, usar execute_code con Python .replace() en lugar de patch(). Ventajas: no hay problema de escape de newlines en JS, se pueden hacer múltiples reemplazos en un solo paso, y se evita el riesgo de conflictos de patch(). Cuándo usarlo: archivo > 20KB (write_file demasiado grande) pero necesitas insertar 3+ bloques en posiciones distintas. Patrón: leer archivo completo → definir cada bloque como string → hacer .replace(old, new) encadenado → escribir con write_file. Ver references/bulk-html-insert-pattern.md.
- CSS insertion via patch() before HTML blocks (2026-06-10) — Cuando necesitas añadir clases CSS nuevas (
.quiz-options, .input-answer, .feedback, .check-btn) a un HTML existente, usar patch() sobre una línea CSS existente (ej: `.fo
…(truncated)
1---2name: matematicas-curso-educativo3description: DeSumarIntegrar — Curso completo de matemáticas de 1º Primaria a 1º Carrera: 107+ HTML interactivos con KaTeX, Plotly.js, ejercicios con feedback. Sistema de mejora continua con cron cada 30min. CALIDAD sobre cantidad — variedad de ejercicios, visuales solo si aportan.4---56# DeSumarIntegrar — Curso de Matemáticas Completo78Curso de matemáticas de Ntizar (David Antizar) que cubre desde 1º Primaria hasta 1º de Carrera universitaria. 107+ archivos HTML interactivos, ~1.2 MB.910## Referencias1112- `references/cron-course-generation-pattern.md` — Patrón de generación de cursos educativos con crons encadenados: mega-plan + progress.json + cron generador auto-actualizable + cron verificador diario. Aplica a cualquier materia, no solo matemáticas.13- `references/progress-json-schema.md` — Schema de progress.json, campos de scores, pitfall de conteo canvas14- `references/cron-mejora-continua-config.md` — Configuración del cron de mejora continua, historial de ejecuciones15- `references/patch-escape-js-multiline.md` — Pitfall: patch() escapa newlines al insertar JS multilinea en HTML16- `references/css-bar-chart-primaria.md`17- `references/css-grid-cards-table.md` — Patrón de tabla de tarjetas CSS con grid para mostrar tablas completas de resultados en primaria (reemplazo ligero de Plotly). Colores semánticos (verde/naranja/rojo). — Patrón de gráfico de barras CSS+emoji para primaria (sin Plotly). Plotly SOLO en Bachiller/Universidad (ver `primaria-plotly-pattern.md` para la excepción).18- `references/canvas-interactivo-primaria.md` — Patrón canvas interactivo (pizarra mágica) para temas de figuras geométricas en primaria19- `references/canvas-figuras-compuestas.md` — Patrón canvas de figuras compuestas seleccionables (L/T/H) con quiz integrado. Diferente de pizarra mágica: es evaluación, no dibujo libre.20- `references/canvas-balanza-peso.md` — Patrón de balanza interactiva para temas de peso/masa en primaria: animales con pesos reales, click para revelar, comparación visual21- `references/primaria-plotly-pattern.md` — Patrón para añadir Plotly a archivos de primaria: CDN, contenedor, JS con guard, verificación.22- `references/css-decimal-alignment-grid.md` — Patrón de CSS grid para visualizar alineación de comas decimales (sin canvas). Útil para temas de sumar/restar decimales en primaria.23- `references/audit-completo.md` — Script de auditoría completa del proyecto: cobertura de tecnologías (KaTeX, Plotly, ejercicios, interactividad), estado CSS (glassmorphism, variables, inline styles), por nivel, temas pendientes. Resultado 2026-06-13: 101 archivos, glassmorphism ausente en 97/101, 52/101 con >15 estilos inline, ESO sin Plotly, 17 pendientes (12 estadística).24- `references/problema-inverso-pista-contextual.md` — Patrón de ejercicios inversos (hallar minuendo/sustraendo/factor) con pistas contextuales en feedback. Incluye tabla de 4 tipos de problema inverso.25- `references/write-file-python-escaping.md` — Patrón de escape de comillas simples en write_file con Python triple-quoted strings para HTML con JS inline.26- `references/individual-feedback-functions-pattern.md` — Patrón de funciones individuales con feedback rico (checkE6, checkE7...) vs funciones unificadas. Regla de decisión: usar individual solo cuando cada ejercicio necesita explicación específica del "por qué".27- `references/primaria-plotly-dynamic-chart.md` — Patrón para gráficos Plotly de barras con botones interactivos (randomizar/ordenar) en primaria.28- `references/connection-box-pattern.md` — Patrón de caja pedagógica "Conexión" que conecta el tema actual con algo ya aprendido.29- `references/connection-espejos-pattern.md` — Patrón de conexión restar↔sumar como "espejos" (inversas). NUNCA usar multiplicación como analogía para restar en 1º Primaria.30- `references/mnemonic-trick-pattern.md` — Patrón de caja "Truco mnemotécnico" con analogía visual para recordar conceptos abstractos.31- `references/complete-repeated-addition-pattern.md` — Patrón de ejercicio "completar suma repetida" para introducción a multiplicación: `3 × 4 = __ + __ + __`.32- `references/exercise-type-verification.md` — Script Python para verificar programáticamente la variedad de ejercicios antes de commitear.33- `references/progress-filename-mapping.md`34- `references/canvas-fracciones-equivalentes.md` — Patrón canvas de barras divididas para visualizar equivalencia de fracciones (1/2 = 2/4 = misma área). — Las keys de progress.json NO son nombres de archivo reales. Mapeo conocido y regla de verificación.35- `references/svg-recta-numerica.md` — Patrón de recta numérica interactiva con SVG (clic en números, muestra signo y valor absoluto). Ideal para temas de enteros en ESO. Diferente del canvas: accesible, escalable, estilizable con CSS.36- `references/bulk-html-insert-pattern.md` — Patrón para insertar múltiples bloques HTML en posiciones específicas usando Python `.replace()` en execute_code. Útil cuando archivo > 20KB y necesitas 3+ inserciones.37- `references/exercise-variety-matrix.md` — Matriz de tipos de ejercicio para archivos con 0 ejercicios. Enfoque de 2-3 ejercicios por capítulo, cada tipo diferente, con 1 caso real + 1 error común por capítulo.38- `references/order-radio-pattern.md` — Patrón para ordenar con radio buttons (3+ items, sin tracking de estado global).39- `references/landing-page-improvement-pattern.md` — Patrón para mejorar páginas landing/index: mini quiz interactivo (1-3 quizzes), caso real cotidiano, caja "¿Sabías que?", glassmorphism, tags por categoría. Diferente de páginas de lección.40- `references/quality-improvement-pattern.md` — Patrón programático de mejora de calidad: análisis previo del HTML, mapeo progress.json→archivo real, funciones JS reutilizables (checkVF, checkOrden), verificación post-mejora. v1.3.0 con lecciones 2026-06-10. Incluye pitfall página índice vs lección con patrón de mejora para landing pages (multi-quiz 3 preguntas, caso real, caja ¿Sabías que?).41- `references/improvement-cron-workflow.md` — Workflow programático para encontrar el primer tema pending que existe (mapeo progress.json → archivo real, código Python de referencia).42- `references/exercise-types-catalog.md` — Catálogo completo de 19 tipos de ejercicio (quiz, completar hueco, V/F, ordenar click, ordenar texto, problema contextualizado, problema cálculo, input texto, sección intermedia, encontrar regla, identificar NO-patrón, crear patrón, completar ritmo, emparejar sumas iguales, conteo visual emojis, decidir operación, emparejar incorrecta, ordenar por resultado, completar hueco multi-pasos) con HTML/JS de referencia y patrón de análisis previo.43- `references/write-file-vs-patch.md` — Cuándo usar write_file vs patch para HTML de DeSumarIntegrar. Regla: ≤20KB + 3+ cambios estructurales → write_file. Incluye patrón de JS unificado (checkE, checkVF, selectQuiz, checkOrder) descubierto 2026-06-10.44- `references/canvas-balanza-peso.md` — Patrón de canvas para balanza interactiva (temas de peso/masa en primaria).45- `references/js-unified-functions-pattern.md` — Patrón de funciones JS unificadas para mejoras de calidad: checkE(num, correct), checkVF(num, expected), selectQuiz(num, btn, selected), checkOrderN(). Diccionario interno de respuestas, reutilizable entre ejercicios.46- `references/calidad-sobre-cantidad.md` — Criterios de calidad: variedad de ejercicios, vida real, visuales útiles, estructura clara.47- `references/eliminar-antes-anadir.md` — Principio de eliminar ejercicios repetitivos ANTES de añadir nuevo contenido. Regla: ningún tipo >30% del total, ≥4 tipos diferentes.48- `references/exercise-types-session-2026-06-10.md` — 3 tipos nuevos descubiertos 2026-06-10: completar hueco inverso (hallar dividendo), problema inverso con doble input (conectar ×÷), ordenar por texto libre (input con coma). Regla de variedad actualizada: ningún tipo >30% del total.49- `references/hueco-multi-pasos.md` — Patrón de completar hueco con múltiples inputs inline (2-5) para enseñar procedimientos de varios pasos: descomposición de multiplicaciones, fracciones equivalentes, pasos intermedios. Diferente de completar hueco simple (1 input).50- `references/ejercicio-comparar.md` — Patrón de ejercicio de comparar (mayor/menor resultado) para entrenar pensamiento relacional. No es cálculo, es comparación.51- `references/consistency-verification.md` — Checklist para verificar que los enunciados de ejercicios coinciden con las funciones JS que los validan (IDs, números, booleanos).52- `references/canvas-linea-numerica-sapo.md` — Patrón de canvas interactivo de línea numérica con "sapo que salta": dibujo línea 0-20, círculo verde en posición inicial, flecha naranja hacia atrás, círculo azul en resultado. Reemplazo ligero de Plotly para visualización de resta en primaria. Diferente de `svg-recta-numerica.md` (SVG para ESO) y `canvas-balanza-peso.md` (balanza para peso).5354- `references/rapid-batch-improvement.md` — patrón de MODO RÁPIDO: mejora batch de 4-6 temas por sesión con rotación obligatoria de niveles (Primaria → ESO → Bachiller). Diferente de mejora individual: selección por prioridad+nivel_rotado, plantilla uniforme por tema, git commit uno por tema.55- `references/css-audit-and-standarization.md` — Patrón de auditoría CSS por niveles y estandarización. Los 4 niveles (Primaria, ESO, Bachiller, Universidad) tenían cobertura CSS desigual: Primaria 47 clases, ESO 34 clases, Bachiller 28 clases, Universidad 42 clases. Incluye lista de 20 clases esenciales, bloques CSS por nivel, patrón de auditoría Python y resultados post-estandarización.56- `references/css-visual-verification.md` — Patrón de verificación visual completa con `browser_vision()`. No confundir "clases CSS existen" con "archivo se ve bien". Incluye umbrales mínimos por nivel y priorización (CRÍTICO <20, ALTO 20-30, MEDIO 30-35, BAJO 35+).5758- **v1.11.0 (2026-06-13):** Added `references/audit-completo.md` — patrón de auditoría completa del proyecto. Hallazgos: 101 archivos HTML, glassmorphism ausente en 97/101, 52/101 con >15 estilos inline, ESO sin Plotly, 17 pendientes (12 estadística). Added pitfall: "glassmorphism ausente como problema sistémico" — 97/101 archivos sin `backdrop-filter`, el sello visual de Aurora. Added pitfall: "estilos inline excesivos" — 52/101 con >15 inline styles. Added pitfall: "ESO sin Plotly" — 0/11 con gráficos. Added pitfall: "17 temas pendientes" — laguna de estadística. Added pitfall: "duplicado s04-4". Added sección "Auditoría programática completa" con patrón reutilizable.59- **v1.10.1 (2026-06-12):** Added `references/css-visual-verification.md` — patrón de verificación visual completa con browser_vision(). Lección: David vio CSS "roto" en ESO 2º/3º a pesar de la estandarización. No confundir "clases CSS existen en el archivo" con "el archivo se ve bien". Incluye umbrales mínimos por nivel (Primaria 35+, ESO 40+, Bachiller 38+, Universidad 40+) y priorización (CRÍTICO <20, ALTO 20-30, MEDIO 30-35, BAJO 35+). Added pitfall: "CSS roto percibido por el usuario" en SKILL.md body.60- **v1.10.0 (2026-06-12):** Added `references/css-audit-and-standarization.md` — patrón de auditoría CSS por niveles y estandarización. Descubierto que los 4 niveles del proyecto (Primaria, ESO, Bachiller, Universidad) tenían CSS con diferente cobertura de clases: Primaria 47 clases, ESO 34 clases, Bachiller 28 clases, Universidad 42 clases. Solución: script que añade bloques CSS faltantes (feedback, chart-container, connection-box, step-indicator, real-world-badge, svg-container, exercise-input, interactive) a cada nivel. Ver sección "Estandarización CSS" en SKILL.md.61- **v1.9.7 (2026-06-10):** Added `references/consistency-verification.md` — pitfall de inconsistencia HTML↔JS descubierto 2026-06-10.62- **v1.9.8 (2026-06-10):** Added `references/canvas-linea-numerica-sapo.md` — patrón canvas de línea numérica interactiva con sapo que salta para restar visualmente en primaria. Reemplaza Plotly cuando es excesivo.63- **v1.9.6 (2026-06-10):** Added `references/hueco-multi-pasos.md` (patrón de completar hueco multi-pasos con 2-5 inputs inline para descomposición de multiplicaciones). Added exercise type 19 to `references/exercise-types-catalog.md`. Updated catalog count from 15 to 19 types.6465## Repositorio6667- **GitHub:** `Ntizar/DeSumarIntegrar`68- **Local:** `/root/workspace/DeSumarIntegrar/`69- **URL:** `https://ntizar.github.io/DeSumarIntegrar/`70- **Estado actual:** 101 archivos HTML (8 índices + 93 lecciones), 62 ejecuciones cron, 17 pendientes (12 estadística), glassmorphism ausente en 97/1017172- **v1.9.5 (2026-06-10):** Added 3 new exercise types to `references/exercise-types-catalog.md`: tipo 16 (decidir operación), tipo 17 (emparejar: identificar pareja INCORRECTA), tipo 18 (ordenar por resultado). Added pitfall: "analogías confusas" — nunca usar multiplicación como analogía para restar en 1º Primaria; usar "espejos" (resta↔suma inversas) en su lugar.73- **v1.9.4 (2026-06-10):** Added `references/eliminar-antes-anadir.md` (principio de eliminar ejercicios repetitivos ANTES de añadir nuevo contenido). Added "REGLA DE ELIMINACIÓN" section to SKILL.md body.74- **v1.9.3 (2026-06-10):** Added `references/css-decimal-alignment-grid.md` (CSS grid para visualizar alineación de comas decimales, alternativa ligera a canvas). Added `references/problema-inverso-pista-contextual.md` (ejercicios inversos: hallar minuendo/sustraendo/factor con pistas contextuales).75- **v1.9.2 (2026-06-10):** Updated `references/landing-page-improvement-pattern.md` — multi-quiz landing pages (3 quizzes covering different topics), real-world case box, "¿Sabías que?" curiosity box. Updated `references/quality-improvement-pattern.md` — added landing page multi-quiz pattern.76- **v1.9.0 (2026-06-10):** Added `references/quality-improvement-pattern.md` patterns: input numérico con pista contextual (pista específica en vez de "intenta de nuevo"), conexión con el futuro (forward-looking, prepara para ESO), input-pattern CSS class.77- **v1.8.0 (2026-06-10):** Added `references/svg-recta-numerica.md` (recta numérica SVG interactiva para enteros ESO).78- **v1.8.1 (2026-06-10):** Added exercise types 14-15 (emparejar sumas iguales, conteo visual emojis) a `references/exercise-types-catalog.md`. Added canvas de línea numérica interactiva pattern a `references/quality-improvement-pattern.md`. Added `checkMatch` JS function pattern.79- **v1.7.0 (2026-06-10):** Added `references/canvas-fracciones-equivalentes.md` (canvas de barras divididas para visualizar equivalencia de fracciones), added pitfalls: canvas fracciones equivalentes, quiz negativo (identificar NO-equivalente), index page detection.80- **v1.6.2 (2026-06-10):** Added pitfall: index page vs lesson page detection — skip files without `<div class="exercise">` or `<div class="interactive">`. Updated `references/quality-improvement-pattern.md` with same pitfall.81- **v1.6.1 (2026-06-10):** Updated `references/quality-improvement-pattern.md` — added "eliminar contenido problemático" step, "problema inverso" exercise type, "caja de conexión" pattern, lecciones aprendidas (eliminar > añadir, coherencia temática, conexiones score 0→1+), pitfall de botones quiz con parámetro booleano. Updated scores objetivo: exercises 6-10 (variedad, no cantidad). Updated `references/bulk-html-insert-pattern.md` — added pitfall de duplicación por anclaje auto-referencial (insertar de abajo hacia arriba).82- **v1.5.0 (2026-06-10):** Added `references/canvas-balanza-peso.md` (canvas de balanza para peso/masa), added pitfall about missing `</div>` after exercise insertion, added progress stats (105 temas, 20 ejecuciones).83- **v1.4.0 (2026-06-09):** Added exercise types 10-13 (encontrar regla, identificar NO-patrón, crear patrón, completar ritmo), added variedad de ejercicios section, added bug duplicado opciones quiz.8485## Stack86- KaTeX (CDN) para fórmulas LaTeX87- Plotly.js (CDN) para gráficos interactivos88- Responsive (móvil + escritorio)8990## Filosofía pedagógica91921. **Intuición primero** — ejemplo de vida real antes que fórmula932. **Visualización siempre** — gráfico interactivo para cada concepto clave943. **Práctica con feedback** — ejercicios interactivos con respuesta inmediata954. **Progresión suave** — cada sesión construye sobre la anterior965. **Casos de uso reales** — "¿Dónde encuentro esto en la vida real?"9798## Estructura del curso (10 niveles)99100| Nivel | Sesión | Contenido | Archivos |101|-------|--------|-----------|----------|102| S01 | 1º-3º Primaria | Contar, sumar, restar, multiplicar, dividir, patrones, medidas | 15 HTML |103| S02 | 2º Primaria | Números grandes, fracciones intro, dinero | 15 HTML |104| S03 | 3º Primaria | Multiplicar, dividir, fracciones, perímetro, estadística | 8 HTML |105| S04 | 4º Primaria | Fracciones equivalentes, decimales, áreas, capacidades, problemas | 20 HTML |106| S05 | 5º Primaria | Decimales, porcentajes, estadística, tiempo, probabilidad | 7 HTML |107| S06 | 6º Primaria | Operaciones grandes, negativos, álgebra intro, potencias, ángulos | 7 HTML |108| S07 | 1º ESO | Enteros, proporcionalidad, ecuaciones, sistemas, estadística | 1 HTML (index) |109| S08 | 2º-3º ESO | Ecuaciones avanzadas, funciones, trigonometría, probabilidad | 1 HTML (index) |110| S09 | Bachiller | Límites, derivadas, integrales, probabilidad avanzada | 11 HTML |111| S10 | 1º Carrera | Multivariable, EDOs, Fourier, álgebra lineal | 11 HTML |112113## Plantilla HTML de sesión114115Cada sesión sigue esta estructura exacta:116117```118<header class="header">119 <h1>{title}</h1>120 <p>{subtitle}</p>121 <div class="progress-bar"><div class="progress-fill"></div></div>122</header>123124<main class="container">125 <section class="chapter">126 <h2>🎯 ¿Qué vamos a aprender?</h2>127 <div class="box box-idea">💡 Idea clave</div>128 <ul>Objetivos de aprendizaje</ul>129 </section>130131 <section class="chapter">132 <h2>1️⃣ {theory_title}</h2>133 <div class="box box-teoria">📖 Teoría</div>134 <div class="box box-ejemplo">🔍 Ejemplo 1</div>135 <div class="box box-ejemplo">🔍 Ejemplo 2</div>136 <div class="box box-ejemplo">🔍 Ejemplo 3</div>137 </section>138139 <section class="chapter">140 <h2>2️⃣ {interactive_title}</h2>141 <div class="interactive">142 <h3>{interactive_desc}</h3>143 {interactive_content}144 <div class="result" id="interactiveResult"></div>145 </div>146 </section>147148 <section class="chapter">149 <h2>📝 Ejercicios</h2>150 <div class="exercises">151 {exercises_html}152 </div>153 </section>154155 <div class="summary">📋 Resumen de lo aprendido</div>156 <div class="nav">157 <a href="{prev_link}">← Anterior</a>158 <a href="{next_link}">Siguiente →</a>159 </div>160</main>161162<footer class="footer">Hecho con ❤️ por David Antizar</footer>163```164165## CSS variables (tokens)166167```css168--azul: #2563eb169--naranja: #f97316170--verde: #10b981171--rojo: #ef4444172--pura: #a855f7173--fondo: #fff174--texto: #1e293b175--gris: #94a3b8176```177178## Cajas de contenido179180| Clase | Color | Uso |181|-------|-------|-----|182| `box-teoria` | Azul claro | Explicación teórica |183| `box-ejemplo` | Naranja claro | Ejemplos resueltos |184| `box-error` | Rojo claro | Errores comunes |185| `box-idea` | Púrpura claro | Idea clave / intuición |186| `box-success` | Verde claro | Confirmación / éxito |187188## Generador Python (`generate_all.py`)189190El script usa un template string con placeholders y un array `ALL_SESSIONS` con la definición de cada sesión.191192**Campos de cada sesión:**193- `file` — nombre del archivo HTML194- `title` / `subtitle` — título y subtítulo195- `key_idea` — intuición principal196- `learning_goals[]` — objetivos en formato `<li>`197- `theory_title` / `theory_text` — sección de teoría198- `example_1/2/3` — ejemplos resueltos199- `interactive_title` / `interactive_desc` / `interactive_content` — zona interactiva200- `exercises_html[]` — array de `{q, opts, correct}`201- `summary_items[]` — puntos clave del resumen202- `prev_link` / `next_link` — navegación203- `js_code` — JavaScript interactivo204205**Ejemplo de ejercicio:**206```python207{"q": "¿Cuánto es 240 ÷ 12?", "opts": ["20", "24", "12"], "correct": 0}208```209210## Criterio de "sesión hecha"2112121. ✅ KaTeX para fórmulas LaTeX (ESO+)2132. ✅ Al menos 1 gráfico interactivo Plotly.js2143. ✅ Al menos 3 ejercicios interactivos con feedback2154. ✅ Caso de uso real explicado2165. ✅ Resumen final con puntos clave2176. ✅ Navegación Anterior/Siguiente2187. ✅ Atribución "Hecho con ❤️ por David Antizar"2198. ✅ Responsive (móvil + escritorio)2209. ✅ Contenido matemático correcto y claro22110. ✅ Intuición antes que fórmula222223## Generación con crons encadenados (patrón 2026-06-10)224225Para cursos de 20+ temas, usar el patrón de **crons auto-actualizables**:2262271. **Mega-plan** — definir toda la estructura (temas, progresión, template)2282. **Cron generador** — lee `progress.json`, carga skill fuente, genera HTML, se actualiza para el siguiente tema2293. **Cron verificador** — diario, revisa HTMLs generados (SVG, ejercicios, navegación, atribución)230231Ver `references/cron-course-generation-pattern.md` para el patrón completo.232233**Este patrón aplica a cualquier materia**, no solo matemáticas. Ejemplo: Dibujo Técnico (53 temas, 9 bloques) usa exactamente el mismo sistema.234235## Generación con crons (patrón histórico)236237El sistema usaba crons `once` para generar sesiones automáticamente.238239## Auditoría y mantenimiento240241El proyecto ha pasado 2 auditorías completas:242- **Corrección de links rotos** — s01-4primaria, s02-7primaria243- **Índices faltantes** — creados s01-1primaria-index, s02-2primaria-index, s03-3primaria-index244- **KaTeX** — añadido a todos los archivos ESO/Bachiller/Carrera245- **Navegación** — reconstruida para 73 sesiones detalladas (orden numérico, no alfabético)246- **Transiciones entre niveles** — s01-10 → s02-1, s06-10 → s07-1247- **Atribución** — añadida a todos los archivos248249## Mejora continua (cron nocturno)250251Cada ejecución del cron mejora EXACTAMENTE UN tema, añadiendo ejercicios y contenido de calidad.252253### Procedimiento2542551. **Leer** `progress.json` → buscar temas con `status: "pending"` primero, ordenados por `priority` (1 primero)2562. **Si no hay pending** → buscar temas con `improvement_count < 4` y prioridad más baja2573. **Si todos complete** → terminar con "Todos los temas están al máximo nivel"2584. **Leer** el HTML del tema seleccionado2595. **Analizar** conteo de: ejercicios (clase "exercise"), teoría (clase "box-teoria"), ejemplos (clase "box-ejemplo"), canvas/Plotly, casos reales, KaTeX2606. **Generar mejoras** según nivel (ver tabla abajo)2617. **Insertar** mejoras con `patch()` ANTES del cierre `</main>` / ANTES de la navegación `<div class="nav">`2628. **Añadir funciones JS** si faltan (`checkAnswer` para quiz, `checkExercise` para input)2639. **Actualizar** `progress.json`: incrementa `improvement_count`, `last_improved`, status = `improved_N` o `complete` si >= 426410. **Git commit + push**265266### MODO RÁPIDO (batch — 4-6 temas por sesión)267268Para sesiones con recursos suficientes (agentes manuales, cron especiales), existe un **modo batch** que mejora 4-6 temas en una ejecución. **Ver `references/rapid-batch-improvement.md`** para el procedimiento completo.269270**Diferencias clave:**271- Selección con **rotación de niveles obligatoria** (P → ESO → B → P...)272- **Plantilla uniforme** por tema: explicación 4 pasos + 2-3 tipos de ejercicio + caso real + error común273- Git commit **uno por tema**, no al final274- Máximo 6 temas por sesión (límite de tokens)275276**Cuándo usar batch:** sesiones de mejora rápida planificadas, cuando se quiere cobertura amplia de niveles en una ejecución.277**Cuándo NO usar batch:** cuando se necesita profundidad pedagógica en un tema específico, o cuando se está debuggeando un problema concreto.278279### Tabla de mejoras por nivel280281| Nivel | Ejercicios nuevos | Explicaciones | Visualizaciones | Notas |282|-------|-------------------|---------------|-----------------|-------|283| Primaria (s01-s06) | 3-5 con emojis | 2-3 con analogías vida real | 1 canvas simple | Objetos cotidianos (juguetes, comida, dinero) |284| ESO (eso1, eso2, s07, s08) | 3-5 con KaTeX | 2-3 con intuición antes fórmula | 1-2 gráficos Plotly | Tablas resumen, conexiones con temas anteriores |285| Bachiller (s09) | 4-6 dificultad creciente | 3-4 conceptuales profundas | 2-3 Plotly (incl. interactivos) | Problemas física/economía, tipo examen |286| Universidad (s10) | 3-5 notación avanzada | 2-3 profundas | 2-3 gráficos 3D Plotly | Conexiones interdisciplinares, papers |287288### Formato de ejercicios289290**Primaria (quiz con botones):**291```html292<div class="exercise">293<p>🍎 Ejercicio X: [Descripción con emoji]</p>294<div class="quiz-options">295<button onclick="checkAnswer(this, true)">Opción correcta</button>296<button onclick="checkAnswer(this, false)">Opción incorrecta</button>297</div>298<p class="feedback"></p>299</div>300```301302**ESO/Bachiller/Uni (input de texto):**303```html304<div class="exercise">305<p>📝 Ejercicio X: [Descripción con KaTeX si necesario]</p>306<div class="exercise-input">307<input type="text" id="exX" placeholder="Tu respuesta">308<button onclick="checkExercise('exX', 'respuesta', this)">Comprobar</button>309</div>310<p class="feedback"></p>311</div>312```313314### Funciones JS necesarias315316```javascript317function checkAnswer(btn, correct) {318 const parent = btn.parentElement;319 parent.querySelectorAll('button').forEach(b => {320 b.disabled = true; b.classList.remove('correct','wrong');321 });322 btn.classList.add(correct ? 'correct' : 'wrong');323 const feedback = parent.nextElementSibling;324 if(feedback && feedback.classList.contains('feedback')) {325 feedback.textContent = correct ? '✅ ¡Correcto! ¡Muy bien!' : '❌ ¡Intenta de nuevo!';326 feedback.className = 'feedback ' + (correct ? 'correct' : 'incorrect');327 }328}329function checkExercise(id, correct, btn) {330 const input = document.getElementById(id);331 const feedback = input.parentElement.nextElementSibling;332 const userVal = input.value.trim().toLowerCase();333 const correctVal = correct.toString().toLowerCase();334 if(userVal === correctVal) {335 feedback.textContent = '✅ ¡Correcto!';336 feedback.className = 'feedback correct';337 input.style.borderColor = 'var(--verde)';338 } else {339 feedback.textContent = '❌ Respuesta correcta: ' + correct;340 feedback.className = 'feedback incorrect';341 input.style.borderColor = 'var(--rojo)';342 }343}344```345346### CSS para quiz-options (si no existe)347348```css349.quiz-options{display:flex;gap:.5rem;flex-wrap:wrap;margin:.8rem 0}350.quiz-options button{flex:1;min-width:100px;padding:.6rem 1rem;border:2px solid #e2e8f0;border-radius:8px;background:#fff;cursor:pointer;font-size:1rem;font-weight:600;transition:all .2s}351.quiz-options button:hover{border-color:var(--azul);background:var(--azul-claro)}352.quiz-options button.correct{background:var(--verde);color:#fff;border-color:var(--verde)}353.quiz-options button.wrong{background:var(--rojo);color:#fff;border-color:var(--rojo)}354.quiz-options button:disabled{opacity:.6;cursor:not-allowed}355```356357### Variedad de ejercicios (CRÍTICO)358359**Problema:** Si no se fuerza explícitamente la variedad, el cron genera SIEMPRE el mismo tipo de ejercicio (quiz con 3 botones). David lo detectó y pidió revisión.360361**Solución:** El prompt del cron debe incluir esta instrucción explícita:362363> "Cada tema debe tener AL MENOS 4 TIPOS diferentes de ejercicio:364> 1. **Quiz con botones** (3-4 opciones) — para conceptos simples365> 2. **Completar hueco** (input de texto) — para cálculos366> 3. **Verdadero/Falso** (2 botones) — para afirmaciones conceptuales367> 4. **Problema con enunciado largo** — para aplicar múltiples pasos368> 5. **Ordenar** (drag/click para ordenar) — para comparar magnitudes369> 6. **Problema contextualizado** (caso real con datos) — para aplicar pasos370> 371> NO repitas el mismo tipo más de 3 veces seguidas."372373**Catálogo de tipos de ejercicio:** Ver `references/exercise-types-catalog.md` (13 tipos documentados con HTML/JS de referencia: quiz, completar hueco, V/F, ordenar click, ordenar texto, problema contextualizado, problema cálculo, input texto, sección intermedia, encontrar regla, identificar NO-patrón, crear patrón, completar ritmo).374375**Validación post-mejora:** Contar tipos de ejercicio y verificar que hay ≥3 tipos diferentes. Si solo hay 1 tipo, la mejora es defectuosa.376377**Patrón de análisis previo (CRÍTICO — descubierto 2026-06-09):**378Antes de añadir ejercicios, SIEMPRE leer el HTML y contar qué tipos YA existen. Solo añadir tipos que NO estén representados. Ejemplo: si ya hay 5 quizzes, añadir 1 completar hueco, 1 V/F, 1 ordenar, 1 problema contextualizado — NO añadir más quizzes.379380### Bug conocido: opciones duplicadas en quiz381382**Problema:** Ejercicio 6 de `s01-1primaria.html` tenía DOS opciones "10 estrellas" — una marcada `true` y otra `false`. El alumno no puede distinguir.383384**Causa:** El cron genera opciones sin verificar unicidad.385386**Solución:** Añadir al prompt del cron:387> "Verifica que TODAS las opciones de cada quiz sean textos ÚNICOS. Nunca repitas el mismo texto en opciones diferentes."388389### Actualización automática del README390391El cron NO actualiza el README con el progreso. Para solucionarlo, añadir al prompt:392> "Tras cada mejora, actualiza la sección '🔄 Mejora Continua' del README.md con el estado actual de progress.json."393394Ver `references/readme-auto-update-prompt.md` para el template exacto.395396### REGLA DE ORO (User Preference — 2026-06-09)397398**David dice: "No implementes tantos ejercicios si son iguales y no aportan conocimiento. Centra todo en mejorarlo a mejor."**399400Esto significa:401- ❌ NO añadir 10 ejercicios del mismo tipo (5+5=?, 3+2=?, 4+1=?)402- ✅ SÍ añadir 3-5 ejercicios VARIADOS (quiz, completar hueco, verdadero/falso, problema)403- ❌ NO añadir dibujos solo por cumplir404- ✅ SÍ añadir visuales SOLO si aportan al aprendizaje405- ❌ NO asumir que "más contenido = mejor"406- ✅ SÍ verificar que cada elemento añadido APORTE algo nuevo407408**Criterio de calidad:** Si un ejercicio no enseña algo nuevo al alumno, NO lo añadas.409410Ver `references/calidad-sobre-cantidad.md` para los criterios completos.411412### REGLA DE ELIMINACIÓN (2026-06-10, actualizada 2026-06-10)413414**Antes de añadir, eliminar repetitivo.**415416Si un tema tiene >50% de ejercicios del mismo tipo, el problema NO es "falta contenido" — es "hay demasiado repetitivo".417418Procedimiento:4191. Contar tipos de ejercicio existentes (NO solo cantidad total)4202. Si un tipo aparece >3 veces → eliminar los peores repetitivos4213. Añadir SOLO tipos que falten4224. Verificar: **ningún tipo >30% del total**, ≥4 tipos diferentes423424Ver `references/eliminar-antes-anadir.md` para el procedimiento completo con ejemplos.425Ver `references/exercise-types-session-2026-06-10.md` para tipos nuevos (completar hueco inverso, problema inverso doble input, ordenar texto libre).426427### Reglas de mejora continua4284291. NO borrar contenido existente, SOLO añadir4302. Respeta el CSS existente del archivo4313. Usa las clases CSS que ya existen (`box-teoria`, `box-ejemplo`, `exercise`, `feedback`)4324. Mantén coherencia pedagógica (no saltar de dificultad)4335. Contenido matemático debe ser CORRECTO4346. Si tema tiene KaTeX, usar KaTeX en nuevos ejercicios4357. Si tema NO tiene KaTeX, no añadirlo (primaria no lo necesita)4368. SIEMPRE git commit + push al final4379. Actualizar progress.json con scores reales tras la mejora438439### Auditoría programática completa440441Cuando necesites un **diagnóstico completo** del proyecto (no solo mejora de un tema), usar el patrón de auditoría:4424431. **Leer** `progress.json` → extraer todos los topics4442. **Listar** archivos HTML del directorio4453. **Para cada archivo no-índice:**446 - Contar KaTeX (`katex` en content)447 - Contar Plotly (`plotly` en content)448 - Contar ejercicios (`class="exercise"`)449 - Contar interactivos (`class="interactive"`)450 - Verificar CSS: `--azul`, `--naranja`, `backdrop-filter`, `body class="nz"`451 - Contar estilos inline (`style="..."`)452 - Contar reglas CSS (`<style>` blocks)4534. **Agrupar por nivel** (Primaria/ESO/Bachiller/Universidad)4545. **Generar resumen** con estadísticas por nivel y lista de problemas455456**Resultado típico:** tabla con todos los temas, estado por nivel, y lista de issues prioritarios.457458Ver `references/audit-completo.md` para el patrón completo.459460### Pitfalls461462- **Orden alfabético vs numérico** — archivos como `s01-10` aparecen antes que `s01-2` en sorting alfabético. La navegación debe seguir orden numérico pedagógico.463- **GitHub Pages** — requiere `index.html` (minúscula), no `INDEX.html`.464- **CSS inline** — el usuario rechazó CSS compartido. Cada archivo tiene su CSS inline para mantener personalidad visual por nivel.465- **Semantic HTML** — 54 archivos (indices) usan `<div>` en lugar de `<header>/<nav>/<main>`. Mejora pendiente.466- **progress.json scores inflados** — al contar elementos HTML, `canvas` aparece también en el JS embebido. Usar conteo manual o regex más preciso para evitar scores artificialmente altos.467- **`patch()` escapa newlines en JS multilinea** — cuando `patch()` inserta JavaScript con múltiples líneas en un HTML, puede corromper el contenido insertando literales `\n` en lugar de saltos de línea reales. **Solución:** después de patchear JS, verificar el archivo con `read_file` y si encuentras `\n` literales, reemplazarlos con un segundo `patch()` que use el texto correctamente formateado con saltos de línea reales. O bien, escribir el bloque JS completo con `write_file` si el archivo es < 20KB.468- **Plotly en primaria** — La regla general es Plotly SOLO en Bachiller/Universidad. Sin embargo, desde la ronda 2 de mejora continua se añadió Plotly a `s01-6-restar-hasta-20.html` con gráfico de barras simple. **Decisión:** Plotly se puede usar en primaria si se añade el CDN explícitamente y se usa `if(typeof plotly !== 'undefined')` como guard para evitar errores si el CDN falla. El patrón CSS+emoji sigue siendo preferible para primaria simple.469- **Mapeo progress.json → nombre real de archivo** — las keys en `progress.json` (ej. `s01-5primaria.html`) NO son los nombres reales de los archivos HTML. Los archivos reales están en `/root/workspace/DeSumarIntegrar/` y tienen nombres como `s01-5-restar-hasta-10.html`. **Siempre haz `ls` o `os.listdir()` para mapear la key al archivo real.** No asumas que la key de progress.json = nombre de archivo.470- **Etiqueta `<script>` anidada** — al añadir `<script src="https://cdn.plot.ly/...">` a un HTML que ya tiene un bloque `<script>...</script>`, la etiqueta CDN debe ir como hermano (fuera del bloque existente), no dentro. Si la pones dentro, se crea `<script><script src=...></script>` que es HTML inválido. **Verifica siempre con `read_file` tras el patch.**471- **Ejercicios todos del mismo tipo** (descubierto 2026-06-09) — Sin instrucción explícita, el cron genera SOLO quiz con botones. El prompt debe forzar al menos 4 tipos diferentes: quiz, completar hueco, verdadero/falso, problema largo. La variedad es CRÍTICA para la calidad percibida.472- **Opciones duplicadas en quiz** (descubierto 2026-06-09) — El cron puede generar dos opciones con el mismo texto (ej: dos "10 estrellas"). Añadir verificación de unicidad al prompt: "Cada opción de quiz debe tener texto ÚNICO".473- **README desactualizado** — El cron no actualiza el README con el progreso. Añadir paso de actualización. Ver `references/readme-auto-update-prompt.md`.474- **Revisión de calidad periódica** — David pregunta "¿cómo va esto?" y espera ver diff concretos. Después de cada ronda, mostrar resumen de cambios y pedir feedback antes de continuar. No asumir que "más contenido = mejor".475- **Funciones JS duplicadas en HTML** (descubierto 2026-06-09) — `sortCheck` aparecía dos veces en `s01-7-figuras-basicas.html`. Antes de patchear, verificar con `grep -c "function nombre" archivo` que no hay duplicados. Si hay duplicados, eliminar la segunda ocurrencia completa.476- **HTML tags rotos: `<h2>` sin `<section>`** (descubierto 2026-06-09) — En `s01-7-figuras-basicas.html`, el `<h2 class="chapter-title">2️⃣ ...` aparecía sin su `<section class="chapter">` envolvente. Antes de patchear, verificar la estructura de secciones con `grep -n "section\|h2" archivo`.477- **Literal `\n` en JS** (descubierto 2026-06-09) — `patch()` puede dejar literales `\n` en lugar de saltos de línea reales en bloques JS. Verificar siempre con `read_file` tras patchear JS y reemplazar si es necesario.478- **Ejercicio demasiado avanzado** (descubierto 2026-06-09) — No añadir ejercicios que requieran conceptos no enseñados aún. Ejemplo: perímetro de triángulo es demasiado avanzado para 1º Primaria que solo acaba de aprender las figuras. Verificar que cada ejercicio use SOLO conceptos ya enseñados en el tema.479- **Mejora manual vs cron** (2026-06-09) — Cuando se mejora un archivo manualmente (no vía cron), el workflow es: leer progress.json → buscar key → verificar nombre real de archivo con `find` o `ls` → leer HTML → analizar tipos existentes → patchear → commit + push + actualizar progress.json manualmente. El cron no actualiza progress.json en este caso.480- **write_file vs patch para archivos pequeños con cambios estructurales** (2026-06-09) — Cuando un archivo HTML es pequeño (< 20KB) y necesita múltiples cambios estructurales (nuevas secciones, nuevo CSS, nuevas funciones JS, nuevos ejercicios de tipos diferentes), `patch()` es propenso a errores (múltiples patches encadenados, riesgo de conflicto). **Solución:** usar `write_file` para reescribir todo el archivo de una vez. Es más limpio, más rápido, y evita problemas de escape de newlines en JS. La regla general: si necesitas 3+ patches distintos, usa `write_file`.481- **HTML tags rotos: `<li><li>` anidados** (2026-06-09) — Al generar HTML con bucles o templates, se pueden crear etiquetas `<li>` anidadas: `<li><li>texto</li></li>`. Esto rompe el renderizado. **Solución:** después de cualquier patch en HTML, verificar con `grep -c '<li><li>' archivo`. Si aparece, reemplazar con `<li>texto</li>` simple. También verificar con un script que cuente `<li>` y `</li>` para que sean iguales.482- **Tipos de ejercicio profundos faltantes** (descubierto 2026-06-09) — Los tipos "encontrar regla", "identificar NO-patrón", "crear patrón" y "completar ritmo" no estaban en el catálogo original. Añadidos en v1.4.0. Ver `references/exercise-types-catalog.md` tipos 10-13.483- **write_file + JS unificado para mejoras múltiples** (2026-06-10) — Cuando se añaden múltiples tipos de ejercicio nuevos (VF, ordenar, quiz botones, completar hueco) en un tema, **no usar patch() para cada función JS individual**. Usar write_file una vez con TODO el contenido (HTML + CSS nuevo + JS unificado). Las funciones JS deben ser unificadas: `checkE(num, correct)` para inputs numéricos, `checkVF(num, expected)` para V/F con diccionario interno, `selectQuiz(num, btn, selected)` para quiz botones, `checkOrderN()` para ordenar. Esto evita duplicación y hace las funciones reutilizables. Patrón visto en `s02-5primaria.html` (fracciones intro): antes tenía 2 funciones checkE separadas, después tiene checkE(num, correct), checkVF(num, expected), selectQuiz(num, btn, selected), checkOrder9() — todas unificadas.484- **Bulk HTML insertion via Python `.replace()`** (2026-06-10) — Cuando necesitas insertar múltiples bloques HTML (ejercicios, casos reales, errores comunes) en posiciones específicas de un archivo existente, **usar `execute_code` con Python `.replace()` en lugar de `patch()`**. Ventajas: no hay problema de escape de newlines en JS, se pueden hacer múltiples reemplazos en un solo paso, y se evita el riesgo de conflictos de `patch()`. **Cuándo usarlo:** archivo > 20KB (write_file demasiado grande) pero necesitas insertar 3+ bloques en posiciones distintas. **Patrón:** leer archivo completo → definir cada bloque como string → hacer `.replace(old, new)` encadenado → escribir con `write_file`. Ver `references/bulk-html-insert-pattern.md`.485- **CSS insertion via patch() before HTML blocks** (2026-06-10) — Cuando necesitas añadir clases CSS nuevas (`.quiz-options`, `.input-answer`, `.feedback`, `.check-btn`) a un HTML existente, **usar `patch()` sobre una línea CSS existente** (ej: `.fo486487…(truncated)