Kit de plano · clínica de fisioterapia · código aberto

O plano completo para o paciente continuar o tratamento

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.

Banner do Atende Fisioterapia: plano de tratamento, exercícios animados, lembrete, adesão e dor, e equipe no Telegram
O que é

Um kit para pedir ao agente: do contrato aos 98 testes verdes

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.

Plano de tratamento com alerta de abandono, exercícios domiciliares animados, lembrete opt-in, adesão e dor, alerta clínico com 192, LGPD de dado de saúde e equipe no Telegram

🦵 O sistema que sai do plano

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.

📦 O kit

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.

📈 Fonte: Raio-X de Margem

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.

🧭 O bot só explica o prescrito

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 forte e sinal de alerta

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.

🔒 LGPD e COFFITO

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.

Como funciona

Da avaliação ao "fiz" de cada dia

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.

Chat do site ou WhatsApp (Evolution)→ Avaliação e sessões agendadas→ Confirmação 1/2 e lista de espera→ Plano de tratamento e prescrição→ Lembrete, "fiz" e dor→ Alertas à equipe e números para o Raio-X

Paciente

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.

Equipe no Telegram

Avisos de agendamento novo e cancelado, e os comandos /agenda, /alertas, /fila, /responder e /encerrar, também em resposta direta à mensagem do paciente.

Página /equipe

Com token: agenda, pacientes, planos, prescrições, adesão e dor, biblioteca de exercícios, alertas, FAQ, cadastros, bloqueios e fila humana.

Plano de tratamento

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.

Exercícios prescritos e lembrete

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.

Adesão e dor

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.

🎞️ Demonstração: exercício animado só com CSS

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

Os 12 exercícios do exemplo

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.

Pré-requisitos

O que você precisa

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.

Python 3.10+ e pytest

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

Claude Code ou Codex

Pela assinatura, sem API paga. Para o loop headless, clone o execucao-longa em ~/projetos.

# conferir
codex --version   # ou: claude --version

Docker, Evolution e Telegram

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
Guia de uso · passo a passo

Do clone ao sistema implementado, no seu ambiente

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.

1

Clone o repositório

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)
2

Responda as decisões abertas

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
3

Congele o contrato

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
4

Rode o agente (escolha um caminho)

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
5

Acompanhe

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
6

Confira com a verificação independente

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
7

Gere os vídeos MP4 dos exercícios

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
8

Rode a sua clínica e faça o deploy na VPS

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

⚠️ Antes de usar com paciente real: revisão de um fisioterapeuta

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).

O que vem no kit

Contrato, testes e travas, com os números reais

Tudo o que o agente precisa para construir, e tudo o que impede que ele finja ter construído.

98 testes de aceitação

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

Especificação de 26 seções

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.

Travas contra atalho

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.

Verificação independente

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.

21 decisões já propostas

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.

Validado por um agente adversarial

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.

As regras de negócio vêm do Raio-X

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.

Regras brasileiras embutidas

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.

Roadmap

Onde está e para onde vai

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.

Plano ✅
Especificação, testes e travas validadosContrato de 26 seções, 98 testes de aceitação, 21 decisões propostas, mapa para o Raio-X e validação adversarial concluída em 05/10/2026.
Implementação
Você roda o /goal ou o loopResponder as decisões, congelar o contrato e deixar o agente trabalhar até 98 passed e LIMITES OK, depois a verificação independente. Hoje o sistema não está implementado.
Vídeos
MP4 dos exercícios, na sua máquinaRodar o tools/render-exercicios uma vez, com rede, Node, FFmpeg e Chromium, e copiar os arquivos para a VPS se for o caso.
Piloto
Numa clínica realTrocar o exemplo pelos horários, serviços e exercícios verdadeiros, ter a revisão de um fisioterapeuta, publicar na VPS e acompanhar faltas, ocupação, retorno e adesão no Painel de Recuperação do Raio-X.
Depois
Fora da v1Prontuário, cobrança, convênio e glosa, várias clínicas, LLM nas respostas e interface em EN/ES ficam para uma próxima versão, com portão humano.