Incidente s60 — Regresiones de shell detectadas por Edu (2026-05-13)
Dos regresiones detectadas en la sesión s60 del 13 de mayo de 2026 y corregidas en el mismo commit (689023f).
Resumen
| # | Bug | Severidad | Estado |
|---|---|---|---|
| 1 | <BottomNav> visible en viewport desktop | UX — cosmético | ✅ Resuelto en 689023f |
| 2 | Badges del sidebar hardcoded, desincronizados de D1 | Dato incorrecto al usuario | ✅ Resuelto en 689023f |
Bug 1: BottomNav aparece en pantallas de escritorio
Síntoma
El componente <BottomNav> (barra de navegación inferior fija, propia de la vista mobile) aparecía renderizado en resoluciones de escritorio.
Causa raíz
El componente src/components/shell/BottomNav.tsx usa className="mobile-nav". La media query que debía ocultarlo en desktop apuntaba a .bottom-nav — una clase legacy huérfana que ningún componente JSX/TSX usa. Resultado: la regla nunca disparaba y el BottomNav quedaba siempre visible.
Confirmado con grep: .bottom-nav solo aparecía en las 2 reglas obsoletas de globals.css.
Fix aplicado
src/styles/mobile.css: añadida media query(min-width: 769px)que oculta.mobile-navcondisplay: none !important.src/styles/globals.css: eliminadas las 2 reglas.bottom-navlegacy. Conservada la media query@media (max-width: 768px)que oculta.app .header/.sidebaren mobile (esa sí era funcional).
Bug 2: Badges del sidebar hardcoded desincronizados
Síntoma
El sidebar mostraba Tareas=9, Noticias=2, Alertas=1 de forma estática, independientemente del estado real de la base de datos.
Edu creó la task #27 el 13-05-2026. El sidebar seguía mostrando 9. Una consulta get_dashboard al MCP confirmó 22 tareas pending reales.
Causa raíz
Los valores de badge estaban hardcoded en el array NAV de Sidebar.tsx:
// ANTES (hardcoded)
{ title: 'Tareas', icon: 'check', href: '/tasks', badge: 9 },
{ title: 'Noticias', icon: 'news', href: '/news', badge: 2 },
{ title: 'Alertas', icon: 'bell', href: '/alerts/admin', badge: 1 },
No había ningún mecanismo para actualizar estos valores.
Fix aplicado
- Creado nuevo endpoint
GET /api/sidebar-counts(CF Pages Function) con 4 COUNT queries ligeras en D1, cachéado 60sprivate. Sidebar.tsxrefactorizado: la propiedadbadge?: numberdel tipoNavDefsustituida porcountKey?que apunta a un campo del response del endpoint. El componente hace fetch enuseEffectal montarse.- Si el fetch falla o el valor es 0, el badge no se renderiza (fail-safe).
Documentación del endpoint: [[entity—shell—endpoint—sidebar-counts]]
Archivos modificados
| Archivo | Cambio |
|---|---|
functions/api/sidebar-counts/index.ts | Nuevo — endpoint CF Pages Function |
src/components/shell/Sidebar.tsx | Refactor badges hardcoded → countKey + useEffect |
src/styles/globals.css | Eliminadas 2 reglas .bottom-nav legacy |
src/styles/mobile.css | Añadida media query (min-width: 769px) para .mobile-nav |
Timeline
| Hora (CEST) | Evento |
|---|---|
| ~20:00 | Edu detecta BottomNav visible en desktop y badges incorrectos |
| 20:08 | Commit 689023f pushed a main por @Esquembri — ambas regresiones resueltas |
Lecciones
- Las clases CSS deben coincidir con el componente real: al renombrar una clase (
.bottom-nav→.mobile-nav) hay que actualizar todas las media queries que la referencian. - Los badges de UI nunca deben ser hardcoded: conectarlos a la fuente de verdad (D1/API) desde el primer día, aunque sea con un endpoint simple.
- El caché
private, max-age=60es un buen compromiso para datos de badge: el sidebar se actualiza en ~1 minuto sin generar presión sobre D1.
Véase también
- [[entity—shell—endpoint—sidebar-counts]]
- [[workspace—que-es-workspace]]
- [[crearack—conceptos—interfaz-general]]