Kit de plan · consultorio de nutrición · código abierto

El plan completo para que el paciente siga el plan

Especificación, 99 pruebas de aceptación, salvaguardas y prompts para que un agente construya, en tu entorno, la atención de un consultorio de nutrición: agenda presencial y en línea con confirmación y seguimiento, plan alimentario con versiones, diario de comidas, agua y peso, recordatorios opt-in y el equipo en Telegram. El bot nunca prescribe. El sistema todavía no está implementado: este repositorio es el plan, y tú ejecutas la implementación.

Banner de Atende Nutrição: agenda presencial y en línea, plan alimentario, diario, recordatorios opt-in y equipo en Telegram
Qué es

Un kit para pedirle al agente: del contrato a las 99 pruebas en verde

Aquí no hay una aplicación lista. Hay el contrato de lo que la aplicación debe hacer, la batería de pruebas que lo demuestra y las salvaguardas que impiden que el agente haga trampa. Quien construye es Claude Code o Codex, en tu máquina, con tu suscripción. Su hermano Atende Clínica, que sirvió de base, se hizo exactamente así y cerró 93 de 93 pruebas.

Agenda presencial y en línea, plan alimentario con versiones, diario de comidas, agua y peso, recordatorios opt-in, alertas 192 y 188, privacidad de datos de salud y equipo en Telegram

🥗 El sistema que sale del plan

Agenda de primera consulta y controles, presencial o en línea (el enlace lo informa el equipo), sin doble reserva. Plan alimentario registrado por el nutricionista, con versiones, y un bot que responde solo lo que está en el plan de ese paciente. Python 3 solo con biblioteca estándar y SQLite, un consultorio por instalación.

📦 El kit

Especificación de 21 secciones, 99 pruebas de caja negra, 19 decisiones ya propuestas, mapa hacia Raio-X, prompts para /goal y para el loop headless, y las salvaguardas que congelan el contrato. Un validador adversarial revisó todo y corrigió 10 problemas, 1 de ellos habría bloqueado la ejecución.

📈 Fuente: Raio-X de Margem

Inasistencias, controles que no ocurren y horarios ociosos son las fugas que ataca la agenda. El sistema devuelve atendimentos_mes, falta_pct, ocupacao_pct, clientes_novos_mes y retorno_atual_pct para el panel del Raio-X de Margem, que es la fuente de las reglas de negocio.

🚨 Alertas en dos listas

Una señal física (dolor de pecho, desmayo, vómito que no para, hipoglucemia) se responde con 192 y urgencias. Trastornos alimentarios y autolesión (atracones, purga, laxantes, ideación) se responden con 188 (CVV) y el nutricionista. Las dos abren una fila de prioridad alta, incluso con la atención humana abierta. 192 y 188/CVV son números de emergencia de Brasil: en otro país, el consultorio debe cambiar esos contactos de emergencia por los locales.

🔒 Privacidad de datos de salud (LGPD)

El plan, el diario y el peso son datos sensibles: el paciente puede exportar todo y la eliminación borra (no solo anonimiza). "PARAR" bloquea todo lo automático. Las campañas solo con consentimiento específico. La LGPD es la ley brasileña de protección de datos: en otro país, el consultorio debe aplicar la ley local sobre datos de salud.

⚠️ Reglas del CFN: aún sin investigar

Raio-X investigó los consejos de médicos, odontólogos y fisioterapeutas (CFM, CFO y COFFITO), no el de los nutricionistas (CFN). La salvaguarda de campañas es solo el mínimo común (promesa de resultado y antes y después). El dueño debe confirmar las reglas del CFN antes de publicar cualquier campaña.

Cómo funciona

De "quiero reservar" al diario de todos los días

Este es el flujo del sistema planeado, lo que el agente va a construir. Servidor Python sin dependencias, SQLite en una carpeta de datos y Docker para la VPS. Evolution y Telegram entran solo por variables de entorno; sin ellas, la bandeja de salida es simulada y no sale ninguna llamada de red.

Chat del sitio o WhatsApp (Evolution)→ Reservar: presencial o en línea→ Confirmación 1/2 y lista de espera→ Plan alimentario enviado por el equipo→ Diario y recordatorios opt-in→ Control programado y números del mes para Raio-X

Paciente

