Nomad Sailors · Diagnóstico ejecutivo + técnico

Auditoría integral del CRM

Estado real del producto, los datos, la seguridad y la operación. El objetivo no es demostrar que el CRM está bien o mal, sino decidir con evidencia qué conservar, qué corregir y en qué orden avanzar.

Fecha: 13 de agosto de 2026Base: main@9e7e93aProducción: Nomad / SupabaseAuditoría sin cambios de datos

A. Veredicto ejecutivo

¿Puede usarse hoy?SÍ, CON RESTRICCIONES

El núcleo de ventas funciona con datos reales: contactos, oportunidades, pipeline, tareas, ventas, analíticos y barcos. No debe considerarse todavía una operación completamente estable porque falta revalidar el guardado real con Carlota, la captura automática de leads no existe y Calendar está aplicado en la base pero no integrado en main.

6,6/10
estado general
La conclusión simple: no hay que reconstruir el CRM. La arquitectura nueva es buena y el flujo comercial central existe. Hay que estabilizar producción, cerrar diferencias entre código y base de datos y empezar a alimentar correctamente el seguimiento diario.
ÁreaNotaJustificación breve
Estado general6,6/10CRM real y utilizable, con brechas operativas y de integración.
Producto7,0/10Resuelve el ciclo comercial principal; reservas, pagos transaccionales y pasajeros no existen como módulos reales.
Frontend7,5/10Next.js moderno, rutas reales, responsive y estados de carga/error; queda una advertencia en el demo legado.
Backend8,0/10Servicios y repositorios por módulo, permisos centrales y acciones de servidor. Buen desacople.
Base de datos7,5/10RLS, migraciones, auditoría y relaciones sólidas; existe deriva entre Supabase y main.
Datos5,5/10Histórico comercial valioso, pero seguimiento, atribución fina y demografía tienen cobertura muy baja.
Seguridad7,0/10RLS y privilegio mínimo bien resueltos; quedan dependencias vulnerables y protección de contraseñas filtradas desactivada.
UX/UI6,5/10Mejoró mucho para celular/tablet y navegación; falta una prueba diaria completa con el usuario Vendedor.
Recontacto5,0/10Modelo, filtros y tareas existen, pero casi no hay datos de actividad ni próxima acción cargados.
Analíticos6,0/10Ventas, comisión y canales sirven; respuesta, UTM, estrategia y demografía no son confiables hoy.
Barcos6,0/1025 barcos y fichas reales; muchos incompletos, sin vínculo con oportunidades y Calendar aún fuera de main.
Producción6,0/10Login responde y la app compila; endpoint automático devuelve 503 y el guardado de Carlota no fue revalidado de punta a punta.
Preparación para automatizaciones5,5/10Hay contratos y endpoint interno, pero no hay entrada web, webhooks de canales ni orquestación activa.

Escala orientativa: 9–10 sólido; 7–8 utilizable; 5–6 parcial; menos de 5 insuficiente.

B. Inventario real

MóduloFrontendBackendDatos realesEstadoObservaciones
DashboardFuncional con mejorasTarjetas navegables y resumen real; varias cifras operativas están en cero por falta de uso/datos.
ContactosCRUD1.082Funcional con mejorasBúsqueda, filtros, detalle, alta, edición, archivo y reactivación. Falta captación web.
LeadsComo oportunidades832Funcional con mejorasNo existe entidad separada; “lead” es la oportunidad en etapa inicial.
Oportunidades / PipelineCRUD + historial832Funcional con mejoras97 ganadas, 735 perdidas, ninguna abierta actualmente.
Tareas / RecontactoCRUD3 tareasIncompleto en operaciónLa capacidad existe, pero el equipo aún no la alimenta de forma suficiente.
ActividadesEn fichasCRUD0Incompleto en operaciónSin historial operativo real de mensajes, llamadas o notas.
VentasDentro de ganadas97Funcional con mejorasMonto final y comisión tienen buena cobertura; no hay libro de pagos.
AnalíticosQueries realesFuncional con mejorasReportes mensuales y exportación de leads; confiabilidad depende del campo.
BarcosCRUD25Funcional con mejorasTarifas, media, tripulación, amenities e inclusiones reales; 18 fichas incompletas.
Disponibilidad / CalendarEn rama aparteEn rama aparteTablas vacíasParcial / no integradoMigración aplicada remotamente, pero código ausente de main. Sin Calendar ID.
Auth / rolesSSR + RLS2 usuariosSólidoAdministrador y Vendedor; ambos activos. No hay panel general de usuarios.
AuditoríaSin interfazAppend-only~1.470 eventosSólido técnicamenteRegistro persistente; falta interfaz de consulta para administración.
AutomatizacionesNoEndpoint interno4 ejecuciones técnicasIncompletoEndpoint cerrado por defecto; en producción responde 503.
ReservasSolo demo legadoNoNoInexistente realNo hay tabla ni flujo productivo.
PasajerosSolo cantidadNoParcialInexistente como móduloNo hay acompañantes, pasaporte ni expediente.
PagosAviso de depósitoCampos en oportunidadParcialNo es contabilidadNo hay transacciones, cuotas ni conciliación.
Documentos / transporteTareas o textoNo dedicadoNoInexistente realTransporte se sigue con tareas; documentos sensibles no se gestionan.
/stockPrototipo separadoNo CRMMockFuera del producto404 en producción y aislado de la sesión CRM.

