Kit de plan · reserva de posada y hotel · código abierto

El plan completo para que la habitación nunca quede vacía

Especificación, 98 pruebas de aceptación, trabas y prompts para que un agente construya, en tu propio entorno, el sistema de reservas de una posada u hotel pequeño: disponibilidad por noche sin overbooking, tarifas por temporada, reserva directa en el chat y en WhatsApp, calendario iCal para Booking y Airbnb y el equipo en Telegram. El sistema todavía no está implementado: este repositorio es el plan, y tú corres la implementación.

Banner de Reserva Hotel: disponibilidad por noche, reserva directa, iCal para Booking y Airbnb y equipo en Telegram
Qué es

Un kit para pedirle al agente: del contrato a las 98 pruebas en verde

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 trabas que impiden que el agente haga trampa. Quien construye es Claude Code o Codex, corriendo en tu máquina, con tu suscripción. El proyecto hermano Atende Clínica se hizo exactamente así y cerró 93 de 93 pruebas.

Disponibilidad por noche, tarifas por temporada, reserva directa, iCal para Booking y Airbnb, ciclo de la estadía, equipo en Telegram, LGPD y Raio-X

🏨 El sistema que sale del plan

Tipos de habitación y habitaciones numeradas, disponibilidad por noche (check-in inclusivo, check-out exclusivo) sin overbooking, estadía mínima, cierres y bloqueos. Tarifas por temporada con paquete de temporada baja (por ejemplo, 3 noches pagan 2) y descuento de reserva directa. Python 3 solo con la biblioteca estándar y SQLite, una posada por instalación.

📦 El kit

Especificación de 20 secciones, 98 pruebas de caja negra, 17 decisiones ya propuestas, mapa hacia el Raio-X, prompts para /goal y para el loop headless, y las trabas que congelan el contrato. Un validador adversarial ya revisó todo y corrigió 13 problemas, 3 de los cuales habrían trabado la ejecución.

📈 Las reglas del Raio-X de Margem

El huésped que reserva directo no paga comisión de OTA, y la temporada baja tiene precio y paquete propios. El sistema devuelve receita_ota, retorno_atual_pct, ocupacao_baixa_pct y otras cifras para el panel del Raio-X de Margem, que es la fuente de las reglas de negocio.

Cómo funciona

Del "¿hay habitación para el feriado?" a la estadía concluida

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.

Chat del sitio o WhatsApp (Evolution)→ Fechas y huéspedes→ Cotización por temporada, con descuento directo→ Reserva sin overbooking→ Recordatorio, pre-check-in, check-in y check-out→ Posestadía y cifras del mes para el Raio-X

Huésped

Por el chat o por WhatsApp consulta disponibilidad y precio, reserva, ve y cancela su propia reserva según la política (gratis hasta 7 días antes, en el ejemplo), resuelve dudas con el FAQ, pide atención humana y envía "PARAR" cuando no quiere más mensajes.

Equipo en Telegram

Avisos de reserva nueva y cancelada, y los comandos /chegadas (llegadas), /ocupacao (ocupación), /fila (cola), /responder y /encerrar (cerrar), también como respuesta directa al mensaje del huésped.

Página /equipe

Con token: llegadas y salidas del día, mapa de ocupación del mes, check-in, check-out y no-show, seña pagada, registros de tipos, habitaciones, temporadas y FAQ, bloqueos y cola humana.

Tarifas y temporadas

Tarifa base por tipo, temporadas (alta, baja, feriado) con precio por noche, persona extra, paquete de temporada baja y descuento de canal propio (directa o mostrador), nunca para la OTA. La seña es una política escrita, marcada como pagada por el equipo. Centavos con redondeo half-up (medio hacia arriba).

iCal con Booking y Airbnb

Exportación por tipo y por habitación, para bloquear las fechas en las OTAs. Importación del .ics descargado de la OTA, enviado como archivo: se vuelve una reserva con origen booking o airbnb. En la v1 no se consulta ninguna URL externa.

Ciclo de la estadía

Recordatorio con pre-check-in unos días antes, check-in y check-out por el equipo, no-show, posestadía que invita a reservar directo (solo con consentimiento) y lista de espera para fechas llenas.

Requisitos

Qué necesitas

Para correr 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 y en el despliegue; Evolution y Telegram son opcionales y tuyos.

Python 3.10+ y pytest

Las pruebas usan pytest (herramienta de desarrollo). La aplicación en sí no tendrá dependencias.

# comprobar
python3 --version
python3 -m pip install pytest

Claude Code o Codex

