caudallmvp

Decisiones de arquitectura (ADRs) — Caudall MVP

Este documento captura las decisiones estructurales del MVP en formato ADR (Architecture Decision Record). Cada una tiene contexto, decisión, alternativas consideradas y consecuencias. Estas decisiones fueron tomadas explícitamente y no deben violarse sin discusión previa con el owner.

Estado global: todas las decisiones marcadas como Accepted a la fecha de este documento. Cambios requieren PR con nueva ADR marcando la anterior como Superseded.


ADR-001 — Barrera empresa-empleado: solo agregados anonimizados

Estado: Accepted Contexto: En un modelo B2B2E la empresa paga y quiere ver el impacto del beneficio, pero el empleado necesita saber que su información financiera personal no llega a RRHH. Sin esa garantía, no responde con honestidad y todo el sistema falla en la primera pregunta.

Decisión: La empresa (tenant admin) solo accede a datos agregados y anonimizados de sus empleados, nunca individuales. Se aplica un umbral mínimo por segmento (default: 5 empleados) para evitar re-identificación en grupos pequeños. La barrera se enforce a nivel de base de datos (Row-Level Security en PostgreSQL) y de query, no solo de UI.

Alternativas consideradas:

Consecuencias:


ADR-002 — El journey del empleado termina en educación e intervenciones conductuales

Estado: Accepted Contexto: El empleado completa el diagnóstico, obtiene su CFHI. Después puede: quedarse en educación/hábitos, o extenderse a productos financieros (AFP, ahorro programado, seguros). En el modelo B2B2E, quien paga es la empresa, no la institución financiera — no hay necesidad de monetizar vía leads.

Decisión: El MVP termina en educación e intervenciones conductuales. Sin catálogo de productos financieros, sin conexión con instituciones. Se agregarán después, per-tenant, como capacidad opcional.

Alternativas consideradas:

Consecuencias:


ADR-003 — Personalización visual: co-branding pleno (logo + color primario)

Estado: Accepted Contexto: Cada empresa quiere que la plataforma “se sienta suya” en algún grado. Hay un rango entre co-branding ligero (solo logo) y white-label completo (dominio propio, tipografías, componentes personalizados).

Decisión: Co-branding pleno en el MVP: logo de la empresa y color primario configurables por tenant. La estructura, tipografía y marca Caudall se preservan. White-label completo se pospone.

Alternativas consideradas:

Consecuencias:


ADR-004 — Catálogo de intervenciones: común con overrides

Estado: Accepted Contexto: Las intervenciones y contenido educativo son el corazón del valor para el empleado. Pueden ser un catálogo común para todas las empresas, uno por empresa, o híbrido.

Decisión: Catálogo común maestro curado por Caudall. Cada empresa puede activar/desactivar piezas del catálogo. Agregar contenido propio de tenant queda para fase posterior.

Alternativas consideradas:

Consecuencias:


ADR-005 — Idiomas: español único en MVP, i18n listo desde el inicio

Estado: Accepted Contexto: El mercado inicial es República Dominicana. Los empleados hablan español. Pero preparar la arquitectura para más idiomas después cuesta mucho más si se hace tarde.

Decisión: UI en español únicamente en el MVP. Sin embargo, toda cadena visible al usuario se implementa vía next-intl con archivo messages/es.json. Ningún string hardcodeado en JSX.

Alternativas consideradas:

Consecuencias:


ADR-006 — Registro del empleado: autoregistro con licencia individual + email personal

Estado: Accepted (actualizado 24 ago 2026 — ver adenda abajo) Contexto: El empleado necesita autenticarse. Opciones: autoregistro con código, carga manual de correos por RRHH, integración con HRIS/nómina, SSO corporativo.

Decisión: Autoregistro con código de acceso + email personal (no corporativo). Opcionalmente RRHH puede subir lista de correos autorizados (feature simple, no bloqueante). Sin integración HRIS ni SSO en MVP.

Alternativas consideradas:

Consecuencias:

Adenda (24 ago 2026) — control de licencias por empleado: el código de acceso dejó de ser un código único compartido por toda la empresa (Tenant.enrollmentCode, que se conserva solo por compatibilidad con tenants creados antes de este cambio). Ahora cada empleado se registra con su propia licencia individual (License.code), y la empresa contrata N licencias con una vigencia de 3, 6 o 12 meses. Esto le da a la empresa control real sobre cuántos empleados pueden usar Caudall a la vez y por cuánto tiempo — antes el código compartido no tenía ningún límite. Al vencer la vigencia de una licencia (contada desde que el empleado se registra con ella, no desde que se crea), el empleado pierde acceso a la app; sus datos de diagnóstico no se borran. ADM crea empresas y genera licencias desde /admin/empresas.


ADR-007 — Prioridad de dispositivo por vista

Estado: Accepted Contexto: “Web responsive” no significa que todas las vistas se diseñen iguales. Cada rol (empleado, RRHH, admin Caudall) tiene un dispositivo típico de uso distinto.

Decisión:

Alternativas consideradas:

Consecuencias:


Estado: Accepted Contexto: El empleado se autoregistra (ADR-006). Necesita autenticarse. Opciones: contraseña, magic link, OTP, OAuth.

Decisión: Magic link como principal. OAuth con Google cuenta personal como opcional. Sin contraseñas.

Alternativas consideradas:

Consecuencias:


ADR-009 — PWA desde el MVP

Estado: Accepted Contexto: Plataforma es web responsive. Dentro de eso puede ser web pura (solo navegador) o PWA (instalable en home screen, offline básico, notificaciones push).

Decisión: PWA desde el MVP. Service worker, manifest, prompt de instalación, notificaciones push cuando la plataforma lo permita.

Alternativas consideradas:

Consecuencias:


Cambios a estas decisiones

Cualquier cambio a las decisiones anteriores requiere:

  1. Nueva ADR (ADR-010, etc.) que explique el cambio.
  2. Marcar la ADR anterior como Superseded by ADR-XXX.
  3. PR discutido y aprobado por Reynoso.
  4. Revisión de las consecuencias en el código.