Especificação, 99 testes de aceitação, travas e prompts para um agente construir, no seu ambiente, o atendimento de uma academia ou estúdio pequeno: planos e matrícula, aulas com vagas e lista de espera, check-in, ficha de treino, exercícios animados e a equipe no Telegram. 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 Fisioterapia segue o mesmo molde, e o atende-clinica, que veio antes, foi feito exatamente assim e fechou 93 de 93 testes.
Alunos e planos, aulas coletivas com reserva, check-in e a ficha de treino do professor. No centro está a aula com vagas: reserva com limite, lista de espera com oferta automática e falta automática. Python 3 só com biblioteca padrão e SQLite, para uma academia por instalação.
Especificação de 23 seções (0 a 22), 99 testes caixa-preta, 20 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 10 problemas, 2 deles travariam um implementador honesto.
Falta sem aviso, horário ocioso e aluno que some são os vazamentos que o plano ataca. O sistema devolve seis números do mês ao painel do Raio-X de Margem, que é a fonte das regras de negócio. Não existe pacote de academia lá: o kit usa o modelo genérico de serviços com agenda, e cada mapeamento é uma premissa.
Planos mensal, trimestral, anual e aulas avulsas, com preço e vigência. A matrícula é ativa, vencida, trancada ou cancelada. O pagamento é só um status manual (pago ou pendente) marcado pela equipe, mais o aviso de vencimento. Nenhum Pix, cartão ou intermediário de pagamento no v1.
O aluno faz check-in pelo código na recepção ou pelo chat (cheguei), um por dia. Quem some há N dias recebe uma mensagem de reativação, mas só se tiver dado consentimento: reativação é marketing, não aviso do contrato. "PARAR" bloqueia tudo que é automático.
Exportar e anonimizar os dados do aluno. O resultado da avaliação física (peso, altura, medidas) é dado sensível: só a equipe vê, nunca pela conversa, e é apagado junto com o aluno. A LGPD 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 pergunta pelas aulas, reserva e cancela, vê meu plano e meu treino, pede explica agachamento, faz cheguei, tira dúvidas do FAQ, pede atendente e manda "PARAR" quando não quer mais mensagens. Palavra de alerta de saúde (dor forte, dor no peito, falta de ar, desmaio, tontura, lesão e outras) responde com 192 e avisa o professor.
Avisos de reserva e de cancelamento, e os comandos /aulas [data], /fila, /responder e /encerrar, também em resposta direta à mensagem do aluno.
Com token: alunos, planos e matrículas, grade, reservas, check-ins, fichas, avaliações, biblioteca de exercícios, FAQ, cadastros e fila humana.
A grade semanal tem modalidade, professor, sala e vagas. A reserva respeita o limite de vagas e a antecedência; com 10 pedidos para a última vaga, um recebe 201 e os outros 409. Quando alguém cancela, o primeiro da lista de espera recebe a oferta automática.
Cancelar dentro do prazo (padrão 2 h antes) devolve o crédito. Depois do prazo, a vaga é liberada e a espera dispara, mas o crédito avulso não volta. Reserva sem check-in no dia da aula vira falta automática na rodada de tarefas, e a equipe pode corrigir.
O professor monta a ficha com exercícios da biblioteca (séries, repetições, carga, descanso). O aluno pede meu treino de hoje e recebe o treino da vez, em sequência a cada check-in. O bot mostra a ficha do professor e nunca prescreve.
Cada exercício é um SVG com animação só em CSS, sem script e sem SMIL. Medido em render real, o HyperFrames não tem adaptador SMIL: o movimento SMIL saiu parado ou fora de fase no MP4, e só o CSS ficou fiel. Este é o agachamento: pés fixos no chão, joelhos para a frente, quadril para trás.
Agachamento, flexão de braço, prancha, remada curvada, supino reto, levantamento terra com bastão, afundo, elevação pélvica, abdominal, desenvolvimento de ombros, puxada alta e polichinelo.
Cada um tem a página pública /exercicios/<id> com o SVG animado, os passos, os erros comuns e os cuidados. No WhatsApp vai um MP4 de 4 s renderizado pelo HyperFrames, passo de build local (tools/render-exercicios); sem o MP4 (ou sem PUBLIC_URL), vai o link da página. Os 12 SVGs são desenhados pelo implementador, e 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, o HyperFrames e o ffprobe.
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 da verificação independente. 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, conferir com a verificação independente, gerar os vídeos e pedir a revisão de um profissional de educação física.
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-academia && cd atende-academia python3 -m pytest -q --collect-only | tail -n 1 # 99 tests collected python3 -m pytest -q | tail -n 1 # 30 failed, 69 errors (0 passed)
Leia docs/DECISOES-ABERTAS.md: são 20 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 reativação só com consentimento, a falta automática ou o prazo de cancelamento), edite docs/ESPECIFICACAO.md e tests/ antes do passo 3 e confira a contagem. Para um piloto real, troque também exemplos/academia.json pela sua grade, planos, professores, 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-academia-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-academia-v1
b) /goal no Claude Code. Abra uma sessão nova do Claude Code na pasta do projeto e siga longrun/2026-10-05-academia-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.
claude # sessão nova, dentro de atende-academia
c) Codex TUI aberto. Cole o conteúdo de longrun/2026-10-05-academia-v1/prompt-goal-codex.md inteiro (ele começa com /goal).
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 state.md diz o que funciona, o que falta e como retomar. 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-academia-v1/loop.log cat longrun/2026-10-05-academia-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 academia que nunca apareceu (outra grade, outros planos e prazos, um feriado, outro relógio), abre 3 SVGs num Chromium para provar que se mexem, renderiza um exercício pelo HyperFrames e faz docker build com healthcheck. Sem Chromium, sem HyperFrames ou sem Docker, essas etapas saem como PULADO, nunca como OK. Depois, abra /, /equipe e /exercicios/prancha no navegador.
python3 -m pytest -q tests/ # 99 passed bash longrun/2026-10-05-academia-v1/verificar-limites.sh # LIMITES OK python3 longrun/2026-10-05-academia-v1/verificar-independente.py # INDEPENDENTE OK
Passo humano, depois da implementação: o tools/render-exercicios (escrito pelo agente) usa só o HyperFrames já instalado, sem baixar nada, e precisa de Node 22 ou mais novo, Chromium e ffprobe. Ele gera web/exercicios/<id>.mp4 (4 s, 720×720, sem áudio) a partir de cada SVG. Instale o HyperFrames depois que o loop fechar, porque o agente não deve baixar pacote. O WhatsApp baixa o vídeo pela URL pública, então o caminho do MP4 exige PUBLIC_URL com HTTPS.
npm install hyperframes tools/render-exercicios --ids agachamento,prancha --saida web/exercicios
Com o sistema implementado, copie o exemplo, troque o token e suba o servidor. O chat do aluno fica em /, a página da equipe em /equipe (header X-Token) e cada exercício em /exercicios/<id>. O deploy na VPS é seu, com as suas credenciais; o roteiro (Docker, webhooks da Evolution e do Telegram, backup) o agente escreve no README, seção 22 da especificação.
mkdir -p dados && cp exemplos/academia.json dados/academia.json ./atende serve --porta 8080 --dados dados ./atende raiox --dados dados --mes 2026-10 --acompanhamento acompanhamento.json
Os 12 SVGs são figuras esquemáticas desenhadas pelo implementador, e os passos, erros comuns e cuidados de cada exercício foram escritos como exemplo: um profissional de educação física precisa revisar tudo antes de ir para aluno real, incluindo a lista de palavras de alerta de saúde. As regras do conselho (CREF/CONFEF) não foram pesquisadas: a trava de campanha é só o mínimo seguro (promessa de resultado e "antes e depois"), sem citar artigo, e o dono confirma as regras antes de publicar qualquer campanha (decisão 5). A base legal da avaliação física, dado sensível, também é do dono ou do advogado confirmar (decisão 6).
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 13 arquivos.
test_integracoes.py 16 test_exercicios_svg.py 14 test_aulas.py 12 test_alunos_planos.py 9 test_conversa.py 8 test_treino.py 6 test_cadastros.py 6 test_basico.py 6 test_docker.py 5 test_checkin.py 5 test_campanhas.py 5 test_avaliacao.py 4 test_lgpd_raiox.py 3
docs/ESPECIFICACAO.md, seções 0 a 22: execução, academia.json, alunos, planos e matrículas, aulas coletivas, check-in, treino, explicação animada, avaliação física, API HTTP, conversa, tarefas, campanhas e trava de publicidade, Raio-X, LGPD, Evolution, Telegram e Docker. Cobrança por Pix ou cartão, catraca, app do aluno, aulas particulares e várias academias no mesmo servidor estão explicitamente fora (seção 16).
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 URL externa no código, sem 0.0.0.0 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 academia nunca vista, confere o movimento dos SVGs e o MP4 quando as ferramentas existem, e faz docker build e healthcheck. Só assim "99 passed" prova uma lógica geral.
Linguagem, canais, cobrança só manual, trava de campanha, avaliação física como dado sensível, reativação com consentimento, falta automática, cancelamento tardio, check-in por código, os 12 exercícios com animação só CSS e o Raio-X. Só os itens marcados com ⚠ mudam o contrato.
Um validador que não viu o planejamento conferiu teste contra especificação e tentou burlar as travas. Achou e corrigiu 10 problemas: 2 bloqueavam a execução, 5 atrapalhavam e 3 eram cosméticos. O principal: a especificação aceitava SMIL, e o render do HyperFrames não tem adaptador SMIL, medido em render real. O relato está em docs/VALIDACAO.md e cada correção tem uma linha em FALHAS.md.
Falta sem aviso, horário ocioso, aluno que não volta e recepção presa na agenda: docs/MAPA-RAIO-X.md liga cada vazamento do pacote de serviços a uma peça da v1 ou ao motivo de ficar fora. O Raio-X não traz número de mercado de academia, então faltas, ocupação e renovação ficam como premissa a medir na sua academia. Detalhes no guia do Raio-X de Margem.
A LGPD (aviso de vencimento, espera e aula cancelada como execução do contrato; reativação e campanha só com consentimento; avaliação física como dado sensível; exportar e anonimizar) e o 192 para emergência. A regra do conselho profissional (CREF/CONFEF) ainda não foi pesquisada. Fora do Brasil, troque pela lei de privacidade, pelo conselho 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-clinica 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.tools/render-exercicios uma vez, com o HyperFrames instalado, e publicar os arquivos junto com PUBLIC_URL.