estado de proyecto updated
This commit is contained in:
@@ -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]
|
||||
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]
|
||||
```
|
||||
Reference in New Issue
Block a user