Especificação, 98 testes de aceitação, travas e prompts para um agente construir, no seu ambiente, o atendimento de uma clínica de fisioterapia: agenda de avaliação e sessões, plano de tratamento com alerta de abandono, exercícios domiciliares com lembrete, adesão e dor, e a equipe no Telegram. O bot nunca orienta. 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 molde, foi feito exatamente assim e fechou 93 de 93 testes.
Agenda de avaliação, sessões e RPG, sem horário duplo, confirmação automática e lista de espera. No centro, o plano de tratamento: sessões previstas contra realizadas, alerta de abandono e de reavaliação. Python 3 só com biblioteca padrão e SQLite, para uma clínica por instalação.
Especificação de 26 seções (0 a 25), 98 testes caixa-preta, 21 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 achou 9 problemas, 3 deles travariam um implementador honesto.
Faltas, paciente que não volta e tratamento indicado que não começa são os vazamentos que o plano ataca. O sistema devolve oito números do mês ao painel do Raio-X de Margem, que é a fonte das regras de negócio e da trava do conselho.
Ele explica exercício só se o fisioterapeuta o prescreveu àquele paciente. Fora disso, responde "fale com seu fisioterapeuta" e chama um atendente. Nunca dá diagnóstico, remédio ou orientação clínica.
Dor de 7 a 10 ou uma palavra de alerta (dormência, formigamento, perda de força, febre, queda, inchaço e outras) abre a fila humana com prioridade alta e avisa a equipe no Telegram. A resposta cita o fisioterapeuta e o 192, e nunca orienta.
Dado de saúde é sensível: exportar e apagar valem também para plano, prescrição e registros de adesão e dor. A campanha só vai a quem consentiu e passa pela trava do COFFITO 424/2013, com a pesquisa do Raio-X como fonte. LGPD, COFFITO e o 192 são do Brasil.
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 como faço a ponte? (só se foi prescrita), liga o lembrete com lembrete 19:00 (ou sem lembrete), responde fiz, não fiz ou dor 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, planos, prescrições, adesão e dor, biblioteca de exercícios, alertas, FAQ, cadastros, bloqueios e fila humana.
Um pacote de sessões por paciente: previstas, realizadas e restantes. Duas faltas seguidas (ajustável) viram alerta de abandono para a equipe; o paciente não recebe mensagem automática, porque retomar contato é decisão humana. Quando restam duas sessões, alerta de reavaliação. Concluído o plano, o retorno nasce 30 dias depois da última sessão.
O fisioterapeuta prescreve itens (séries, repetições, vezes ao dia, dias da semana) e o paciente recebe o texto com o link de cada exercício. O lembrete diário é opt-in: só liga quando o paciente pede, na hora que escolhe (padrão 19:00), e só nos dias prescritos.
O paciente responde fiz, não fiz ou a dor de 0 a 10; vale um registro por dia, e o último vence. A adesão semanal é os dias feitos divididos pelos dias previstos, de segunda a domingo, desde o início da prescrição até hoje: 2 feitos em 4 previstos dão 50%. A dor da semana é a média dos registros.
Cada exercício é um SVG com animação só em CSS, sem script e sem SMIL, porque o render de vídeo só avança animação CSS. Esta é a ponte, no esqueleto da especificação.
Ponte, alongamento de isquiotibiais, rotação de ombro com bastão, pêndulo de Codman, retração cervical, gato-camelo, agachamento na parede, elevação de calcanhar, abdução de quadril deitado, prancha modificada, bird-dog e mobilidade de tornozelo.
Cada um tem a página pública /exercicios/<id> (passos, erros comuns, cuidados, contraindicações e "pare se"). No WhatsApp vai um MP4 de 4 s renderizado pelo HyperFrames, passo de build local (tools/render-exercicios); sem o MP4, vai o link. O movimento é conferido no nível 4 pelo verificar-independente.py, que diz PULADO quando falta a ferramenta.
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. Para os vídeos dos exercícios, Node 22 ou mais novo, FFmpeg e Chromium.
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é 98 passed e LIMITES OK, conferir com a verificação independente, gerar os vídeos e pedir a revisão clínica.
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-fisioterapia && cd atende-fisioterapia python3 -m pytest -q --collect-only | tail -n 1 # 98 tests collected python3 -m pytest -q | tail -n 1 # 23 failed, 75 errors (0 passed)
Leia docs/DECISOES-ABERTAS.md: são 21 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 o alerta de abandono, a lista de palavras de alerta ou o limiar de dor), edite docs/ESPECIFICACAO.md e tests/ antes do passo 3 e confira a contagem. Para um piloto real, troque também exemplos/clinica.json pelos seus horários, serviços, FAQ e exercícios.
less docs/DECISOES-ABERTAS.md python3 -m pytest -q --collect-only | tail -n 1
Com o git status limpo, o script grava o hash de tests/, pytest.ini, da especificação e dos verificadores em hash-congelado.txt e faz um commit. Daí em diante, qualquer mudança nos testes é detectada.
git status bash longrun/2026-10-05-fisio-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-fisio-v1
b) /goal no Claude Code. Abra uma sessão nova do Claude Code na pasta do projeto e siga longrun/2026-10-05-fisio-v1/prompt-goal-claude.md: cole a condição de /goal (a saída precisa mostrar 98 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-fisioterapia
c) Codex TUI aberto. Cole o conteúdo de longrun/2026-10-05-fisio-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-fisio-v1/loop.log cat longrun/2026-10-05-fisio-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 uma clínica que nunca apareceu (outro passo de agenda, outro limiar de dor, outro relógio, exercícios com outros textos), abre 3 SVGs num Chromium para provar que se mexem, renderiza um MP4 pelo HyperFrames e faz docker build com healthcheck. Sem Chromium ou sem HyperFrames, essas etapas saem como PULADO, nunca como OK; Docker é obrigatório. Depois, abra /, /equipe e /exercicios/ponte no navegador.
python3 -m pytest -q tests/ # 98 passed bash longrun/2026-10-05-fisio-v1/verificar-limites.sh # LIMITES OK python3 longrun/2026-10-05-fisio-v1/verificar-independente.py # INDEPENDENTE OK
Passo humano, depois da implementação: o tools/render-exercicios (escrito pelo agente) precisa de rede, Node 22 ou mais novo, FFmpeg e Chromium. Ele gera web/exercicios/<id>.mp4 (4 s, 720×720, sem áudio) a partir de cada SVG. Os MP4 não entram no Git; na VPS, rode o comando uma vez ou copie os arquivos para a pasta de EXERCICIOS_MP4_DIR.
python3 tools/render-exercicios
Com o sistema implementado, copie o exemplo, troque TROQUE-ESTE-TOKEN e suba o servidor. O chat do paciente fica em /, a página da equipe em /equipe (header X-Token) e cada exercício em /exercicios/<id>.
mkdir -p dados && cp exemplos/clinica.json dados/clinica.json ./atende serve --porta 8080 --dados dados
O deploy é seu, com as suas credenciais, e o próprio agente escreve o roteiro de deploy como parte do goal (seção 19 da especificação): docker compose atrás de proxy HTTPS, webhooks da Evolution e do Telegram, e backup diário.
cp .env.exemplo .env && chmod 600 .env # preencha EVOLUTION_*, TELEGRAM_*, WEBHOOK_SEGREDO docker compose up -d --build
Os 12 exercícios do exemplo (passos, erros comuns, cuidados, contraindicações e "pare se"), a lista de palavras de alerta e o limiar de dor (dor_alerta: 7) foram escritos como exemplo, e conteúdo clínico é do fisioterapeuta. Um fisioterapeuta precisa revisar tudo antes de ir para paciente real (decisões 10 e 9 em docs/DECISOES-ABERTAS.md). Há ainda um ponto em aberto: palavras como caiu e queda casam com frases comuns ("a dor caiu bastante") e abrem fila alta por engano, um falso alarme barato que o fisioterapeuta decide manter ou não (decisão 20).
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 12 arquivos.
test_integracoes.py 16 test_agenda.py 12 test_conversa.py 10 test_cadastros.py 9 test_campanhas.py 9 test_lembretes.py 8 test_prescricao.py 8 test_exercicios.py 7 test_basico.py 6 test_planos.py 6 test_docker.py 4 test_lgpd_raiox.py 3
docs/ESPECIFICACAO.md, seções 0 a 25: execução, clinica.json, regras de agenda, API HTTP, conversa em 12 regras, lista de espera, confirmação e retorno, campanhas e trava do conselho, Raio-X, LGPD, cadastros, WhatsApp, Telegram, Docker, planos de tratamento, biblioteca de exercícios, prescrição e lembretes, adesão e dor, alertas à equipe e vídeo MP4. Prontuário, cobrança por Pix, convênio e glosa (TISS) e várias clínicas no mesmo servidor estão explicitamente fora.
Hash congelado de tests/, pytest.ini, da especificação e dos verificadores. Escopo de arquivos: o agente só mexe no código e nos próprios registros. Sem chave de API, sem API externa no código e sem SMIL nem script nos SVGs. 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 uma clínica nunca vista, com todos os argumentos explícitos, confere o movimento dos SVGs e o MP4 quando as ferramentas existem, e faz docker build e healthcheck. Só assim "98 passed" prova uma lógica geral.
Linguagem, canais, retorno como reavaliação, alerta de abandono, lembrete opt-in, registro de adesão por dia, dor e sinais de alerta, os 12 exercícios, animação só CSS, o que o bot explica, trava do COFFITO e Raio-X. 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 9 problemas: 3 bloqueavam a execução, 4 atrapalhavam e 2 eram cosméticos. O relato completo está em docs/VALIDACAO.md e cada correção tem uma linha em FALHAS.md.
Falta sem aviso, retenção, orçamento que não começa 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. A trava do COFFITO 424/2013 (preço, promoção, gratuito, depoimento, promessa de resultado) tem como fonte a pesquisa do Raio-X. Detalhes no guia do Raio-X de Margem.
A LGPD de dado de saúde (confirmação, retorno, prescrição e lembrete como tutela da saúde; campanha só com consentimento; exportar e apagar), a resolução COFFITO 424/2013 para a publicidade e o 192 para emergência. Fora do Brasil, troque pela lei de privacidade, pelo conselho profissional e pelo número de emergência locais.
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.
98 passed e LIMITES OK, depois a verificação independente. Hoje o sistema não está implementado.tools/render-exercicios uma vez, com rede, Node, FFmpeg e Chromium, e copiar os arquivos para a VPS se for o caso.