Por el chat o por WhatsApp reserva, confirma con 1 o 2, pide el link de la consulta en línea, consulta meu plano (mi plan) o o que posso comer no lanche da tarde (qué puedo comer en la merienda), registra 2 copos (2 vasos), pulei o almoço (me salté el almuerzo) o peso 82,5, resuelve dudas del FAQ, pide un humano y envía "PARAR" cuando no quiere más mensajes. Los comandos del chat del bot están en portugués.

Equipo en Telegram

Avisos de reserva nueva y cancelada, y los comandos /agenda, /alertas, /fila, /responder y /encerrar, también como respuesta directa al mensaje del paciente.

Página /equipe

Con token: agenda, pacientes, plan alimentario, diario y adherencia, serie de peso, FAQ, registros, bloqueos y fila humana.

Plan alimentario

Comidas por horario, con opciones y observaciones, en versiones (la última es la activa). El equipo lo revisa y lo envía al paciente. Fuera del plan, "¿puedo comer chocolate?" se convierte en "no oriento fuera del plan" y pasa a un humano. No hay cálculo nutricional en la v1.

Diario, peso y metas

Vasos de agua con meta, comidas hechas u omitidas, foto de la comida (solo metadatos, no se descarga ninguna imagen) y serie de peso con variación. La respuesta al peso es neutra, sin juicio: el sistema nunca comenta la evolución.

Recordatorios opt-in

El equipo configura, en la consulta, recordatorios de agua y de las comidas del plan, en los horarios que el paciente eligió. Hay una ventana de tolerancia: un recordatorio atrasado no se acumula. parar lembretes (parar recordatorios) apaga solo los recordatorios.

Requisitos

Lo que necesitas

Para ejecutar el plan basta con Python para las pruebas y un agente con sesión iniciada en tu suscripción. Docker solo entra en la verificación final y en el despliegue; Evolution y Telegram son opcionales y tuyos.

Python 3.10+ y pytest

Las pruebas usan pytest (herramienta de desarrollo). La aplicación en sí no tendrá dependencias.

# comprobar
python3 --version
python3 -m pip install pytest

Claude Code o Codex

Con tu suscripción, sin API de pago. Para el loop headless, clona execucao-longa en ~/projetos.

# comprobar
codex --version   # o: claude --version

Docker, Evolution y Telegram

Docker hace el build final y el despliegue en la VPS. Una instancia de Evolution y un bot de Telegram solo si quieres esos canales; las credenciales quedan en .env.

# comprobar
docker --version
Guía de uso · paso a paso

Del clon al sistema implementado, en tu entorno

Los comandos de abajo son los del repositorio. El ciclo: responder las decisiones, congelar el contrato, ejecutar el agente hasta 99 passed y LIMITES OK, y comprobar con la verificación independiente.

1

Clona el repositorio

Todavía no existe ./atende: el repositorio solo tiene el plan. Comprueba que la suite se recolecta sin errores y que aún nada pasa (sin la implementación las pruebas fallan o dan error, y eso es lo esperado).

git clone https://github.com/inematds/atende-nutricao && cd atende-nutricao
python3 -m pytest -q --collect-only | tail -n 1   # 99 tests collected
python3 -m pytest -q | tail -n 1                  # 15 failed, 84 errors (0 passed)
2

Responde las decisiones abiertas

Lee docs/DECISOES-ABERTAS.md: son 19 propuestas por defecto ya aplicadas en la especificación y en las pruebas. Responder "ok em tudo" (todo bien) destraba la ejecución. Si cambias algo marcado con ⚠ (por ejemplo la salvaguarda de campañas, las palabras de alerta o las reglas del peso), edita docs/ESPECIFICACAO.md y las pruebas antes de congelar. Para un piloto real, cambia también exemplos/nutricao.json por tus horarios, servicios, FAQ y plan de ejemplo. Responde además la pregunta sobre el CFN, descrita en el recuadro de abajo. Los documentos están en portugués.

less docs/DECISOES-ABERTAS.md
3

Congela el contrato

Con todo commiteado, el script graba el hash de tests/, pytest.ini, la especificación y los dos verificadores, más el commit base en hash-congelado.txt, y hace un commit. Desde entonces, cualquier cambio en las pruebas se detecta. Si hay cambios pendientes, el script se detiene y pide el commit antes.

