BACKLOG - elm-st-web
April 6, 2026 · View on GitHub
Leyenda
- Prioridad: P0 (crítico), P1 (alto), P2 (medio), P3 (bajo)
- Estado: TODO, DOING, DONE, BLOCKED
Estado de cierre operativo
- Fecha de cierre: 6 abril 2026.
- Cierre: proyecto cerrado para migracion/hardening/portfolio; tareas TODO restantes quedan como evolucion futura no bloqueante.
- Indexacion externa: cerrada como
verde tecnico / ambar externo aceptado; Bing indexa la home y Google mantiene las 11 URLs como descubiertas sin bloqueo tecnico accionable.
Plataforma y migración
| ID | Prioridad | Estado | Tarea | Criterio de aceptación |
|---|---|---|---|---|
| PLAT-001 | P0 | DONE | Configurar netlify.toml base | Deploy preview funcional en Netlify |
| PLAT-002 | P0 | DONE | Definir _redirects para rutas legacy | No hay 404 en rutas públicas existentes |
| PLAT-003 | P0 | DONE | Definir _headers de seguridad | Headers activos en producción |
| PLAT-004 | P0 | DONE | Migrar formulario de php/submit.php a solución Netlify Functions | Envío y recepción verificados vía submit-contact + Turnstile server-side |
| PLAT-005 | P1 | DONE | Configurar dominio elmst.ibaifernandez.com en Netlify DNS | Dominio principal resolviendo en Netlify |
| PLAT-006 | P1 | DONE | Añadir CI bloqueante (quality-gate) | Pipeline ejecuta checks automatizados |
| PLAT-007 | P0 | DONE | Eliminar bucle de redirección en /en/ | /en/ responde 200 sin ERR_TOO_MANY_REDIRECTS |
| PLAT-008 | P1 | DONE | Activar entrega por email del formulario (Resend) | Envío válido confirmado por correo en producción (submit-contact + Resend) |
| PLAT-009 | P0 | DONE | Consolidar gobernanza de GitHub (main protegida + PR + Quality Gate) | Ruleset Main Protection activo con PR obligatorio + check quality + bloqueo de force push/delete |
| PLAT-010 | P1 | DONE | Unificar la experiencia 404 en ES/EN bajo el 404.html global de Netlify | /ruta-inexistente y /en/ruta-inexistente responden 404 con header actual, CTA de dossier y assets cargados |
SEO
| ID | Prioridad | Estado | Tarea | Criterio de aceptación |
|---|---|---|---|---|
| SEO-001 | P0 | DONE | Actualizar robots.txt al dominio nuevo | Sitemap: correcto y rastreable |
| SEO-002 | P0 | DONE | Regenerar sitemap.xml con URLs finales | URLs válidas y status 200 |
| SEO-003 | P1 | DONE | Añadir canonical en todas las páginas | 100% páginas con canonical correcto |
| SEO-004 | P1 | DONE | Añadir Open Graph y Twitter cards | Previsualización social consistente |
| SEO-005 | P1 | TODO | Corregir títulos/descripciones duplicadas o débiles | Metadata única por URL indexable |
| SEO-006 | P1 | DONE | Añadir hreflang ES/EN cuando esté publicado el bilingüe | Cobertura internacional sin canibalización |
| SEO-007 | P0 | DONE | Decisión de negocio sobre expiración de elmst.net | Riesgo SEO aceptado: dominio no se renueva y proyecto queda como pieza de portfolio |
| SEO-008 | P1 | DONE | Activar gobernanza inicial de indexación en Google Search Console y Bing Webmaster Tools | Propiedades activas y sitemap productivo enviado a ambas plataformas |
| SEO-009 | P1 | DONE | Revisar cobertura inicial post-alta de herramientas webmaster | Cierre 6 abril 2026: Google/Bing aceptan sitemap sin errores; Bing indexa la home; Google mantiene URLs descubiertas sin indexar como latencia externa aceptada |
Accesibilidad
| ID | Prioridad | Estado | Tarea | Criterio de aceptación |
|---|---|---|---|---|
| A11Y-001 | P0 | DONE | Corregir alt vacíos/no existentes en imágenes críticas | 0 img sin nombre accesible en rutas principales |
| A11Y-002 | P1 | TODO | Revisar jerarquía de encabezados y landmarks | Estructura semántica válida por página |
| A11Y-003 | P1 | DONE | Etiquetado y validación accesible del formulario | Inputs con nombre accesible y validación activa |
| A11Y-004 | P2 | DOING | Verificar contraste y estados de foco | Cumplimiento WCAG AA en navegación principal |
| A11Y-005 | P1 | DONE | Eliminar rule exception de color-contrast en axe | Axe pasa sin exclusiones |
Rendimiento
| ID | Prioridad | Estado | Tarea | Criterio de aceptación |
|---|---|---|---|---|
| PERF-001 | P0 | DONE | Comprimir/modernizar imágenes pesadas | Reducción significativa del peso total |
| PERF-002 | P1 | DONE | Eliminar activos residuales (Thumbs.db, duplicados) | Repositorio limpio de basura binaria y artefactos legacy sin uso |
| PERF-003 | P1 | DONE | Revisar carga de JS/CSS y defer en no críticos | Menor blocking time inicial |
| PERF-004 | P2 | DONE | Definir budget por página | Budget documentado en performance-budgets.json y validado por test:budgets |
| PERF-005 | P0 | DONE | Subir Lighthouse a umbral de CI | test:lighthouse pasa en 10 rutas auditadas (ES/EN + dossier) |
| PERF-006 | P1 | DONE | Reducir dependencia de fuentes externas en render crítico | Montserrat servido en local con font-display: swap y menor variabilidad de LCP |
| PERF-007 | P1 | DONE | Convertir umbrales Lighthouse en budgets de release por ruta | Presupuesto técnico publicado y auditado por release (npm run report:release) |
| PERF-008 | P2 | DONE | Ejecutar barrido final de residuos legacy del repositorio | Eliminados assets unreferenced de vendor/, videos/, dist/ y restos no usados de rs-plugin/ sin regresión en quality:ci |
Seguridad
| ID | Prioridad | Estado | Tarea | Criterio de aceptación |
|---|---|---|---|---|
| SEC-001 | P0 | DONE | Eliminar dependencias por http:// | 0 mixed content |
| SEC-002 | P0 | DONE | Sustituir flujo PHP sin saneado robusto | Validación server-side implementada |
| SEC-003 | P1 | DONE | Revisar enlaces externos target="_blank" con rel seguro | 100% enlaces externos endurecidos |
| SEC-004 | P1 | TODO | Gestionar API keys expuestas en frontend | Ningún secreto sensible en HTML/JS público |
| SEC-005 | P2 | DONE | Estabilizar checker de enlaces externos ante anti-bot (allowlist) | test:links estable en CI con externos habilitados |
| SEC-006 | P1 | DONE | Integrar captcha invisible opcional para formulario (Turnstile + verificación serverless) | Captcha activo al definir TURNSTILE_SITE_KEY y TURNSTILE_SECRET_KEY en Netlify |
| SEC-007 | P0 | DONE | Activar Turnstile en producción | Formulario bloquea envíos bot y mantiene envío válido en ES/EN vía /.netlify/functions/submit-contact |
Calidad de código y contenido
| ID | Prioridad | Estado | Tarea | Criterio de aceptación |
|---|---|---|---|---|
| QLT-001 | P1 | DONE | Corregir errores de marcado HTML detectados | Validación HTML sin errores críticos |
| QLT-002 | P2 | TODO | Unificar copy y geografía de marca (Bogotá/Colombia/Ecuador) | Mensaje consistente en todo el sitio |
| QLT-003 | P2 | DONE | Corregir enlaces rotos/malformados (https://https://...) | 0 enlaces malformados |
| QLT-004 | P1 | DONE | Implementar regresión visual baseline | Snapshots versionados y passing |
| QLT-005 | P2 | DONE | Fijar versión de Node para desarrollo local | .nvmrc presente y CI alineado |
| QLT-006 | P1 | DONE | Alinear snapshots visuales por plataforma en CI | Baselines chromium-linux versionados y test:visual estable en GitHub Actions |
| QLT-007 | P1 | DONE | Refrescar baseline Linux de Home tras cambio de navegación (selector idioma) | home-*-chromium-linux.png actualizado y Quality Gate desbloqueado |
| QLT-008 | P1 | DONE | Re-sincronizar baselines visuales tras hardening de carga tipográfica/slider | Baselines chromium-darwin y chromium-linux regenerados y test:visual estable |
Internacionalización (i18n)
| ID | Prioridad | Estado | Tarea | Criterio de aceptación |
|---|---|---|---|---|
| I18N-001 | P0 | DONE | Definir estrategia bilingüe ES/EN (rutas, SEO, QA) | Documento de arquitectura i18n aprobado |
| I18N-002 | P0 | DONE | Crear rutas EN equivalentes para páginas públicas | Paridad funcional ES/EN |
| I18N-003 | P0 | DONE | Traducir copy EN aprobado por negocio | 100% rutas públicas con versión EN operativa |
| I18N-004 | P1 | DONE | QA bilingüe (links, sitemap, hreflang, Lighthouse) | Gate de calidad pasa en ES y EN |
| I18N-005 | P1 | DONE | Exponer selector visible de idioma en navegación | Cambio ES/EN accesible desde botón flotante en todas las rutas públicas |
| I18N-006 | P2 | DONE | Replicar patrón de selector flotante tipo portfolio (pelotita abajo izquierda) | Selector flotante con bandera y fallback accesible en navegación legacy |
Observabilidad y documentación
| ID | Prioridad | Estado | Tarea | Criterio de aceptación |
|---|---|---|---|---|
| OBS-001 | P1 | TODO | Migrar tracking UA a GA4 o alternativa | Eventos base verificados en tiempo real |
| OBS-002 | P2 | TODO | Definir panel mínimo de KPIs | Dashboard con tráfico y conversiones |
| OBS-003 | P1 | DONE | Integrar monitoreo de errores frontend (Sentry o equivalente) | Errores JS críticos visibles con contexto y alertas |
| OBS-004 | P1 | DONE | Configurar monitoreo de uptime externo | Alertas automáticas ante caída de elmst.ibaifernandez.com |
| OBS-005 | P1 | DONE | Configurar reglas de alertado P1/P2 en Sentry para reducir ruido | Reglas activas en production (P1: 10/15m, P2: 3/60m) y regla por defecto de alto ruido desactivada |
| DOC-001 | P1 | DONE | Crear y mantener CHANGELOG.md | Historial de releases y cambios disponible |
| DOC-002 | P1 | DONE | Mantener ROADMAP.md y BACKLOG.md al día | Estado real reflejado tras cada iteración |
| DOC-003 | P1 | DONE | Publicar informe de estado por iteración | Resumen técnico + riesgos + resultados de tests por ciclo |
| DOC-004 | P1 | DONE | Programar ejecución semanal automática de Quality Gate | Workflow Quality Gate corre por schedule y reporta estado |
| DOC-005 | P1 | TODO | Formalizar revisión manual mensual de QA CSV | Issue mensual con checklist desktop/mobile y owner asignado |
| DOC-006 | P1 | DONE | Generar reporte técnico versionado por release | Archivo de release con métricas de calidad, SEO, seguridad y pruebas |
| DOC-007 | P1 | DONE | Publicar dossier técnico web ES/EN | dossier-tecnico.html y en/technical-dossier.html disponibles en sitemap |
| DOC-008 | P1 | DONE | Consolidar documentación y QA bajo docs/ | Markdown operativos, QA CSV y reportes versionados centralizados con rutas actualizadas |
| DOC-009 | P1 | DONE | Publicar runbook de indexación y reflejarlo en el dossier técnico | Runbook versionado en docs/ y narrativa pública actualizada en ES/EN |