NUTRISYNCBuilders Hub
🏠 🛠

📸 Epic P — Meal Photo AI: la comida entra por la cámara

Propuesta 39 · 9 de agosto de 2026 · decisión Juanjo: entra en la 0.22 («yes, 22!») · game changer, no mejora incremental · nace del feedback del piloto (NS-0033 💡) y del análisis competitivo v1.1 (pestaña 🥊)
Foto → borrador creíble → corregir en uno o dos toques → dato nutricional estructurado. Y a partir de ahí, lo estratégico: aprender qué patrones funcionan para CADA usuaria a lo largo de sus ciclos.

1 · Por qué es EL epic (y por qué ahora)

2 · Reparto (quién trae qué)

QuiénTrae
LucíaScreenflows y diseños: captura, «analizando…», pantalla de confirmación/corrección (borrador, no veredicto), diario visual.
PilarDeontología del mapeo foto→nutrientes: qué se estima, cómo se comunica la incertidumbre, qué NUNCA se afirma (nada clínico), reglas de porciones y rangos.
EngineeringToda la lógica: captura, Edge Function de análisis, casado con base nutricional (USDA ya con clave ✔ · EuroFIR pendiente de alta), cálculo determinista, patrones.

3 · Arquitectura — el stack que ya tenemos, sin piezas nuevas

Cero servidores nuevos (principio rector). Todo Supabase + React Native + un proveedor de visión:

App RN (Expo)
  ├─ foto → redimensionar 1024px JPEG (compress .75, SIN EXIF)
  ├─ subir a Storage PRIVADO  meal-images/{user_id}/{meal_id}.jpg
  └─ crear meal_log (status: uploading → queued)
        ▼
Edge Function analyse-meal
  ├─ verificar sesión de la usuaria (y que el meal es SUYO)
  ├─ descargar imagen privada → base64
  ├─ visión IA → JSON ESTRICTO (json_schema, strict:true)
  ├─ casar alimentos contra canonical_foods (USDA/EuroFIR)
  ├─ macros DETERMINISTAS: per100g × gramos ÷ 100  ← jamás el LLM
  └─ guardar borrador (status: needs_review)
        ▼
Pantalla de confirmación (borrador, no hecho)
  ├─ «La IA detectó esto» + confianza
  ├─ corrige porciones/ingredientes → meal_edits (ORO)
  └─ confirmar (status: confirmed)
        ▼
Motor de patrones (SQL primero, LLM solo EXPLICA después)
  └─ grupos + macros + fase + síntomas + energía + sueño + ejercicio

Modelos y enrutado

CasoModelo
Comida normal (volumen alto)gpt-5.6-luna (visión, Responses API, salida JSON estricta)
Confianza < 0.65 · platos mixtos · salsas · etiquetas/menúsreintento con gpt-5.6-terra
Sigue dudosoUNA pregunta simple a la usuaria: «¿era pollo o atún?»
Encaje con el Epic N (Propuesta 32): mismo régimen — router reversible, golden-set propio (fotos de comidas reales del piloto con corrección como etiqueta), cero PII en prompts: a la visión viaja SOLO la imagen, jamás el historial de ciclo o salud. El proveedor de visión es una elección revisable, no un matrimonio.

4 · Las reglas que no se negocian

5 · Modelo de datos (resumen — SQL completo en el anexo del chat de ingeniería)

TablaQué guarda
meal_logsLa comida: tipo, imagen, status (uploading→queued→processing→needs_review→confirmed→failed), modelo/prompt/confianza IA, macros confirmados, snapshot de fase y día de ciclo, raw JSON de auditoría.
meal_itemsCada alimento detectado: nombre, casado canónico (fuente+id), gramos estimados (con rango bajo/alto), confianza, preparación, macros calculados, grupos[], ingredientes visibles y ocultos posibles, confirmado o no.
meal_editsCada corrección de la usuaria: before/after JSON + motivo. El oro.
canonical_foodsLa base nutricional propia: fuente (USDA/EuroFIR/OFF/propia), per-100g de energía/proteína/hidratos/grasa/fibra, aliases multiidioma (pgvector después), payload de origen. Cambiar de fuente no rompe la app.

RLS en todo (cada usuaria solo lo suyo), bucket meal-images privado con carpeta por usuaria — el mismo patrón que feedback-shots.

6 · Fuentes nutricionales

FuenteParaEstado
USDA FoodData CentralIngredientes y alimentos genéricosCLAVE ACTIVA 9-ago gratuita, en Edge secrets
EuroFIR AISBLAlimentos europeos/españoles (pan, legumbres, quesos, platos locales)Alta de membresía pendiente → pedir cuota → 🗳 Decisiones. Muestra ES ya en casa: inputs/2026-08-09-EuroFIR-ES-sample.xlsx (2.456 filas de alimentos españoles con nombre original/inglés, grupo y FoodExplorer ID — el formato exacto que casará con canonical_foods)
Open Food FactsEnvasados y códigos de barras (después)Comunidad → con flag de calidad de dato
Recetario propio verificadoPlatos NutriSync de expertasCon la capa experta (Incremento 4)

6b · El databed ya existe (9-ago tarde)

Hecho el mismo día: los 5 datasets oficiales de USDA descargados a datasets/usda/ (Foundation · SR Legacy · FNDDS · Branded · full CSV + el PDF de definiciones de campos, con README de cadencias y avisos), la migración completa del modelo (2026-08-09-epic-p-databed.sql: meal_logs con origen foto|manual para compatibilidad con el formulario manual de hoy, meal_items, meal_edits, canonical_foods agnóstica de fuente, RLS y bucket privado) y el primer seed real: 363 Foundation Foods con macros analíticos per-100g vía tools/usda-import-foundation.mjs (re-ejecutable en cada release semestral de USDA). Estrategia de fuentes: Foundation sembrado entero · Branded (3 GB) por API bajo demanda con caché · FNDDS para porciones estándar · EuroFIR al llegar la membresía (muestra ES ya en inputs/).

7 · Los 5 incrementos y dónde caen

#IncrementoEntregaRelease
P1Borrador de comida por IA: foto → detección + ingredientes + grupos + confirmación. (Cámara = dependencia nativa → build)📦 nativo0.22
P2Cálculo nutricional: casado canónico USDA + porciones + macros/fibra deterministas🔄 OTA sobre 0.220.22.x
P3Patrones: agregados semanales y por ciclo, observaciones personales, dashboard🔄 OTA0.22.x / 0.23
P4Propuestas expertas: fichas de nutricionistas gobernadas, filtros duros, ranking, registro de aceptación📦 + backend0.23
P5Capa comunidad: recetas moderadas, matching, popularidad y respuesta personalbackend0.23 / GA
Realismo de calendario: la 0.22 es el build nativo del miércoles. El Incremento P1 entra si Lucía trae los screenflows a tiempo y el piloto lo prueba como BETA (flag por cohorte). P2+ viajan por OTA encima — esa es la gracia de haber separado la cámara (nativa) del cerebro (Edge Functions).

8 · Qué mide el éxito (piloto)

9 · Encaje en los planes

Anexo técnico completo (SQL de tablas + RLS + Edge Function analyse-meal + captureMeal.ts) archivado en el chat de ingeniería del 9-ago y listo para arrancar el Incremento P1 cuando lleguen los screenflows.