git add -A && git commit -m "contrato v1"
bash longrun/2026-10-05-nutri-v1/congelar.sh
4

Ejecuta el agente (elige un camino)

a) Loop headless con Codex (recomendado). loop.env define 20 ciclos de 30 min, 8 GB por ciclo, parada tras 3 ciclos sin avance, modelo gpt-6-astra y CODEX_ARGS="-c sandbox_workspace_write.network_access=true": sin eso el sandbox de Codex bloquea el servidor local de las pruebas.

~/projetos/execucao-longa/tools/loop-longrun.sh longrun/2026-10-05-nutri-v1

b) /goal en Claude Code. Abre una sesión nueva de Claude Code en la carpeta del proyecto y sigue longrun/2026-10-05-nutri-v1/prompt-goal-claude.md: pega la condición de /goal (la salida debe mostrar 99 passed y LIMITES OK) y, como primer mensaje, el bloque de prompt-goal-codex.md desde RESULTADO:.

claude   # sesión nueva, dentro de atende-nutricao

c) Codex TUI abierto. Pega el contenido de longrun/2026-10-05-nutri-v1/prompt-goal-codex.md.

codex -c sandbox_workspace_write.network_access=true
5

Haz el seguimiento

En el loop, loop.log muestra cada ciclo y progress.md trae una línea por checkpoint. El código de salida del loop dice qué pasó: 0 concluido (pasó la prueba final), 1 se alcanzó el tope de ciclos, 2 detenido por 3 ciclos sin avance, 3 ya hay otro loop corriendo en la carpeta. Una prueba en conflicto con la especificación va a failures.md: es una compuerta humana, y el agente no debe ajustar ni la prueba ni la especificación.

tail -f longrun/2026-10-05-nutri-v1/loop.log
cat longrun/2026-10-05-nutri-v1/state.md
6

Comprueba con la verificación independiente

Cuando el agente diga "concluido", ejecuta los tres comandos. El último el agente nunca lo vio: busca valores de la fixture copiados en el código, levanta un consultorio que nunca apareció (paso de 20 min, consulta de 40 min, control en 15 días, sin atención en línea, plan con comidas de otros nombres, otro reloj) y hace docker build con healthcheck. Después, abre / y /equipe en el navegador.

python3 -m pytest -q tests/                                         # 99 passed
bash longrun/2026-10-05-nutri-v1/verificar-limites.sh               # LIMITES OK
python3 longrun/2026-10-05-nutri-v1/verificar-independente.py      # INDEPENDENTE OK
7

Ejecuta tu consultorio y despliega en la VPS

Con el sistema implementado, copia el ejemplo, cambia TROQUE-ESTE-TOKEN y levanta el servidor. El chat del paciente queda en / y la página del equipo en /equipe (header X-Token).

mkdir -p dados && cp exemplos/nutricao.json dados/nutricao.json
./atende serve --porta 8080 --dados dados

El despliegue es tuyo, con tus credenciales. El propio agente escribe el README de despliegue como parte del goal: levantar docker compose (puerto solo en 127.0.0.1:8080, detrás de un proxy HTTPS), el webhook de Evolution en /webhook/evolution/<secreto> (evento MESSAGES_UPSERT), el webhook de Telegram con setWebhook y secret_token, y el respaldo diario (./atende backup en el cron).

cp .env.exemplo .env && chmod 600 .env   # completa EVOLUTION_*, TELEGRAM_*, WEBHOOK_SEGREDO
docker compose up -d --build

⚠️ Antes de publicar cualquier campaña: el CFN

Las reglas de publicidad del nutricionista, del Consejo Federal de Nutricionistas de Brasil (CFN), todavía no se investigaron en este kit. La salvaguarda de campañas (sección 11 de la especificación) es el mínimo común a los consejos de médicos, odontólogos y fisioterapeutas: bloquea promessa_resultado (garantizado, resultado garantizado, 100%) y antes_depois (antes y después). No se cita ningún artículo del CFN, a propósito. El dueño del consultorio confirma las reglas del CFN (precio, promoción, testimonios, antes y después) antes de publicar cualquier campaña; si hay una regla adicional, entra como un código nuevo y cambia el contrato (decisión 4 en docs/DECISOES-ABERTAS.md).

Qué incluye el kit

Contrato, pruebas y salvaguardas, con los números reales

