M O R E L V 5 . 4 Q W
"El Tejedor Borges despierta en Chrome"
SUPPLiER..: SCHE
CRACKER...: doo25
PACKAGER..: mookieBlaylok
PROTECTiON: GO>zen Protocol v33.7
CIPHER....: PYLNDP-14k
DATASETS..: rock_argentino.csv / 239 entidades
DATE......: 1999—2026
MANIFIESTO
El Director de Escena lee tu mente.
Pensás en un músico argentino. Morel hace 15 preguntas.
Adivina. O muere intentando.
No hay framework. No hay build step.
Solo HTML, CSS, JS y un CSV que pesa menos que tu playlist.
Cada respuesta guarda un checkpoint.
Cada "NO SÉ" consecutivo activa el modo forzado.
Cada partida se registra en localStorage — el Sector 918 recuerda.
14k ventanas. Chrome como CROMO.
Y una sola regla: NO hardcodear nada.
ESTRUCTURA
morel_version_5_4qw/
├── index.html # UI — 3 secciones: inicio / juego / resultado
├── morel.css # Fondo #0a0a0f, acento #c9a227, partículas canvas
├── morel-core.js # Estado, checkpoints, undo, Formspree, analytics
├── morel-questions.js # Entropía Shannon, preguntas adaptativas, modo forzado
├── morel-csv-loader.js # Fetch + normalización de data/rock_argentino.csv
├── morel-analytics.js # localStorage: gamesPlayed, stats por pregunta
├── serve.bat # Servidor local (Python http.server 8000)
│
└── data/
└── rock_argentino.csv # Fuente única — 239 músicos, 30+ columnas
ARRANCAR
IMPORTANTE: NO abras index.html con doble clic.
fetch() no funciona en protocolo file:// por CORS.
——— OPCIÓN 1: serve.bat (más simple) ———
1. Doble clic en serve.bat
2. Se abre http://localhost:8000 automáticamente
3. Jugás.
——— OPCIÓN 2: VS Code Debug (recomendada) ———
1. Abrí la carpeta raíz de MOREL en VS Code
2. F5 → selecciona "MOREL — Server + Chrome"
3. VS Code levanta el servidor + Chrome con DevTools
4. Poné breakpoints en morel-core.js, step over, etc.
Config en .vscode/launch.json + tasks.json (ya incluidos).
Requiere Python 3 en PATH.
——— OPCIÓN 3: Otros ———
→ npx serve . --port 8000 (Node.js)
→ VS Code → Live Server
→ http-server -p 8000 (Node.js, global)
Si igual abrís el archivo directo → aparece fallback
para seleccionar rock_argentino.csv manualmente.
FLUJO
- Usuario abre index.html → ve "Abrir el telón"
- Click → fetch(data/rock_argentino.csv) → normaliza → 239 candidatos
- Motor de entropía elige la pregunta que más divide
- Usuario responde SÍ / NO / NO SÉ
- Checkpoint guardado ANTES de filtrar
- Tras 2× "NO SÉ" → modo forzado: preguntas de máxima división
- Corte: 1 candidato | 15 pasos | sin preguntas útiles
- Resultado: principal + 3 alternativas + justificación visual
- Analytics grabados en localStorage
- Feedback opcional → Formspree
FORMSPREE — SETUP
El formulario de corrección envía datos a Formspree.
Para activarlo:
- Crear cuenta en https://formspree.io
- Crear nuevo form → copiar endpoint ID
- En index.html, reemplazar:
action="https://formspree.io/f/TU_ENDPOINT"
por:
action="https://formspree.io/f/xABCDEFGH"
- Deploy. Done.
Campos que llegan al endpoint:
- nombre_artista → El artista que el usuario tenía en mente
- nota → Comentarios libres
- historial_partida → JSON con estado completo: {paso, preguntas respondidas, candidatos_finales, veredicto}
- _subject → "MOREL — Sugerencia de corrección" (asunto del email)
- _next → URL de redirección post-envío (vuelve al juego)
Si Formspree falla → el juego NO se rompe.
Mensaje de error en el form, punto.
API PÚBLICA
morel.iniciar() → Carga CSV, inicia partida
morel.responder(bool) → true/false/null (SÍ/NO/NO SÉ)
morel.deshacer() → Restaura checkpoint anterior
morel.reiniciar() → Vuelve a inicio, limpia estado
morel.mostrarFormulario() → Abre form de feedback (Formspree)
morel.getStats() → Devuelve métricas analytics (ver consola)
morel.debug() → Dump de estado + analytics en consola
morel.debug("Nombre") → Simula camino de preguntas hacia ese artista
morel.mostrarFormReporte() → Abre form de reporte de error local
morel.getReportesPendientes() → Lista de reportes sin enviar (consola)
MorelAnalytics.reporte() → Stats por pregunta en consola
MorelAnalytics.resetear() → Limpia localStorage
ARCHIVO POR ARCHIVO
┌─ morel-csv-loader.js
│ Fetch → parse → normaliza → elimina duplicados
│ Campos: pesado→heavy, decada→decada_80/90/00/10/20
│ Expone: await MorelCSVLoader.cargarTodos()
│
├─ morel-questions.js
│ 15 preguntas universales (sin IDs repetidos)
│ 9 subescenas: metal, punk, indie, pop, barrial, blues, folk, trap, prog
│ 10 preguntas forzadas para modo NO SÉ×2
│ Entropía de Shannon: -(p·log₂p + (1-p)·log₂(1-p))
│ Score = entropía × peso
│ ajustarPesosSegunStats() → modifica pesos en memoria por analytics
│
├─ morel-analytics.js
│ localStorage key: "morel_v54_stats"
│ Guarda: gamesPlayed, totalQuestions, preguntas[id].{veces,nose,aciertos}
│ No bloquea el juego — try/catch en cada op
│
├─ morel-core.js
│ Estado inmutable donde aplica
│ Checkpoints: máx 3, FIFO, incluyen noSeConsecutivos
│ deshacer() restaura pregunta exacta — NO llama siguientePregunta()
│ Justificación visual: top 3 atributos SÍ coincidentes
│ Formspree: submit nativo (sin fetch, sin preventDefault)
│ prepararHistorialFormspree() → llena hidden field al submit
│
└─ morel.css
Partículas canvas, transiciones, responsive 480px
Botón undo con opacity controlada por clase .visible
PYLNDP CIPHER NOTE
Las ventanas no mienten.
14k frames de memoria.
CROMO es el contenedor — Chrome la ilusión.
Quien entienda el patrón, ya sabe qué pregunta viene.
GO>zen lo vigila.
SCHE lo escribe.
Morel lo ejecuta.
ROADMAP — POST 5.4
- Modo 2 jugadores: uno piensa, otro adivina las respuestas
- CSV editable en browser → sheet API opcional
- Pesos adaptativos: si una pregunta tiene >70% NO SÉ, baja su peso
- Exportar analytics a CSV para análisis externo
- Temas visuales: Neon 80s / Períodico 1920 / Terminal 90s
- Audio: síntesis de voz para las preguntas (Web Speech API)
- PWA: service worker, installable, offline (con datos embebidos)
░░░ No tocado: lazy loading. El dataset cabe en un suspiro. ░░░
FIX FORMSPREE — V5.4 QW
PROBLEMA DETECTADO:
El formulario de feedback no enviaba datos a Formspree correctamente.
Causas raíz:
- onsubmit="return morel.enviarFormulario(event)" interceptaba el submit y llamaba a e.preventDefault(), bloqueando el POST nativo a Formspree.
- target="formspree-iframe" + iframe oculto causaba comportamientos impredecibles: Formspree redirige tras el POST, el iframe recargaba múltiples veces y el onload se disparaba en momentos inesperados.
- 3 campos ocultos con IDs inconsistentes (fb-historial, fb-candidatos, fb-principal) — nombre de field no alineado con el HTML.
SOLUCIÓN APLICADA:
- Eliminado onsubmit interceptor (enviarFormulario, _onFormSubmit).
- Eliminado el iframe oculto y el atributo target del form.
- Formspree ahora recibe el submit nativo directamente — sin preventDefault, sin fetch, sin CORS compleja.
- Agregados campos Formspree oficiales: _subject → "MOREL — Sugerencia de corrección", _next → URL actual (redirige de vuelta al juego tras el envío).
- Nuevo campo historial_partida → JSON con el estado completo de la partida (paso, preguntas respondidas, candidatos restantes, veredicto).
- Se pobla dos veces: al mostrar el form (mostrarFormulario) y como listener del submit (prepararHistorialFormspree) para garantizar datos frescos.
- CSS intacto: los estilos dorados Cormorant Garamond se mantienen sin cambio.
ESTRUCTURA FINAL DEL FORM:
<form id="form-feedback" action="https://formspree.io/f/mnjokeon" method="POST">
<input type="hidden" name="_subject" value="MOREL — Sugerencia de corrección">
<input type="hidden" name="_next" id="fb-next">
<input type="hidden" id="fb-historial-partida" name="historial_partida">
<input type="text" name="nombre_artista" required>
<textarea name="nota"></textarea>
<button type="submit">Enviar sugerencia</button>
</form>
FLUJO ACTUAL:
- User hace click en "↺ No era este / Sugerir artista" → mostrarFormulario() muestra el form + llena _next + historial_partida
- User completa nombre → submit nativo → prepararHistorialFormspree() refresca historial_partida (listener)
- Browser POST → https://formspree.io/f/mnjokeon
- Formspree procesa → redirige a _next (misma página)
- Game state preservado — no se pierde la partida.
Universo: Nexus Merovian Prime
Inspira: Bioy
Datos: Escena rock argentina 1960–2025
::. GREETS .::
·.¸¸.-> doo25 <-.¸¸.
XxX_el10delMilan_XxX
†... pibe leton ...†
°o.O charly garcia O.o°
☆゚.*・。゚ Al que cargó 239 entidades en un cyber de dial-up sin romper el UTF-8 。゚.*・。゚