Base de Conocimiento — LPDI Relacionamiento
Base de conocimiento del proyecto (notas activas del sistema SGR). Documento vivo.
title: Instrucciones activas de Frank
tags:
- lpdi
- instrucciones
- frank
- activas
status: active
permalink: main/convergence-hub/agents-pmo/lpdi-relacionamiento/instrucciones-activas
Instrucciones activas de Frank
Este archivo se actualiza automáticamente.
Cada instrucción detectada en Slack se appenda aquí.
El bot DEBE leer este archivo al inicio de cada sesión.
Log de instrucciones
- [2026-05-25 15:28] change | <@U0AL201N7UY> necesitamos ahora revisar la configuración de los correos que se le envían a los usuarios (confirmaciones, notificaciones, códigos, cambios de contraseña, etc.) podría decirme: 1. Cuál- [2026-05-25 17:06] persist | Respecto a 3. Invitación (contacto ICG) — "You have been invited" → Este es el correo de creación de contacto del ICG que mencionas. Se dispara cuando un ICG registra un contacto nuevo. Está c
- [2026-05-25 17:20] persist | Pregunta: El contacto recibe el template que dice "Restablece tu contraseña". ¿Quieres que cree un template específico con copy más apropiado tipo *"Se ha creado una cuenta para ti en el Ecosistem
- [2026-05-25 22:17] change | Las palabras Inversionistas, Corporativos y Gestores con mayúscula inicial. Tambíen cambiar gestores por "Gestores del ecosistema"
- [2026-05-25 22:24] change | Por otro lado en el sistema pedimos aceptar Términos y condiciones y el tratamiento de datos personales pero no teníamos los enlaces para consulta. Ya están listos. Por favor:
-
Haga un inventario d
- [2026-05-25 22:26] change | Yo creo que sí me puede mostrar cómo quedó el diseño de este correo con los cambios que pedí: Las palabras Inversionistas, Corporativos y Gestores con mayúscula inicial. También cambiar gestores por "
- [2026-05-26 00:36] persist | En el panel 3 del FS se pide el correo del CEO, aquí, si este es un correo distinto al registrado en el panel 1, deberíamos crear también un usuario para este nuevo correo y el flujo debería ser pare
- [2026-05-26 19:00] ui_text | Respecto a este análisis que esta pendiente de decisión: LAP-324 https://playgrounds.digitalhubassist.ai/pmo/reporte-2026-05-25-1940.html -
El CEO debe aceptar expresamente los TyC y el tratamient
- [2026-05-26 20:46] persist | 1. FD-only (registrar startup nueva desde dashboard): hoy NO se crea usuario para el CEO en este path — los datos quedan solo como texto en la tablastartups. Si querés que también se cree el user
- [2026-05-26 23:09] persist | Ahora revisemos la situación de los miembros de la startup cuando se registran en la pregunta "Fundadores y equipo directivo" del panel 6 de FD.
El manual en esta parte dice:
_Observación 9: Se d
- [2026-05-26 23:18] persist | Ahora revisemos la situación de los miembros de la startup cuando se registran en la pregunta "Fundadores y equipo directivo" del panel 6 de FD.
El manual en esta parte dice:
- [2026-05-27 18:27] change | Notas/preguntas antes de arrancar:
-
Cuando el CEO modifica un email ya enviado (cambia juan@x a juan@y): trato el nuevo como invitación nueva y dejo el anterior como
rejectedautomático? ¿O p
- [2026-05-28 15:46] change | COMENTARIOS: -
1 Contact Welcome — ICG asigna contacto. La frase "Como CEO...." no es correcta, esta persona es solo el contacto del ICG, no se le generan privilegios de edición y lo que se busca c
- [2026-05-28 16:08] persist | ¿Querés que creemos un correo #15 — ICG Welcome que le llegue directamente al ICG al registrarse? Sería análogo al #2 pero con copy adaptado al perfil ICG (Inversionista, Corporativo, Gestor, etc.
- [2026-05-28 17:13] persist | Imagen 01 → Correo #1 Contact Welcome, variante donde el ICG registrado tiene rol CEO. Va al contacto que ese CEO designó al registrar el ICG. El contacto recibe credenciales temporales y un m
- [2026-05-28 21:13] change | QA LAP-329 + LAP-331:
-
MAIL: 2 CEO WELCOME - usuario YA EXISTE: Cambiar "Tenés" por "Tienes"
-
MAIL: 3 Contact Welcome ICG - usuario NUEVO: a) el mensaje es algo confuso debería ser "[Nombre ICG]
- [2026-05-28 23:39] change | 1. Cuando se elimina una entidad manualmente, ¿el correo va solo al usuario que la eliminó, o también a founders/contactos asociados? a todos los usuarios asociados a esa entidad sea Startup o ICG
- [2026-05-29 00:43] ui_text | 1. Entidad eliminada: Cambiar "..., comunícate con el administrador del ecosistema" por ", restaura el registro aquí" y el botón debe ser "Restaurar" y envía al usuario directamente a la opción de res
- [2026-05-29 17:43] ui_order | La numeración de las imágenes no guarda relación con el ID de los correos del reporte https://playgrounds.digitalhubassist.ai/pmo/inventario-correos-lpdi.html. Por favor sea organizado y numere y no
- [2026-05-29 20:35] rule | Comentarios: -
Hay varios correos que dicen "Si tienes dudas, responde este correo y te ayudamos" pero la verdad es que este correo es sólo para envío de mensajes. En ese caso sugiero reemplazar por
- [2026-05-30 13:58] change | 1. HAY VARIAS COSAS DE MI SOLICITUD QUE NO VEO RESPONDIDAS. ADEMAS QUE EL REPORTE SI BIEN INCLUYE IMAGENES, ELIMINÓ Condicionales y observaciones -
Validación de si el CTA obliga a aceptar TyC y Trat
- [2026-05-30 13:59] rule | ESTE FUE MI REQUERIMIENTO Y PREGUNTAS QUE PLANTEÉ: -
Hay varios correos que dicen "Si tienes dudas, responde este correo y te ayudamos" pero la verdad es que este correo es sólo para envío de mensaj
- [2026-05-30 17:04] persist | 3. H4: Sí, documentar como template de reserva. No eliminar el template. -
Correos faltantes identificados (C14). SI PROCEDER CON EL DISEÑO DE ESTOS CORREOS:
• Reminder de invitación de equipo: Usar
- [2026-05-30 19:44] persist | LAP-324 EN ESA TABLA SE REGISTRAN TODAS LAS ACEPTACIONES SIN EXCEPCIÓN ALGUNA PARA TODOS LOS USUARIOS DEL SISTEMA LPDI, AHORA Y EN ADELANTE COMO UN AREGLA DEL SISTEMA LPDI?
- [2026-05-30 20:16] persist | 1. ARRANQUE CON LAP-329 Y TENGA EN CUENTA MIS ÚLTIMAS SOLICITUDES Y DECISIONES, VER IMAGEN - PROCEDA CON LOS 8 AJUSTES QUE ESTÁN PENDIENTE (C5, C6, C7, C8, C9, C10, H1 Y H2) .
- H4: Sí, documentar
- [2026-05-30 20:25] persist | H4 (template de reserva): No hay concepto de "template de reserva" en el código actual. ¿A qué template te referís, Frank? ¿Es el template H3 que se decidió no tocar? H4 EN SU MISMO REPORTE: <http
- [2026-05-30 20:50] change | En el informe no se incluye el asunto que llevará cada correo
- [2026-05-30 20:52] persist | Y LE DIJE HASTA EL CANSANCIO QUE LOS ICG NO REGISTRAN CEO, QUE PUTAS NO ENTIENDE? EMAIL-005ICG — Bienvenida CEO (usuario nuevo)
- [2026-06-01 16:05] change | Ajuste:
• EMAIL-010Invitacion equipo — usuario nuevo, con TyC pendientes. Trigger CEO agrega un miembro al equipo desde Panel 6. Miembro NO tenia cuenta y necesita aceptar TyC. y DestinatarioEmail
- [2026-06-01 16:06] change | Ajuste:
• EMAIL-011Invitacion equipo — usuario nuevo, sin TyC. Trigger CEO agrega miembro desde Panel 6. Miembro NO tenia cuenta pero NO necesita TyC.. No es preciso, cualquier miembro con privile
- [2026-06-02 03:27] change | AJUSTES A LOS CORREOS:
• 07 USUARIO/USER/EXIST/NO-ED/Notificación Correo Cambiado/NO-TYC/SUPA DICE: "Si no realizaste este cambio, contacta al equipo de soporte de inmediato", el copy debería ser "S
- [2026-06-02 11:37] change | LAP-329
AJUSTES A LOS CORREOS:
• 07 USUARIO/USER/EXIST/NO-ED/Notificación Correo Cambiado/NO-TYC/SUPA DICE: "Si no realizaste este cambio, contacta al equipo de soporte de inmediato", el copy debe
- [2026-06-03 00:35] ui_text | AJUSTE CORREO:
- STARTUP/TEAM/EXIST/NO-ED/Bienvenida sin Edición/NO-TYC/LPDI
El CTA debe ser "Ir al dashboard" porque aquí solo se le está confirmando su registro como miembro del equipo de la sta
- [2026-06-03 00:43] ui_text | AJUSTE CORREO:
- STARTUP/USER/EXIST/NO-ED/Eliminación de Entidad/NO-TYC/LPDI
Destinatario: debe ser "Los miembros asociados a la entidad (CEO, equipo, contacto) CON PERMISO DE EDICIÓN."
LÓGICA: U
- [2026-06-03 01:14] ui_text | 1. Esas cuatro variantes están mal, porque un usuario existente debe tener sí o sí TYC aceptados previamente. La variables son: 1. usuario nuevo/existente 2. Usario tiene permiso de edición Sí/No. Y e
- [2026-06-03 01:57] ui_text | Ajuste
Correo 18 STARTUP/TEAM/NUEVO/NO-ED/Invitación al Equipo/SI-TYC/LPDI · STARTUP/TEAM/EXIST/NO-ED/Invitación al Equipo/NO-TYC/LPDI
Asunto: No debe ser “{CEO} te ha incluido en el equipo de
- [2026-06-03 02:09] rule | No entendí la nota técnica. No se supone que como hay un sistema de usuarios, se extrae el nombre del perfil del usuario que registra la startup? O ese dato no siempre se tiene al principio sobre todo
- [2026-06-03 21:40] persist* | DOS TEMAS:
- En https://playgrounds.digitalhubassist.ai/pmo/informe-emails-lpdi-completo.html?v=6&t=1780521416 no se ve la imagen del correo Reporte Diario Ecosistema LPDI
2. Recibí el cor
- [2026-06-03 22:04] persist | En acumulado total separemos dos secciones una de entidades y otra de usuarios, y en usuarios por un lado Usuarios individuales y luego "Total usuarios registrados" quite "(correos)". Y este último da
- [2026-06-05 21:41] ui_order | Es un rol llamado "Micro VC" dentro de la categoría "Inversionista Institucional", en el orden en el listado, estaría entre "Venture Capital Fund – VC" y " Corporate Venture Capital Fund – CVC". Est
- [2026-06-05 21:46] change | ¿Querés que lo ejecute ahora? Solo necesito confirmar: ¿el value/código en la DB sería'Micro VC'tal cual? Sí, ejecute. El nombre dejémoslo mejor'Micro Venture Capital - Micro VC'para mayor clar
- [2026-06-06 17:24] persist | Me gustaría que diseñemos una opción para que los usuarios (registrados o no) puedan reportarnos problemas de la plataforma y sugerirnos mejoras, funcionalidades. etc. Qué propone? Pensaría en una opc
- [2026-06-06 20:55] change* | 1. Por qué la línea gráfica es completamente diferente a la usada en el Sistema? - Cambiemos el nombre del botón "Ideas y mejoras" por "Ayúdanos a mejorar", Internamente deja el formulario con el tí
- [2026-06-06 21:46] change | 1. En el pop-up que se abre en Dashboard cambiar el título "Ayúdanos a mejorar" por el mismo encabezado del formulario sin login (ícono - Ideas y mejoras - Ayúdanos a construir un mejor ecosistema.
- [2026-06-08 17:27] persist* | Decisiones que necesito de tu parte antes de arrancar: - Google Maps API— ¿lo aprobamos para ubicación de eventos o usamos alternativa gratuita para el MVP? No entendí la pregunta
- Proveedor de
- [2026-06-08 19:01] persist | 1. Ubicación con Google Maps*— ¿tenés API key de Google Places para autocompletado? Si no, el campo de ubicación será texto libre. Ya no hablamos de esto? -
Zonas horarias— ¿lista completa IANA o
- [2026-06-09 14:28] ui_text | Ahora sí comentarios al formulario de eventos (en adelante: FE) -
No veo la funcionalidad de validación de existencia del usuario en SI y creación de contraseña si no existe el usuario
- Eliminar d
- [2026-06-09 17:39] ui_text | Ajustes:
General
1. La creación de usuario, crea un perfil de usuario en el Sistema LPDI? Y eso se valida correctamente?
2. Dónde está la aceptación de TYC y Datos? Eso no es negociable cuando se cre
- [2026-06-09 22:16] ui_text | Opción B — Código autogenerado: Debe ser la opción B, pero no tenemos un sistema de nomenclatura y si es valioso tener una. Yo creo que debe arrancar con el código país del evento (si es online no
- [2026-06-10 13:36] persist | Tengo una duda, Google cobra por qué ? cada inicio de sesión en el sistema? No creería. No cobra por cada vez que alguien hace uso de la funcionalidad de ubicación, que en este caso sería para registr
- [2026-06-10 19:46] ui_text | Ajustes al FE:
Panel 1
1. Aceptación de TYC y Datos. Para usuarios nuevos, FE valida efectivamente que se deben aceptar los datos para continuar. Por diseño en el Sistema LPDI, todas las preguntas
- [2026-06-10 21:18] change | Respecto Google Places API (Autocomplete)
Aquí tengo mi reflexión:
-
Esta decisión va a afectar a todo el Sistema LPDI, no solo a FE, porque hay varios formularios y lugares del Sistema donde se p
- [2026-06-10 21:45] change | Más ajustes al FE: -
Movamos el campo “Link al evento” del panel 4 al panel 2. Ahora es un campo no obligatorio que se activa para eventos Online, híbridos y duales. Para eventos híbridos y duales d
- [2026-06-11 21:05] persist | 1. Nombre de la empresa responsable del registro : Es posible que el sistema identifique las entidades (Startups, PyMEs, ICG) que ya están registradas en el sistema y a medida que se va escribie
- [2026-06-11 21:15] ui_text* | Le voy a relacionar los ajustes que ya están validados y que se deben cerrar como done en Linear, los demás que no estén en esta lista siguen pendientes (total o parcial)
Panel 1
• Aceptación de TY
- [2026-06-11 21:16] change | Corrijo tareas done en panel 4:
Panel 4
• Costo de inscripción: Opción “Sí”, cambiar “(tiene costo)” por “-Tiene costo-”
• No se ve el campo código del evento (el que genera automáticamente) o eso
- [2026-06-11 21:18] persist | Corrijo: Tareas AUN PENDIENTES en panel 3
• Temática central del evento: El mensaje al elegir sectorial debe ser: “_La temática “Sectorial” hace referencia a eventos enfocados en un sector especí
- [2026-06-11 21:30] change | Para organizar el listado de pendientes, le anexo, lo que aún no veo en el FE o no he revisado si ya está:
Panel 1
· Nombre de la empresa responsable del registro : Es posible que el sistema
- [2026-06-11 21:59] change | ¿Te parece bien o prefieres cambiar el estándar? cambiemos al código telefónico, en el caso de países con dos digitos, se agrega un cero antes para garantizar los tres dígitos. Ej: 057 Colombia
- [2026-06-11 23:49] change* | Revise estos pendientes:
Panel 1
· Nombre de la empresa responsable del registro : Es posible que el sistema identifique las entidades (Startups, PyMEs, ICG) que ya están registradas en el si
- [2026-06-12 13:36] persist | LAP-367, yo estoy pudiendo enviar el formulario. Los datos están quedando registrados?
- [2026-06-12 19:35] change* | <@U0AL201N7UY> Estos ajustes siguen pendientes. Qué pasa? Por que no los resuelve?
Panel 1
· Nombre de la empresa responsable del registro : Es posible que el sistema identifique las entidade
- [2026-06-12 22:53] change* | Aquí va todo, incluyendo lo que usted referenció. Tome como base mi reporte:
PANEL 1
• Nombre de la empresa responsable del registro : Es posible que el sistema identifique las entidades (Startups,
- [2026-06-12 23:11] persist* | Respuesta a sus preguntas:
• ¿Apruebas la solución del ítem 3 (prefill editable + selector si hay varias entidades)? Es una muy buena pregunta. Esta pregunta es heredada de un sistema previo que no
- [2026-06-12 23:11] persist | Respuesta a sus preguntas:
• ¿Apruebas la solución del ítem 3 (prefill editable + selector si hay varias entidades)? Es una muy buena pregunta. Esta pregunta es heredada de un sistema previo que no
- [2026-06-13 13:23] change | Respecto a los dos últimos comentarios de su última respuesta. Debo decir que usted no está tomando en cuenta decisiones que ya habíamos tomado.
- Respecto a la empresa responsable del registro. Que
- [2026-06-13 17:57] persist | Mis comentarios al Panel 1:
Teníamos esta discusión:
¿Apruebas la solución del ítem 3 (prefill editable + selector si hay varias entidades)? Es una muy buena pregunta. Esta pregunta es heredada de
- [2026-06-13 18:08] persist | Respecto a este ajuste:
• Si en FE público estoy en una sesión activa pero quiero registrar mi evento con otro correo, no es fácil hacerlo, sugiero que si ya estoy loggeado, haya la opción de cerrar
- [2026-06-13 19:26] rule | Arranque 387 y 388 porque a este paso nunca vamos a acabar con el panel 1
- [2026-06-13 20:02] rule | Pero antes el QA no se tardaba tanto, no estoy pidiendo sacrificar la seguridad, sino quiero entender por qué ahora los QA están tan demorados, se rompen o no se hacen, incluso pasa que no se hacen, p
- [2026-06-14 14:16] persist | 1. Cerrar LAP-393, 387, 240 (LAP EN BACKLOG DESDE HACE TIEMPO, CUANDO SE ABORDE ESE MODULO SE ABRE UN LAP NUEVO)
2. LAP-388. Ver imagen. Se hizo login en el FE público pero el botón "Usar otro correo
- [2026-06-14 14:52] persist | Fix Importante: En el perfil del usuario detallado https://eco.lpdi.co/dashboard/perfil-usuario hay errores:
-
En los cálculos de los porcentajes de avance. Subí una foto de perfil y no la guardó,
- [2026-06-14 15:03] ui_order | Mientras tanto te confirmo que entendí los 4 puntos, para que validemos que el alcance está completo: -
Foto de perfil — no guarda al primer intento (funciona tras varios) y, aunque guarde, el %
- [2026-06-14 17:32] persist | Si el paso 3 estaba completado, por qué no se actualizó el reporte de seguimiento. Si ya está en la fase 4 por qué no se evidencia. Eso confunde
[:white_check_mark:] 1. Localizar en el intake dónde
- [2026-06-14 23:50] ui_order | Siento que usted es un completo caos. Ya habíamos definido el orden de intervención y ahora me dice que está bloqueado porque yo no le digo en qué orden hacerlo.
Por qué es tan desordenado y se olvi
- [2026-06-15 00:22] ui_order | No quiero volver a ver este mensaje: "Procesamiento extenso — el PMO retomará tu mensaje en breve". En vez de eso quiero ver un resumen ejecutivo en tres segmentos:
- La cola de tareas que está d
- [2026-06-15 00:29] rule | Con esto: arranco la cola del segmento 1 en ese orden (395 → 394 a QA, luego cierro los frentes de Panel 1). Si quieres mover una prioridad, me lo dices y reordeno sin perder el resto. ¿Confirmas el m
- [2026-06-15 01:32] ui_order* | ¿Le doy verde a LAP-388 ahora? Sí, ya dijimos que si no tiene preguntas de fondo sobre el LAP no me esté preguntando cada paso que hace, sobre todo si ya sabe el orden de prioridades
Donde está mi re
- [2026-06-15 15:04] persist | Le asigno tareas para corregir bugs y mejoras del perfil de usuario detallado PUD la que se accede desde el dashboard: https://eco.lpdi.co/dashboard/perfil-usuario. Cree un lap para cada tarea, no
title: Compliance y sesión LPDI — audit log, versionado legal, inactividad
type: report
permalink: main/convergence-hub/agents-pmo/lpdi-relacionamiento/compliance-y-sesion-lpdi-audit-log-versionado-legal-inactividad
tags:
- lpdi
- compliance
- auditoria
- tyc
- pdp
- sesion
Contexto
Batch de Frank del 2026-07-06 (canal C0AK3HB65NZ). GO explícito a: regla de versionado TYC/PDP (3a), re-aceptación tácita (3b), controles de sesión (4) y bitácora unificada de acciones (5). Todo construido y desplegado a main (eco.lpdi.co).
Item 5 — Bitácora central de acciones (commit 8d61a46)
- Migración
100_action_audit_log.sql: tablaaction_audit_logappend-only (RLS: service inserta, user lee lo propio). 16action_type(team_invitation_accepted/rejected, ceo_accepted, icg_contact_accepted, transfer_, account_deletion_, entity_deleted/restored, consent_accepted, consent_reaccepted_tacit). - Helper
src/lib/server/audit.ts→logAction(event|null, entry)fire-and-forget (IP+UA, patrón de consent.ts). - Enganchado en: team.ts confirmInvitation/rejectInvitation, entity-transfer create/[action], transferencia/[token] accept/reject/createAndAccept, account/delete, entities/delete, entities/restore.
- Gap tapado:
transferencia createAndAcceptno registraba consent TYC/PDP; ahora sí.
Items 3a+3b — Versionado legal + re-aceptación tácita (commit 7eacefb)
- Migración
101_legal_documents_versioning.sql: tablalegal_documents(una fila por versión, índice único parcialis_currentpor doc_type), semilla v1.0 de terms+privacy. RPCs: publish_legal_version(...): publica versión nueva, desactiva la anterior atómico.record_tacit_reacceptance(doc_type,version): inserta consent tácito append-only fechado a la vigencia, idempotente. Probado ROLLBACK: publica → 55 tácitos → 2a corrida = 0.src/lib/server/legal.ts: getCurrentLegalVersion/Versions/Document +assertLegalVersionLoaded(guard REGLA: no anunciar cambio sin versión cargada).consent.ts: la versión deja de ser '1.0' fijo, lee la vigente.- Endpoint
src/routes/api/admin/legal/publish(gateadois_super_admin): GET historial, POST carga versión + tácita opcional. - PENDIENTE: el correo de anuncio de cambio TYC/PDP no existe aún; el guard está listo para cuando se construya. Pregunté a Frank si quiere pantalla de admin para cargar versiones o pasármelas él.
Item 4 — Sesión (commit 0a2658c)
hooks.server.ts: inactividad 30 días a nivel app (cookielpdi_last_activity, sin llamada de red, NO toca Auth compartido con SGC). >30d → signOut +/login?motivo=inactividad./api/account/logout-all:signOut({scope:'global'})revoca todos los refresh tokens.- Sidebar: botón «Cerrar sesión en todos los dispositivos» con confirmación.
- Login: aviso amigable por inactividad.
Relaciones
- [[transferencia-entidades-decisiones]]
- consent_log (migración 040) es la base append-only reutilizada para tácitos.
- Instancia Supabase compartida con SGC → por eso inactividad es app-level, no config de Auth.
Documentos legales ingeridos (2026-07-06, commit 102)
Frank pasó 11 PDFs oficiales por Slack. Guardados en bucket público legal-documents (Supabase Storage) y registrados en legal_documents:
- TYC: v1.0 (25-may histórico) + v2.0 (02-jul VIGENTE)
- PDP: v1.0 (25-may histórico) + v2.0 (02-jul VIGENTE)
- 6 anexos de la PDP: todos v1.0 (25-may, vigentes). doc_type='privacy', category='annex', slug='anexo-1'..'anexo-6'.
- Re-aceptación tácita ejecutada (committed): terms 2.0 y privacy 2.0, 55 usuarios c/u, fechada 2026-07-02. Idempotente.
Acciones adicionales (item 5b Frank)
account_recoveredañadido en cuenta-eliminada recover.transfer_expiredañadido en ~/bin/lpdi-entity-transfer-cron.py (backup .bak).- REGLA en DESIGN.md §17: toda acción sensible nueva DEBE usar logAction. Agregar action_type al CHECK de la tabla + a AuditAction en audit.ts.
Preguntas abiertas a Frank
- ¿Pantalla de admin para cargar versiones legales o se las paso yo? (endpoint /api/admin/legal/publish ya soporta ambos)
- ¿Correo de anuncio de cambio TYC/PDP? No existe aún; guard assertLegalVersionLoaded listo.
- ¿Tablero web para consultar bitácora + historial de versiones? (ofrecido, pendiente decisión)
Pantallas de administrador (super_admin) — commits 2638928, e4c201e
/dashboard/admin/legal: gestión de documentos legales. Versiones vigentes + formulario de carga (sube PDF a Storage server-side, soporta anexos) + historial. Endpoint publish acepta multipart/form-data. Verificado E2E Playwright (login super_admin temporal en cuenta e2e-test, publicó, limpiado)./dashboard/admin/auditoria: tablero de la bitácora action_audit_log. Nombre de persona resuelto, etiquetas ES, filtros (acción/entidad/fechas/búsqueda), export CSV. Verificado E2E.- Ambos links en sidebar bajo Administración › Sistema (gate isEventSuperAdmin ≡ is_super_admin, único: Frank user 2b2ef928).
Método de test E2E autenticado (reutilizable)
Otorgar super_admin temporal a e2e-test (1d5e1aa2), password TestRepro#2026xy, dev server :5199, Playwright con /usr/bin/google-chrome. SIEMPRE limpiar después: borrar filas de prueba + revocar admin_roles. Cuidado: kill $(pgrep vite) mata la shell (mismo process group) → usar variable intermedia.
4 flujos confirmados operativos a Frank (2026-07-06)
Auditados por código: (1) confirmación de cuentas (registro-usuario→/auth/confirmar, registro-startup→/auth/confirmar-startup, team→confirmInvitation) — el comentario "no lo dispara ningún flujo" en /auth/confirmar estaba DESACTUALIZADO; (2) eliminación soft-delete 30d; (3) recuperación cuenta+papelera; (4) transferencias completas+cron. Todos con audit logging.
Tablero de auditoría fusiona consent_log (fix del "0 registros")
Frank vio el tablero vacío. Causa: action_audit_log es nueva (0 filas). Fix: el tablero (/dashboard/admin/auditoria) ahora fusiona action_audit_log + consent_log (135 TYC + 135 PDP) en una vista, con badge doc/versión y canal. Verificado E2E: 270 registros. Commit fix(audit).
Pruebas exhaustivas de los 5 flujos (Frank pidió "sin dudas", TestSprite)
Rechacé TestSprite-contra-prod (destructivo sin PITR). Hice suite segura:
- supabase/tests/flows_full_lifecycle.sql: T1-T8 (eliminar/restaurar startup+ICG, eliminar/recuperar cuenta, transferencia crear+cancelar, anonimización auto-protección) sobre fixtures reales del test account, BEGIN...ROLLBACK. Todas OK.
- entity_transfer_lifecycle.sql: T1/C1/C2/C3 (accept/reject/tick/anonymize). OK.
- Confirmación de cuentas: prueba en vivo (crear sin confirmar → /auth/confirmar → confirmada → limpiado). PASS.
- Total 13 verificaciones OK. Reporte: https://playgrounds.digitalhubassist.ai/pmo/pruebas-flujos-lpdi.html
- Anonimización confirmada en MODO REPORTE (doble llave execute:true + ANONYMIZE_ENABLED, no agendada, auto-protección por-fila con RAISE 'no elegible').
Tablero: completitud de datos (histórico + pendientes) — commit feat(audit)
Frank vio "nadie aceptó CEO/miembro". Realidad: 3 miembros verificados, 0 CEO (12 pending), 9 ICG con contacto. Fusioné más fuentes al tablero:
- startup_founders verified → ceo_accepted/team_invitation_accepted (histórico).
- startup_founders pending → ceo_pending/member_pending (⏳ ámbar). 11 cuentas sin confirmar → account_pending_confirmation.
- Filtro Acción agrupado por categorías (Cuentas/Equipo/Entidades/Transferencias/Legal/Pendientes). Registró cuenta (auth.users.created_at). TYC/PDP ya no es entidad. Ancho panel admin min(1680px,96vw).
Análisis confirmación de cuentas (verificado)
- Cuenta SIN confirmar NO puede loguearse: login → email_not_confirmed (probado en vivo).
- Correo 01 confirma standalone (funciona).
- GAP: ciclo de recordatorios de confirmación (Correo 15 día 3, Correo 16 día 6, inactivar día 8) existe en cron
account-confirmation-lifecyclepero está DORMANT/no agendado → 11 cuentas sin confirmar sin recordatorios. Recomendé activarlo. - Correos 11/12/18 (vía startup) = flujo separado, sin conflicto con Correo 01.
Decisiones pendientes de Roberto (outward-facing, requieren OK explícito)
- Anonimización: activar cron (irreversible, 0 elegibles hoy). Frank dijo OK; falta OK de Roberto.
- Ciclo de recordatorios de confirmación: agendar (envía correos a usuarios reales).
- Correo de anuncio TYC/PDP: construir + cablear (build; envío gated por regla versión-cargada).
title: Opción B — verificación de correo a nivel app (LPDI SGR)
type: note
permalink: lpdi-relacionamiento/opcion-b-verificacion-correo-app-level
tags: [lpdi, auth, supabase, opcion-b, verificacion]
Opción B — verificación de correo a nivel app
Frank (2026-07-06) eligió que una cuenta sin verificar pueda usar el sistema hasta 7 días, luego recordatorios e inactivación día 8.
Limitación clave de Supabase (verificada empíricamente)
Supabase (GoTrue hosted de este proyecto, ref ryrtbemxxviceekvgvlz) NO deja iniciar sesión a un email_confirmed_at = NULL. Los flags mailer_autoconfirm y mailer_allow_unverified_email_sign_ins no lo cambian (probado 3× con >5 min de propagación; el segundo existe en la API pero el GoTrue no lo honra). Por eso "sin confirmar pero con acceso" no es un switch: se hace a nivel app.
Modelo implementado
- Las cuentas se crean con
email_confirm: true(Supabase-confirmadas → pueden entrar de una). - La verificación real vive en
profiles.email_verified_at(NULL = sin verificar). Migración103_email_verification_applevel.sql(backfill: confirmados previos = verificados). - Enlace de verificación = magiclink →
/auth/verificar(+server.ts,verifyOtp type=magiclink→ marcaemail_verified_at). - Los 4 flujos de registro (
/api/auth/register,registro-usuario/startup/icg) creanemail_confirm:true+ enlace magiclink. - La config de Supabase queda en su estado original (ambos flags
false); B no depende de ella.
Operación (Hetzner, DB-direct porque la cuenta Vercel de eco.lpdi.co es inaccesible)
- Script
~/bin/lpdi-confirmation-cron.py(patrón de [[lpdi-entity-transfer-cron]]: psql + Resend HTTP; UAcurl/8.0 lpdi-cronpara evitar Cloudflare 1010). kickoff [--dry]: cuentas pendientes reales →email_confirm:true+ ancla hoy + correo de verificación. Corrido 2026-07-06 para las 7 cuentas reales.reminder(cron diario 10:45): día 3/6 recordatorio, día 8 inactivación, sobreemail_verified_at.
Pendiente menor
Banner in-app "confirma tu correo" del dashboard mira email_confirmed_at (ahora siempre seteado) → no aparece; el nudge lo cubren los correos. Re-cablear a email_verified_at si se quiere in-app.
Commits: fd1eac5 (core B) · 4ee7f29 (ruteo pestaña Registro del login) · e467ee5 (limpieza).