RE LPDI — 16-jun-2026 19:50 UTC
Generado por el equipo de agentes PMO | 2026-06-16
# Reporte de Estado — LPDI **Fecha:** 16-jun-2026 14:50 COT (19:50 UTC) **Cliente:** Frank Prieto Pinto · **Canal:** `#todo-swfacrtory-lapuntadeliceberg` **Fuente de verdad:** Linear (team LPDI) + repo `devlapuntadeliceberg/lpdi-relacionamiento`. --- ## ✅ Cerrados en Linear (últimas 24h) | LAP | Título | Commit / Evidencia | |---|---|---| | **LAP-392** | Panel 1 evento — Sesión/perfil | Cerrado con ack de Frank | | **LAP-396** | PUD — Cálculo de % de avance inconsistente | Cerrado con ack de Frank | | **LAP-399** | PUD Panel 3 — % no llega a 100% | Cerrado con ack de Frank | | **LAP-403** | Eliminar duplicación de sigla en selectores de género | `5e4bd5f` | | **LAP-397** | Foto de perfil no se guarda | `08c31be` | | **LAP-401** | Finalizar perfil: redirect a vista de perfil | `6603793` | --- ## ⚙️ Aplicado en producción · esperando validación de Frank ### **LAP-398 — Roles del Panel 2 (PUD)** · `c0503be` (hoy 19:45 UTC) **Segundo síntoma reportado por Frank a las 17:21 UTC** (después del fix de duplicación de chips de ayer): - Chips arriba mostraban roles correctos. - Pero los checkboxes del listado debajo quedaban **desmarcados**. - Al re-clickear, el chip se **duplicaba** en vez de toggle. **Causa raíz:** type mismatch entre `selectedRoleIds: string[]` (que casteaba con `String()` los ids del perfil) y `catalogByCategory[].roles[].id` que se pusheaba con el id crudo de Supabase. La columna `catalogo_rol_ecosistema.id` es **int4** → llegaba como `number` en runtime aunque el tipo TypeScript declarado decía `string`. Resultado: ``` ["8","12","17"].includes(8) → false → checkbox desmarcado toggleRole(8 /* number */) → array contaminado: ["8", 8] → chip duplicado ``` **Fix:** coercionar a `String` al construir `catalogByCategory`, garantizando homogeneidad de tipo en todas las comparaciones (`includes`, `filter`, `toggleRole`). ### **LAP-400 — Regla del % del Panel 4 (PUD)** · `3070c76` **Fórmula vigente:** - Página web válida → **+10** - ≥1 red social → **+15** - LinkedIn URL válida (bonus) → **+3** - Cap del panel: **25** (el bonus no hace overflow). **Combinaciones:** | Estado | Cálculo | Panel 4 | |---|---|---| | Solo web `lpdi.co` | 10 | **10/25** | | Solo LinkedIn válido | 15 + 3 (cap 25) | **18/25** | | Web + 1 red social cualquiera | 10 + 15 = 25 | **25/25** ✓ | | Web + LinkedIn válido | 10 + 15 + 3 → cap 25 | **25/25** | **Frank reportó hoy "no tiene sentido"** mostrando 2 capturas (web sola = 10/25, LinkedIn solo = 18/25). Esos números son matemáticamente correctos según la regla pactada ayer ("web + 1 red = 25/25"). Si la regla esperada cambió, necesito que Frank la confirme: - **Opción A (vigente):** web (10) + ≥1 red (15) = 25/25 → web es OPCIONAL pero suma puntos. - **Opción B:** ≥1 red sola = 25/25; web sin red = 0. Web deja de sumar, solo cuenta cumplir lo OBLIGATORIO. - **Opción C:** que Frank defina. --- ## 🔍 En Review · pendiente validación de 2º síntoma ### **LAP-395 — `/aceptar-terminos`: botón no activa + congelamiento** Estado Linear: **In Review**. - 1º síntoma resuelto en `3954e0e`. - 2º síntoma (congelamiento) — pendiente reproducir con cuenta limpia. --- ## 📋 Backlog priorizable ### **LAP-402 — QR único del usuario** · Backlog Descarga del QR + compartir desde "Mi perfil"; menú lateral con acceso permanente. Propuesta de UX pendiente. ### LAPs 116–263 (RE acumulado anterior) 116-263 cerrados o estabilizados según historial previo. Sin frentes nuevos abiertos hoy. --- ## ❗ Lo que NO está cerrado y debe priorizarse esta semana | LAP | Razón | |---|---| | LAP-398 | Frank valida el fix de hoy. Si OK → close. | | LAP-400 | Frank confirma la regla (A/B/C). Si A → close (ya está). | | LAP-395 | Reproducir 2º síntoma + fix. | | LAP-402 | Propuesta de UX del QR + scope. | --- ## 🧠 Observación honesta (Roberto manejando el canal) - Entre las 23:06 UTC de ayer y las 17:21 UTC de hoy hubo **18h de silencio** sin que el sistema detectara que Frank no había escrito. Es un blind spot: cuando el bot está silenciado por `manual_override`, el canal queda **sin watchdog** que pinche al humano cuando Frank vuelve a escribir. - Acción pendiente (post-respuesta a Frank): codificar un cron `slack_watchdog.py` que cada 5 min chequee `C0AK3HB65NZ` y dispare notificación si Frank tiene un mensaje pendiente sin respuesta > 10 min. — *Reporte generado manualmente · manual_override activo*