C. Bugs, riesgos y funcionalidades falsamente terminadas

Categorías usadas: CONFIRMADO = evidencia directa; PROBABLE = falta una prueba adicional; SUGERENCIA = mejora, no bug.
IDSeveridadMóduloProblemaEvidenciaImpacto / solución
AUD-001ALTADeploy / DBCONFIRMADO: Supabase tiene Calendar aplicado, pero main no contiene esa migración.Remoto: 20260812190000; rama feature/boats-calendar; ausencia en supabase/migrations de main.Un entorno nuevo no reproduce producción. Integrar la rama solo después del piloto y reconciliar historial.
AUD-002ALTAOperaciónPROBABLE: el arreglo general de guardado está en c09b434, pero no se revalidó el flujo completo con Carlota.Commit de fix presente; prueba visual autenticada no completada.Puede impedir la operación del Vendedor. Hacer smoke test real crear/editar/archivar con Carlota.
AUD-003ALTADependenciasCONFIRMADO: npm audit reporta 6 vulnerabilidades altas.Next 16.2.10, PostCSS, Sharp y transitivas brace-expansion, js-yaml, nanoid.Actualizar en rama dedicada y repetir toda la suite; no mezclar con funciones.
AUD-004MEDIAAuthCONFIRMADO: protección contra contraseñas filtradas desactivada.Supabase Security Advisor.Activarla antes de incorporar más usuarios.
AUD-005ALTALeadsCONFIRMADO: no existe entrada automática desde formulario web.Sin endpoint/webhook de intake en app; única API: /api/internal/automations.Se pueden perder leads antes de entrar al CRM. Construir primero una fuente web con idempotencia.
AUD-006ALTASeguimientoCONFIRMADO: el modelo existe, pero los datos operativos están casi vacíos.0 actividades; 3 tareas; first_response_at 0; last_contact_at 1.Riesgo real de olvidar leads. Definir disciplina de próxima acción y medir adopción.
AUD-007MEDIAAnalíticosCONFIRMADO: demografía, UTM, respuesta, estrategia y destino no sirven para decidir hoy.Edad 0; UTM 0; first response 0; estrategia 0; destino 0.Mostrar cobertura junto a los reportes y mejorar captura antes de sacar conclusiones.
AUD-008MEDIADocumentaciónCONFIRMADO: README, CLAUDE.md y doc 87 contradicen la implementación.README describe demo/pnpm/schema.sql; CLAUDE dice 25 migraciones/630 tests; doc 87 dice Calendar no aplicado.Puede provocar despliegues o decisiones incorrectas. Crear una fuente de estado vigente.
AUD-009MEDIADatosPROBABLE: hay duplicados y nacionalidades inconsistentes que requieren revisión humana.14 grupos de email, 18 de teléfono; 72 valores de nacionalidad vs 55 normalizados.No fusionar automáticamente. Preparar cola de revisión y reglas de normalización.
AUD-010MEDIABarcosCONFIRMADO: 18/25 fichas incompletas y 0 vínculos barco-oportunidad.boats.status; opportunity_boats = 0; Google Calendar IDs = 0.El catálogo sirve para consulta, pero no cierra el flujo comercial. Completar solo datos confirmados.
AUD-011MEDIAPerformanceCONFIRMADO: 27 claves foráneas sin índice según Advisor.Supabase Performance Advisor.Revisar con queries reales antes de agregar índices; priorizar relaciones con mayor uso.
AUD-012MEDIAUsuariosCONFIRMADO: existe bootstrap seguro del primer admin, pero no gestión normal de usuarios posteriores.scripts/admin/bootstrap-first-admin.mjs; no inviteUserByEmail en app/features.Agregar invitación administrativa auditada cuando se necesite el tercer usuario.
AUD-013MEDIAProducciónCONFIRMADO: el endpoint automático responde 503; PROBABLE: falta CRON_SECRET o job configurado.GET /api/internal/automations = HTTP 503; .env.example lo define cerrado por defecto.Verificar Vercel sin exponer secretos y activar solo cuando el proceso esté aprobado.
AUD-014BAJACalidadCONFIRMADO: lint pasa con una advertencia y Node emite avisos de módulo.components/crm/modules.tsx:76; MODULE_TYPELESS_PACKAGE_JSON.Limpiar al retirar demo legado; no bloquea el CRM real.