Por suscripción, sin API de pago. Para el loop headless, clona execucao-longa en ~/projetos.

# comprobar
codex --version   # o: claude --version

Docker, Evolution y Telegram

Docker hace el build final y el despliegue en el VPS. Una instancia de Evolution y un bot de Telegram solo si quieres los canales; las credenciales van en el .env.

# comprobar
docker --version
Guía de uso · paso a paso

Del clon al sistema implementado, en tu entorno

Los comandos de abajo son los del repositorio. El ciclo: responder las decisiones, congelar el contrato, correr el agente hasta 98 passed y LIMITES OK, y comprobar con la verificación independiente.

1

Clona el repositorio

Todavía no existe ./reserva: el repositorio solo tiene el plan. Comprueba que la suite se recolecta sin errores y que aún no pasa nada (sin la implementación, las pruebas fallan o dan error, y eso es lo esperado).

git clone https://github.com/inematds/reserva-hotel && cd reserva-hotel
python3 -m pytest -q --collect-only | tail -1   # 98 tests collected
python3 -m pytest -q | tail -1                  # 0 passed
2

Responde las decisiones abiertas

Lee docs/DECISOES-ABERTAS.md (escrito en portugués): son 17 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 el descuento de reserva directa, el inventario por tipo o la política de cancelación), edita docs/ESPECIFICACAO.md y las pruebas antes de congelar. Para un piloto real, cambia también exemplos/pousada.json por tus tipos de habitación, habitaciones, temporadas y FAQ.

less docs/DECISOES-ABERTAS.md
3

Congela el contrato

Con todo commiteado, el script guarda el hash de tests/, pytest.ini, de la especificación y de los dos verificadores, más el commit base en hash-congelado.txt, y hace un commit. Desde ahí, cualquier cambio en las pruebas se detecta. Si hay cambios pendientes, el script se detiene y pide el commit antes.

git add -A && git commit -m "contrato v1"
bash longrun/2026-10-05-reservas-v1/congelar.sh
4

Corre el agente (elige un camino)

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-reservas-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-reservas-v1/prompt-goal-claude.md: pega la condición de /goal (la salida debe mostrar 98 passed y LIMITES OK) y, como primer mensaje, el bloque de prompt-goal-codex.md a partir de RESULTADO:.

claude   # sesión nueva, dentro de reserva-hotel

c) Codex TUI abierto. Pega el contenido de longrun/2026-10-05-reservas-v1/prompt-goal-codex.md.

codex -c sandbox_workspace_write.network_access=true
5

Haz el seguimiento

En el loop, loop.log muestra cada ciclo y progress.md trae una línea por checkpoint. El código de salida del loop dice qué pasó: 0 concluido (la prueba final pasó), 1 tope de ciclos alcanzado, 2 detenido por 3 ciclos sin avance, 3 ya hay otro loop corriendo en la carpeta. Una prueba en conflicto con la especificación va a failures.md: es una compuerta humana, y el agente no debe ajustar la prueba ni la especificación.

tail -f longrun/2026-10-05-reservas-v1/loop.log
cat longrun/2026-10-05-reservas-v1/state.md
6

Comprueba con la verificación independiente

Cuando el agente diga "concluido", corre los tres comandos. El último el agente nunca lo vio: busca valores del fixture copiados en el código, levanta una posada que nunca apareció (otros tipos, precios con centavos, temporada baja de invierno, paquete 4 pagan 3, descuento de 15 %, seña de 50 %, otro reloj) y hace docker build con healthcheck. Después, abre / y /equipe en el navegador.

python3 -m pytest -q tests/                                        # 98 passed
bash longrun/2026-10-05-reservas-v1/verificar-limites.sh              # LIMITES OK
python3 longrun/2026-10-05-reservas-v1/verificar-independente.py     # INDEPENDENTE OK
7

Corre tu posada y haz el despliegue en el VPS

Con el sistema implementado, copia el ejemplo, cambia TROQUE-ESTE-TOKEN y TROQUE-ESTE-SEGREDO (el token y el secreto de relleno) y levanta el servidor. El chat del huésped queda en / y la página del equipo en /equipe (header X-Token).

mkdir -p dados && cp exemplos/pousada.json dados/pousada.json
./reserva serve --porta 8080 --dados dados

El despliegue es tuyo, con tus credenciales. El propio agente escribe el README de despliegue como parte del goal: levantar docker compose (puerto solo en 127.0.0.1:8080, detrás de un proxy HTTPS), webhook de Evolution en /webhook/evolution/<secreto> (evento MESSAGES_UPSERT), webhook de Telegram con setWebhook y secret_token, la URL /ical/<secreto>/… registrada en Booking y Airbnb, la importación de su .ics por la página del equipo y el respaldo diario (./reserva backup en el cron).

