Especificación, 99 pruebas de aceptación, salvaguardas y prompts para que un agente construya, en tu entorno, la atención de un gimnasio o estudio pequeño: planes y matrícula, clases con cupos y lista de espera, check-in, rutina de entrenamiento, ejercicios animados y el equipo en Telegram. 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, corriendo en tu máquina, con tu suscripción. Su hermano Atende Fisioterapia sigue el mismo molde, y atende-clinica, que vino antes, se hizo exactamente así y cerró 93 de 93 pruebas.
Alumnos y planes, clases grupales con reserva, check-in y la rutina de entrenamiento del profesor. En el centro está la clase con cupos: reserva con límite, lista de espera con oferta automática y falta automática. Python 3 solo con la biblioteca estándar y SQLite, un gimnasio por instalación.
Especificación de 23 secciones (0 a 22), 99 pruebas de caja negra, 20 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 ya revisó todo y encontró 10 problemas, 2 de los cuales habrían frenado a un implementador honesto.
La falta sin aviso, el horario ocioso y el alumno que desaparece son las fugas que ataca el plan. El sistema devuelve seis números del mes al panel de Raio-X de Margem, que es la fuente de las reglas de negocio. Allí no existe un paquete de gimnasio: el kit usa el modelo genérico de servicios con agenda, y cada mapeo es una premisa.
Planes mensual, trimestral, anual y clases sueltas, con precio y vigencia. La matrícula es ativa, vencida, trancada o cancelada (activa, vencida, congelada, cancelada). El pago es solo un estado manual (pago o pendente, pagado o pendiente) marcado por el equipo, más el aviso de vencimiento. Ningún Pix, tarjeta ni intermediario de pago en la v1.
El alumno hace check-in con su código en la recepción o por el chat (cheguei, "llegué"), uno por día. A quien desaparece hace N días le llega un mensaje de reactivación, pero solo si dio su consentimiento: la reactivación es marketing, no un aviso del contrato. "PARAR" bloquea todo lo automático.
Exportar y anonimizar los datos del alumno. El resultado de la evaluación física (peso, estatura, medidas) es un dato sensible: solo lo ve el equipo, nunca por la conversación, y se borra junto con el alumno. La LGPD y el 192 son de Brasil: la LGPD es la ley brasileña de protección de datos y el 192 es el número de la ambulancia en Brasil.
Este es el flujo del sistema planificado, lo que el agente va a construir. Servidor Python sin dependencias, SQLite en una carpeta de datos y Docker para el 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 pregunta por las clases, reserva y cancela, ve meu plano (mi plan) y meu treino (mi entrenamiento), pide explica agachamento (explica la sentadilla), escribe cheguei, resuelve dudas con el FAQ, pide un humano y manda "PARAR" cuando no quiere más mensajes. Una palabra de alerta de salud (dolor fuerte, dolor en el pecho, falta de aire, desmayo, mareo, lesión y otras) se responde con 192 y avisa al profesor. El chat está en portugués en la v1.
Avisos de reserva y de cancelación, y los comandos /aulas [fecha], /fila, /responder y /encerrar, también como respuesta directa al mensaje del alumno.
Con token: alumnos, planes y matrículas, grilla, reservas, check-ins, rutinas, evaluaciones, biblioteca de ejercicios, FAQ, registros y la cola humana.
La grilla semanal tiene modalidad, profesor, sala y cupos. La reserva respeta el límite de cupos y la anticipación; con 10 pedidos para el último cupo, uno recibe 201 y los otros nueve 409. Cuando alguien cancela, el primero de la lista de espera recibe la oferta automática.
Cancelar dentro del plazo (por defecto 2 h antes) devuelve el crédito. Pasado el plazo, el cupo se libera y se dispara la espera, pero el crédito suelto no vuelve. Una reserva sin check-in el día de la clase pasa a ser falta automática en la ronda de tareas, y el equipo puede corregirla.
El profesor arma la rutina con ejercicios de la biblioteca (series, repeticiones, carga, descanso). El alumno pide meu treino de hoje (mi entrenamiento de hoy) y recibe el entrenamiento que toca, en secuencia con cada check-in. El bot muestra la rutina del profesor y nunca prescribe.
Cada ejercicio es un SVG con animación solo en CSS, sin script y sin SMIL. Medido en un render real, HyperFrames no tiene adaptador SMIL: el movimiento SMIL salió quieto o desfasado en el MP4, y solo el CSS quedó fiel. Esta es la sentadilla: pies fijos en el suelo, rodillas hacia adelante, cadera hacia atrás.
Sentadilla, flexión de brazos, plancha, remo inclinado, press de banca, peso muerto con bastón, zancada, elevación de pelvis, abdominal, press de hombros, jalón al pecho y salto de tijera (jumping jack).
Cada uno tiene una página pública /exercicios/<id> con el SVG animado, los pasos, los errores comunes y los cuidados. En WhatsApp va un MP4 de 4 s renderizado por HyperFrames, un paso de build local (tools/render-exercicios); sin el MP4 (o sin PUBLIC_URL) va el enlace de la página. Los 12 SVG los dibuja el implementador, y el movimiento se comprueba en el nivel 4 con verificar-independente.py, que dice PULADO (omitido) cuando falta la herramienta.
Para ejecutar el plan basta Python para las pruebas y un agente con sesión iniciada por suscripción. Docker solo entra en la verificación final; Evolution y Telegram son opcionales y tuyos. Para los videos de los ejercicios, Node 22 o más nuevo, HyperFrames y ffprobe.
Las pruebas usan pytest (herramienta de desarrollo). La aplicación en sí no tendrá dependencias.
# comprobar python3 --version python3 -m pip install pytest
Por 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 de la verificación independiente. Una instancia de Evolution y un bot de Telegram solo si quieres los canales; las credenciales quedan en el .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, comprobar con la verificación independiente, generar los videos y pedir la revisión de un profesional de educación física.
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-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)
Lee docs/DECISOES-ABERTAS.md: son 20 propuestas por defecto ya aplicadas en la especificación y en las pruebas. Responder "ok en todo" destraba la ejecución. Si cambias algo marcado con ⚠ (por ejemplo la reactivación solo con consentimiento, la falta automática o el plazo de cancelación), edita docs/ESPECIFICACAO.md y tests/ antes del paso 3 y revisa el conteo. Para un piloto real, cambia también exemplos/academia.json por tu grilla, planes, profesores, FAQ y ejercicios.
less docs/DECISOES-ABERTAS.md python3 -m pytest -q --collect-only | tail -n 1
Con el git status limpio, el script guarda el hash de tests/, pytest.ini, la especificación y los verificadores en hash-congelado.txt y hace un commit. Desde entonces, cualquier cambio en las pruebas se detecta.
git status bash longrun/2026-10-05-academia-v1/congelar.sh
a) Loop headless con Codex (recomendado). El 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-academia-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-academia-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.
claude # sesión nueva, dentro de atende-academia
c) Codex TUI ya abierto. Pega todo el contenido de longrun/2026-10-05-academia-v1/prompt-goal-codex.md (empieza con /goal).
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; state.md dice qué funciona, qué falta y cómo retomar. Una prueba en conflicto con la especificación va a failures.md: es una compuerta humana, y el agente no debe ajustar pruebas ni especificación.
tail -f longrun/2026-10-05-academia-v1/loop.log cat longrun/2026-10-05-academia-v1/state.md
Cuando el agente diga "terminado", ejecuta los tres comandos. El último el agente nunca lo vio: busca valores del fixture copiados en el código, levanta un gimnasio que nunca apareció (otra grilla, otros planes y plazos, un feriado, otro reloj), abre 3 SVG en un Chromium para probar que se mueven, renderiza un ejercicio con HyperFrames y hace docker build con healthcheck. Sin Chromium, sin HyperFrames o sin Docker, esas etapas salen como PULADO, nunca como OK. Después abre /, /equipe y /exercicios/prancha en el 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
Paso humano, después de la implementación: tools/render-exercicios (escrito por el agente) usa solo el HyperFrames ya instalado, no descarga nada, y necesita Node 22 o más nuevo, Chromium y ffprobe. Genera web/exercicios/<id>.mp4 (4 s, 720×720, sin audio) a partir de cada SVG. Instala HyperFrames después de que el loop termine, porque el agente no debe descargar paquetes. WhatsApp descarga el video desde la URL pública, así que el camino del MP4 exige PUBLIC_URL con HTTPS.
npm install hyperframes tools/render-exercicios --ids agachamento,prancha --saida web/exercicios
Con el sistema implementado, copia el ejemplo, cambia el token y levanta el servidor. El chat del alumno queda en /, la página del equipo en /equipe (header X-Token) y cada ejercicio en /exercicios/<id>. El despliegue en el VPS es tuyo, con tus credenciales; el guion (Docker, webhooks de Evolution y Telegram, respaldo) lo escribe el agente en el README, sección 22 de la especificación.
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
Los 12 SVG son figuras esquemáticas dibujadas por el implementador, y los pasos, errores comunes y cuidados de cada ejercicio se escribieron como ejemplo: un profesional de educación física debe revisar todo antes de llegar a un alumno real, incluida la lista de palabras de alerta de salud. Las reglas del consejo profesional (CREF/CONFEF, los consejos brasileños de educación física) no se investigaron: la salvaguarda de campañas es solo el mínimo seguro (promesa de resultado y "antes y después"), sin citar ningún artículo, y el dueño confirma las reglas antes de publicar cualquier campaña (decisión 5). La base legal de la evaluación física, dato sensible, también la confirma el dueño o un abogado (decisión 6).
Todo lo que el agente necesita para construir, y todo lo que impide que finja haber construido.
Caja negra, por HTTP y por línea de comandos, en 13 archivos.
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, secciones 0 a 22: ejecución, academia.json, alumnos, planes y matrículas, clases grupales, check-in, entrenamiento, explicación animada, evaluación física, API HTTP, conversación, tareas, campañas y la salvaguarda de publicidad, Raio-X, LGPD, Evolution, Telegram y Docker. El cobro por Pix o tarjeta, el torniquete, la app del alumno, las clases personalizadas y varios gimnasios en el mismo servidor están explícitamente fuera (sección 16).
Hash congelado de tests/, pytest.ini, la especificación y los verificadores. Alcance de archivos: el agente solo toca el código y sus propios registros. Sin clave de API, sin URL externa en el código, sin 0.0.0.0 y sin SMIL ni script en los SVG. verificar-limites.sh comprueba todo eso e imprime LIMITES OK.
Nivel 4, oculto para el agente: busca valores del fixture en el código, levanta un gimnasio nunca visto, comprueba el movimiento de los SVG y el MP4 cuando existen las herramientas, y hace docker build y healthcheck. Solo así "99 passed" prueba una lógica general.
Lenguaje, canales, cobro solo manual, salvaguarda de campañas, evaluación física como dato sensible, reactivación con consentimiento, falta automática, cancelación tardía, check-in por código, los 12 ejercicios con animación solo CSS y Raio-X. Solo los ítems marcados con ⚠ cambian el contrato.
Un validador que no vio la planificación comparó pruebas con especificación e intentó burlar las salvaguardas. Encontró y corrigió 10 problemas: 2 bloqueaban la ejecución, 5 estorbaban y 3 eran cosméticos. El principal: la especificación aceptaba SMIL, y el render de HyperFrames no tiene adaptador SMIL, medido en un render real. El relato completo está en docs/VALIDACAO.md y cada corrección tiene una línea en FALHAS.md.
Falta sin aviso, horario ocioso, alumno que no vuelve y recepción atada a la agenda: docs/MAPA-RAIO-X.md vincula cada fuga del paquete de servicios con una pieza de la v1 o con el motivo de quedar fuera. Raio-X no trae cifras de mercado de gimnasios, así que faltas, ocupación y renovación quedan como premisa para medir en tu propio gimnasio. Detalles en la guía de Raio-X de Margem.
La LGPD (aviso de vencimiento, espera y clase cancelada como ejecución del contrato; reactivación y campaña solo con consentimiento; evaluación física como dato sensible; exportar y anonimizar) y el 192 para emergencias. La regla del consejo profesional (CREF/CONFEF) todavía no se investigó. Fuera de Brasil, cámbialo por la ley de privacidad, el consejo profesional y el número de emergencia locales.
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-clinica 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.tools/render-exercicios una vez, con HyperFrames instalado, y publicar los archivos junto con PUBLIC_URL.