diff --git a/docs/estado/ESTADO_PROYECTO_JUNIO_2026.md b/docs/estado/ESTADO_PROYECTO_JUNIO_2026.md index d7289b8..3a39526 100644 --- a/docs/estado/ESTADO_PROYECTO_JUNIO_2026.md +++ b/docs/estado/ESTADO_PROYECTO_JUNIO_2026.md @@ -1,155 +1,131 @@ # ESTADO DEL PROYECTO — Datos País sobre el Cuidado -## Documento de continuidad — 11 junio 2026 +## Documento de continuidad — 20 junio 2026 -> Director: Marcos · Metodología: Maria Mersan · Contacto Fundación: Valeria Arce +> Director (Product Owner): Marcos · Claude (Projects) = arquitecto/copiloto · Claude Code = implementación +> Metodología: Maria Mersan · Contacto Fundación: Valeria Arce --- -## 1. URLs operativas +## 1. Versionado y ramas -| Recurso | URL | -|---|---| -| Formulario Demo | https://economia-cuidado.inqualityhq.com/?s=30000000-0000-0000-0000-000000000001 | -| Formulario InQuality | https://economia-cuidado.inqualityhq.com/?s=30000000-0000-0000-0000-000000000002 | -| Formulario Fundación Solidaridad | https://economia-cuidado.inqualityhq.com/?s=30000000-0000-0000-0000-000000000003 | -| Dashboard — Todos | https://economia-cuidado.inqualityhq.com/dashboard?survey_id=00000000-0000-0000-0000-000000000000 | -| Dashboard — InQuality | https://economia-cuidado.inqualityhq.com/dashboard?survey_id=30000000-0000-0000-0000-000000000002 | -| Dashboard — Fundación Solidaridad | https://economia-cuidado.inqualityhq.com/dashboard?survey_id=30000000-0000-0000-0000-000000000003 | -| Dashboard — Demo | https://economia-cuidado.inqualityhq.com/dashboard?survey_id=30000000-0000-0000-0000-000000000001 | -| Control de respuestas | https://economia-cuidado.inqualityhq.com/admin/responses | +- **Versión en producción:** 2.1.0 (formulario lineal, dashboard multitenante) +- **Versión en desarrollo:** 3.0.0 (wizard, en `main`) +- **Rama de preservación:** `v2.1.0-stable` (código + dump DB) + tag `v2.1.0` +- Convención: SemVer + CHANGELOG.md (raíz) + tags en cada versión estable +- ADRs en `docs/adr/`. ADR-005 = esquema declarativo + estrategia dos fases. --- -## 2. Infraestructura — OPERATIVA ✅ +## 2. Sprint 4 — Wizard v3 — EN CURSO -- **App:** Next.js 15.3.8 (CVE-2025-66478 resuelto ✅) -- **DB:** Supabase self-hosted en Dokploy v0.29.4 -- **VPS:** inq-mart-2, IP VPN: 172.20.5.11 -- **Repos:** - - App: `git.inquality.com.py/marcos/motor-de-encuestas` (rama main) - - Supabase stack: `git.inquality.com.py/marcos/supabase-motor-fomularios` (rama master) -- **API Supabase:** https://db.inqualityhq.com (Kong + SSL) -- **Backups:** `/var/backups/supabase-prod/`, cron 3AM, GFS (3 días diarios + domingos 14 días) -- **Studio:** solo vía SSH tunnel → `ssh -L 3001:localhost:3001 administrator@172.20.5.11` +Arquitectura (ADR-005): el formulario es un **esquema declarativo** (datos); el frontend +es un **renderer** sin reglas de negocio; el motor interpreta el esquema. +Estrategia dos fases: Fase 1 (este sprint) formulario-como-esquema; Fase 2 (BACKLOG-002) +motor genérico universal. ---- - -## 3. Instrumento — v2.1 ACTIVO - -- **44 preguntas**, 8 secciones -- **Salto triple:** 1.1=No AND 1.6=No AND 1.13=No → salta a 6.4 (validado con datos reales ✅) -- **Nueva pregunta 6.6:** voluntariado en redes de apoyo (Sí/No/Tal vez) -- **2.4 eliminada**, **2.1 → multiple_choice** -- "Prefiero no decir" eliminado de todas las preguntas -- Hint "Podés marcar más de una opción" en todas las multiple_choice -- "Tecnología asistiva" en 1.3 y 1.10 - ---- - -## 4. DB — estado actual - -| Tabla | Filas | -|---|---| -| organizations | 3 (Empresa Demo, InQuality, Fundación Solidaridad) | -| surveys | 3 (una por organización) | -| questions | 132 (44 × 3 surveys) | -| responses | 15 (8 InQuality + 7 Demo — todas de prueba) | -| answers | ~500 (estimado) | - ---- - -## 5. Dashboard — multitenante operativo ✅ - -- Selector de empresa en el header: Todos / InQuality / Fundación Solidaridad / Demo -- "Todos" usa UUID especial `00000000-0000-0000-0000-000000000000` → pool agregado -- Implementado via flag en `_dash_responses` (migración `20260611000001`) -- Validado visualmente con n=15: KPIs, heatmap departamental, perfil población ✅ - ---- - -## 6. Vista de control /admin/responses - -- Tabla plana: una fila por answer, agrupada por submission -- Colapsar/expandir por submission (Client Component island) -- Excluye: `text_long`, `is_sensitive=true` (TECH-DEBT-008 — sin auth) -- Sin columna "Tipo" - ---- - -## 7. Método — Sprint 2 cerrado ✅ - -- `method/PATTERNS.md` y `method/ANTI_PATTERNS.md` creados en el repo -- C.8 promovido a estable con casos reales del proyecto -- AP.10 y AP.11 documentados con casos reales - ---- - -## 8. Deuda técnica abierta - -| ID | Descripción | Bloqueante | +### Etapas +| Etapa | Nombre | Estado | |---|---|---| -| TECH-DEBT-006 | Backup remoto S3 | SÍ — antes del primer dato real | -| TECH-DEBT-007 | auth.jwt() deprecado en GoTrue v2.189+ | No (piloto) | -| TECH-DEBT-008 | /admin/responses sin auth | No (URL no publicada) | -| TECH-DEBT-009 | Rotar secrets Supabase post-CVE-2025-66478 | SÍ — antes del primer dato real | +| 4.0 | Preservación v2 (tag, rama, dump, CHANGELOG) | ✅ | +| 4A | Persistencia `instance_id` en answers | ✅ aplicada en prod | +| 4B | Esquema declarativo + seed v3 (10 secciones, 150 questions) | ✅ aplicada en prod | +| 4C | Motor de resolución de flujo (puro, lib/, 16 tests) | ✅ commiteada | +| 4D | Frontend renderer (consume el motor, una preg/pantalla) | ⏳ siguiente | +| 4E | Instancias de vínculo (mini-wizard familiares) | pendiente | +| 4F | Autocomplete barrios (requiere geo_paraguay_full.json) | pendiente | +| 4G | Submit con instance_id + **validación server-side (no negociable)** | pendiente | +| 4H | RPCs de vínculo (agregados por instancia) | pendiente | +| 4I | Validación e2e + tag v3.0.0 + ADR + BACKLOG Fase 2 | pendiente | + +Orden: 4D → (4E ∥ 4F) → 4G → 4H → 4I + +### Estado técnico v3 en la DB (ya aplicado en prod) +- `answers.instance_id text DEFAULT 'default'`, constraint `(response_id, question_id, instance_id)` +- `questions` extendida: `instance_generator`, `instance_of`, `hint` +- 150 questions (50 × 3 surveys), instrumento v3 de 10 secciones +- 4.1 = `instance_generator`; 4.2/4.3 = `instance_of='4.1'` +- Datos de prueba v2 borrados (TRUNCATE); v3 arranca limpio + +### Motor de flujo (4C) — lib/form-engine.ts +- Módulo puro, sin React/DOM. Tests en `lib/form-engine.test.mts` (16/16). +- Operadores: `eq`, `eq_any`, `not_in` (escalares); `contains`, `eq_sole` (array multiple_choice) +- Acciones: `show`, `hide` (hide = veto absoluto sobre show del mismo array) +- Reglas múltiples en un array = OR +- ID de instancia: `familiar_${posición fija de opción}` (determinista, estable) +- Secciones = pantallas propias; se ocultan solo si su fila type='section' tiene regla + +### Recorridos del formulario (validados en mockup y tests) +- Completo: todos los vínculos → todas las secciones +- Solo niño sin discapacidad (`eq_sole` op 1): liviano → 5.3, 8.4, 9.1, 9.4 +- Ninguna (`contains` op 8): salta a Sección 10 +- 3.1='No': oculta 3.2-3.5 --- -## 9. Pendientes próxima sesión +## 3. Decisiones arquitectónicas clave (no reabrir) -1. TECH-DEBT-006 — backup remoto S3 -2. TECH-DEBT-009 — rotar secrets Supabase -3. RE Index — confirmar mapeo G1/G2/G4/G5 → códigos seed con Marcos -4. Informe descargable — prometido en deck comercial -5. Onboarding empresas reales — cuando validación esté lista +1. Lógica de flujo en datos (esquema), no en frontend (ADR-005) +2. Frontend = renderer sin reglas de negocio +3. Motor de flujo (4C) corre en cliente, módulo puro testeable +4. **Validación de integridad del submit = server-side, NO negociable (4G)** + La validación de cliente es UX, no seguridad. Datos de salud sensibles. +5. Secciones como pantallas propias (reversible — es comportamiento del motor) +6. Se extiende `questions`, no se crea tabla de definición (ADR-005) +7. Migraciones vía CLI del VPS (`docker exec -i supabase-db psql`) +8. consent_records inmutable (ADR-003); el seed nunca toca datos de respuesta --- -## 10. Decisiones tomadas — no reabrir +## 4. Deuda técnica y seguridad -1. Supabase en Dokploy siempre via modo Git -2. POSTGRES_PASSWORD siempre con `openssl rand -hex` -3. kong.yml: una sola entrada por bloque keyauth_credentials -4. SMTP_PORT=587 siempre explícito aunque SMTP esté desactivado -5. GOTRUE_EXTERNAL_ANONYMOUS_USERS_ENABLED=false siempre explícito -6. LUA_AUTH_EXPR con prefijo "Bearer " en kong-entrypoint.sh -7. NEXT_PUBLIC_SUPABASE_URL via Build Argument en Dokploy -8. App conecta a https://db.inqualityhq.com -9. /admin/responses no muestra is_sensitive=true sin auth (TECH-DEBT-008) -10. brand_config.org_name alimenta el nombre de empresa en el formulario -11. Organizaciones separadas para cada encuesta -12. conditional_rules referencian códigos de pregunta, no UUIDs -13. UUID cero `00000000-...` es el flag p_all del dashboard -14. Next.js pinneado a versión exacta `15.3.8` (sin caret) +| 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 | +| SEC-002 | Sprint de compliance (audit log, hashing, cifrado en reposo) | Sprint dedicado | +| SEC-003 | **Agujero TRUNCATE evade inmutabilidad ADR-003** — cerrar antes de datos reales | Antes de datos reales | +| BACKLOG-002 | Fase 2: motor genérico de formularios | Post-deadline | + +COMPLIANCE.md documenta estado de seguridad, roadmap de auditabilidad, y la decisión +fundamentada de NO usar blockchain. --- -## 11. Contexto comercial - -- 2 empresas comprometidas para piloto (InQuality y Fundación Solidaridad en espacio de pruebas) -- Cronograma: JUN inicio · JUL-AGO relevamiento · SEP análisis · OCT informe + evento -- Meta: 20 empresas pioneras -- Precios: Gs. 4.5M (≤50) · 7.5M (≤200) · 12M (≤400) -- GAPs deck vs producto: RE Index no implementado, informe descargable no existe -- Contacto Fundación: Valeria Arce — ddff@fundacionsolidaridad.org.py · +595 991 854333 +## 5. Infraestructura (sin cambios) +- Next.js 15.3.8 · Supabase self-hosted · Dokploy v0.29.4 · VPS inq-mart-2 (172.20.5.11) +- App: `economia-cuidado.inqualityhq.com` · API: `db.inqualityhq.com` +- Repos Gitea: `git.inquality.com.py/marcos/motor-de-encuestas` +- Backups GFS locales 3AM --- -## 12. Prompt para nueva sesión - -Pegá al inicio de la nueva conversación: +## 6. Contexto comercial +- 2 clientes inminentes en 10-20 días (motivan el deadline de v3) +- InQuality y Fundación Solidaridad ya en joint venture del producto +- Datos de prueba descartables (existe dump en v2.1.0-stable) --- -Sos el copiloto técnico del proyecto "Datos País sobre el Cuidado" — plataforma soberana -de encuestas sobre economía del cuidado en Paraguay. Tenemos múltiples sesiones de trabajo. +## 7. Próximo paso inmediato +**Etapa 4D — Frontend renderer.** El componente consume el motor (4C) y renderiza +una pregunta por pantalla. Incluye la tarea 4.5 pospuesta de 4C (query de app/page.tsx +con hint/instance_generator/instance_of). Reemplaza lib/conditional.ts y la lógica +de secciones hardcodeada de survey-form.tsx v2. -Stack: Next.js 15.3.8 + Supabase self-hosted + Dokploy v0.29.4. -URL: https://economia-cuidado.inqualityhq.com -Repos en Gitea: git.inquality.com.py/marcos/ +--- -El estado completo está en `docs/estado/ESTADO_PROYECTO_JUNIO_2026.md` en el repo. -Los prompts de etapas pasadas están en `sprints/`. -Las reglas no negociables están en `CLAUDE.md`. +## 8. Prompt para nueva sesión +``` +Sos el arquitecto/copiloto técnico de "Datos País sobre el Cuidado", motor de +formularios soberano (Paraguay). Yo soy el product owner. Estamos en Sprint 4 +construyendo el formulario wizard v3 (esquema declarativo, ADR-005). -Próximos pasos: [COMPLETAR CON LO QUE VAS A HACER] \ No newline at end of file +Estado completo: docs/estado/ESTADO_PROYECTO_JUNIO_2026.md en el repo. +Sprint: sprints/sprint-4/ (BRIEF + prompts de etapa + reportes). +Completadas: 4.0, 4A, 4B, 4C. Siguiente: 4D (frontend renderer). + +El motor de flujo ya existe y está testeado (lib/form-engine.ts, 16 tests). +La lógica vive en datos; el frontend es renderer sin reglas. + +Próximo paso: [COMPLETAR] +``` \ No newline at end of file