cp .env.exemplo .env && chmod 600 .env   # completa EVOLUTION_*, TELEGRAM_*, WEBHOOK_SEGREDO
docker compose up -d --build
Qué trae el kit

Contrato, pruebas y trabas, con los números reales

Todo lo que el agente necesita para construir, y todo lo que impide que finja haber construido.

98 pruebas de aceptación

Caja negra, por HTTP y por línea de comandos, en 10 archivos.

test_inventario.py            17
test_integracoes.py           16
test_conversa.py              14
test_ciclo.py                 11
test_tarifas.py               10
test_cadastros.py              9
test_ical.py                   7
test_basico.py                 6
test_docker.py                 4
test_lgpd_raiox.py             4

Especificación de 20 secciones

docs/ESPECIFICACAO.md: ejecución, pousada.json, noches y disponibilidad, cálculo de tarifas, autenticación, API HTTP, conversación, lista de espera, ciclo de la estadía, cancelación, iCal, exportación al Raio-X, LGPD, lo que queda fuera de la v1, páginas, registros, base de datos, Evolution, Telegram y Docker. Pago (Pix y tarjeta), sincronización iCal por URL, venta de extras, precio dinámico y varias posadas están explícitamente fuera.

Trabas contra atajos

Hash congelado de tests/, pytest.ini, de la especificación y de los dos verificadores. Alcance de archivos: el agente solo toca el código y sus propios registros. Sin dependencia externa, sin clave de API, sin URL externa y sin 0.0.0.0 en el código. El verificar-limites.sh comprueba todo eso e imprime LIMITES OK.

Verificación independiente

Nivel 4, oculto para el agente: busca valores del fixture en el código, levanta una posada nunca vista, con todos los argumentos explícitos, y hace docker build y healthcheck del contenedor. Solo así "98 passed" demuestra una lógica general.

17 decisiones ya propuestas

Lenguaje, canales, descuento de reserva directa y paridad con Booking, inventario por tipo, OTAs solo por iCal, seña y cancelación, tarifas, ciclo de la estadía, qué va al Raio-X, una posada por instalación y solo PT en la v1. Solo los ítems marcados con ⚠ cambian el contrato.

Validado por un agente adversarial

Un validador que no vio la planificación comparó pruebas con la especificación, rehízo 70 cuentas e intentó burlar las trabas. Encontró y corrigió 13 problemas, 3 de los cuales habrían trabado la ejecución. El relato completo está en docs/VALIDACAO.md.

Las reglas de negocio vienen del Raio-X

Reserva directa frente a comisión de OTA, temporada baja con paquete y el huésped que vuelve: docs/MAPA-RAIO-X.md liga cada fuga del paquete hotel a una pieza de la v1 o al motivo de quedar fuera. Detalles en la guía del Raio-X de Margem.

Las reglas incorporadas son brasileñas

La LGPD (ley de protección de datos de Brasil: recordatorio como ejecución del contrato, posestadía solo con consentimiento, exportar y anonimizar) y el cuidado con la paridad de precios del contrato de Booking en Brasil: ninguna página pública publica precio, y el descuento directo solo aparece en la conversación 1:1. El dueño de la posada valida ese punto. Fuera de Brasil, adáptalas a la ley local.

Roadmap

Dónde está y hacia dónde va

El plan está listo y validado. La implementación todavía no existe: nace cuando corres el /goal, con el método execucao-longa. Atende Clínica siguió el mismo camino y cerró 93 de 93.

Plan ✅
Especificación, pruebas y trabas validadasContrato de 20 secciones, 98 pruebas de aceptación, decisiones propuestas, mapa hacia el Raio-X y validación adversarial concluida el 05/10/2026.
Implementación
Tú corres el /goalResponder las decisiones, congelar el contrato y dejar que el agente trabaje hasta 98 passed y LIMITES OK, y después la verificación independiente. Hoy el sistema no está implementado.
Piloto
En una posada realConfigurar tipos, habitaciones, temporadas y FAQ verdaderos, publicar en el VPS, registrar el iCal en Booking y Airbnb y seguir reserva directa, ocupación en temporada baja y retorno en el Panel de Recuperación del Raio-X.
Después
Fuera de la v1Pago, sincronización iCal por URL, venta de extras, precio dinámico, varias posadas e interfaz en EN/ES quedan para una próxima versión, con compuerta humana.