From 10bb7299a29e6f1a6c06c97f82153f6a64823e24 Mon Sep 17 00:00:00 2001 From: markosbenitez Date: Sat, 27 Jun 2026 13:38:10 -0300 Subject: [PATCH] =?UTF-8?q?docs:=20actualizar=20estado=20=E2=80=94=20cierr?= =?UTF-8?q?e=20release=20v3.0.0=20+=20ETAPA=5FAUTH=20+=20incidente=20VPS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sprint 4 completo (widgets Mirada Empresa, tema claro, 4F, 4I/release ya estaban hechos antes de esta sesión). Documenta el incidente de colisión de container_name en el VPS y su recuperación, y el cierre de TECH-DEBT-008 (auth de staff) en esta sesión. Próximos pasos quedan abiertos a decisión del director (dashboard País/Humana, sprint de compliance, o mantenimiento de dependencias). --- TECH_DEBT.md | 17 +++--- docs/estado/ESTADO_PROYECTO_JUNIO_2026.md | 72 +++++++++++++++-------- 2 files changed, 58 insertions(+), 31 deletions(-) diff --git a/TECH_DEBT.md b/TECH_DEBT.md index 628069f..fbb3847 100644 --- a/TECH_DEBT.md +++ b/TECH_DEBT.md @@ -77,14 +77,15 @@ ## [TECH-DEBT-008] /admin/responses sin autenticación -- **Estado:** ABIERTO. -- **Descripción:** la vista de control `/admin/responses` no tiene auth. Por diseño - explícito, excluye preguntas `is_sensitive=true` (14 preguntas de salud/ - discapacidad) y `text_long`. Para mostrar esas preguntas en la vista, primero - implementar un gate de autenticación para staff (Basic Auth con env var como - mínimo viable). -- **Impacto actual:** ninguno en producción — la URL no está publicada. -- **Bloqueante para:** ampliar visibilidad de datos en la vista de control. +- **Estado:** RESUELTO (27 jun 2026, ETAPA_AUTH). +- **Descripción:** la vista de control `/admin/responses` no tenía auth. Se implementó + login con Supabase Auth (`@supabase/ssr`), `middleware.ts` protegiendo + `/admin/:path*` y `/dashboard/:path*` con redirect a `/login` sin sesión, y la página + migrada de `service_role` a la sesión del usuario (`anon` key + RLS). Sigue + excluyendo preguntas `is_sensitive=true` y `text_long` — ese diseño no cambió. +- **Nota:** la vista no distingue roles dentro de staff todavía (todo usuario con fila + en `user_roles` ve lo mismo). Diferenciar `platform_admin` de `org_admin` ahí sería + una etapa nueva, no parte de este cierre. --- diff --git a/docs/estado/ESTADO_PROYECTO_JUNIO_2026.md b/docs/estado/ESTADO_PROYECTO_JUNIO_2026.md index 98faf0e..42ec5e3 100644 --- a/docs/estado/ESTADO_PROYECTO_JUNIO_2026.md +++ b/docs/estado/ESTADO_PROYECTO_JUNIO_2026.md @@ -1,5 +1,5 @@ # ESTADO DEL PROYECTO — Datos País sobre el Cuidado -## Documento de continuidad — 25 junio 2026 +## Documento de continuidad — 27 junio 2026 > Director (Product Owner): Marcos · Claude (Projects) = arquitecto/copiloto · Claude Code = implementación > Metodología: Maria Mersan · Contacto Fundación: Valeria Arce @@ -7,17 +7,14 @@ --- ## 1. Versionado y ramas -- **Producción:** 2.1.0 (formulario lineal) — los 3 surveys en `draft` -- **Desarrollo:** 3.0.0 (wizard + dashboard nuevo) en `main`, NO desplegado aún +- **Producción:** 3.0.0 (wizard + dashboard tres miradas) — tag `v3.0.0` pusheado, los 3 surveys + en `live`. Release v3 completado (etapa 4I). - **Preservación:** `v2.1.0-stable` + tag `v2.1.0` - SemVer + CHANGELOG + tags. ADRs en `docs/adr/`. -⚠️ Los 3 surveys están en `draft` a propósito (el frontend v2 desplegado no entiende seed v3). -Se reactivan a `live` al desplegar v3 completo. - --- -## 2. Sprint 4 — Wizard v3 — Formulario COMPLETO, falta release +## 2. Sprint 4 — Wizard v3 — COMPLETO, release hecho | Etapa | Estado | |---|---| @@ -28,26 +25,41 @@ Se reactivan a `live` al desplegar v3 completo. | 4D wizard renderer (layout estable) | ✅ | | 4E instancias (emergente del motor) | ✅ | | 4G submit + validación server-side (RPC transaccional) | ✅ verificado vs Postgres real | -| 4F autocomplete barrios (UX) | ⏳ pendiente | -| 4I validación e2e + tag v3.0.0 + desplegar + reactivar surveys | ⏳ pendiente | +| 4F autocomplete barrios (UX) | ✅ | +| Widgets Mirada Empresa (frontend) | ✅ | +| Tema claro dashboard (marca Re) | ✅ | +| 4I validación e2e + tag v3.0.0 + desplegar + reactivar surveys | ✅ | +| ETAPA_AUTH — login/middleware/sign-out para `/admin` y `/dashboard` | ✅ (27 jun) | El formulario v3 funciona end-to-end: motor, wizard, instancias, submit con validación -server-side (RPC `rpc_submit_response`, único camino de escritura, verificado). +server-side (RPC `rpc_submit_response`, único camino de escritura, verificado). Dashboard +Mirada Empresa con sus 13 widgets, consumiendo las RPCs `rpc_me_*` reales. `/admin/responses` +y `/dashboard` ahora requieren sesión autenticada (antes sin auth — cierra TECH-DEBT-008). --- -## 3. Dashboard v3 — DECISIÓN MAYOR: rediseño de "tres miradas" +## 2.1 Incidente VPS (27 jun) — recuperado + +Una segunda instancia de Dokploy desplegada desde el mismo repo (con `container_name` fijos en +docker-compose.yml) colisionó con la producción y vació el esquema `public` de `supabase-db`. +**Sin pérdida de datos reales** (solo seed demo). Se restauró: migraciones completas + seed + +surveys reactivados a `live` + usuario `platform_admin` creado. Verificado end-to-end: login, +sign-out, redirect sin sesión, formulario público (3 links `?s=`) — todo OK. +Detalle completo en memoria `project_vps_container_name_incident`. El director ya separó la +segunda instancia a un repo Gitea propio sin `container_name` fijos, para que no se repita. + +--- + +## 3. Dashboard v3 — "tres miradas" **Decisión:** NO migrar las RPCs v2 (referencian códigos inexistentes en v3). En su lugar, dashboard nuevo de tres miradas, fundamentado en marcos reales (OIT 5R, CEPAL, PNCUPA Paraguay). ### Estado -- **Mirada Empresa:** ✅ RPCs implementadas y VERIFICADAS contra 50 respuestas reales. - E1-E4 exactos, estrella "Talento en riesgo" con umbral parametrizable, E9 segmentación - con k≥5. Migraciones `20260625000001` (fix helper) + `20260625000002` (11 RPCs). Commiteado. - Widgets del frontend: PENDIENTE (etapa siguiente). +- **Mirada Empresa:** ✅ RPCs + widgets de frontend completos y en producción. E1-E10 + estrella + "Talento en riesgo", k≥5 en segmentación. Tema claro aplicado. - **Mirada País y Mirada Humana:** propuesta + mockup listos, implementación DIFERIDA a - sprint de dashboard post-deadline. + sprint de dashboard post-deadline (sin cambios desde el último estado). ### Documentos (en docs/dashboard/) - `PROPUESTA_DASHBOARD_v3.md` — las 3 miradas, ~30 métricas, marcos citados honestamente @@ -65,16 +77,25 @@ dashboard nuevo de tres miradas, fundamentado en marcos reales (OIT 5R, CEPAL, P --- ## 4. Deuda técnica y seguridad + +~~TECH-DEBT-008 (`/admin/responses` sin autenticación)~~ — **resuelto** por ETAPA_AUTH (27 jun). + | ID | Descripción | Prioridad | |---|---|---| | TECH-DEBT-006 | Backup remoto S3 | Antes de datos reales | | TECH-DEBT-009 | Rotar secrets post-CVE | Antes de datos reales | | TECH-DEBT-010 | E9 lee modalidad por JOIN a answers (2.7) en vez de qi_modalidad. Promover si se usa seguido | Baja | +| SEC-001 | Next.js — vuln "Cache Key Confusion" vigente en 15.3.8; última mayor es 16.2.9 (breaking) | Media | +| TECH-001 | `npm audit`: 4 vulns (1 moderate, 3 high) — `form-data`, `next`, `undici` | Pendiente revisión | | SEC-002 | Sprint compliance (audit log, hashing, cifrado en reposo) | Sprint dedicado | | SEC-003 | Agujero TRUNCATE evade ADR-003 | Antes de datos reales | | SEC-004 | RPC validable por bypass REST (coherencia de flujo en Server Action) | Sprint futuro | | BACKLOG-002 | Fase 2: motor genérico | Post-deadline | +*(SEC-001/TECH-001 verificados 27 jun vía `npm view next version` / `npm audit --json` — +los números en BACKLOG.md/TECH_DEBT.md estaban desactualizados, ej. citaban Next 15.3.3 +y "2 vulnerabilidades" cuando ya corre 15.3.8 con 4.)* + --- ## 5. Infraestructura @@ -87,14 +108,19 @@ dashboard nuevo de tres miradas, fundamentado en marcos reales (OIT 5R, CEPAL, P --- ## 6. Próximos pasos -1. **Widgets de Mirada Empresa** — el frontend del dashboard que consume las RPCs ya verificadas. - La spec (SPEC_MIRADA_EMPRESA.md) define shapes de retorno; el mockup define el aspecto. -2. **4F autocomplete barrios** — subir `geo_paraguay_full.json` (8152 barrios) a public/data/. -3. **4I release** — validación e2e, tag v3.0.0, desplegar v3, reactivar surveys a live. -4. **Sprint de dashboard (post-deadline):** Miradas País y Humana, preguntas faltantes - (bienestar, horas no remuneradas, escolarización), decisión qi_modalidad. -Orden sugerido para go-live: widgets Mirada Empresa → 4F → 4I. +**Go-live (widgets → 4F → 4I) está cerrado.** v3.0.0 en producción, surveys `live`, auth para +staff funcionando. No queda ninguna etapa de Sprint 4 pendiente — el roadmap pre-escrito se +agotó. El próximo paso requiere decisión del director entre: + +1. **Sprint de dashboard (post-deadline):** Miradas País y Humana, preguntas faltantes + (bienestar, horas no remuneradas, escolarización), decisión qi_modalidad (TECH-DEBT-010). +2. **Sprint de compliance/seguridad (SEC-002):** audit log append-only, hashing de integridad, + cifrado en reposo — bloquea escalar a más empresas/datos reales. +3. **Mantenimiento de dependencias:** SEC-001 (Next.js) + TECH-001 (`npm audit`, 4 vulns). +4. Otro ítem de BACKLOG.md/TECH_DEBT.md no listado arriba. + +Ninguno de estos se decide unilateralmente (Nivel 3 — tocan planificación/seguridad). ---