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.

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 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.
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.
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.
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.
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.
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.
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.
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.
Avisos de reserva nueva y cancelada, y los comandos /agenda, /alertas, /fila, /responder y /encerrar, también como respuesta directa al mensaje del paciente.
Con token: agenda, pacientes, plan alimentario, diario y adherencia, serie de peso, FAQ, registros, bloqueos y fila humana.
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.
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.
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.
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.
Las pruebas usan pytest (herramienta de desarrollo). La aplicación en sí no tendrá dependencias.
# comprobar python3 --version python3 -m pip install pytest
Con tu suscripción, sin API de pago. Para el loop headless, clona execucao-longa en ~/projetos.
# comprobar codex --version # o: claude --version
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
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.
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)
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
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
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
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
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
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
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).
Todo lo que el agente necesita para construir, y todo lo que impide que finja haber construido.
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
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.
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.
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.
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.
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.
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.
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.
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.
99 passed y LIMITES OK, y luego la verificación independiente. Hoy el sistema no está implementado.