D. Qué bloquea una operación confiable

1. Guardado del Vendedor

Hasta completar un recorrido real con Carlota no se puede afirmar que crear y editar funcionen para ambos roles en producción.

2. Deriva de Calendar

La base de producción tiene tres objetos que main no sabe recrear. Es un problema de recuperación y despliegue.

3. Entrada de leads

El equipo depende de carga manual. El CRM no puede ser la bandeja diaria completa si el formulario web no entra solo.

4. Seguimiento sin datos

Sin actividades y próximas acciones, las pantallas existen pero no protegen al equipo de olvidarse oportunidades.

No bloqueante, pero necesario antes de declarar estabilidad

  • Resolver vulnerabilidades altas de dependencias y activar protección de contraseñas filtradas.
  • Confirmar variables y deployment exacto de Vercel sin exponer valores.
  • Completar piloto de Calendar en un barco antes de conectar toda la flota.

E. Calidad y cobertura de datos reales

1.082contactos totales
842contactos activos
832oportunidades
97ventas ganadas
25barcos activos
2usuarios activos

Contactos activos

CampoTotalCon datoVacíoCoberturaLectura
Email o teléfono84254629664,8%Parcial 35,2% no contactable.
Email84229155134,6%Baja para automatización por correo.
Teléfono84254529764,7%Mejor canal disponible.
Nacionalidad842833998,9%Alta cobertura, pero etiquetas inconsistentes.
Canal de adquisición84270114183,3%Útil a nivel general.
Idioma preferido84218410,1%No confiable
Género84218410,1%No confiable
Edad84208420%No disponible

Oportunidades

CampoTotalCon datoCoberturaConclusión
Responsable832832100%Confiable.
Canal83269683,7%Útil para vista general.
Pasajeros83224229,1%Insuficiente para demanda.
Fechas deseadas8328510,2%Insuficiente para planificar disponibilidad.
Primera respuesta83200%No se puede medir velocidad.
Último contacto83210,1%No se puede medir abandono.
UTM83200%No permite atribución de campaña.
Estrategia de venta83200%No permite medir qué estrategia funciona.
Destino83200%No permite analizar demanda por destino.
Advertencia de fechas: 1.079 contactos tienen fecha reciente por la importación. Usar contacts.created_at como “leads nuevos de la semana” contaminaría los reportes hasta separar fecha de importación y fecha comercial original.

Integridad

  • 0 oportunidades, tareas o actividades huérfanas detectadas.
  • 0 incoherencias entre is_archived, archived_at y archived_by.
  • 832 eventos de etapa para 832 oportunidades: garantizan un punto inicial, pero no reconstruyen movimientos previos a la migración.
  • Potenciales duplicados: 14 grupos por email y 18 por teléfono normalizado. Requieren revisión, no borrado automático.

F. Seguridad y base de datos

Lo más importante está bien: todas las tablas públicas tienen RLS; no se detectaron grants peligrosos de TRUNCATE, TRIGGER o REFERENCES para roles web; las funciones SECURITY DEFINER no son ejecutables por anon ni authenticated; y no hay DELETE web sobre contactos ni perfiles.
NivelHallazgoEstadoAcción
ALTO6 vulnerabilidades altas en dependenciasConfirmadoActualización controlada de Next/PostCSS/Sharp y transitivas.
MEDIOProtección de contraseñas filtradas desactivadaConfirmadoActivar en Supabase Auth.
MEDIODeriva entre esquema remoto y mainConfirmadoReconciliar Calendar y asegurar migraciones reproducibles.
BAJOBucket boat-photos públicoIntencionalCorrecto para fotos comerciales; no usar para documentos sensibles.
BAJODos policies permisivas SELECT de perfiles para adminAdvisorRevisar por claridad/performance, sin urgencia funcional.

