nutri. es una PWA de registro nutricional de uso diario: React, Supabase, sin equipo de backend ni otra persona que mantenga el código. Esa es la superficie. Lo que merece explicarse es cómo trabajamos un agente de IA y yo sobre el código, y qué controles permiten hacerlo sin un segundo revisor que detecte una integración defectuosa.
Las funciones de IA y su evidencia
Hay cuatro funciones de IA activas en producción. Cada una enlaza a un caso de construcción con su propia evidencia: capturas, resultados de evaluaciones o una verificación contra la base de datos en vivo:
- Extracción nutricional con IA: una foto de etiqueta o una descripción se convierte en una estimación estructurada por cada 100 g mediante una cadena de respaldo de siete modelos; todo cambio de prompt o modelo pasa por una evaluación con conjunto de referencia cotejado con datos de USDA. Evaluaciones de una cascada de modelos
- Búsqueda semántica en el catálogo: combina palabras clave y pgvector; «fruta cítrica» encuentra naranja, toronja y limón aunque los nombres no coincidan literalmente. RAG que solo cita lo recuperado
- «Pregunta a tu registro»: RAG estructurado sobre el diario de alimentos; en la prueba integral, la respuesta citó 409.5 mg de sodio y la vista de la base de datos registraba 409.500. El mismo caso
- Servidor MCP remoto: OAuth 2.1 con registro dinámico de clientes y seguridad por filas de la base de datos para autorizar acceso a datos de usuario; Claude registra comidas desde claude.ai contra producción. Servidor MCP remoto
Las convenciones son la base
Cada sesión carga dos archivos normativos: un acuerdo de trabajo (CLAUDE.md) y un archivo permanente de estándares (BIBLIA.md). No son READMEs: codifican invariantes que el agente no puede violar. Cada nutriente se almacena por 100 g, los totales se calculan en vistas SQL y nunca se copian, y existe un límite inferior médico de sodio que no se negocia ni se configura. La calidad del agente depende del contexto que se le obliga a releer; los archivos de convenciones son una pieza central del trabajo en un repositorio agéntico.
Controles estructurales antes que recomendaciones
Una recomendación de «revisa tu rama» no resiste una carrera entre dos sesiones que comparten un checkout. Un hook previo al commit que rechaza cualquier commit a main sí lo hace. Lo mismo ocurre con la corrección: un cambio no está terminado porque se vea bien; está terminado cuando pasan 186 pruebas, lint y build. La compuerta es mecánica, no una promesa.
MCP en ambos sentidos
Los cambios de esquema pasan por el conector MCP de Supabase: el agente escribe una migración incremental y numerada, la aplica al proyecto en vivo y la verifica con una consulta antes de cerrar el trabajo. Se han entregado así más de dos docenas de migraciones; la numeración y la comprobación posterior dejan un rastro auditable.
El mismo patrón cubre la observabilidad: el proyecto de Sentry se configuró por su conector MCP —proyecto, DSN y cambio de CSP enviados desde el agente en una sola sesión— para que los errores de producción regresen al ciclo de trabajo en lugar de quedar en la consola de un usuario.
El conector también funciona en la otra dirección: nutri expone su propio servidor MCP remoto, de modo que Claude opera la aplicación en lenguaje natural contra producción, con seguridad por filas como única capa de autorización y los mismos validadores de dominio que usa la interfaz. La construcción —OAuth 2.1, decisiones sobre las herramientas y verificación sin cambios netos en la base de datos en vivo— tiene su propio caso: Un servidor MCP remoto con RLS como única capa de autorización.
La fiabilidad también deja evidencia
Dos usuarios con teléfonos reales encontraron un error que una demo no muestra: con mala conexión, una misma comida se registraba tres veces porque la interfaz esperaba a la red antes de responder. Ahora las escrituras entran en una cola local y aparecen de inmediato; el UUID de la fila se genera en el cliente, así que repetir un insert choca con la clave primaria en vez de crear un duplicado. El catálogo también queda en caché: la app instalada puede abrirse sin conexión, buscar y registrar alimentos. Escrituras sin conexión y cola idempotente
El producto
La mayor parte exige iniciar sesión, así que estas imágenes muestran pantallas que quien revisa el caso no vería de otro modo.
Qué podría trasladarse a un equipo mayor
En una operación individual, esto es una disciplina de trabajo. En un equipo, cada pieza se convierte en una superficie de plataforma: los archivos de convenciones pasan a ser habilidades compartidas, el hook previo al commit se convierte en política de CI, el acceso MCP en infraestructura gobernada y el sistema de evaluaciones en una práctica de medición común. Operar la versión de una sola persona me enseñó dónde están las uniones.
Repositorio: github.com/vryahn/nutri · En vivo: nutri.vryahn.com/about (recorrido público → demo en vivo, sin registro: copia aislada con 35 días de datos que se borran automáticamente)