Files
motor-de-encuestas/docs/estado/ESTADO_PROYECTO_26JUN2026.md

8.0 KiB

ESTADO DEL PROYECTO — Datos País sobre el Cuidado

Documento de continuidad — 26 junio 2026

Director (Product Owner): Marcos · Claude (Projects) = arquitecto/copiloto · Claude Code = implementación Metodología: Maria Mersan · Contacto Fundación: Valeria Arce


1. Versionado y ramas

  • Producción: 3.0.0 — wizard v3 + dashboard tres miradas desplegado · tag v3.0.0 · commit fcf93ea
  • Preservación: v2.1.0-stable + tag v2.1.0
  • 3 surveys en live — reactivados al desplegar v3 (26 jun 2026)
  • SemVer + CHANGELOG + tags. ADRs en docs/adr/.

2. Sprint 4 — Wizard v3 — COMPLETO Y EN PRODUCCIÓN

Etapa Estado
4.0 Preservación v2
4A instance_id
4B esquema declarativo + seed v3
4C motor de flujo (lib/form-engine.ts, puro, 20+ tests)
4D wizard renderer (layout estable, header/footer fijos)
4E instancias familiares (mini-wizard emergente del motor)
4F autocomplete barrios + filtro ciudad por departamento
4G submit + validación server-side (RPC rpc_submit_response)
4I validación e2e + tag v3.0.0 + deploy + surveys live

Decisiones arquitectónicas clave (no reabrir)

  • ADR-005: lógica de flujo en datos (esquema), nunca en frontend.
  • Motor puro en cliente; reusado server-side para validación de submit.
  • Único camino de escritura: RPC rpc_submit_response (SECURITY DEFINER).
  • instance_id por answer — instancias familiares persistidas correctamente.
  • Validación server-side: 7 checks (preguntas visibles, valores válidos, instancias legítimas, consentimiento, requeridas presentes). Rechaza el submit completo si algo falla.

Autocomplete geo (4F)

  • public/data/geo_paraguay_full.json — 8152 barrios, jerarquía depto → ciudad → barrios.
  • Pregunta 2.3 (barrio): autocomplete con position: fixed + getBoundingClientRect().
  • Pregunta 2.2 (ciudad): filtra por departamento (2.1) usando el mismo JSON. Limpia valor al cambiar departamento. Texto libre siempre permitido como fallback.

3. Dashboard v3 — Mirada Empresa en producción

Decisión vigente: NO migrar RPCs v2. Dashboard nuevo de tres miradas (OIT 5R, CEPAL, PNCUPA Paraguay).

Estado

  • Mirada Empresa: COMPLETA EN PRODUCCIÓN
    • 11 RPCs (rpc_me_*) + helper _dash_es_cuidador verificados contra 50 respuestas reales.
    • 9 widgets funcionando: Talento en riesgo, Prevalencia, Punto ciego, Señales de impacto (presentismo 41.7%, ausentismo 36.1%, riesgo 38.9%, carrera congelada 47.2%), Apoyos demandados (ordenados por demanda), Segmentación (nivel y modalidad), Disposición a red de apoyo.
    • Tema claro marca Re: fondo #E7E6E5, cards #FFFFFF, texto #494F4F.
    • Migraciones aplicadas: 20260625000001 (fix _dash_responses) + 20260625000002 (11 RPCs) + 20260626000001 (fix bug cnt Opción B).
  • Mirada País y Mirada Humana: propuesta + mockup listos, implementación DIFERIDA a sprint de dashboard post-deadline.

Bug conocido abierto

  • rpc_me_carrera_congelada: "Ninguna de las anteriores" aparece en top_opciones a pesar del filtro en el subquery. El filtro opera sobre el array completo, no sobre los elementos individuales del jsonb_array_elements_text. No bloqueante para el release — registrado para próximo sprint.

Documentos (en docs/dashboard/)

  • PROPUESTA_DASHBOARD_v3.md — las 3 miradas, ~30 métricas, marcos citados
  • dashboard_tres_miradas_mockup.html — mockup funcional 3 pestañas
  • SPEC_MIRADA_EMPRESA.md — contrato técnico 10 métricas + estrella

Decisiones del dashboard (no reabrir)

  • CUIDADOR_ACTIVO incluye "hijo menor sin discapacidad" (criterio UNFPA, validado por Maria jun 2026).
  • Mirada Empresa NO expone datos sensibles (3.x, 4.2, 4.3).
  • k-anonimato k≥5 sobre count(DISTINCT response_id) — también en métricas por instancia.
  • 2 gaps de datos para sprint dashboard: horas cuidado no remunerado (País), escolarización niñez (Humana).