Inventario técnico de Supabase

  • Proyecto activo en PostgreSQL 17.6; 37 migraciones remotas.
  • 21 funciones, 27 triggers, 0 vistas públicas y 0 Edge Functions.
  • RLS activa en todas las tablas públicas inspeccionadas.
  • Auditoría append-only con ~1.470 eventos.
  • pg_cron y pg_net no están instalados; la automatización depende de un llamador externo.
  • No se encontraron secretos reales trackeados. .env.example contiene solamente nombres vacíos.

G. UX, frontend y responsive

¿Una persona nueva puede aprenderlo? Sí, con una introducción corta. La navegación ya expresa el flujo comercial y las tarjetas del dashboard abren sus listados. En celular y tablet hay pruebas estáticas específicas y componentes responsive. La principal dificultad no es visual: es que muchas etapas y campos quedan vacíos si el equipo no registra actividad y próxima acción.

Bien resuelto

  • Estados de carga, error y vacío por ruta.
  • Detalle directo de contacto, oportunidad, tarea y barco.
  • Pipeline con ganadas/perdidas separadas.
  • Interfaz en español e inglés.
  • /stock aislado y oculto en producción.

A verificar con personas reales

  • Guardar como Vendedor desde celular y tablet.
  • Flujo completo sin volver manualmente al listado.
  • Claridad de próxima acción y recontactos.
  • Longitud de formularios en pantallas pequeñas.
  • Feedback cuando falla Supabase.

Limitación de la auditoría: la inspección automatizada de todas las rutas autenticadas en producción no terminó por fallos del control del navegador. No se marca como probado lo que no pudo recorrerse visualmente.

H. Analíticos: qué se puede confiar

KPIConfianzaMotivo
Ventas ganadas, volumen y comisiónConfiable97 ganadas; 96 con monto final y 97 con comisión/fecha de venta.
Pérdidas y motivoConfiable735 perdidas con motivos codificados.
Canal generalParcial83% de cobertura; sirve para tendencia, no para atribución exacta.
Leads nuevos por fecha de contactoNo confiable hoyLa importación masiva alteró created_at.
Conversión por campaña/anuncioNo confiableUTM y click IDs vacíos.
Tiempo de primera respuestaNo disponible0 oportunidades con first_response_at.
Embudo histórico y tiempo por etapaParcialEl historial anterior fue backfill de un evento por oportunidad.
País / nacionalidadParcialCobertura excelente, normalización irregular y concepto “nacionalidad” no siempre equivale a país de residencia.
Edad y géneroNo disponible0% y 0,1% de cobertura.
Rendimiento por estrategia de ventaNo disponibleCampo sin datos.

I. Deuda técnica y documentación

  1. Alta: migración de disponibilidad aplicada fuera de main.
  2. Alta: dependencias con vulnerabilidades conocidas.
  3. Media: README describe el prototipo y un proceso de Supabase que ya no corresponde.
  4. Media: demo legado conserva mocks, any y una advertencia de lint; está aislado, pero confunde búsquedas.
  5. Media: 27 FK sin índice y 38 índices reportados como no utilizados. Medir antes de actuar.
  6. Baja: avisos de Node por ausencia de type: module en package.json.

Estado de la documentación

FuenteClasificaciónComentario
docs/37, 38, 45, 49 y arquitectura por capasVigenteCoincide ampliamente con el código.
docs/75, 76, 78, 82–86Parcialmente vigenteBuen contexto, algunos estados ya cambiaron.
docs/87-estado-calendar-disponibilidad.htmlDesactualizadoIndica migración pendiente, pero ya está aplicada en Supabase.
CLAUDE.mdParcialmente desactualizadoArquitectura correcta; cifras de migraciones/tests y Calendar quedaron atrás.
README.mdObsoletoDocumenta el prototipo mock, pnpm y schema.sql, no el CRM real.

J. Cosas bien resueltas que no hay que reconstruir

Arquitectura

Separación por dominio, aplicación, infraestructura y presentación. Repositorios y puertos permiten cambiar integraciones sin contaminar reglas.

Seguridad de datos

RLS generalizada, roles simples, auditoría append-only y service role aislada del cliente.

Flujo comercial

Contactos, oportunidades, etapas, ganadas/perdidas, aviso de pago y tareas de operación ya tienen una base coherente.

Calidad

790 pruebas pasan; lint, typecheck y build finalizan correctamente.

Datos históricos

Las 97 ventas tienen comisión y casi todas monto, fecha y noches. Es una base valiosa para negocio.

