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.
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:
Employee con DimensionScore accesible desde el tenant admin.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:
educational_content, behavioral_action, commitment, reminder.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:
Tenant incluye logoUrl y primaryColor.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:
InterventionCatalog (maestro versionado) e Intervention (curadas por Caudall).TenantInterventionOverride con status enabled / disabled.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:
next-intl desde el arranque.messages/es.json con claves por dominio._i18n_key que apuntan a traducciones gestionadas en admin.messages/en.json + traducciones en admin, sin tocar código.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:
Employee tiene personalEmail (no corporativo).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.
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:
(employee), (hr), (admin).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:
EmailProvider (magic link) y GoogleProvider.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:
next-pwa desde el arranque.public/manifest.json completo con íconos en resoluciones estándar.Cualquier cambio a las decisiones anteriores requiere:
Superseded by ADR-XXX.