Todo lo que el agente necesita para construir, y todo lo que impide que finja haber construido.

99 pruebas de aceptación

De caja negra, por HTTP y por línea de comandos, en 11 archivos.

test_agenda.py                16
test_integracoes.py           15
test_conversa.py              13
test_cadastros.py             10
test_diario.py                10
test_lembretes.py              9
test_plano.py                  8
test_basico.py                 6
test_campanhas.py              5
test_docker.py                 4
test_lgpd_raiox.py             3

Especificación de 21 secciones

docs/ESPECIFICACAO.md: ejecución, nutricao.json, reglas de agenda, autenticación, API HTTP, conversación, lista de espera, confirmación y recordatorios, plan alimentario, diario y peso, campañas, exportación a Raio-X, LGPD, lo que queda fuera de la v1, páginas, registros, gestión de agenda, base de datos, Evolution, Telegram y Docker. Cálculo nutricional, análisis de fotos, pagos, convenios y varios consultorios están explícitamente fuera.

Salvaguardas contra atajos

Hash congelado de tests/, pytest.ini, la especificación y los dos verificadores. Alcance de archivos: el agente solo toca el código y sus propios registros. Sin dependencia externa, sin clave de API, sin URL externa, sin descarga de medios y sin 0.0.0.0 en el código. verificar-limites.sh comprueba todo eso e imprime LIMITES OK.

Verificación independiente

Nivel 4, oculta al agente: busca valores de la fixture en el código, levanta un consultorio nunca visto, con todos los argumentos explícitos, y hace docker build y healthcheck del contenedor. Solo así "99 passed" demuestra una lógica general.

19 decisiones ya propuestas

Lenguaje, canales, salvaguarda de campañas, qué responde el bot, señales de alerta, peso neutro, recordatorios opt-in, plan alimentario, foto solo con metadatos, consulta en línea, control, LGPD, Raio-X y un consultorio por instalación. Solo los ítems marcados con ⚠ cambian el contrato.

Validado por un agente adversarial

Un validador que no vio la planificación comparó pruebas con la especificación, rehízo las cuentas e intentó burlar las salvaguardas. Encontró y corrigió 10 problemas: 1 bloqueaba la ejecución, 6 estorbaban y 3 eran cosméticos. El relato completo está en docs/VALIDACAO.md y cada corrección tiene una línea en FALHAS.md.

Las reglas de negocio vienen de Raio-X

Inasistencia sin aviso, control que no vuelve y horario ocioso: docs/MAPA-RAIO-X.md conecta cada fuga del paquete clinica con una pieza de la v1 o con el motivo de quedar fuera. Detalles en la guía de Raio-X de Margem.

Reglas brasileñas incorporadas

La LGPD para datos de salud (confirmación, control, recordatorio y plan como tutela de la salud; campaña solo con consentimiento; exportar y borrar) y los contactos de emergencia de Brasil: 192 y 188 (CVV). Todo esto es de Brasil: en otro país, el consultorio debe cambiar esos contactos de emergencia y aplicar su propia ley de privacidad. Las reglas del CFN siguen por confirmar, como en el recuadro de aviso al final de la guía de uso.

Roadmap

Dónde está y hacia dónde va

El plan está listo y validado. La implementación todavía no existe: nace cuando ejecutas el /goal o el loop, con el método execucao-longa. Atende Clínica siguió el mismo camino y cerró 93 de 93.

Plan ✅
Especificación, pruebas y salvaguardas validadasContrato de 21 secciones, 99 pruebas de aceptación, decisiones propuestas, mapa hacia Raio-X y validación adversarial concluida el 05/10/2026.
Implementación
Tú ejecutas el /goal o el loopResponder las decisiones, congelar el contrato y dejar que el agente trabaje hasta 99 passed y LIMITES OK, y luego la verificación independiente. Hoy el sistema no está implementado.
Piloto
En un consultorio realConfigurar horarios, servicios, FAQ y plan de ejemplo verdaderos, confirmar con el nutricionista las palabras de alerta y las reglas del CFN, publicar en la VPS y seguir inasistencias, ocupación y control en el Panel de Recuperación de Raio-X.
Después
Fuera de la v1Cálculo nutricional, análisis de fotos, pagos, convenios, varios consultorios, LLM en las respuestas e interfaz en EN/ES quedan para una próxima versión, con compuerta humana.