Aislamiento

/stock y demo legado no contaminan las rutas productivas.

K. ¿Qué falta para cerrar la etapa actual?

Bloqueante

  • Prueba real completa con Administrador y Vendedor: crear, editar, mover etapa, archivar, reactivar y recargar.
  • Reconciliar migración Calendar remota con código versionado.

Necesario

  • Corregir vulnerabilidades altas y activar protección de contraseñas filtradas.
  • Confirmar configuración productiva de Vercel y decidir si el endpoint automático debe seguir cerrado.
  • Definir un procedimiento diario de tareas, actividades y próxima acción.
  • Ejecutar el piloto de Calendar con un único barco real.

Recomendable

  • Normalización asistida de nacionalidades y revisión de duplicados.
  • Corregir README/CLAUDE/documentos de estado.
  • Medir y priorizar índices de FK.

Puede esperar

  • Reservas, pasajeros, documentos, pagos completos y propuestas avanzadas.
  • WhatsApp, Instagram, n8n y analítica demográfica avanzada.
  • Panel administrativo de auditoría y gestión completa de usuarios.

L. Roadmap recomendado

P0 — Estabilidad y verdad técnica

Smoke test de Carlota; reconciliar Calendar; actualizar dependencias de seguridad; verificar deployment/env/cron.

P1 — CRM operativo diario

Hacer obligatoria o muy visible la próxima acción, registrar actividades, limpiar duplicados prioritarios y completar piloto de disponibilidad.

P2 — Productividad comercial

Captura automática del formulario web, cola de leads nuevos, alertas por inactividad y datos mínimos de interés/fechas/pasajeros.

P3 — Automatizaciones

Contrato de eventos, webhooks salientes, n8n y luego WhatsApp/Instagram/Meta, con idempotencia y auditoría.

P4 — Evolución

Reservas, pasajeros, pagos, documentos y propuestas cuando el flujo comercial y la calidad de datos sean estables.

M. Top 10 acciones por impacto / esfuerzo / riesgo

  1. Revalidar el guardado con Carlota en producción.
    Impacto alto · esfuerzo bajo · riesgo bajo · depende de acceso Vendedor.
  2. Reconciliar Calendar entre Supabase, rama feature y main.
    Impacto alto · esfuerzo medio · riesgo medio · depende del piloto.
  3. Actualizar dependencias vulnerables y activar protección de contraseñas.
    Impacto alto · esfuerzo medio · riesgo medio · requiere regresión completa.
  4. Conectar un solo Calendar real y validar libre/ocupado/timezone/privacidad.
    Impacto alto · esfuerzo medio · riesgo bajo · depende del Calendar ID piloto.
  5. Crear entrada segura desde el formulario web.
    Impacto muy alto · esfuerzo medio · riesgo medio · requiere contrato e idempotencia.
  6. Establecer la próxima acción como hábito medible.
    Impacto alto · esfuerzo bajo · riesgo bajo · depende del proceso del equipo.
  7. Revisar duplicados y normalizar nacionalidades sin borrar automáticamente.
    Impacto medio · esfuerzo medio · riesgo medio · requiere validación humana.
  8. Empezar a registrar actividades y primera respuesta.
    Impacto alto · esfuerzo medio · riesgo bajo · puede acompañar el formulario web.
  9. Agregar smoke E2E productivo sin secretos en Git.
    Impacto alto · esfuerzo medio · riesgo bajo · requiere usuario de prueba autorizado.
  10. Actualizar README y documentos de estado.
    Impacto medio · esfuerzo bajo · riesgo bajo · después de reconciliar Calendar.

N. Quick wins

  • Activar la protección de contraseñas filtradas.
  • Publicar un checklist breve de prueba diaria Administrador/Vendedor.
  • Mostrar en Analíticos la cobertura de cada indicador para evitar interpretaciones falsas.
  • Marcar README como histórico hasta actualizarlo.
  • Corregir las cifras de tests/migraciones en CLAUDE.md.
  • Agregar una vista de contactos sin email ni teléfono para completar los que importan.

O. Qué no hacer ahora

  • No reconstruir la arquitectura ni cambiar Supabase/Next.js.
  • No volver a importar barcos, fotos o fichas.
  • No conectar toda la flota a Calendar antes del piloto.
  • No construir reservas, pasajeros, pagos y documentos simultáneamente.
  • No instalar n8n antes de definir y probar el contrato de entrada/salida.
  • No sacar conclusiones de edad, género, UTM o primera respuesta con 0% de cobertura.
  • No fusionar duplicados ni borrar índices automáticamente.
  • No mezclar actualizaciones de seguridad con nuevas funcionalidades.

