A. Veredicto ejecutivo
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.
estado general
| Área | Nota | Justificación breve |
|---|---|---|
| Estado general | 6,6/10 | CRM real y utilizable, con brechas operativas y de integración. |
| Producto | 7,0/10 | Resuelve el ciclo comercial principal; reservas, pagos transaccionales y pasajeros no existen como módulos reales. |
| Frontend | 7,5/10 | Next.js moderno, rutas reales, responsive y estados de carga/error; queda una advertencia en el demo legado. |
| Backend | 8,0/10 | Servicios y repositorios por módulo, permisos centrales y acciones de servidor. Buen desacople. |
| Base de datos | 7,5/10 | RLS, migraciones, auditoría y relaciones sólidas; existe deriva entre Supabase y main. |
| Datos | 5,5/10 | Histórico comercial valioso, pero seguimiento, atribución fina y demografía tienen cobertura muy baja. |
| Seguridad | 7,0/10 | RLS y privilegio mínimo bien resueltos; quedan dependencias vulnerables y protección de contraseñas filtradas desactivada. |
| UX/UI | 6,5/10 | Mejoró mucho para celular/tablet y navegación; falta una prueba diaria completa con el usuario Vendedor. |
| Recontacto | 5,0/10 | Modelo, filtros y tareas existen, pero casi no hay datos de actividad ni próxima acción cargados. |
| Analíticos | 6,0/10 | Ventas, comisión y canales sirven; respuesta, UTM, estrategia y demografía no son confiables hoy. |
| Barcos | 6,0/10 | 25 barcos y fichas reales; muchos incompletos, sin vínculo con oportunidades y Calendar aún fuera de main. |
| Producción | 6,0/10 | Login 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 automatizaciones | 5,5/10 | Hay 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ódulo | Frontend | Backend | Datos reales | Estado | Observaciones |
|---|---|---|---|---|---|
| Dashboard | Sí | Sí | Sí | Funcional con mejoras | Tarjetas navegables y resumen real; varias cifras operativas están en cero por falta de uso/datos. |
| Contactos | Sí | CRUD | 1.082 | Funcional con mejoras | Búsqueda, filtros, detalle, alta, edición, archivo y reactivación. Falta captación web. |
| Leads | Como oportunidades | Sí | 832 | Funcional con mejoras | No existe entidad separada; “lead” es la oportunidad en etapa inicial. |
| Oportunidades / Pipeline | Sí | CRUD + historial | 832 | Funcional con mejoras | 97 ganadas, 735 perdidas, ninguna abierta actualmente. |
| Tareas / Recontacto | Sí | CRUD | 3 tareas | Incompleto en operación | La capacidad existe, pero el equipo aún no la alimenta de forma suficiente. |
| Actividades | En fichas | CRUD | 0 | Incompleto en operación | Sin historial operativo real de mensajes, llamadas o notas. |
| Ventas | Dentro de ganadas | Sí | 97 | Funcional con mejoras | Monto final y comisión tienen buena cobertura; no hay libro de pagos. |
| Analíticos | Sí | Queries reales | Sí | Funcional con mejoras | Reportes mensuales y exportación de leads; confiabilidad depende del campo. |
| Barcos | Sí | CRUD | 25 | Funcional con mejoras | Tarifas, media, tripulación, amenities e inclusiones reales; 18 fichas incompletas. |
| Disponibilidad / Calendar | En rama aparte | En rama aparte | Tablas vacías | Parcial / no integrado | Migración aplicada remotamente, pero código ausente de main. Sin Calendar ID. |
| Auth / roles | Sí | SSR + RLS | 2 usuarios | Sólido | Administrador y Vendedor; ambos activos. No hay panel general de usuarios. |
| Auditoría | Sin interfaz | Append-only | ~1.470 eventos | Sólido técnicamente | Registro persistente; falta interfaz de consulta para administración. |
| Automatizaciones | No | Endpoint interno | 4 ejecuciones técnicas | Incompleto | Endpoint cerrado por defecto; en producción responde 503. |
| Reservas | Solo demo legado | No | No | Inexistente real | No hay tabla ni flujo productivo. |
| Pasajeros | Solo cantidad | No | Parcial | Inexistente como módulo | No hay acompañantes, pasaporte ni expediente. |
| Pagos | Aviso de depósito | Campos en oportunidad | Parcial | No es contabilidad | No hay transacciones, cuotas ni conciliación. |
| Documentos / transporte | Tareas o texto | No dedicado | No | Inexistente real | Transporte se sigue con tareas; documentos sensibles no se gestionan. |
/stock | Prototipo separado | No CRM | Mock | Fuera del producto | 404 en producción y aislado de la sesión CRM. |
C. Bugs, riesgos y funcionalidades falsamente terminadas
| ID | Severidad | Módulo | Problema | Evidencia | Impacto / solución |
|---|---|---|---|---|---|
| AUD-001 | ALTA | Deploy / DB | CONFIRMADO: 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-002 | ALTA | Operación | PROBABLE: 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-003 | ALTA | Dependencias | CONFIRMADO: 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-004 | MEDIA | Auth | CONFIRMADO: protección contra contraseñas filtradas desactivada. | Supabase Security Advisor. | Activarla antes de incorporar más usuarios. |
| AUD-005 | ALTA | Leads | CONFIRMADO: 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-006 | ALTA | Seguimiento | CONFIRMADO: 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-007 | MEDIA | Analíticos | CONFIRMADO: 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-008 | MEDIA | Documentación | CONFIRMADO: 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-009 | MEDIA | Datos | PROBABLE: 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-010 | MEDIA | Barcos | CONFIRMADO: 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-011 | MEDIA | Performance | CONFIRMADO: 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-012 | MEDIA | Usuarios | CONFIRMADO: 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-013 | MEDIA | Producción | CONFIRMADO: 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-014 | BAJA | Calidad | CONFIRMADO: 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
Contactos activos
| Campo | Total | Con dato | Vacío | Cobertura | Lectura |
|---|---|---|---|---|---|
| Email o teléfono | 842 | 546 | 296 | 64,8% | Parcial 35,2% no contactable. |
| 842 | 291 | 551 | 34,6% | Baja para automatización por correo. | |
| Teléfono | 842 | 545 | 297 | 64,7% | Mejor canal disponible. |
| Nacionalidad | 842 | 833 | 9 | 98,9% | Alta cobertura, pero etiquetas inconsistentes. |
| Canal de adquisición | 842 | 701 | 141 | 83,3% | Útil a nivel general. |
| Idioma preferido | 842 | 1 | 841 | 0,1% | No confiable |
| Género | 842 | 1 | 841 | 0,1% | No confiable |
| Edad | 842 | 0 | 842 | 0% | No disponible |
Oportunidades
| Campo | Total | Con dato | Cobertura | Conclusión |
|---|---|---|---|---|
| Responsable | 832 | 832 | 100% | Confiable. |
| Canal | 832 | 696 | 83,7% | Útil para vista general. |
| Pasajeros | 832 | 242 | 29,1% | Insuficiente para demanda. |
| Fechas deseadas | 832 | 85 | 10,2% | Insuficiente para planificar disponibilidad. |
| Primera respuesta | 832 | 0 | 0% | No se puede medir velocidad. |
| Último contacto | 832 | 1 | 0,1% | No se puede medir abandono. |
| UTM | 832 | 0 | 0% | No permite atribución de campaña. |
| Estrategia de venta | 832 | 0 | 0% | No permite medir qué estrategia funciona. |
| Destino | 832 | 0 | 0% | No permite analizar demanda por destino. |
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_atyarchived_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
SECURITY DEFINER no son ejecutables por anon ni authenticated; y no hay DELETE web sobre contactos ni perfiles.| Nivel | Hallazgo | Estado | Acción |
|---|---|---|---|
| ALTO | 6 vulnerabilidades altas en dependencias | Confirmado | Actualización controlada de Next/PostCSS/Sharp y transitivas. |
| MEDIO | Protección de contraseñas filtradas desactivada | Confirmado | Activar en Supabase Auth. |
| MEDIO | Deriva entre esquema remoto y main | Confirmado | Reconciliar Calendar y asegurar migraciones reproducibles. |
| BAJO | Bucket boat-photos público | Intencional | Correcto para fotos comerciales; no usar para documentos sensibles. |
| BAJO | Dos policies permisivas SELECT de perfiles para admin | Advisor | Revisar 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_cronypg_netno están instalados; la automatización depende de un llamador externo.- No se encontraron secretos reales trackeados.
.env.examplecontiene 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.
/stockaislado 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
| KPI | Confianza | Motivo |
|---|---|---|
| Ventas ganadas, volumen y comisión | Confiable | 97 ganadas; 96 con monto final y 97 con comisión/fecha de venta. |
| Pérdidas y motivo | Confiable | 735 perdidas con motivos codificados. |
| Canal general | Parcial | 83% de cobertura; sirve para tendencia, no para atribución exacta. |
| Leads nuevos por fecha de contacto | No confiable hoy | La importación masiva alteró created_at. |
| Conversión por campaña/anuncio | No confiable | UTM y click IDs vacíos. |
| Tiempo de primera respuesta | No disponible | 0 oportunidades con first_response_at. |
| Embudo histórico y tiempo por etapa | Parcial | El historial anterior fue backfill de un evento por oportunidad. |
| País / nacionalidad | Parcial | Cobertura excelente, normalización irregular y concepto “nacionalidad” no siempre equivale a país de residencia. |
| Edad y género | No disponible | 0% y 0,1% de cobertura. |
| Rendimiento por estrategia de venta | No disponible | Campo sin datos. |
I. Deuda técnica y documentación
- Alta: migración de disponibilidad aplicada fuera de
main. - Alta: dependencias con vulnerabilidades conocidas.
- Media: README describe el prototipo y un proceso de Supabase que ya no corresponde.
- Media: demo legado conserva mocks,
anyy una advertencia de lint; está aislado, pero confunde búsquedas. - Media: 27 FK sin índice y 38 índices reportados como no utilizados. Medir antes de actuar.
- Baja: avisos de Node por ausencia de
type: moduleen package.json.
Estado de la documentación
| Fuente | Clasificación | Comentario |
|---|---|---|
| docs/37, 38, 45, 49 y arquitectura por capas | Vigente | Coincide ampliamente con el código. |
| docs/75, 76, 78, 82–86 | Parcialmente vigente | Buen contexto, algunos estados ya cambiaron. |
| docs/87-estado-calendar-disponibilidad.html | Desactualizado | Indica migración pendiente, pero ya está aplicada en Supabase. |
| CLAUDE.md | Parcialmente desactualizado | Arquitectura correcta; cifras de migraciones/tests y Calendar quedaron atrás. |
| README.md | Obsoleto | Documenta 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
- Revalidar el guardado con Carlota en producción.
Impacto alto · esfuerzo bajo · riesgo bajo · depende de acceso Vendedor. - Reconciliar Calendar entre Supabase, rama feature y main.
Impacto alto · esfuerzo medio · riesgo medio · depende del piloto. - Actualizar dependencias vulnerables y activar protección de contraseñas.
Impacto alto · esfuerzo medio · riesgo medio · requiere regresión completa. - Conectar un solo Calendar real y validar libre/ocupado/timezone/privacidad.
Impacto alto · esfuerzo medio · riesgo bajo · depende del Calendar ID piloto. - Crear entrada segura desde el formulario web.
Impacto muy alto · esfuerzo medio · riesgo medio · requiere contrato e idempotencia. - Establecer la próxima acción como hábito medible.
Impacto alto · esfuerzo bajo · riesgo bajo · depende del proceso del equipo. - Revisar duplicados y normalizar nacionalidades sin borrar automáticamente.
Impacto medio · esfuerzo medio · riesgo medio · requiere validación humana. - Empezar a registrar actividades y primera respuesta.
Impacto alto · esfuerzo medio · riesgo bajo · puede acompañar el formulario web. - Agregar smoke E2E productivo sin secretos en Git.
Impacto alto · esfuerzo medio · riesgo bajo · requiere usuario de prueba autorizado. - 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
| Control | Resultado | Detalle |
|---|---|---|
| Instalación limpia | OK | npm ci, 486 paquetes. |
| Pruebas | OK | 790 aprobadas, 0 fallidas. |
| Lint | OK | Código 0; 1 advertencia en demo legado. |
| TypeScript | OK | tsc --noEmit sin errores. |
| Build | OK | Next.js 16.2.10; 23 rutas compiladas; Proxy reconocido. |
| Producción /login | HTTP 200 | Dominio responde. |
| Producción /api/internal/automations | HTTP 503 | Cerrado por falta de configuración o decisión. |
| Git | Limpio salvo informe previo | main 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?
¿Está terminada la etapa actual?
¿Hay que reconstruir partes importantes?
Las 3 prioridades absolutas ahora son
- Validar producción con Carlota y cerrar cualquier fallo real de guardado.
- Reconciliar Calendar y ejecutar un piloto con un solo barco antes de integrar toda la flota.
- Automatizar la entrada del formulario web y convertir cada lead en seguimiento con responsable y próxima acción.
Próximo milestone recomendado
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.