Especificação, 99 testes de aceitação, travas e prompts para um agente construir, no seu ambiente, o atendimento de um consultório de nutrição: agenda presencial e online com confirmação e retorno, plano alimentar com versões, diário de refeições, água e peso, lembretes opt-in e a equipe no Telegram. O bot nunca prescreve. O sistema ainda não está implementado: este repositório é o plano, e você roda a implementação.

Aqui não há aplicativo pronto. Há o contrato do que o aplicativo deve fazer, a bateria de testes que prova isso e as travas que impedem o agente de trapacear. Quem constrói é o Claude Code ou o Codex, rodando na sua máquina, pela sua assinatura. O irmão Atende Clínica, que serviu de base, foi feito exatamente assim e fechou 93 de 93 testes.
Agenda de primeira consulta e retornos, presencial ou online (o link é informado pela equipe), sem horário duplo. Plano alimentar registrado pelo nutricionista, com versões, e um bot que responde só o que está no plano daquele paciente. Python 3 só com biblioteca padrão e SQLite, para um consultório por instalação.
Especificação de 21 seções, 99 testes caixa-preta, 19 decisões já propostas, mapa para o Raio-X, prompts para /goal e para o loop headless, e as travas que congelam o contrato. Um validador adversarial já passou por tudo e corrigiu 10 problemas, 1 deles travaria a execução.
Faltas, retorno que não acontece e horário ocioso são os vazamentos que a agenda ataca. O sistema devolve atendimentos_mes, falta_pct, ocupacao_pct, clientes_novos_mes e retorno_atual_pct para o painel do Raio-X de Margem, que é a fonte das regras de negócio.
Sinal físico (dor no peito, desmaio, vômito sem parar, hipoglicemia) responde com 192 e pronto-socorro. Transtorno alimentar e autolesão (compulsão, purgação, laxante, ideação) responde com 188 (CVV) e o nutricionista. As duas abrem fila de prioridade alta, até com o atendimento humano aberto.
Plano, diário e peso são dado sensível: o paciente pode exportar tudo e a exclusão apaga (não só anonimiza). "PARAR" bloqueia tudo o que é automático. Campanha só com consentimento específico.
O Raio-X pesquisou CFM, CFO e COFFITO, não o conselho dos nutricionistas (CFN). A trava de campanha é só o mínimo comum (promessa de resultado e antes e depois). O dono precisa confirmar as regras do CFN antes de publicar qualquer campanha.
Este é o fluxo do sistema planejado, o que o agente vai construir. Servidor Python sem dependências, SQLite numa pasta de dados e Docker para a VPS. Evolution e Telegram entram só por variáveis de ambiente; sem elas, a caixa de saída é simulada e nenhuma chamada de rede sai.
Pelo chat ou pelo WhatsApp agenda, confirma com 1 ou 2, pede o link da consulta online, consulta meu plano ou o que posso comer no lanche da tarde, registra 2 copos, pulei o almoço ou peso 82,5, tira dúvidas do FAQ, pede atendente e manda "PARAR" quando não quer mais mensagens.
Avisos de agendamento novo e cancelado, e os comandos /agenda, /alertas, /fila, /responder e /encerrar, também em resposta direta à mensagem do paciente.
Com token: agenda, pacientes, plano alimentar, diário e adesão, série de peso, FAQ, cadastros, bloqueios e fila humana.
Refeições por horário, com opções e observações, em versões (a última é a ativa). A equipe revisa e envia ao paciente. Fora do plano, "posso comer chocolate?" vira "não oriento fora do plano" e vai para o humano. Não há cálculo nutricional na v1.
Copos de água com meta, refeições feitas ou puladas, foto de refeição (só metadados, nenhuma imagem é baixada) e série de peso com variação. A resposta ao peso é neutra, sem julgamento: o sistema nunca comenta a evolução.
A equipe configura, na consulta, lembretes de água e das refeições do plano, nos horários que o paciente escolheu. Há janela de tolerância: lembrete atrasado não acumula. parar lembretes desliga só os lembretes.
Para rodar o plano basta Python para os testes e um agente logado pela assinatura. Docker só entra na verificação final e no deploy; Evolution e Telegram são opcionais e seus.
Os testes usam pytest (ferramenta de desenvolvimento). A aplicação em si não terá dependências.
# conferir python3 --version python3 -m pip install pytest
Pela assinatura, sem API paga. Para o loop headless, clone o execucao-longa em ~/projetos.
# conferir codex --version # ou: claude --version
Docker faz o build final e o deploy na VPS. Uma instância Evolution e um bot do Telegram só se quiser os canais; as credenciais ficam no .env.
# conferir docker --version
Os comandos abaixo são os do repositório. O ciclo: responder as decisões, congelar o contrato, rodar o agente até 99 passed e LIMITES OK, e conferir com a verificação independente.
Ainda não há ./atende: o repositório só tem o plano. Confira que a suíte é coletada sem erro e que nada passa ainda (faltando a implementação, os testes falham ou dão erro, e isso é o 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)
Leia docs/DECISOES-ABERTAS.md: são 19 propostas padrão já aplicadas na especificação e nos testes. Responder "ok em tudo" destrava a execução. Se mudar algo marcado com ⚠ (por exemplo a trava de campanha, as palavras de alerta ou as regras do peso), edite docs/ESPECIFICACAO.md e os testes antes de congelar. Para um piloto real, troque também exemplos/nutricao.json pelos seus horários, serviços, FAQ e plano de exemplo. Responda também a pergunta sobre o CFN, descrita no quadro abaixo.
less docs/DECISOES-ABERTAS.md
Com tudo commitado, o script grava o hash de tests/, pytest.ini, da especificação e dos dois verificadores, mais o commit-base em hash-congelado.txt, e faz um commit. Daí em diante, qualquer mudança nos testes é detectada. Se houver alteração pendente, o script para e pede o commit antes.
git add -A && git commit -m "contrato v1" bash longrun/2026-10-05-nutri-v1/congelar.sh
a) Loop headless com o Codex (recomendado). O loop.env define 20 ciclos de 30 min, 8 GB por ciclo, parada após 3 ciclos sem avanço, modelo gpt-6-astra e CODEX_ARGS="-c sandbox_workspace_write.network_access=true": sem isso o sandbox do Codex bloqueia o servidor local dos testes.
~/projetos/execucao-longa/tools/loop-longrun.sh longrun/2026-10-05-nutri-v1
b) /goal no Claude Code. Abra uma sessão nova do Claude Code na pasta do projeto e siga longrun/2026-10-05-nutri-v1/prompt-goal-claude.md: cole a condição de /goal (a saída precisa mostrar 99 passed e LIMITES OK) e, como primeira mensagem, o bloco de prompt-goal-codex.md a partir de RESULTADO:.
claude # sessão nova, dentro de atende-nutricao
c) Codex TUI aberto. Cole o conteúdo de longrun/2026-10-05-nutri-v1/prompt-goal-codex.md.
codex -c sandbox_workspace_write.network_access=true
No loop, o loop.log mostra cada ciclo e progress.md traz uma linha por checkpoint. O código de saída do loop diz o que houve: 0 concluído (o teste final passou), 1 teto de ciclos atingido, 2 parado por 3 ciclos sem avanço, 3 outro loop já roda na pasta. Teste em conflito com a especificação vai para failures.md: é portão humano, e o agente não deve ajustar teste nem especificação.
tail -f longrun/2026-10-05-nutri-v1/loop.log cat longrun/2026-10-05-nutri-v1/state.md
Quando o agente disser "concluído", rode os três comandos. O último o agente nunca viu: ele procura valores da fixture copiados no código, sobe um consultório que nunca apareceu (passo de 20 min, consulta de 40 min, retorno em 15 dias, sem atendimento online, plano com refeições de outros nomes, outro relógio) e faz docker build com healthcheck. Depois, abra / e /equipe no 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
Com o sistema implementado, copie o exemplo, troque TROQUE-ESTE-TOKEN e suba o servidor. O chat do paciente fica em / e a página da equipe em /equipe (header X-Token).
mkdir -p dados && cp exemplos/nutricao.json dados/nutricao.json ./atende serve --porta 8080 --dados dados
O deploy é seu, com as suas credenciais. O próprio agente escreve o README de deploy como parte do goal: subir o docker compose (porta só em 127.0.0.1:8080, atrás de proxy HTTPS), webhook da Evolution em /webhook/evolution/<segredo> (evento MESSAGES_UPSERT), webhook do Telegram com setWebhook e secret_token, e o backup diário (./atende backup no cron).
cp .env.exemplo .env && chmod 600 .env # preencha EVOLUTION_*, TELEGRAM_*, WEBHOOK_SEGREDO docker compose up -d --build
As regras de publicidade do nutricionista, do Conselho Federal de Nutricionistas, ainda não foram pesquisadas neste kit. A trava de campanha (seção 11 da especificação) é o mínimo comum a CFM, CFO e COFFITO: bloqueia promessa_resultado (garantido, resultado garantido, 100%) e antes_depois. Nenhum artigo do CFN é citado, de propósito. O dono do consultório confirma as regras do CFN (preço, promoção, depoimento, antes e depois) antes de publicar qualquer campanha; se houver regra a mais, ela entra como código novo e muda o contrato (decisão 4 em docs/DECISOES-ABERTAS.md).
Tudo o que o agente precisa para construir, e tudo o que impede que ele finja ter construído.
Caixa-preta, por HTTP e por linha de comando, em 11 arquivos.
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: execução, nutricao.json, regras de agenda, autenticação, API HTTP, conversa, lista de espera, confirmação e lembretes, plano alimentar, diário e peso, campanhas, exportação para o Raio-X, LGPD, o que fica fora da v1, páginas, cadastros, gestão de agenda, banco, Evolution, Telegram e Docker. Cálculo nutricional, análise de foto, pagamento, convênio e vários consultórios estão explicitamente fora.
Hash congelado de tests/, pytest.ini, da especificação e dos dois verificadores. Escopo de arquivos: o agente só mexe no código e nos próprios registros. Sem dependência externa, sem chave de API, sem URL externa, sem download de mídia e sem 0.0.0.0 no código. O verificar-limites.sh confere tudo isso e imprime LIMITES OK.
Nível 4, escondido do agente: procura valores da fixture no código, sobe um consultório nunca visto, com todos os argumentos explícitos, e faz docker build e healthcheck do container. Só assim "99 passed" prova uma lógica geral.
Linguagem, canais, trava de campanha, o que o bot responde, sinais de alerta, peso neutro, lembretes opt-in, plano alimentar, foto só por metadados, consulta online, retorno, LGPD, Raio-X e um consultório por instalação. Só os itens marcados com ⚠ mudam o contrato.
Um validador que não viu o planejamento conferiu teste contra especificação, refez as contas e tentou burlar as travas. Achou e corrigiu 10 problemas: 1 bloqueava a execução, 6 atrapalhavam e 3 eram cosméticos. O relato completo está em docs/VALIDACAO.md e cada correção tem uma linha em FALHAS.md.
Falta sem aviso, retorno que não volta e horário ocioso: docs/MAPA-RAIO-X.md liga cada vazamento do pacote clinica a uma peça da v1 ou ao motivo de ficar fora. Detalhes no guia do Raio-X de Margem.
A LGPD de dado de saúde (confirmação, retorno, lembrete e plano como tutela da saúde; campanha só com consentimento; exportar e apagar) e os contatos de emergência do Brasil: 192 e 188 (CVV). As regras do CFN ainda estão por confirmar, como no quadro de aviso no fim do guia de uso.
O plano está pronto e validado. A implementação ainda não existe: ela nasce quando você roda o /goal ou o loop, pelo método execucao-longa. O Atende Clínica seguiu o mesmo caminho e fechou 93 de 93.
99 passed e LIMITES OK, depois a verificação independente. Hoje o sistema não está implementado.