P. Preparación para la arquitectura futura

La arquitectura actual puede evolucionar sin reconstruirse. La capa de aplicación, repositorios, IDs de correlación, auditoría y endpoint interno son buenos puntos de apoyo. Lo que falta es un contrato de integración estable.

Entrada

Un endpoint server-side para formulario web con firma o secreto, validación, deduplicación e idempotency key.

Modelo

Crear contacto + oportunidad inicial + evento de origen en una operación coherente, sin depender de la UI.

Salida

Eventos versionados como lead.created, opportunity.stage_changed y task.due.

n8n

Consumidor externo con reintentos, idempotencia y auditoría; nunca dueño exclusivo de la verdad comercial.

Canales

Web primero; después WhatsApp/Instagram/Meta uno por uno, conservando fuente, campaña y consentimiento.

Seguridad

Service role solo servidor; secretos por ambiente; payloads mínimos; sin tokens ni mensajes completos en auditoría.

Validaciones ejecutadas

ControlResultadoDetalle
Instalación limpiaOKnpm ci, 486 paquetes.
PruebasOK790 aprobadas, 0 fallidas.
LintOKCódigo 0; 1 advertencia en demo legado.
TypeScriptOKtsc --noEmit sin errores.
BuildOKNext.js 16.2.10; 23 rutas compiladas; Proxy reconocido.
Producción /loginHTTP 200Dominio responde.
Producción /api/internal/automationsHTTP 503Cerrado por falta de configuración o decisión.
GitLimpio salvo informe previomain sincronizado; docs/87... ya era no rastreado.
Rutas compiladas

/, /_not-found, /analytics, /analytics/reporte, /api/internal/automations, /auth/accept-invite, /auth/callback, /auth/invite-error, /auth/set-password, /boats, /boats/[id], /boats/new, /contacts, /contacts/[id], /demo-legacy, /login, /logout, /opportunities, /opportunities/[id], /opportunities/new, /pipeline, /recontact, /stock, /tasks, /tasks/[id], /tasks/new.

Evidencia principal de código
  • proxy.ts — sesión SSR, protección interna y aislamiento de /stock.
  • features/*/{domain,application,infrastructure,presentation} — arquitectura modular.
  • features/opportunities/infrastructure/supabase-opportunities-repository.ts — query comercial real.
  • scripts/admin/bootstrap-first-admin.mjs — bootstrap seguro.
  • supabase/migrations/* — esquema canónico de main.
  • origin/feature/boats-calendar:supabase/migrations/20260812190000_boat_availability.sql — disponibilidad ausente de main.
  • tests/security/* y tests/integration/stage-one-workflow.test.ts — límites de seguridad y flujo.
  • lib/demo-data.ts, lib/data-store.ts, components/crm/* — prototipo legado aislado.

Q. Respuesta final

¿Podemos utilizar hoy el CRM en operación real?

SÍ, CON RESTRICCIONES. Se puede trabajar con contactos, oportunidades, pipeline, ventas, tareas, analíticos y barcos. Hasta validar el guardado con Carlota, el equipo debe mantener un control manual de incidencias. Los leads del formulario aún deben cargarse manualmente.

¿Está terminada la etapa actual?

CASI. Funcionalmente el núcleo está construido, pero no está cerrado operativamente mientras exista deriva de Calendar, falte la prueba completa del Vendedor y sigan abiertos los riesgos de seguridad de dependencias.

¿Hay que reconstruir partes importantes?

NO. Hay que retirar o archivar el prototipo legado cuando deje de ser útil, pero la arquitectura real, Supabase, RLS y los módulos principales se deben conservar.

Las 3 prioridades absolutas ahora son

  1. Validar producción con Carlota y cerrar cualquier fallo real de guardado.
  2. Reconciliar Calendar y ejecutar un piloto con un solo barco antes de integrar toda la flota.
  3. Automatizar la entrada del formulario web y convertir cada lead en seguimiento con responsable y próxima acción.

Próximo milestone recomendado

Milestone: CRM operativo confiable

Se considera terminado cuando: Administrador y Vendedor completan el flujo de guardar sin errores; main reproduce exactamente Supabase; las vulnerabilidades altas están resueltas; un barco piloto responde disponibilidad sin exponer eventos privados; y un lead del formulario web entra una sola vez, con origen, responsable, auditoría y próxima acción.