🔔 Sesión r15 — La 0.21 nace con voz (push) y el correo aprende a repartir
7 de agosto de 2026 · web po166–po167 · builds nativos 0.21.0 (iOS b7 + Android vc5) · Edge nueva: notify-dispatch · SQL: notify-dispatch · multi-dieta · incidencias-v2 · texto_es ×57 · OTA NS-0009
1 · La 0.21: push de punta a punta, en un día
- N1 — módulo
expo-notifications + permiso al activar (patrón L8) + token → notification_prefs. Guardas totales: el mismo bundle viaja por OTA a 0.18-0.20 y a la PWA sin romper nada.
- N2 — Ajustes → Notificaciones deja de ser maqueta: interruptor maestro, 4 grupos espejo de BD (diario · fases · rachas · reenganche), horarios mañana/noche, idioma persistido. 14 claves × 14 catálogos en el mismo cambio.
- N3 — despachador servidor:
notify_due() decide quién recibe qué a su hora local (lección NS-0010), con eventos de ciclo, dedupe 1/grupo/día y rotación de plantillas; Edge notify-dispatch envía por lotes al Push API de Expo, sella notification_log y autocura tokens muertos. Cron horario :05.
- N4 — el toque navega: racha→Progress, ciclo→Calendar, resto→Cycle; frío/fondo/abierto cubiertos.
- N5 — texto_es de las 57 activas con la voz de la marca («Despierta, bestie. Las hormonas eligieron violencia») — repaso founders en
PARA-FOUNDERS-Notificaciones-ES.md. Las 6 críticas elegidas, activadas (57 activas · 8 borrador · 15 descartadas).
- Privacidad por diseño (revisión inclusiva r13): las críticas viajan con aviso genérico en la pantalla bloqueada; el texto real, dentro de la app.
- Infra: Firebase
nutrisync-push (Spark, solo FCM — cero PII, D20 intacta para septiembre), service account en EAS, APNs key generada en el primer build. Builds duales terminados y distribuidos: TestFlight b7 (FO ya; grupos externos → beta review) + Play internal release 5 con notas EN/ES.
2 · El triaje que se convirtió en software
| Ticket | Criticidad | Qué pasó hoy |
| NS-0009 «Sin predicción + períodos fantasma» | FB1 | Raíz doble arreglada y OTA HOY: fuera la retro-proyección (pasado limpio) + predicción pintada en la rejilla (aro discontinuo + 🔮) — antes solo vivía en Tendencias. |
| NS-0004 «Solo una dieta» | FB2 | Multi-dieta completa: users.diet_types[], motor exige TODAS (verificado en vivo: glutenfree+dairyfree → 77 alimentos correctos), selector multi con «No diet» exclusiva, onboarding siembra. En 0.21. |
| NS-0005 «Más opciones / Other» | FB3 | Fila «Other» en NutriLog (texto libre que cuenta) + la vía IA queda para Epic N. |
| NS-0007 «Siempre las mismas comidas» | FB3 | Rotación diaria determinista (semilla día local + categoría) ANTES del corte top-6 que causaba la monotonía. Pura + unitarios. |
| NS-0008 «Pantallas solapadas» | FB2 | Transición fade: el solape era el slide del stack con fondos transparentes sobre el melocotón compartido. |
| NS-0003 · NS-0006 · NS-0010 | FB1 | Ya arregladas (r12-b4 / r14): respondidas con «fix enviado». |
Las 6 respuestas salieron a las testers por la app; 194 unitarios (13 nuevos hoy).
3 · Incidencias v2 (los 5 puntos de Juanjo)
- Título por ticket («cómo la llamamos nosotros») · categoría (bug/mejora/consulta/datos) · criticidad FB1/FB2/FB3 con definiciones y orden.
- Ciclo de cierre confirmado: fix enviado → esperando_usuaria → 72 h sin respuesta → ✔ para cerrar (badge + KPI + sección en el digest) → cierran founders.
- Responsable en select (buzones del dominio). CSV ampliado. nsFail apunta al SQL vigente.
Definiciones FB (FB = Feature Bug): FB1 crítico — rompe la promesa o bloquea → ≤48 h / próxima OTA · FB2 importante — degradado con rodeo → siguiente versión · FB3 menor/mejora → backlog priorizado.
4 · La saga del correo: cuatro capas, un diseño mejor
to: como string con comas → denomailer exige array («No valid emails») — y la escalación llevaba 2 días muda por lo mismo.
- Multi-destinatario → IONOS lo veta desde IPs de Supabase (554 policy).
- 11 envíos secuenciales → WORKER_RESOURCE_LIMIT (546): la CPU del Edge no da para tanta ceremonia TLS.
- La ráfaga de pruebas → «450 Mail send limit exceeded»: cuota del remitente agotada (capturada LITERAL con un envío de control desde el Mac — auth 235 ✓, sender-match ✓).
El diseño final es la moraleja: UN envío diario al alias founders@ y el fan-out lo hace IONOS desde su propia casa (7 buzones del dominio, creados hoy con credenciales en secrets/). Verificado en vivo: el digest llegó con el formato nuevo — [FB1] NS-0009 «…» + RESPUESTAS ENVIADAS. El error SMTP literal ahora viaja en la respuesta JSON (filosofía nsFail, v9).
5 · También hoy
- r15-C GitHub↔Cloudflare vivos otra vez (eran los minutos de Actions; plan Pro) + sello ns-build en el head: «¿qué build corre?» = un curl. Deploy Web natural verificado end-to-end en 3 minutos.
- web po166 (sello) · po167 (Incidencias v2). Build determinista: mismo pack → mismos bytes.
- guardarraíles 82 web-tests · 194 jest · contrato fonts · sintaxis JS · backups: FULL 54 MB + autobackup por integrate + appdev sellado en git (
935a72d).
6 · Camino (actualiza roadmap)
- 0.22 (pre-8-oct): wearables O1-O3 (D15 aceptada: «antes, solo plataformas de teléfono») — S3/S4 con consentimiento aparte, L7 escribir período, D16 no auto-ánimo, D17 sin Fitbit/Strava. DS1 pantallas → petición puntual a Design (gobernanza r14j).
- Epic N: golden-set primero (D12 aceptada: Haiku Bedrock/Vertex UE + fallback GPT-mini Azure).
- Septiembre: D20 Firebase Crashlytics+Analytics cero-PII (proyecto ya creado) · RevenueCat (D5-D8) en 0.22/0.23.
- Pulido FB3: asunto del digest sin emojis (el webmail de IONOS enseña el MIME crudo en la lista) · aterrizaje del push en NotificationCenter (0.21.1).