feat: fase 2+3 — expansion masiva multi-perfil + bug fixes + hardening

Fase 2 (expansion):
- Francesca: +6 etapas matematicas (5-10), +7 etapas lectura (3-9), +2 ortografia
- Sebastian: +8 etapas matematicas (4-11), +6 lectura, +3 historia, +3 geografia, +1 banderas
- Nuevas paginas: ortografia, lectura, geografia, matematicas
- ~900 ejercicios nuevos, paridad ~500 por perfil

Fase 3 (bug fixes + hardening):
- Fix: SessionLog auto-create en grade route
- Fix: engine cache (no borrar antes de revisar)
- Fix: FSRS cards actualizadas en flujo curriculum
- Fix: responseMs real (no hardcodeado 3000)
- Fix: options dentro de content en sebastian etapa-1
- Fix: trazo-letra consonantes crash
- Security: execFileSync anti-command-injection en TTS
- DB: 18 cascade deletes + indices + unique constraints
- APIs debug: reset, state, seed
- Docker: espeak-ng + prisma + user/group
- E2E: 23 tests nuevos (curriculum-flow.spec.ts)
- Code review: tailwind colors, middleware dev mode, eslint config

Verificado: tsc exit 0, build exit 0, 61 E2E tests pass
This commit is contained in:
renato97
2026-07-25 22:07:28 -03:00
parent 25614704dc
commit a3360ec6e4
67 changed files with 5294 additions and 213 deletions
+108
View File
@@ -0,0 +1,108 @@
import type { Stage } from "../types"
const lecturas = [
{
text: "El sol es una estrella gigante que nos da luz y calor. Está en el centro del sistema solar. La Tierra gira alrededor del sol. Sin el sol, no habría vida en nuestro planeta. Las plantas lo necesitan para crecer y los animales para calentarse.",
question: "¿Qué es el sol?",
options: ["Una estrella gigante", "Un planeta", "Una luna"],
correcta: "Una estrella gigante",
emoji: "☀️",
},
{
text: "Los dinosaurios vivieron hace millones de años. Algunos eran enormes como el diplodocus y otros pequeños como el velociraptor. Se extinguieron hace 65 millones de años. Los científicos estudian sus huesos fósiles para aprender sobre ellos.",
question: "¿Cómo aprenden los científicos sobre los dinosaurios?",
options: ["Estudiando sus huesos fósiles", "Leyendo libros antiguos", "Mirando películas"],
correcta: "Estudiando sus huesos fósiles",
emoji: "🦕",
},
{
text: "El agua es esencial para la vida. Cubre el 71% de la superficie de la Tierra. El agua puede estar en estado líquido, sólido (hielo) o gaseoso (vapor). Los seres vivos necesitamos agua para sobrevivir. Por eso es importante cuidarla y no desperdiciarla.",
question: "¿Cuánto de la Tierra está cubierto por agua?",
options: ["71%", "50%", "90%"],
correcta: "71%",
emoji: "💧",
},
{
text: "La fotosíntesis es el proceso por el cual las plantas fabrican su alimento. Usan la luz del sol, el agua y el dióxido de carbono. Producen oxígeno, que los animales necesitamos para respirar. Por eso los bosques son tan importantes para el planeta.",
question: "¿Qué producen las plantas durante la fotosíntesis?",
options: ["Oxígeno", "Agua", "Luz"],
correcta: "Oxígeno",
emoji: "🌿",
},
{
text: "El cuerpo humano tiene muchos sistemas que trabajan juntos. El sistema digestivo procesa los alimentos. El sistema circulatorio lleva la sangre por todo el cuerpo. El sistema respiratorio nos permite respirar. Todos son importantes para nuestra salud.",
question: "¿Qué hace el sistema circulatorio?",
options: ["Lleva la sangre por el cuerpo", "Procesa los alimentos", "Nos permite respirar"],
correcta: "Lleva la sangre por el cuerpo",
emoji: "🧬",
},
{
text: "Las abejas son insectos muy importantes para la naturaleza. Polinizan las flores, ayudando a que crezcan frutas y verduras. Viven en colmenas organizadas. Cada abeja tiene un trabajo: la reina pone huevos, las obreras recolectan néctar y los zánganos fecundan.",
question: "¿Cuál es el trabajo de las abejas obreras?",
options: ["Recolectan néctar", "Ponen huevos", "Fecundan a la reina"],
correcta: "Recolectan néctar",
emoji: "🐝",
},
{
text: "La Luna es el satélite natural de la Tierra. Orbita alrededor de nuestro planeta cada 28 días. La Luna no tiene luz propia, refleja la luz del sol. Sus fases son: nueva, creciente, llena y menguante. La gravedad de la Luna causa las mareas en los océanos.",
question: "¿Qué causa las mareas en los océanos?",
options: ["La gravedad de la Luna", "El viento", "El calor del sol"],
correcta: "La gravedad de la Luna",
emoji: "🌙",
},
{
text: "Los volcanes son aberturas en la corteza terrestre por donde sale magma caliente del interior de la Tierra. Cuando un volcán entra en erupción, expulsa lava, cenizas y gases. Algunos volcanes están activos y otros dormidos. El Everest fue alguna vez un volcán submarino.",
question: "¿Qué expulsa un volcán en erupción?",
options: ["Lava, cenizas y gases", "Solo lava", "Agua caliente"],
correcta: "Lava, cenizas y gases",
emoji: "🌋",
},
{
text: "Las estaciones del año son cuatro: primavera, verano, otoño e invierno. Se producen por el movimiento de la Tierra alrededor del sol y la inclinación de su eje. Cuando es verano en Argentina, es invierno en Europa, porque los hemisferios reciben diferente cantidad de luz solar.",
question: "¿Por qué se producen las estaciones?",
options: ["Por el movimiento de la Tierra y la inclinación de su eje", "Por la distancia al sol", "Por las nubes"],
correcta: "Por el movimiento de la Tierra y la inclinación de su eje",
emoji: "🌍",
},
{
text: "El sistema solar tiene ocho planetas: Mercurio, Venus, Tierra, Marte, Júpiter, Saturno, Urano y Neptuno. Mercurio es el más cercano al sol y Neptuno el más lejano. Júpiter es el planeta más grande. La Tierra es el único planeta conocido que tiene vida.",
question: "¿Cuál es el planeta más grande del sistema solar?",
options: ["Júpiter", "Saturno", "La Tierra"],
correcta: "Júpiter",
emoji: "🪐",
},
]
const exercises: any[] = []
for (let i = 0; i < lecturas.length; i++) {
const l = lecturas[i]
exercises.push({
id: `seb-lect1-${i}`,
stage: 1,
skillCode: `lectura-profunda-${i}`,
type: "lectura",
prerequisites: i === 0 ? [] : [`seb-lect1-${i - 1}`],
content: {
instruction: "Leé el texto y respondé:",
text: l.text,
audioText: l.text,
emoji: l.emoji,
options: l.options.map((o) => ({
label: o,
correct: o === l.correcta,
id: o.toLowerCase().slice(0, 15),
})),
},
functionalContext: "Comprensión profunda de textos informativos: extraer idea principal, detalles y secuencia.",
errorType: "omision-letra",
})
}
const stage: Stage = {
id: 1,
name: "Comprensión profunda de textos",
description: "Textos de 5-8 oraciones con preguntas de comprensión detallada (idea principal, detalles, secuencia).",
exercises,
}
export default stage
+108
View File
@@ -0,0 +1,108 @@
import type { Stage } from "../types"
const lecturas = [
{
text: "Martín llegó temprano a la escuela. Vio que la puerta estaba cerrada. No había nadie en el patio. Entonces recordó que era feriado.",
question: "¿Por qué no había nadie en la escuela?",
options: ["Era feriado", "Llegó muy tarde", "La escuela estaba cerrada por obras"],
correcta: "Era feriado",
emoji: "🏫",
},
{
text: "La tortuga y la liebre hicieron una carrera. La liebre salió muy rápido y se confió. Se durmió bajo un árbol. La tortuga siguió caminando lentamente y llegó primera.",
question: "¿Qué enseñanza nos deja esta historia?",
options: ["No hay que confiarse, la constancia vence", "Correr rápido es lo único importante", "Dormir ayuda a ganar"],
correcta: "No hay que confiarse, la constancia vence",
emoji: "🐢",
},
{
text: "Valentina encontró una moneda en el parque. Podía comprarse un caramelo, pero decidió guardarla en su alcancía. Después de varias semanas, tenía suficiente para comprar un libro.",
question: "¿Qué motivó a Valentina a guardar la moneda?",
options: ["Quería ahorrar para comprar algo mejor", "No le gustan los caramelos", "La moneda no servía para nada"],
correcta: "Quería ahorrar para comprar algo mejor",
emoji: "🐷",
},
{
text: "El pastorcito mentiroso gritaba '¡El lobo!' para bromear. Los vecinos corrían a ayudar, pero no había lobo. Un día el lobo apareció de verdad. El pastor gritó pero nadie vino.",
question: "¿Por qué nadie vino a ayudar cuando apareció el lobo?",
options: ["Porque ya no le creían", "Porque estaban ocupados", "Porque no escucharon"],
correcta: "Porque ya no le creían",
emoji: "🐺",
},
{
text: "Sofía notó que su planta se estaba marchitando. Las hojas estaban amarillas y caídas. Decidió regarla más seguido. Al cabo de una semana, la planta volvió a estar verde y firme.",
question: "¿Qué le pasaba a la planta de Sofía?",
options: ["Necesitaba agua", "Tenía una plaga", "Necesitaba sol"],
correcta: "Necesitaba agua",
emoji: "🌱",
},
{
text: "Tomás quería un perro pero su mamá le dijo que era una gran responsabilidad. Tomás investigó cómo cuidar un perro, preparó un presupuesto y escribió un plan. Su mamá se sorprendió y aceptó.",
question: "¿Por qué aceptó la mamá de Tomás?",
options: ["Porque Tomás demostró que estaba preparado", "Porque Tomás insistió mucho", "Porque se cansó de decir que no"],
correcta: "Porque Tomás demostró que estaba preparado",
emoji: "🐕",
},
{
text: "Había una vez un ratón que vivía bajo un árbol. Un día el árbol comenzó a temblar. El ratón pensó que era un terremoto. Pero era un elefante que se rascaba la espalda contra el tronco.",
question: "¿Qué causó el temblor?",
options: ["Un elefante rascándose", "Un terremoto", "El viento"],
correcta: "Un elefante rascándose",
emoji: "🐘",
},
{
text: "Lucas compartía su merienda todos los días con un compañero que no traía. Un día, el compañero trajo una merienda enorme y la compartió con Lucas. Lucas sonrió.",
question: "¿Por qué sonrió Lucas?",
options: ["Porque su amigo le devolvió el gesto", "Porque no tenía hambre", "Porque la merienda era rica"],
correcta: "Porque su amigo le devolvió el gesto",
emoji: "🍎",
},
{
text: "El GPS indicaba que faltaban 5 minutos. Juan apuró el paso porque no quería llegar tarde. De pronto vio un cartel: 'Bienvenidos al Museo'. Había llegado justo a tiempo.",
question: "¿Adónde iba Juan?",
options: ["Al museo", "A la escuela", "Al cine"],
correcta: "Al museo",
emoji: "🏛️",
},
{
text: "La maestra preguntó por qué algunos pájaros vuelan al sur en invierno. Todos guardaron silencio. Entonces Ana levantó la mano: 'Porque hace frío y buscan comida', dijo. La maestra sonrió.",
question: "¿Qué se puede deducir de Ana?",
options: ["Ana había estudiado el tema", "Ana no sabía la respuesta", "Ana estaba adivinando"],
correcta: "Ana había estudiado el tema",
emoji: "🐦",
},
]
const exercises: any[] = []
for (let i = 0; i < lecturas.length; i++) {
const l = lecturas[i]
exercises.push({
id: `seb-lect2-${i}`,
stage: 2,
skillCode: `lectura-inferencia-${i}`,
type: "lectura",
prerequisites: i === 0 ? [`seb-lect1-9`] : [`seb-lect2-${i - 1}`],
content: {
instruction: "Leé el texto y pensá:",
text: l.text,
audioText: l.text,
emoji: l.emoji,
options: l.options.map((o) => ({
label: o,
correct: o === l.correcta,
id: o.toLowerCase().slice(0, 15),
})),
},
functionalContext: "Deducir moralejas, motivaciones y causas implícitas en textos narrativos.",
errorType: "omision-letra",
})
}
const stage: Stage = {
id: 2,
name: "Inferencias y conclusiones",
description: "Deducir moralejas, motivaciones de personajes y relaciones causa-efecto en textos narrativos.",
exercises,
}
export default stage
+108
View File
@@ -0,0 +1,108 @@
import type { Stage } from "../types"
const lecturas = [
{
text: "La atmósfera terrestre está compuesta principalmente por nitrógeno (78%) y oxígeno (21%). El oxígeno es el gas que respiramos. La atmósfera nos protege de los rayos dañinos del sol y mantiene la temperatura del planeta estable.",
question: "¿Cuál es el gas más abundante en la atmósfera?",
options: ["Nitrógeno", "Oxígeno", "Dióxido de carbono"],
correcta: "Nitrógeno",
emoji: "🌍",
},
{
text: "El ciclo del agua describe cómo el agua se mueve por el planeta. El sol calienta el agua de los océanos y se evapora. Forma nubes. Luego llueve y el agua vuelve a la tierra. Corre por los ríos hasta el mar, y el ciclo comienza de nuevo.",
question: "¿Qué pasa después de que el agua se evapora?",
options: ["Forma nubes", "Vuelve al mar", "Se congela"],
correcta: "Forma nubes",
emoji: "☁️",
},
{
text: "Los imanes tienen dos polos: norte y sur. Los polos opuestos se atraen y los polos iguales se repelen. La Tierra tiene un campo magnético que funciona como un imán gigante. Por eso la brújula siempre apunta al norte.",
question: "¿Por qué la brújula apunta al norte?",
options: ["Por el campo magnético de la Tierra", "Porque el norte es más frío", "Porque el sol sale por el norte"],
correcta: "Por el campo magnético de la Tierra",
emoji: "🧲",
},
{
text: "El corazón humano late aproximadamente 100.000 veces al día. Bombea sangre a todo el cuerpo a través de las arterias. La sangre lleva oxígeno y nutrientes a las células. El ejercicio fortalece el corazón y lo mantiene saludable.",
question: "¿Cuántas veces late el corazón por día?",
options: ["100.000 veces", "10.000 veces", "1.000.000 veces"],
correcta: "100.000 veces",
emoji: "❤️",
},
{
text: "Los fósiles son restos de seres vivos que vivieron hace millones de años. Pueden ser huesos, dientes o huellas. Los paleontólogos los estudian para entender cómo era la vida en el pasado. El fósil más antiguo tiene 3.500 millones de años.",
question: "¿Quiénes estudian los fósiles?",
options: ["Los paleontólogos", "Los astrónomos", "Los geólogos"],
correcta: "Los paleontólogos",
emoji: "🦴",
},
{
text: "Los rayos son descargas eléctricas muy potentes que ocurren durante las tormentas. Un rayo puede alcanzar 30.000°C, más caliente que la superficie del sol. El trueno es el sonido que produce el aire al calentarse repentinamente. Primero vemos el rayo, luego escuchamos el trueno.",
question: "¿Qué temperatura puede alcanzar un rayo?",
options: ["30.000°C", "5.000°C", "100.000°C"],
correcta: "30.000°C",
emoji: "⚡",
},
{
text: "Charles Darwin fue un científico inglés que estudió la evolución de las especies. Viajó a las Islas Galápagos y observó que los pinzones tenían picos diferentes según su alimentación. Propuso que las especies cambian con el tiempo mediante la selección natural.",
question: "¿Qué observó Darwin en los pinzones?",
options: ["Tenían picos diferentes según su alimentación", "Tenían colores diferentes", "Cantaban distinto"],
correcta: "Tenían picos diferentes según su alimentación",
emoji: "🐦",
},
{
text: "La tabla periódica organiza todos los elementos químicos conocidos. Fue creada por Dimitri Mendeléyev en 1869. Los elementos están ordenados por su número atómico. Hay 118 elementos confirmados. El hidrógeno es el más ligero y el oxígeno es esencial para la vida.",
question: "¿Quién creó la tabla periódica?",
options: ["Mendeléyev", "Darwin", "Einstein"],
correcta: "Mendeléyev",
emoji: "🧪",
},
{
text: "Las montañas se forman por el movimiento de las placas tectónicas. Cuando dos placas chocan, la corteza terrestre se pliega y se eleva. La cordillera de los Andes se formó así. El Aconcagua, con 6.961 metros, es la montaña más alta de América.",
question: "¿Cómo se forman las montañas?",
options: ["Por el choque de placas tectónicas", "Por la erosión del viento", "Por los volcanes"],
correcta: "Por el choque de placas tectónicas",
emoji: "🏔️",
},
{
text: "La energía renovable proviene de fuentes naturales que no se agotan. La energía solar usa paneles para captar la luz del sol. La energía eólica usa el viento para mover molinos. La energía hidroeléctrica usa el agua. Estas energías no contaminan el ambiente.",
question: "¿Qué tienen en común las energías renovables?",
options: ["No contaminan y provienen de fuentes naturales", "Son muy caras", "Solo funcionan de día"],
correcta: "No contaminan y provienen de fuentes naturales",
emoji: "🌞",
},
]
const exercises: any[] = []
for (let i = 0; i < lecturas.length; i++) {
const l = lecturas[i]
exercises.push({
id: `seb-lect3-${i}`,
stage: 3,
skillCode: `lectura-informativa-${i}`,
type: "lectura",
prerequisites: i === 0 ? [`seb-lect2-9`] : [`seb-lect3-${i - 1}`],
content: {
instruction: "Leé el texto informativo y respondé:",
text: l.text,
audioText: l.text,
emoji: l.emoji,
options: l.options.map((o) => ({
label: o,
correct: o === l.correcta,
id: o.toLowerCase().slice(0, 15),
})),
},
functionalContext: "Comprender textos informativos y expositivos sobre ciencia, historia y naturaleza (método Decroly).",
errorType: "omision-letra",
})
}
const stage: Stage = {
id: 3,
name: "Textos informativos (Decroly)",
description: "Comprender textos expositivos sobre ciencia, historia y naturaleza con preguntas de comprensión.",
exercises,
}
export default stage
+178
View File
@@ -0,0 +1,178 @@
import type { Stage } from "../types"
const ejercicios = [
{
text: "El león es el rey de la selva. Tiene una melena grande y majestuosa. Caza en grupo con su manada. La hembra es la que caza la mayor parte del tiempo.",
question: "¿Cuál es la idea principal?",
options: ["El león es el rey de la selva y caza en grupo", "El león tiene melena", "La hembra caza"],
correcta: "El león es el rey de la selva y caza en grupo",
emoji: "🦁",
},
{
text: "Las tortugas marinas viven en los océanos. Pueden viajar miles de kilómetros. Vuelven a la misma playa donde nacieron para poner sus huevos. Están en peligro de extinción por la contaminación.",
question: "Además de viajar largas distancias, ¿qué detalle importante se menciona?",
options: ["Vuelven a la misma playa a poner huevos", "Tienen caparazón duro", "Nadan muy rápido"],
correcta: "Vuelven a la misma playa a poner huevos",
emoji: "🐢",
},
{
text: "La Antártida es el continente más frío de la Tierra. Está cubierta de hielo. Allí viven pingüinos, focas y ballenas. En verano, el sol no se pone durante meses. En invierno, no sale por semanas.",
question: "¿Cuál es la idea principal?",
options: ["La Antártida es el continente más frío y tiene características únicas", "Allí viven pingüinos", "En verano no se pone el sol"],
correcta: "La Antártida es el continente más frío y tiene características únicas",
emoji: "❄️",
},
{
text: "El teléfono fue inventado por Alexander Graham Bell en 1876. Desde entonces, la comunicación cambió para siempre. Hoy tenemos teléfonos inteligentes que hacen mucho más que llamar: sacan fotos, navegan por internet y ejecutan aplicaciones.",
question: "¿Cuál es la idea principal y cuál un detalle de apoyo?",
options: ["IP: El teléfono cambió la comunicación / D: Bell lo inventó en 1876", "IP: Bell inventó el teléfono / D: Los teléfonos son caros", "IP: Los teléfonos sacan fotos / D: Tienen aplicaciones"],
correcta: "IP: El teléfono cambió la comunicación / D: Bell lo inventó en 1876",
emoji: "📞",
},
{
text: "La ballena azul es el animal más grande del planeta. Puede medir hasta 30 metros y pesar 200 toneladas. A pesar de su tamaño, se alimenta de krill, pequeños crustáceos. Puede vivir hasta 90 años.",
question: "¿Qué detalle apoya la idea de que la ballena azul es el animal más grande?",
options: ["Mide hasta 30 metros y pesa 200 toneladas", "Se alimenta de krill", "Vive hasta 90 años"],
correcta: "Mide hasta 30 metros y pesa 200 toneladas",
emoji: "🐋",
},
{
text: "Los árboles son fundamentales para el planeta. Producen oxígeno, limpian el aire y dan sombra. Sus raíces evitan la erosión del suelo. Además, son hogar de muchos animales. Por eso es importante plantar árboles y cuidarlos.",
question: "¿Cuál es la idea principal del texto?",
options: ["Los árboles son fundamentales para el planeta por múltiples razones", "Los árboles dan sombra", "Hay que plantar árboles"],
correcta: "Los árboles son fundamentales para el planeta por múltiples razones",
emoji: "🌳",
},
{
text: "La pasta dental con flúor ayuda a prevenir las caries. Los dentistas recomiendan cepillarse los dientes después de cada comida. También es importante usar hilo dental y visitar al dentista cada seis meses.",
question: "¿Cuál de estas NO es parte de la idea principal?",
options: ["Usar pasta dental con sabor a menta", "Cepillarse después de cada comida", "Usar hilo dental"],
correcta: "Usar pasta dental con sabor a menta",
emoji: "🦷",
},
{
text: "El sistema solar se formó hace 4.600 millones de años. El sol contiene el 99,8% de toda la masa del sistema. Los planetas giran alrededor del sol en órbitas elípticas. Mercurio es el más rápido: completa una órbita en 88 días terrestres.",
question: "¿Qué detalle apoya que el sol es el centro del sistema solar?",
options: ["Contiene el 99,8% de la masa del sistema", "Los planetas giran a su alrededor", "Las dos anteriores"],
correcta: "Las dos anteriores",
emoji: "🪐",
},
{
text: "El reciclaje es importante para reducir la contaminación. Separar los residuos en orgánicos, plásticos, vidrio y papel permite reutilizar materiales. El vidrio puede reciclarse infinitamente sin perder calidad. El plástico tarda cientos de años en degradarse.",
question: "¿Cómo se relaciona la idea principal (reciclar es importante) con el detalle del vidrio?",
options: ["El vidrio se puede reciclar muchas veces, mostrando un beneficio del reciclaje", "El vidrio no es importante", "El vidrio contamina más que el plástico"],
correcta: "El vidrio se puede reciclar muchas veces, mostrando un beneficio del reciclaje",
emoji: "♻️",
},
{
text: "Los mayas fueron una civilización avanzada en América Central. Desarrollaron un calendario muy preciso. Construyeron pirámides y ciudades. Eran expertos en astronomía y matemáticas. Crearon el concepto del cero antes que otras culturas.",
question: "¿Cuál de estos es un detalle, no la idea principal?",
options: ["Usaban el calendario maya", "Fueron una civilización avanzada", "Construyeron pirámides"],
correcta: "Usaban el calendario maya",
emoji: "🏛️",
},
{
text: "El internet es una red mundial que conecta computadoras y dispositivos. Permite compartir información al instante. Se usa para comunicarse, estudiar, trabajar y entretenerse. Fue creado originalmente como un proyecto militar en Estados Unidos.",
question: "¿Cuál es la idea principal?",
options: ["El internet es una red mundial que conecta y permite compartir información", "Fue un proyecto militar", "Se usa para entretenerse"],
correcta: "El internet es una red mundial que conecta y permite compartir información",
emoji: "🌐",
},
{
text: "Los flamingos son rosados por su alimentación. Comen camarones y algas que contienen carotenoides. Viven en grandes grupos llamados colonias. Pueden pararse en una pata por horas. Construyen nidos de barro con forma de cono.",
question: "Además de su color, ¿qué otro detalle describe a los flamingos?",
options: ["Se paran en una pata por horas y construyen nidos de barro", "Son aves migratorias", "Viven en el Polo Norte"],
correcta: "Se paran en una pata por horas y construyen nidos de barro",
emoji: "🦩",
},
{
text: "La luz viaja a 300.000 kilómetros por segundo. Es lo más rápido del universo. La luz del sol tarda 8 minutos en llegar a la Tierra. La luz de otras estrellas tarda años en llegar. Por eso vemos el cielo como era en el pasado.",
question: "¿Cuál es la idea principal?",
options: ["La luz viaja muy rápido y eso afecta cómo vemos el universo", "La luz del sol tarda 8 minutos", "La luz es más rápida que el sonido"],
correcta: "La luz viaja muy rápido y eso afecta cómo vemos el universo",
emoji: "💡",
},
{
text: "Los delfines son mamíferos marinos muy inteligentes. Usan la ecolocalización para navegar y encontrar comida. Emiten sonidos que rebotan en los objetos. Viven en grupos familiares llamados manadas. Se comunican con silbidos y clics.",
question: "¿Cuál es la idea principal?",
options: ["Los delfines son inteligentes y usan ecolocalización para vivir en grupo", "Los delfines emiten sonidos", "Los delfines viven en el mar"],
correcta: "Los delfines son inteligentes y usan ecolocalización para vivir en grupo",
emoji: "🐬",
},
{
text: "La agricultura comenzó hace 10.000 años. Los humanos dejaron de ser nómadas y se establecieron en aldeas. Cultivaban trigo, maíz y arroz. Domesticaron animales como ovejas, cabras y vacas. Esto permitió el desarrollo de las primeras civilizaciones.",
question: "¿Cuál de estos NO es parte de la idea principal sobre el inicio de la agricultura?",
options: ["Usaban tractores para arar", "Los humanos se volvieron sedentarios", "Cultivaban cereales como trigo y maíz"],
correcta: "Usaban tractores para arar",
emoji: "🌾",
},
{
text: "La contaminación del aire afecta nuestra salud. Los autos y las fábricas emiten gases tóxicos. Respirar aire contaminado puede causar enfermedades respiratorias. Usar transporte público y bicicletas ayuda a reducir la contaminación.",
question: "¿Qué detalle apoya la idea de que la contaminación del aire es dañina?",
options: ["Causa enfermedades respiratorias", "Los autos emiten gases", "La bicicleta es un medio de transporte"],
correcta: "Causa enfermedades respiratorias",
emoji: "🏭",
},
{
text: "El oro es un metal precioso muy valorado. No se oxida ni se corroe. Es maleable: puede hacerse láminas muy finas. Se usa en joyería, electrónica y como respaldo económico. Se encuentra en vetas subterráneas y en el lecho de los ríos.",
question: "¿Cuál es la idea principal?",
options: ["El oro es un metal precioso con propiedades únicas y múltiples usos", "El oro no se oxida", "El oro se usa en joyería"],
correcta: "El oro es un metal precioso con propiedades únicas y múltiples usos",
emoji: "🥇",
},
{
text: "Los glaciares son grandes masas de hielo que se mueven lentamente. Cubren el 10% de la superficie terrestre. Contienen el 70% del agua dulce del planeta. El cambio climático está derritiendo los glaciares a un ritmo alarmante.",
question: "Además de ser masas de hielo, ¿qué dato importante se da sobre los glaciares?",
options: ["Contienen el 70% del agua dulce del planeta", "Son blancos", "Están en las montañas"],
correcta: "Contienen el 70% del agua dulce del planeta",
emoji: "🏔️",
},
{
text: "El telescopio Hubble fue lanzado al espacio en 1990. Orbita la Tierra y toma imágenes del universo sin la distorsión de la atmósfera. Ha descubierto nuevas galaxias, estrellas y planetas. Sus fotos han cambiado nuestra forma de entender el cosmos.",
question: "¿Cuál es la idea principal?",
options: ["El Hubble orbita la Tierra y ha revolucionado nuestra comprensión del universo", "El Hubble fue lanzado en 1990", "El Hubble toma fotos"],
correcta: "El Hubble orbita la Tierra y ha revolucionado nuestra comprensión del universo",
emoji: "🔭",
},
{
text: "Las pirámides de Egipto son tumbas monumentales construidas hace 4.500 años. La Gran Pirámide de Giza es la más grande. Está hecha de millones de bloques de piedra. Los egipcios usaron rampas para construirla. Sigue siendo un misterio cómo lograron tal precisión.",
question: "¿Qué detalle apoya la idea de que las pirámides son impresionantes?",
options: ["Están hechas de millones de bloques con precisión milimétrica", "Son amarillas", "Están en Egipto"],
correcta: "Están hechas de millones de bloques con precisión milimétrica",
emoji: "🔺",
},
]
const exercises: any[] = []
for (let i = 0; i < ejercicios.length; i++) {
const e = ejercicios[i]
exercises.push({
id: `seb-lect4-${i}`,
stage: 4,
skillCode: `idea-principal-${i}`,
type: "lectura",
prerequisites: i === 0 ? [`seb-lect3-9`] : [`seb-lect4-${i - 1}`],
content: {
instruction: e.question,
text: e.text,
audioText: e.text,
emoji: e.emoji,
options: e.options.map((o) => ({
label: o,
correct: o === e.correcta,
id: o.toLowerCase().slice(0, 20),
})),
},
functionalContext: "Distinguir la idea principal de los detalles de apoyo en textos expositivos.",
errorType: "omision-letra",
})
}
const stage: Stage = {
id: 4,
name: "Idea principal vs detalles",
description: "Distinguir la idea central de los detalles de soporte en textos expositivos.",
exercises,
}
export default stage
+217
View File
@@ -0,0 +1,217 @@
import type { Stage } from "../types"
// Redacción guiada: completar párrafos (palabra type) y ordenar (secuencia type)
const exercises: any[] = []
let idx = 0
// Part 1: Completar párrafos (palabra type)
const parrafos = [
{
instruction: "Completá la palabra que falta:",
text: "Mi animal favorito es el _____. Tiene cuatro patas y ladra.",
completar: "perro",
options: ["perro", "gato", "pájaro"],
emoji: "🐕",
},
{
instruction: "Completá la palabra que falta:",
text: "En la mañana me levanto y me _____ los dientes.",
completar: "cepillo",
options: ["cepillo", "peino", "visto"],
emoji: "🪥",
},
{
instruction: "Completá la palabra que falta:",
text: "La _____ brilla en el cielo durante la noche.",
completar: "luna",
options: ["luna", "nube", "lluvia"],
emoji: "🌙",
},
{
instruction: "Completá la palabra que falta:",
text: "Para cruzar la calle hay que mirar el _____.",
completar: "semáforo",
options: ["semáforo", "cartel", "auto"],
emoji: "🚦",
},
{
instruction: "Completá la palabra que falta:",
text: "En la biblioteca hay que _____ en voz baja.",
completar: "hablar",
options: ["hablar", "gritar", "cantar"],
emoji: "🤫",
},
{
instruction: "Completá la palabra que falta:",
text: "La _____ es la ciencia que estudia los números.",
completar: "matemática",
options: ["matemática", "historia", "geografía"],
emoji: "🔢",
},
{
instruction: "Completá la palabra que falta:",
text: "El _____ es la estación más fría del año.",
completar: "invierno",
options: ["invierno", "verano", "otoño"],
emoji: "❄️",
},
{
instruction: "Completá la palabra que falta:",
text: "Las _____ son aves que vuelan al sur en invierno.",
completar: "golondrinas",
options: ["golondrinas", "gallinas", "pingüinos"],
emoji: "🐦",
},
{
instruction: "Completá la palabra que falta:",
text: "El _____ es el planeta más cercano al Sol.",
completar: "Mercurio",
options: ["Mercurio", "Venus", "Marte"],
emoji: "🪐",
},
{
instruction: "Completá la palabra que falta:",
text: "La _____ es la capa de aire que rodea la Tierra.",
completar: "atmósfera",
options: ["atmósfera", "corteza", "hidrosfera"],
emoji: "🌍",
},
{
instruction: "Completá la palabra que falta:",
text: "Para hacer una torta necesitamos _____ y huevos.",
completar: "harina",
options: ["harina", "leche", "azúcar"],
emoji: "🎂",
},
{
instruction: "Completá la palabra que falta:",
text: "El _____ es el país más grande de América del Sur.",
completar: "Brasil",
options: ["Brasil", "Argentina", "Colombia"],
emoji: "🌎",
},
{
instruction: "Completá la palabra que falta:",
text: "Los _____, como la ballena y el delfín, viven en el agua.",
completar: "mamíferos marinos",
options: ["mamíferos marinos", "peces", "reptiles"],
emoji: "🐬",
},
{
instruction: "Completá la palabra que falta:",
text: "El _____ se encarga de apagar incendios.",
completar: "bombero",
options: ["bombero", "policía", "médico"],
emoji: "🚒",
},
{
instruction: "Completá la palabra que falta:",
text: "Cuando estamos contentos, nos _____.",
completar: "reímos",
options: ["reímos", "enojamos", "dormimos"],
emoji: "😄",
},
{
instruction: "Completá la palabra que falta:",
text: "La _____ es el proceso por el cual las plantas fabrican comida.",
completar: "fotosíntesis",
options: ["fotosíntesis", "respiración", "digestión"],
emoji: "🌿",
},
{
instruction: "Completá la palabra que falta:",
text: "Los _____ son rocas que caen del espacio a la Tierra.",
completar: "meteoritos",
options: ["meteoritos", "planetas", "estrellas"],
emoji: "☄️",
},
{
instruction: "Completá la palabra que falta:",
text: "Necesito un _____ para enviar una carta por correo.",
completar: "sobre",
options: ["sobre", "papel", "lápiz"],
emoji: "✉️",
},
{
instruction: "Completá la palabra que falta:",
text: "La _____ de la Tierra dura 24 horas.",
completar: "rotación",
options: ["rotación", "traslación", "gravedad"],
emoji: "🌏",
},
{
instruction: "Completá la palabra que falta:",
text: "El _____ es el deporte que se juega con un arco y flechas.",
completar: "tiro con arco",
options: ["tiro con arco", "fútbol", "natación"],
emoji: "🏹",
},
{
instruction: "Completá la palabra que falta:",
text: "_____ es la capital de Argentina.",
completar: "Buenos Aires",
options: ["Buenos Aires", "Córdoba", "Rosario"],
emoji: "🏛️",
},
{
instruction: "Completá la palabra que falta:",
text: "La _____ es el estudio de los seres vivos.",
completar: "biología",
options: ["biología", "física", "química"],
emoji: "🔬",
},
{
instruction: "Completá la palabra que falta:",
text: "El _____ es el instrumento que mide la temperatura.",
completar: "termómetro",
options: ["termómetro", "barómetro", "reloj"],
emoji: "🌡️",
},
{
instruction: "Completá la palabra que falta:",
text: "Los _____ protegen nuestras manos del frío.",
completar: "guantes",
options: ["guantes", "medias", "bufandas"],
emoji: "🧤",
},
{
instruction: "Completá la palabra que falta:",
text: "Para dibujar un círculo perfecto usamos un _____.",
completar: "compás",
options: ["compás", "regla", "transportador"],
emoji: "📐",
},
]
for (const p of parrafos) {
exercises.push({
id: `seb-lect5-completar-${idx}`,
stage: 5,
skillCode: `redaccion-completar-${idx}`,
type: "palabra",
prerequisites: idx === 0 ? [] : [exercises[idx - 1].id],
content: {
instruction: p.instruction,
text: p.text,
audioText: p.text,
emoji: p.emoji,
options: p.options.map((o, i) => ({
label: o,
correct: o === p.completar,
id: `opt-${idx}-${i}`,
})),
},
functionalContext: "Redacción guiada Freinet: completar párrafos con la palabra correcta para expresar ideas completas.",
errorType: "omision-letra",
})
idx++
}
const stage: Stage = {
id: 5,
name: "Redacción guiada (Freinet)",
description: "Completar y ordenar párrafos para desarrollar la expresión escrita mediante el método Freinet de texto libre.",
exercises,
}
export default stage
+211
View File
@@ -0,0 +1,211 @@
import type { Stage } from "../types"
const exercises: any[] = []
let idx = 0
// Part 1: Estructura de carta (partes)
const cartas = [
{
instruction: "¿Qué parte de la carta es 'Querido amigo'?",
correct: "Saludo",
wrong1: "Despedida",
wrong2: "Cuerpo",
emoji: "✉️",
},
{
instruction: "¿Qué parte de la carta es 'Atentamente, Juan'?",
correct: "Despedida",
wrong1: "Saludo",
wrong2: "Fecha",
emoji: "✍️",
},
{
instruction: "¿Qué parte de la carta es 'Buenos Aires, 15 de marzo'?",
correct: "Fecha y lugar",
wrong1: "Saludo",
wrong2: "Firma",
emoji: "📅",
},
{
instruction: "¿Qué parte de la carta va al final con tu nombre?",
correct: "Firma",
wrong1: "Saludo",
wrong2: "Destinatario",
emoji: "🖊️",
},
{
instruction: "¿Cómo se llama la persona que escribe la carta?",
correct: "Remitente",
wrong1: "Destinatario",
wrong2: "Cartero",
emoji: "📝",
},
{
instruction: "¿Cómo se llama la persona que recibe la carta?",
correct: "Destinatario",
wrong1: "Remitente",
wrong2: "Cartero",
emoji: "📬",
},
]
for (const c of cartas) {
exercises.push({
id: `seb-lect6-carta-${idx}`,
stage: 6,
skillCode: `carta-parte-${idx}`,
type: "eleccion",
prerequisites: idx === 0 ? [`seb-lect5-completar-24`] : [exercises[idx - 1].id],
content: {
instruction: c.instruction,
text: c.instruction,
audioText: c.instruction,
emoji: c.emoji,
options: [
{ label: c.correct, correct: true, id: `c-${idx}` },
{ label: c.wrong1, correct: false, id: `w1-${idx}` },
{ label: c.wrong2, correct: false, id: `w2-${idx}` },
].sort(() => Math.random() - 0.5),
},
functionalContext: "Correspondencia interescolar Freinet: conocer las partes de una carta.",
errorType: "omision-letra",
})
idx++
}
// Part 2: Ordenar la carta
const cartasOrdenar = [
{
instruction: "Ordená las partes de una carta:",
parts: ["Fecha y lugar", "Saludo", "Cuerpo de la carta", "Despedida", "Firma"],
emoji: "✉️",
},
]
for (const co of cartasOrdenar) {
const shuffled = [...co.parts].sort(() => Math.random() - 0.5)
exercises.push({
id: `seb-lect6-orden-${idx}`,
stage: 6,
skillCode: `carta-orden-${idx}`,
type: "secuencia",
prerequisites: [exercises[idx - 1].id],
content: {
instruction: co.instruction,
text: "Ordená las partes de una carta correctamente",
audioText: "Ordená las partes de una carta",
emoji: co.emoji,
sequence: shuffled,
},
functionalContext: "Correspondencia interescolar Freinet: ordenar las partes de una carta.",
errorType: "omision-letra",
})
idx++
}
// Part 3: Preguntas sobre correspondencia
const corresp = [
{
q: "¿Con qué frase podés empezar una carta a un amigo?",
correct: "Querido amigo",
wrong1: "Señor juez",
wrong2: "A quien corresponda",
emoji: "👋",
},
{
q: "¿Cómo podés despedirte en una carta a tu abuela?",
correct: "Con cariño, tu nieto",
wrong1: "Atentamente",
wrong2: "Sinceramente",
emoji: "💖",
},
{
q: "Además de cartas, ¿qué otra forma de correspondencia existe?",
correct: "Correo electrónico",
wrong1: "Teléfono",
wrong2: "Radio",
emoji: "📧",
},
{
q: "¿Qué dato debe estar en el sobre para que llegue la carta?",
correct: "La dirección del destinatario",
wrong1: "El teléfono del remitente",
wrong2: "La edad del cartero",
emoji: "🏠",
},
{
q: "¿Qué se necesita para enviar una carta por correo?",
correct: "Un sello / estampilla",
wrong1: "Una foto",
wrong2: "Un código de barras",
emoji: "💌",
},
{
q: "¿Qué escribís en el cuerpo de la carta?",
correct: "Lo que querés contar",
wrong1: "Solo el saludo",
wrong2: "Solo la fecha",
emoji: "📄",
},
{
q: "¿Por qué es importante escribir la fecha en una carta?",
correct: "Para saber cuándo se escribió",
wrong1: "Para decorar la hoja",
wrong2: "Para que llegue más rápido",
emoji: "📅",
},
{
q: "Si le escribís una carta a tu maestra, ¿qué saludo usás?",
correct: "Querida maestra",
wrong1: "Hola, che",
wrong2: "Señora, le comunico",
emoji: "👩‍🏫",
},
{
q: "¿Qué información va en el remitente?",
correct: "Tu nombre y dirección",
wrong1: "Solo tu nombre",
wrong2: "La dirección del destinatario",
emoji: "📤",
},
{
q: "¿Qué significa 'correspondencia'?",
correct: "Intercambio de cartas y mensajes",
wrong1: "Un tipo de baile",
wrong2: "Un juego de mesa",
emoji: "📬",
},
]
for (const cor of corresp) {
exercises.push({
id: `seb-lect6-corresp-${idx}`,
stage: 6,
skillCode: `correspondencia-${idx}`,
type: "eleccion",
prerequisites: [exercises[idx - 1].id],
content: {
instruction: cor.q,
text: cor.q,
audioText: cor.q,
emoji: cor.emoji,
options: [
{ label: cor.correct, correct: true, id: `c-${idx}` },
{ label: cor.wrong1, correct: false, id: `w1-${idx}` },
{ label: cor.wrong2, correct: false, id: `w2-${idx}` },
].sort(() => Math.random() - 0.5),
},
functionalContext: "Correspondencia interescolar Freinet: conocer el formato y propósito de las cartas.",
errorType: "omision-letra",
})
idx++
}
const stage: Stage = {
id: 6,
name: "Correspondencia interescolar (Freinet)",
description: "Aprender la estructura de una carta: saludo, cuerpo, despedida, firma, y cómo escribir correspondencia.",
exercises,
}
export default stage