Qué es el proyecto, qué hace cada feature y la lista de pendientes están en README.md
(sección “Funcionalidades” y “Pendientes”). Este archivo solo contiene reglas de trabajo y datos
que no se deducen del código.
Solo cuenta como “funciona” lo que se ve en producción:
Flujo tras cualquier cambio de código:
npm run build en los workspaces afectados.git push a main (siempre, aunque el usuario suela
decir “hazlo ya”). El push dispara Cloudflare Workers Builds (turnigo-panel y turnigo-widget,
deploys separados que no siempre acaban a la vez). Nunca wrangler deploy a mano.Monitor: curl a la URL, extraer el hash del bundle
(grep -o 'assets/index-[a-zA-Z0-9]*\.js') y comparar con el anterior. Sin sleep en primer plano.reservas-saas, ref fjpbruwczuovvynhlnzv, https://fjpbruwczuovvynhlnzv.supabase.co,
plan Free (riesgo de pausado por inactividad; recomendado Pro, el usuario no lo ha decidido).supabase/migrations/ se aplican directamente a producción.
Pedir confirmación antes de cualquier migración o cambio en la BD, sin excepción por
“es aditivo/bajo riesgo”. Se pueden agrupar varias migraciones ya presentadas en una sola
confirmación si el usuario lo pide así.deploy_edge_function del MCP de Supabase (Cloudflare solo
cubre las dos apps). Generar el payload leyendo el archivo real de disco, nunca retipeándolo.CRON_SECRET, GOOGLE_STATE_SECRET, DASHBOARD_URL, GOOGLE_SYNC_CRON_SECRET. El valor real de
CRON_SECRET está embebido en los cron jobs:
select command from cron.job where jobname='whatsapp-reminders-hourly';pg_cron/pg_net por SQL directo.memory/feedback-*.md — firma de RPC, reescribir desde pg_get_functiondef, upsert con
índice parcial, select (fn()).*, timeout en fetch de Edge Functions.guard_business_update exige sesión real de super-admin para cambiar type/slug/
is_active de un negocio. No intentar saltarlo por SQL (DISABLE TRIGGER, spoof de
request.jwt.claims): está bloqueado por el clasificador de seguridad. Usar la UI
(Admin → Editar negocio).business_type, booking_status…), auditar
con agentes Explore toda comparación literal en SQL y TS; hay datos reales en producción.generate-client-ai-report): modelo en la constante MODEL
(gemini-3.6-flash; gemini-2.5-flash ya no existe para claves nuevas). Devuelve 503/429 con
frecuencia — el panel reintenta 3 veces. Si Google lo retira, el 404 indica el modelo sustituto.lodesiko12@gmail.com (la cuenta del usuario). Credenciales en la memoria
local del asistente, nunca en el repo.restaurante-la-plaza (staff@restaurante.test / Restaurante1234!).barberia-demo y admin@reservas.test ya no existen en producción (seed.sql los recrearía).ana-sanchez-psicologa, type='psicologo'): crear solo datos de prueba propios y borrarlos al
terminar; no tocar clientes/reservas reales.mimate, tipo citas, 5 profesionales) es un negocio de demo comercial para un
cliente potencial: el 2026-09-22 se cargaron 48 clientes y 821 reservas ficticias (14 sept–10 oct)
para que la Agenda se vea llena. Sirve para verificar features de citas sin miedo a tocar datos
reales, pero dejarlo presentable (sin basura visible). Credenciales en la memoria local.with r(...) as (values ...) insert ... select ... from r join ... en tandas de ~200 filas
(un INSERT por fila en 500 KB no cabe en una llamada).