4. Datos de prueba en VPS

  • 51 respuestas en survey Demo (30000000-0000-0000-0000-000000000001) — 50 del seed determinista (seed=42) + 1 del e2e de 4I.
  • Survey Demo en live. Datos NO limpiados — el director los necesita para mostrar al equipo.
  • Script de limpieza cuando corresponda:
docker exec supabase-db psql -U postgres -d postgres -c "
TRUNCATE answers, responses, consent_records CASCADE;
UPDATE surveys SET status='draft' WHERE id='30000000-0000-0000-0000-000000000001';"
  • ⚠️ El seed corrió dos veces en sesión anterior (detectado y corregido). Agregar guard anti-duplicación al seed_prueba_50.sql — anotado en BACKLOG.

5. Deuda técnica y seguridad

ID Descripción Prioridad
BUG-001 "Ninguna de las anteriores" aparece en rpc_me_carrera_congelada Próximo sprint dashboard
TECH-DEBT-006 Backup remoto (S3 o VPS alternativo o Google Drive) Antes de datos reales no desechables
TECH-DEBT-009 Rotar secrets post-CVE Antes de datos reales no desechables
TECH-DEBT-010 E9 lee modalidad por JOIN a answers (2.7) en vez de qi_modalidad Baja
SEC-002 Sprint compliance (audit log, hashing, cifrado en reposo) Sprint dedicado
SEC-003 TRUNCATE evade inmutabilidad ADR-003 Antes de datos reales no desechables
SEC-004 RPC bypass REST (coherencia de flujo en Server Action) Sprint futuro
BACKLOG-001 seed_prueba_50.sql idempotente (guard anti-duplicación) Baja
BACKLOG-002 Fase 2: motor genérico de formularios Post-deadline

Riesgo aceptado explícitamente (26 jun 2026): TECH-DEBT-006, TECH-DEBT-009 y SEC-003 aplican cuando haya datos reales no desechables. Los datos actuales son de empresas voluntarias y grupos de control — desechables si es necesario.


6. Infraestructura

  • 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 (Kong + SSL)
  • Repo: git.inquality.com.py/marcos/motor-de-encuestas (rama main)
  • Repo local: /Users/marcos/InQ/Motor de encuestas
  • Migraciones SIEMPRE vía CLI del VPS: docker exec -i supabase-db psql -U postgres -d postgres < archivo.sql
  • Deploy: Dokploy → Rebuild + "Clean cache"
  • Anon key Kong (diagnóstico): eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlzcyI6InN1cGFiYXNlIiwiaWF0IjoxNzAwMDAwMDAwLCJleHAiOjIwMDAwMDAwMDB9.6D79NWu1KfeOzEZXT6Amf-NmG0T9uk8SK9xNd32oLaY

7. Contexto comercial

  • 2 clientes inminentes. Mirada Empresa es la que le habla al cliente que paga.
  • InQuality y Fundación Solidaridad en joint venture.
  • Datos actuales: empresas voluntarias y grupos de control (desechables).
  • Datos reales no desechables: avisará el director — en ese momento activar deuda de seguridad.

8. Próximos sprints sugeridos

  1. Sprint dashboard — Miradas País y Humana, fix BUG-001 carrera congelada, preguntas faltantes (horas no remuneradas, escolarización), decisión qi_modalidad.
  2. Sprint compliance — SEC-002 (audit log, hashing, cifrado), SEC-003, TECH-DEBT-006/009.
  3. Sprint motor genérico — BACKLOG-002 Fase 2, extracción del intérprete.

9. 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 (Marcos).
Claude Code (VS Code, contexto separado) hace la implementación; vos planificás,
especificás y auditás.

Estado completo: docs/estado/ESTADO_PROYECTO_26JUN2026.md

Producción: v3.0.0 desplegada · 3 surveys en live · tag v3.0.0 (commit fcf93ea)
Formulario v3: COMPLETO (motor, wizard, instancias, submit server-side, autocomplete geo)
Dashboard: Mirada Empresa funcional en producción · País/Humana diferidas
Datos en VPS: 51 respuestas en survey Demo (no limpiar — para mostrar al equipo)

Bug abierto: "Ninguna de las anteriores" en rpc_me_carrera_congelada (no bloqueante)

Próximo paso: [COMPLETAR]