Files
motor-de-encuestas/BACKLOG.md
markosbenitez 2e6fbd7801 feat(submit): submit v3 con validación de integridad server-side [4G]
RPC transaccional SECURITY DEFINER (rpc_submit_response) como único camino
de escritura. Dropea las policies WITH CHECK(true): cierra la falla donde
anon podía insertar cualquier cosa. Validación server-side (7 checks)
reusando el motor. Persistencia atómica con instance_id por instancia.
Verificado contra Postgres real: instancias separadas, atomicidad, RLS.
Riesgo residual de bypass por REST documentado (SEC-004).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 21:27:49 -03:00

6.3 KiB

BACKLOG.md

Ítems pendientes que no entran en el sprint actual. El agente NO los ejecuta sin aprobación del director (Nivel 3 salvo indicación contraria).


Seguridad

[SEC-004] RPC de submit es bypasseable vía REST directo (coherencia de flujo)

  • Estado: Riesgo residual documentado — no resuelto en Etapa 4G
  • Contexto: rpc_submit_response (migración 20260624000001_submit_rpc.sql) es el único camino de escritura para consent_records/responses/answers (las policies WITH CHECK(true) que permitían INSERT directo a anon se eliminaron). La RPC valida lo ESTRUCTURAL en SQL (el question_id pertenece a la encuesta, la encuesta está viva, el consentimiento llegó). La validación de COHERENCIA DE FLUJO (visibilidad según conditional_rules, instancias legítimas de 4.1) vive en TypeScript (lib/submit-validation.ts, reusa lib/form-engine.ts) porque reimplementarla en SQL violaría la regla de "no duplicar la lógica de flujo" (BRIEF 4G).
  • Riesgo: quien llame a rpc_submit_response directo por la REST API de Supabase (sin pasar por el Server Action de Next.js) puede mandar un payload con instancias/visibilidad incoherentes que igual pase las validaciones estructurales de la RPC.
  • Por qué no es un incidente de privacidad: el dato resultante sigue siendo anónimo (respondent_id=NULL), is_sensitive se sigue respetando, y queda sujeto al umbral k-anonimato en agg_segment/RPCs de dashboard igual que cualquier otra respuesta. Es un problema de calidad de datos de investigación (una respuesta lógicamente imposible podría colarse), no de exposición de datos.
  • Cierre posible (no implementado): firmar el payload en el Server Action (HMAC con un secreto server-only) y verificar la firma dentro de la RPC antes de insertar — así un caller directo sin el secreto no puede producir un payload válido. Evaluar costo/beneficio antes de priorizar.
  • Dependencia: no bloquea Sprint 4; evaluar junto con SEC-002 (sprint de compliance).

[SEC-002] Sprint de compliance & seguridad

  • Estado: Diferido — pendiente de priorizar tras Sprint 4
  • Contexto: COMPLIANCE.md documenta el estado actual de seguridad (v2.1.0) y el roadmap de hardening. Antes de escalar a más empresas o datos reales, se requiere un sprint dedicado.
  • Ítems principales (ver COMPLIANCE.md secciones 5 y 6):
    • Registro de auditoría append-only (log inmutable de operaciones sensibles)
    • Hashing SHA-256 de integridad de respuestas (detección de tampering sin blockchain)
    • Cifrado en reposo a nivel de volumen/disco de la base de datos
    • Roadmap de hardening por capas: aplicación, autenticación, datos, infraestructura, observabilidad y proceso (revisión periódica de CVEs, pen testing)
  • Dependencia: no bloquea Sprint 4; sí bloquea escalar a producción masiva.
  • Ver: COMPLIANCE.md secciones 5 y 6.

[SEC-001] Actualizar Next.js — CVE pendiente en 15.3.3

  • Estado: Pendiente
  • Prioridad: Alta
  • Contexto: Next.js 15.3.3 tiene un CVE conocido. La versión no se actualizó en la tarea del 2026-06-02 para no mezclar cambios con el fix de producción de chromedriver. Actualizar en el próximo ciclo de mantenimiento.
  • Acción: npm install next@latest + verificar que el build y la app sigan funcionando antes de deployar.
  • Nota: revisar changelog de Next.js por breaking changes antes de actualizar.

Técnico / Deuda

[TECH-001] npm audit reporta 2 vulnerabilidades en deps de producción

  • Estado: Pendiente de revisión
  • Contexto: npm audit señala 1 moderate + 1 critical. Evaluar con npm audit --json si afectan el runtime de la app o solo herramientas de build.
  • Acción: npm audit fix (o fix manual) y re-verificar build.

[TECH-002] Mockup formulario_mapeo.html no encontrado en el árbol de trabajo

  • Estado: Pendiente
  • Contexto: El BRIEF Sprint 2 lo cita como "contrato visual". El agente diseñó la UI basándose en SEED_SPEC.md. Requiere validación visual del director contra el mockup original.

[TECH-003] Auditoría a11y interactiva pendiente (foco, aria-expanded, widgets)

  • Estado: Pendiente
  • Contexto: La auditoría de Etapa 2A se corrió sobre el HTML SSR estático (jsdom). La verificación de componentes interactivos (foco al abrir bloque condicional, aria-expanded en triggers, operación solo con teclado) requiere auditoría en browser real.
  • Acción: Correr axe-cli con Chrome 149+ (o actualizar Chrome a 149) y hacer test manual de navegación por teclado.

Features

(Sprint 3 y posteriores — ver ARCHITECTURE.md y BRIEF por sprint)

[BACKLOG-001] Consentimiento inicial editable desde admin

  • Estado: hoy el texto del consentimiento está hardcoded en consent-screen.tsx.
  • Necesidad: cuando se construya el motor de formularios (builder), el texto del consentimiento debe ser editable por encuesta desde la administración, para reflejar cambios en política de privacidad o ajustes específicos por tipo de relevamiento.
  • Bloquea: implementación del builder visual.
  • Decisión cerrada: la edición es desde admin, no desde el código.

[BACKLOG-002] Fase 2 — Motor genérico de formularios

  • Estado: Diferido post-deadline

  • Contexto: En Sprint 4 se construye un intérprete del esquema declarativo específico para el formulario de cuidadores (ADR-005, Fase 1). Una vez entregado ese caso, el intérprete se extrae a un motor universal que interprete cualquier esquema definido en questions.conditional_rules + campos de instanciación, sin hardcodear ningún formulario. El formulario de cuidadores se vuelve el primer caso de prueba del motor sin reescribir el contrato de datos.

  • Dependencia: Fase 1 completada (Sprint 4 — wizard funcional).

  • Ver: ADR-005 (docs/adr/ADR-005-esquema-declarativo-formularios.md).

  • Dashboard / reportes (Sprint 3)

  • Formulario de consentimiento + persistencia de respuestas (Etapa 2B)

  • Builder visual de encuestas (post-validación del caso fijo)

  • Integración LLM para análisis de texto libre (diferenciador)

  • Modo B / controller_role dual (reservado en esquema)

  • Columnas qi_gender / qi_modality en responses — decisión Nivel 3 abierta (ver hallazgo en SEED_SPEC.md)