Desglose completo en tareas verificables con criterios de aceptación, dependencias explícitas y checkpoints de fase para un equipo de 2 devs + 1 agente IA auxiliar.
Resumen del proyecto
Un portal web privado para clientes de CULTIVA IA donde pueden acceder a sus skills y recursos comprados, solicitar nuevas automatizaciones mediante formulario guiado, consultar el estado de sus proyectos en un tablero Kanban en tiempo real y descargar los entregables generados por agentes IA. El acceso se gestiona con magic link (Supabase Auth), cada cliente ve únicamente sus datos y el equipo de CULTIVA administra asignaciones desde un panel interno. El MVP debe estar en producción en 3 semanas con un coste de infraestructura < 50 €/mes.
Decisiones de arquitectura
Auth + PostgreSQL + Storage + Realtime en una sola plataforma. Elimina necesidad de servidor propio y encaja en el presupuesto.
Políticas RLS en Supabase garantizan aislamiento de datos por cliente en BD sin lógica extra en la API.
Las Edge Functions enolan jobs en una tabla processing_queue; un worker separado procesa y actualiza estado para evitar timeouts.
Componentes Radix UI pre-estilizados con Tailwind. Velocidad máxima sin necesitar diseño personalizado.
Supabase Realtime solo en la tabla kanban_cards filtrado por proyecto activo, para no saturar conexiones.
Los archivos subidos se almacenan en bucket privado con tokens firmados de vida corta. Sin URLs públicas.
Grafo de dependencias
Fase 1 — Fundamentos (Días 1–4)
Inicializar el repositorio con create-next-app, instalar @supabase/supabase-js,
configurar variables de entorno en Vercel (SUPABASE_URL, SUPABASE_ANON_KEY, SUPABASE_SERVICE_KEY),
y verificar que el primer deploy en preview funciona sin errores.
supabaseClient inicializado y devuelve 200 en health checknpm run build sin errores TypeScript
Crear las tablas profiles, clients, resources,
projects, kanban_cards, briefs y deliverables
en Supabase con sus relaciones FK. Activar RLS y escribir políticas para que cada usuario
solo acceda a filas donde client_id = auth.uid().
supabase/migrations/client_id y project_idsupabase db push sin erroresbriefs solo lectura propia
Implementar páginas de login (/login) y callback (/auth/callback)
usando Supabase Auth. El usuario introduce su email, recibe magic link, hace clic y queda
autenticado con sesión en cookie httpOnly. Layout protegido redirige a /login
si no hay sesión.
sb-access-token httpOnly visiblenpm run build sin errores en rama mainFase 2 — Features principales (Días 5–10)
Crear /dashboard/recursos que lista los recursos asignados al cliente autenticado
(skill name, descripción, fecha de compra, botón de descarga). Datos servidos via Server Component
con consulta Supabase filtrada por RLS.
Implementar /dashboard/proyectos/[id] con columnas Pendiente / En progreso / Revisión / Hecho.
Tarjetas de la tabla kanban_cards suscritas via Realtime filtrado por project_id.
Drag-and-drop con @dnd-kit/core.
Crear wizard de 3 pasos en /dashboard/nueva-solicitud: (1) tipo de automatización,
(2) descripción + adjuntar PDF (brief), (3) confirmación. El PDF se sube a Supabase Storage en bucket
privado. Se inserta una fila en briefs con estado pending.
status: pending y file_pathbriefsapplication/pdf
Edge Function process-brief que: (1) lee el PDF de Storage, (2) extrae texto,
(3) llama a Claude API para estructurar el brief en Markdown, (4) guarda el .md en Storage,
(5) actualiza briefs.status a completed y crea fila en deliverables.
Se dispara via Supabase Database Webhook al insertar en briefs.
status queda en error con mensaje legiblecompletederrorFase 3 — Panel de administración (Días 11–13)
Sección /admin protegida por rol admin (claim personalizado en JWT).
Tabla de clientes con CRUD básico: crear cliente, asignar/desasignar recursos, ver proyectos activos.
Solo accesible para emails en lista de admins de CULTIVA.
updated_by)role: admin presenteFase 4 — Polish y producción (Días 14–15)
Revisar políticas RLS con ojos de seguridad, añadir Content-Security-Policy headers en Next.js, confirmar que no hay URLs de Storage públicas, añadir página de política de privacidad y aviso de cookies mínimo. Validar que briefs PDFs se eliminan de Storage si el cliente borra su cuenta.
Conectar dominio portal.cultivaia.com en Vercel, configurar variables de entorno
de producción (Supabase prod project), activar Vercel Analytics y Sentry para captura de errores.
Smoke test completo en producción antes de dar acceso a clientes.
Oportunidades de paralelización
kanban_cards: definir schema primeroRiesgos y mitigaciones
| Riesgo | Impacto | Probabilidad | Mitigación |
|---|---|---|---|
| Timeout en Edge Functions al procesar PDFs grandes (> 15 pág) | Alto | Media | Arquitectura async con cola en BD; el cliente ve estado "en proceso" en Kanban |
| Datos sensibles en PDFs de clientes (GDPR) | Alto | Alta | Bucket privado + URLs firmadas de vida corta + cascade delete al eliminar cuenta |
| Saturación de Supabase Realtime con muchos proyectos activos | Medio | Baja (MVP) | Suscripción filtrada por project_id; 1 suscripción activa máx por cliente |
| Coste Claude API supera presupuesto en producción | Medio | Baja | Rate limit por cliente (máx. 5 briefs/mes en tier gratuito) |
| RLS mal configurado expone datos de otros clientes | Alto | Baja | Test específico en Checkpoint 1: usuario A no lee filas de usuario B |
Preguntas abiertas (requieren decision humana)
deliverables.
Referencia de tamaños de tarea
| Talla | Archivos | Alcance | Ejemplo en este proyecto |
|---|---|---|---|
| XS | 1 | Función o config aislada | T09 – CSP headers en next.config.ts |
| S | 1–2 | Un componente o endpoint | T01 – Setup repositorio |
| M | 3–5 | Un slice de feature completo | T04 – Catálogo de recursos |
| L | 5–8 | Feature multi-componente | (evitado en este plan) |
| XL | 8+ | Demasiado grande — subdividir | N/A — todas las tareas son M o menores |