95 commits en un día: carruseles, retailers y un refactor de síntesis multi-canal
Hoy cerramos features en cuatro proyectos. En Hezu, validamos FEAT-022 y desplegamos navegación en carrusel con rAF limpio. En Ganga24, FEAT-020 sobre preferencia de retailer quedó listo. Chordna completó SEO con internal linking. Y en Sofi, desacoplamos generación de resúmenes del canal de entrega—ahora el contenido es único, solo se adapta el formato.
El día de los grandes cierres
Hoy fue intenso. 95 commits repartidos entre cuatro proyectos, y casi todo llegó a producción o quedó validado.
Hezu: carrusel sin conflictos CSS-JS
El carrusel de casos de uso estaba roto por un conflicto entre keyframes CSS y transforms en JS. La solución: usar requestAnimationFrame para todo y olvidarse de las keyframes en esa sección. Elena sacó el código de initializeCarouselNavigation de la clase y lo metió en el handler correcto. También agregamos arrows y swipe táctil. FEAT-021 completado, y ahora FEAT-022 está validado con los testimonios en lista de espera.
Un detalle: previnimos FOUC en la value prop section con opacity:0 inline desde el primer frame, no con JS. Cuando el script carga, descubre el elemento ya invisible.
Ganga24: retailers en el feed
Laura terminó FEAT-020: ahora el /api/deals/top expone local_image_path y tenemos un nuevo endpoint /api/images/{filename}. Pero lo interesante es que limitamos los retailers que renderiza el bot a los que realmente están en el feed real, no a todos los soportados. Eso simplifica datos y mantiene coherencia.
Sofi: la sinergia de Laura
Esta es la que más me interesa técnicamente. Desacoplamos generación de resúmenes del canal de entrega. Ahora hay una summary_generator facade que genera contenido único, y una delivery_service router que decide si va a Telegram, WhatsApp o ambos. La razón: queremos un único contenido pero con adaptaciones de formato por canal, no duplicación de lógica. Laura refactorizó los endpoints de Telegram a thin wrappers alrededor del router nuevo. FEAT-015 cerrado.
Chordna: linking SEO en dos fases
FEAT-013 de internal linking cerró, FEAT-014 (About/Privacy + footer) también. SEO estructurado.
El meta: journal automático
Mientras todo esto pasaba, Laura mejoraba el pipeline de journal. Ahora soporta Claude como fallback de Gemini cuando toca quota limits, normalizó títulos YAML multilinea, y backfilleó 99 entradas de los últimos tres meses. Edge Runtime compatible para Cloudflare Pages.
Lo que aprendí hoy: a veces el fix más simple es no usar JS donde CSS puede hacerlo, y que desacoplar generadores de consumidores escala mejor que intentar servir múltiples formatos desde el mismo código.