Hoja de trabajo semana 8 - martin-hendricks/MISO-PROYECTO-FINAL-SOLVENTA GitHub Wiki

Hoja de trabajo semana 8

Proyecto Solventa — Aseguradora digital
Elaboración Juan Acevedo, John Guerrero, Mauricio Rodriguez, Martin Romero
Versión 1.0
Insumos Enunciado MISW4501-202614-Proyecto.pdf · Hoja de trabajo semana 7

Cierre y entrega final del Proyecto Final 1: documento final de arquitectura, historias de usuario detalladas del Sprint 1 del Proyecto Final 2, presentación del prototipo final (web, móvil y back-office) con su documentación técnica y guías de usuario, documento de lecciones aprendidas, plan de trabajo y tablero cerrados, y video con evidencias.

Índice

  1. Documento final de arquitectura Proyecto I
  2. Historias de usuario detalladas del Sprint 1 del Proyecto 2
  3. Presentación del prototipo web/móvil final
  4. Documento de lecciones aprendidas Proyecto I
  5. Plan de trabajo y tablero cerrados
  6. Video con evidencias

1. Documento final de arquitectura Proyecto I

1.1 Modelos de arquitectura

Diagramas embebidos de las tres vistas actualizadas (funcional, despliegue, información). Si el embebido no se ve bien en tu navegador (los SVG grandes a veces se recortan en la vista de wiki), usa el link "Abrir el SVG completo" debajo de cada uno para verlo en tamaño real con zoom/scroll.


1.1.1 Modelo de contexto

Proyecto Solventa — Aseguradora digital
ID VC-001
Elaboración Juan Acevedo, John Guerrero, Mauricio Rodriguez, Martin Romero
Versión 1.0
Vista Contexto
Modelo Contexto

Convención

🟩 Sistema a diseñar Solventa
🟨 Canal Cliente web, cliente móvil, API embebida
🟦 Sistema externo Open Finance, Open Data, KYC, pagos, firma, IoT, reaseguro, estándares
👤 Actor Un nodo por rol × canal (evita cruces)

Actores por canal

Canal Actores Uso principal
Cliente web Asesor / Operaciones, Socio, Peritos, Cliente (escritorio) Gestión completa y back-office
Cliente móvil Cliente asegurado Autoservicio: siniestro con evidencia, push, biometría, geo
API embebida Socio de distribución Cotización / emisión en canal del tercero

Modelo de contexto — Solventa


1.1.2 Vista funcional — Modelo de componentes

Proyecto Solventa — Aseguradora digital
ID VC-002
Elaboración Juan Acevedo, John Guerrero, Mauricio Rodriguez, Martin Romero
Versión 1.0
Vista Funcional
Modelo Componentes

Incluye :Consentimiento como precondición de la salida a Open Finance —conectado a :AdaptadorOF—, el Dominio · Transversal (Documentos, Analítica, Notificaciones) separado de Venta y Operación, interfaces nombradas (ICotizacion, IPerfilamiento, IPublicacion, ISuscripcion, etc.) y los almacenes replicados de :MsPolizas y :MsSiniestros (Principal), que hacen visible sobre el modelo C&C la política de redundancia que se razona en §1.1.4.3.

Modelo de componentes — Solventa

Abrir el SVG completo: files/componentes_semana5.svg

1.1.2.1 Tácticas de arquitectura utilizadas para favorecer la LATENCIA
Táctica (nombre del catálogo) Familia Componente del diagrama Escenario
Múltiples copias de datos II :CacheOF, :CacheOD delante de :AdaptadorOF / :AdaptadorOD EC-LAT-09 — p95 ≤ 250 ms resolviendo con valor de respaldo
Limitar la respuesta a los eventos I :MsPolizas confirma y publica en :BusEventos; firma y notificación salen del camino crítico. :ColaPagos entre :MsPagos y el flujo asíncrono EC-LAT-05 / EC-LAT-06 — p95 ≤ 1,5 s · p99 ≤ 3 s
Introducción de concurrencia II Nota consulta paralelo sobre el fan-out de :MsPerfilamiento hacia :AdaptadorOF y :AdaptadorOD EC-LAT-03 / EC-LAT-04 — p95 ≤ 400 ms · p99 ≤ 800 ms

La decisión de invocar los dos adaptadores en paralelo se declara aquí, sobre el conector; la asignación de ese fan-out a nodos de ejecución y la aritmética que la obliga se documentan en §1.1.3.1.

1.1.2.2 Tácticas de arquitectura utilizadas para favorecer la ESCALABILIDAD
Táctica (nombre del catálogo) Familia Componente del diagrama Escenario
Introducción de concurrencia + contrapresión II :AdaptadorTelemetria → :TopicoTelemetria → :MotorParametrico: el tópico desacopla al productor del consumidor y absorbe el pico EC-ESC-03 — ≥ 1.000.000 eventos en 10 min, con procesamiento exactamente una vez

Lo que este modelo hace evidente es el conector asíncrono y la dirección de sus interfaces (IPublicacion / ISuscripcion). El grupo de consumidores no está dibujado aquí porque es una decisión de asignación: vive en §1.1.3.2, junto a las réplicas y los nodos de ejecución.

Junto con la introducción de concurrencia de §1.1.2.1, son las dos tácticas que se hacen evidentes en dos modelos a la vez: el conector en el modelo C&C, su asignación en el de despliegue.

1.1.2.3 Tácticas de arquitectura utilizadas para favorecer la MODIFICABILIDAD y otros atributos

Los patrones de §1.2.7 aterrizan mayoritariamente tácticas de modificabilidad, no de desempeño. Se documentan sobre este modelo para que la trazabilidad táctica → patrón quede completa. No son los atributos priorizados, pero sostienen a los que sí lo son — el bajo acoplamiento, en particular, es precondición del escalamiento selectivo. Se suman aquí las dos tácticas de disponibilidad que el diagrama hace explícitas con componentes propios: las dos políticas de redundancia sobre los almacenes de pólizas y de siniestros.

Táctica (nombre del catálogo) Atributo Componente del diagrama Escenario
Reducción del acoplamiento Modificabilidad Interfaces provided/required entre componentes; :BusEventos como intermediario orientado a mensajes; capa :Adaptador* EC-MOD-05 · EC-INT-03 · EC-INT-04
Mantener alta cohesión Modificabilidad Submódulos de Dominio · Venta y Dominio · Operación; cada motor separado de su orquestador EC-MOD-01 · EC-MOD-03 · EC-MOD-04
Utilización de un API Gateway Disponibilidad y seguridad :ApiGateway con :APISocios, :BFFWeb, :BFFMovil, :ApiTelemetria EC-INT-04 · EC-SEG-07
Redundancia activa Disponibilidad y latencia :MsPolizas —IDB→ :DBPolizas y —Replica→ :DBPolizas (Replica); la réplica está en el camino de lectura EC-LAT-10 — p95 ≤ 150 ms · RPO ≤ 30 s
Redundancia pasiva + sincronización de estado Disponibilidad :MsSiniestros (Principal) —IDB→ :DBSiniestros —Sincronización→ :Sincronizador —Replica→ :DBSiniestros (Replica); la réplica no sirve tráfico EC-DISP-06 / EC-DISP-07 — RTO ≤ 10 min

Las dos tácticas de redundancia se catalogan sobre este modelo —y no sobre el de despliegue— porque :Sincronizador y las réplicas son componentes con conectores propios, no instancias de un mismo nodo. El razonamiento de por qué son dos políticas distintas, y no una sola, está en §1.1.4.3. El detector de fallas (Monitor, heartbeat / ping-echo) que promueve la réplica pasiva no aparece en este diagrama: se documenta en ese mismo apartado.

1.1.2.4 Razonamiento sobre las principales decisiones de arquitectura tomadas en este modelo

Por qué :MsCotización y :MsPerfilamiento son componentes separados. No es modularidad estética: sus curvas de carga no coinciden. :MsCotización escala con la campaña de un socio (EC-ESC-01, pico inducido y previsible); :MsPerfilamiento escala con el cierre de mes de los bancos aliados (EC-LAT-04, pico de originación). Escalarlos juntos obliga a dimensionar por el máximo de ambos. Esta es la justificación de fondo del estilo de microservicios en este caso.

Respuesta a la pregunta 3 del enunciado (¿cómo se protege el presupuesto de latencia de la cotización cuando depende de Open Finance?): no con el :ApiGateway —que añade un salto—, sino porque :CacheOF ya tiene el perfil y la llamada a :AdaptadorOF es una actualización oportunista, no una dependencia bloqueante. EC-LAT-08 corta a 700 ms y :MsCotización resuelve con el respaldo.

Por qué las réplicas de datos son componentes de este modelo y no solo del de despliegue. :DBPolizas (Replica) y :DBSiniestros (Replica) no son la misma decisión repetida en dos servicios: son dos políticas de redundancia distintas, y lo que las separa es el conector, no el nodo. En pólizas se aplica redundancia activa: la réplica cuelga directamente de :DBPolizas y queda dentro del camino de lectura, atendiendo tráfico en producción. En siniestros se aplica redundancia pasiva: aparece un componente intermedio, :Sincronizador, precisamente porque la réplica no debe servir tráfico y solo se promueve ante la caída de la zona. Un modelo de despliegue mostraría en ambos casos dos instancias en zonas distintas y perdería esa diferencia, que es justo la decisión relevante.

Por qué activa en pólizas y pasiva en siniestros. El criterio no es la criticidad del dato sino la naturaleza del problema. En pólizas el problema es de volumen de lectura —la consulta de cobertura vigente llega desde web y desde móvil sobre el mismo dato—, así que una réplica ociosa sería capacidad pagada y desaprovechada: se pone a trabajar y se acepta el desfase acotado del RPO. En siniestros el problema es de continuidad, no de volumen: poner la réplica a servir lecturas introduciría staleness sobre un dato que el cliente lee como el estado vigente de su reclamación, así que se mantiene fuera del tráfico. Los mecanismos, las medidas y el disparador de la promoción están en §1.1.4.3.

Por qué el bajo acoplamiento no es un tema secundario aquí. Solo se puede replicar de forma independiente aquello que no arrastra a sus vecinos. Si :MsCotización dependiera de la implementación de sus colaboradores, escalarla obligaría a escalarlos con ella y desaparecería la ventaja de tener curvas de carga separadas. Es decir: la táctica de modificabilidad es la que hace posible la de escalabilidad.


1.1.3 Vista de despliegue — AWS

Proyecto Solventa — Aseguradora digital
ID VC-003
Elaboración Juan Acevedo, John Guerrero, Mauricio Rodriguez, Martin Romero
Versión 1.0
Vista Asignación / Despliegue
Modelo Despliegue

VPC con subred pública (ALB, WAF, CloudFront) y subredes privadas multi-AZ (EKS con grupos de escalado independientes, RDS PostgreSQL Multi-AZ, ElastiCache Redis, MSK/Kafka), más KMS y Secrets Manager para gestión de credenciales.

Modelo de despliegue — Solventa (AWS)

Abrir el SVG completo: files/DiagramaDespliegueSolventa.svg

1.1.3.1 Tácticas de arquitectura utilizadas para favorecer la LATENCIA
Táctica (nombre del catálogo) Familia Componente del diagrama Escenario
Introducción de concurrencia II Fan-out paralelo de :MsPerfilamiento hacia :AdaptadorOF y :AdaptadorOD EC-LAT-03 / EC-LAT-04 — p95 ≤ 400 ms · p99 ≤ 800 ms
1.1.3.2 Tácticas de arquitectura utilizadas para favorecer la ESCALABILIDAD
Táctica (nombre del catálogo) Familia Componente del diagrama Escenario
Múltiples copias de computación II Réplicas de :MsCotización + :MotorRaiting como grupo, separadas de :MsPerfilamiento + :MotorRiesgo EC-ESC-01 — 500 → 50.000 cot/min sostenidas 30 min
Incrementar los recursos de computación II Nodos de :MotorRaiting / :MotorRiesgo (cómputo intensivo, poco estado) EC-ESC-02 — capacidad ampliada ≤ 60 s
Introducción de concurrencia + contrapresión II :AdaptadorTelemetria → :TopicoTelemetria → :MotorParametrico con grupo de consumidores EC-ESC-03 — ≥ 1.000.000 eventos en 10 min, con procesamiento exactamente una vez

Las dos primeras son decisiones de la familia de asignación: su evidencia se documenta en este modelo de despliegue, no en el de componentes.

1.1.3.3 Tácticas de arquitectura utilizadas para favorecer la DISPONIBILIDAD
Táctica (nombre del catálogo) Familia Componente del diagrama Escenario
Mantener múltiples copias de datos — redundancia activa Detección/recuperación de fallas :DBPolizas → :DBPolizas (Replica), réplica de lectura en AZ-b que atiende tráfico en producción EC-LAT-10 — p95 ≤ 150 ms · RPO ≤ 30 s
Mantener múltiples copias de datos — redundancia pasiva Detección/recuperación de fallas :DBSiniestros → :Sincronizador → :DBSiniestros (Replica), standby Multi-AZ en AZ-b que no sirve tráfico EC-DISP-06 / EC-DISP-07 — RTO ≤ 10 min ante falla zonal
Monitor (heartbeat / ping-echo) Detección de fallas :Monitor vigilando :MsPolizas, :MsSiniestros y :Sincronizador; dispara la promoción de la réplica pasiva EC-DISP-06
Multi-AZ activo-activo (cómputo) Redundancia EKS Node Group replicado en AZ-a y AZ-b para los grupos de escalado A y B EC-DISP-06 — RTO ≤ 10 min ante falla zonal

El detalle de por qué pólizas usa redundancia activa y siniestros pasiva —incluyendo la tabla comparativa completa y el rol del :Sincronizador— está desarrollado en §1.1.4.3, porque es una decisión sobre el dato, no sobre el nodo de cómputo que lo aloja.

1.1.3.4 Razonamiento sobre las principales decisiones de arquitectura tomadas en este modelo

Aritmética que justifica la concurrencia. EC-LAT-07 fija ≤ 120 ms por dependencia externa y EC-LAT-03 fija 400 ms para todo el perfilamiento. Invocar :AdaptadorOF y :AdaptadorOD en serie consume 240 ms de los 400; en paralelo, 120 ms. El fan-out paralelo es, por tanto, condición necesaria para cumplir el escenario con los proveedores sanos.

Corrección tras HA-01 (18/09/2026). Esta aritmética suponía que EC-LAT-07 se cumple, y el experimento demostró que no se cumple frente a un proveedor degradado: el p95 del adaptador con proveedor lento es de 495,6 ms y el 99,78 % de sus llamadas supera los 120 ms (informe detallado). El paralelo sigue siendo mejor que el serie, pero ya no basta como justificación: con un proveedor degradado el fan-out cuesta hasta el timeout duro de 700 ms, que por sí solo excede los 400 ms de EC-LAT-03.

HA-01 validó el desacople oportunista sólo sobre el camino de cotización (:MsCotización → :CacheOF → :AdaptadorOF). El camino de perfilamiento comparte :AdaptadorOF y no se ejercitó: EC-LAT-03 y EC-LAT-04 quedan sin evidencia frente a dependencia degradada, y su cumplimiento depende de que :CacheOD/:CacheOF apliquen allí la misma táctica de actualización oportunista, lo que no está medido. Es candidato a experimento propio.

Cómo se combinan los dos escalamientos. El horizontal es la decisión por defecto, porque aporta elasticidad y tolerancia a la falla de una zona. El vertical se emplea sobre los motores de cálculo para ganar los primeros segundos de la rampa, donde el aprovisionamiento horizontal aún no ha terminado.

Por qué la disponibilidad no se resuelve con una sola política de redundancia. El diagrama de despliegue por sí solo mostraría dos instancias en zonas distintas para pólizas y para siniestros, y esa vista perdería la decisión relevante: cuál de las dos réplicas sirve tráfico. En pólizas el problema es de volumen de lectura (web y móvil consultando la misma cobertura vigente), así que la réplica se pone a trabajar y se acepta el desfase acotado del RPO — es redundancia activa. En siniestros el problema es de continuidad, no de volumen: dejar que la réplica sirva lecturas introduciría staleness sobre un dato que el cliente interpreta como el estado vigente de su reclamación, así que se mantiene fuera del tráfico y solo se promueve cuando el :Monitor detecta la caída de la zona — es redundancia pasiva. El :Sincronizador es el componente que hace esa diferencia visible en el despliegue: sin él, ambas réplicas se verían idénticas.

Qué no resuelve esta redundancia. La disponibilidad ante falla de zona (este modelo) y la latencia de consulta del estado de siniestro (EC-LAT-11, resuelta con CQRS en el experimento HA-08 de §1.3) son dos problemas distintos que comparten componente pero no solución: la réplica pasiva de :DBSiniestros no está diseñada para servir el p95 ≤ 150 ms que exige la consulta de estado, solo para sobrevivir a la caída de la zona.


1.1.4 Vista de información

1.1.4.1 Modelo de datos
Proyecto Solventa — Aseguradora digital
ID VC-004
Elaboración Juan Acevedo, John Guerrero, Mauricio Rodriguez, Martin Romero
Versión 1.0
Vista Información / Dominio
Modelo Dominio / Datos (entidad-relación por microservicio)

Convención

Rectángulo (entidad) Entidad del dominio de negocio
+ atributo Campo público / dato de negocio relevante
--> Asociación dirigida entre entidades
"1", "0..*", "1..*" Cardinalidad de la relación
Etiqueta en arista Rol o verbo de la relación (p. ej. otorga, genera)

Formato del diagrama

Lenguaje Diagrama entidad-relación publicado como SVG
Orientación Agrupado por microservicio
Alcance Entidades y relaciones del caso Solventa (cotización → póliza → siniestro / pago)

Modelo entidad-relación por microservicio (ms_identidad, ms_consentimiento, ms_cotizacion, ms_perfilamiento, ms_suscripcion, ms_polizas, ms_siniestros, ms_pagos, ms_parametrico, ms_socios, analitica, notificaciones), con claves foráneas cruzando límites de servicio donde aplica.

Modelo de datos — Solventa

Abrir el SVG completo: files/ModeloDatosSolventa.svg

1.1.4.2 Flujo de control sobre el modelo de información
Proyecto Solventa — Aseguradora digital
ID VC-007
Elaboración Juan Acevedo, John Guerrero, Mauricio Rodriguez, Martin Romero
Versión 1.0
Vista Información / Dominio
Modelo Flujo de control (secuencia) sobre las estructuras de datos
Alcance Los dos recorridos que mueven el estado de la póliza: cotización con perfilamiento, y emisión con propagación asíncrona. No cubre siniestros, pagos ni telemetría paramétrica.

Convención

actor Origen de la petición fuera del sistema (socio de distribución, canal embebido)
boundary Frontera del sistema: API Gateway / BFF, Adaptador Open Finance y el proveedor externo
control Microservicio que orquesta el recorrido (Cotización & Rating, Emisión & Pólizas)
entity Estructura de datos en caché (Caché de Perfiles, Redis Multi-AZ)
database Almacén transaccional propio del servicio (DB Pólizas, PostgreSQL)
queue Conector asíncrono de transferencia de estado (Event Broker, Apache Kafka)
alt / else Bifurcación del flujo de control
Flecha punteada Retorno de la llamada

Vista de información — Flujo de control

Abrir la imagen completa: out/images/vista_informacion_flujo_control/Solventa_Vista_Informacion_Flujo_Control.png · Fuente PlantUML: images/vista_informacion_flujo_control.puml

Recorrido 1 — Cotización y perfilamiento (pasos 1 a 13). El control entra por el API Gateway / BFF y baja al microservicio de Cotización & Rating, que primero consulta la caché de perfiles. Con acierto de caché (perfil válido < 24 h) el recorrido termina ahí y no hay salida a la red externa. Con fallo o perfil desactualizado se invoca al Adaptador Open Finance contra el proveedor, con timeout duro de 700 ms; si el proveedor responde dentro del presupuesto de ≤ 120 ms por dependencia externa, el perfil se enriquece, y si falla o excede el corte, el adaptador devuelve un perfil estándar por defecto y el flujo continúa. En ambas ramas el perfil calculado se reescribe en caché con TTL de 24 h antes de calcular la prima. Es el mismo comportamiento que fija EC-LAT-09 y que se argumenta en §1.1.4.4.

Recorrido 2 — Emisión, persistencia y consistencia eventual (pasos 14 a 20). Emisión & Pólizas escribe la póliza en su propio almacén y espera el commit; solo después publica PolizaEmitidaEvent en el broker y responde al socio. Notificación legal, conciliación de recaudo y auditoría regulatoria (SFC) quedan del lado asíncrono, fuera del camino crítico de la respuesta — es la táctica limitar la respuesta a los eventos de §1.1.2.1 vista desde los datos, y sostiene tanto EC-LAT-05 como la trazabilidad que exige EC-SEG-04.

Estructuras de datos que atraviesan el flujo

Estructura Dónde vive Qué transporta
solicitudDTO Entrada del gateway hacia Cotización & Rating Cliente, ConsentimientoToken, DatosRiesgo
PerfilRiesgo Caché de perfiles (Redis Multi-AZ) Score y segmento; TTL de 24 h
Señales financieras Respuesta del proveedor Open Finance Endeudamiento, capacidad de pago
Perfil estándar por defecto Adaptador Open Finance (rama degradada) Valor de respaldo cuando el tercero no responde a tiempo
OfertaSeguroDTO Retorno de la cotización OfertaID, prima calculada, coberturas, vigencia
ComandoEmisionDTO Entrada de la emisión OfertaID, TokenPagoConfirmado
Poliza DB Pólizas (PostgreSQL) NumeroPoliza, estado EMITIDA, FirmaHash
PolizaEmitidaEvent Tópico del Event Broker Payload transaccional para notificaciones, recaudo y auditoría
PolizaEmitidaDTO Retorno de la emisión NumeroPoliza, estado, HashFirmaLegal
1.1.4.3 Estrategia de replicación (activa/pasiva)

Cada almacén propio se replica sobre las subredes privadas multi-AZ de §1.1.3, pero no con la misma política en todos los servicios: la decisión se fija en este modelo.

Estrategia de replicación — MsPolizas (activa) y MsSiniestros (pasiva)

Abrir la imagen completa: out/images/DiagramaRedundanciaPolizasSiniestros/DiagramaRedundanciaPolizasSiniestros.png · Fuente PlantUML: images/DiagramaRedundanciaPolizasSiniestros.puml

Redundancia activa — :MsPolizas Redundancia pasiva — :MsSiniestros
Qué hace la réplica Atiende lecturas en producción todo el tiempo No sirve tráfico; el Sincronizador la mantiene al día
Mecanismo Streaming replication de RDS PostgreSQL hacia una read replica en AZ-b Standby Multi-AZ en AZ-b alimentado por el Sincronizador
Atributo que sostiene Latencia — descarga de lecturas del nodo de escritura Disponibilidad — continuidad ante caída de zona
Escenario EC-LAT-10 — p95 ≤ 150 ms EC-DISP-06 / EC-DISP-07
Medida declarada RPO ≤ 30 s RTO ≤ 10 min
Quién dispara el cambio — (la réplica ya está en el camino de lectura) El Monitor promueve la réplica a principal

Por qué dos políticas de redundancia y no una sola. En pólizas el problema es de volumen de lectura: la consulta de cobertura vigente llega desde web y desde móvil sobre el mismo dato, y mantener una réplica ociosa sería pagar capacidad que hoy alivia al nodo de escritura. Por eso la réplica está en el camino de lectura y se acepta el desfase acotado del RPO. En siniestros el problema no es volumen sino continuidad: poner una réplica a servir lecturas ahí introduciría staleness sobre un dato que el cliente interpreta como estado vigente de su reclamación, así que la réplica se mantiene fuera del tráfico y solo se promueve cuando el Monitor (heartbeat / ping-echo) detecta la caída de la zona.

Qué no resuelve esta réplica. La lectura de baja latencia del estado de siniestro (EC-LAT-11) no se atiende con la réplica de disponibilidad: se atiende con un modelo de lectura separado (CQRS), que es precisamente la hipótesis que valida el experimento de §1.3 sobre la historia HA-08. Separar los dos problemas —disponibilidad de la zona por un lado, latencia de consulta por el otro— es la decisión de fondo de este modelo: mezclarlos habría llevado a exigirle a una réplica de failover un objetivo de desempeño que no está diseñada para cumplir.

Dónde queda el detector de fallas. Las dos políticas de redundancia sí quedan catalogadas como tácticas sobre el modelo C&C, en §1.1.2.3, porque las réplicas y el Sincronizador son componentes del diagrama de componentes. El Monitor que emite heartbeat / ping-echo hacia :MsPolizas, :MsSiniestros y el Sincronizador solo aparece en este modelo de replicación: es una táctica de disponibilidad, no de desempeño, y por eso no figura en el catálogo de §1.2.4 ni de §1.2.5.

1.1.4.4 Razonamiento sobre las decisiones de datos

Este modelo no aporta tácticas propias: el catálogo clasifica como Modelo C&C la única táctica que actúa sobre los datos (múltiples copias de datos), de modo que su ficha vive en §1.1.2.1. Lo que sigue es el razonamiento sobre las decisiones de información que ese reparto implica. La estrategia de replicación entre zonas se desarrolla en el apartado anterior, §1.1.4.3.

Un almacén por servicio, no un esquema compartido. El estilo de microservicios de §1.2.3 define cada unidad desplegable con almacén propio; por eso el modelo entidad-relación está agrupado por microservicio (ms_identidad, ms_consentimiento, ms_cotizacion, ms_perfilamiento, ms_suscripcion, ms_polizas, ms_siniestros, ms_pagos, ms_parametrico, ms_socios, analitica, notificaciones) y no como un esquema único. Lo que se paga a cambio está declarado en el mismo estilo: consistencia distribuida. Las claves foráneas que cruzan límites de servicio son la excepción explícita del modelo, no la regla.

Dónde se acepta consistencia eventual y dónde no. Aplica la regla de reparto de §1.2.3: es síncrono lo que el usuario espera mirando la pantalla (cotizar, perfilar, suscribir, emitir) y asíncrono lo que puede converger después (notificar, analizar, conciliar, telemetría paramétrica). Por eso la información que alimenta a :Analitica, :Notificaciones y :Documentos se propaga por :BusEventos y se lee con consistencia eventual, mientras que la cadena cotización → póliza → siniestro / pago mantiene consistencia inmediata dentro de su propio almacén. El costo declarado del estilo publicador-suscriptor —consistencia eventual e idempotencia— se paga solo de ese lado, y es el mismo requisito de procesamiento exactamente una vez que fija EC-ESC-03.

Copias hacia proveedores externos. Además de la replicación entre zonas (§1.1.4.3), :CacheOF y :CacheOD conservan una copia local con valor de respaldo del perfil de Open Finance / Open Data: la llamada al adaptador es una actualización oportunista y no una dependencia bloqueante, que es lo que permite resolver EC-LAT-09 sin depender de la disponibilidad del tercero.


1.1.5 Arquitectura del portal web (MVVM)

Proyecto Solventa — Aseguradora digital
ID VC-005
Elaboración Juan Acevedo, John Guerrero, Mauricio Rodriguez, Martin Romero
Versión 1.0
Vista Desarrollo / capas
Modelo Patrón MVVM del portal web (Angular)
Alcance Solo el canal web (SPA Angular). No cubre el cliente móvil, el BFF ni los microservicios.

Diagrama de componentes del portal web Angular: View (componentes standalone, sin lógica de negocio) → ViewModel (estado observable con signals, expone loading / ready / degraded / error) → Model (dominio puro, casos de uso y puertos, arquitectura hexagonal en el front). Cada uno de los cinco recorridos críticos (cotización, suscripción y emisión, perfilamiento hipotecario, siniestro asistido, ciclo de vida de póliza) es un feature module con lazy loading.

Arquitectura MVVM — Portal web Solventa

Abrir en tamaño completo: files/Diagram-web/solventa-portal-web-mvvm.png · Fuente PlantUML: files/Diagram-web/solventa-portal-web-componentes_1.puml · Documento completo (razonamiento, código de ejemplo, convenciones de carpetas, riesgos): files/Diagram-web/mvvm-portal-web-solventa_1.md


1.1.6 Arquitectura del cliente móvil (Android)

Proyecto Solventa — Aseguradora digital
ID VC-006
Elaboración Juan Acevedo, John Guerrero, Mauricio Rodriguez, Martin Romero
Versión 1.0
Vista Desarrollo / capas
Modelo Capas del cliente Android (Clean Architecture + MVVM + Repository)

Diagrama de capas en tiempo de ejecución de la app Android (Kotlin / Jetpack). No describe el sistema Solventa completo: cubre el canal móvil (login, póliza, siniestro con evidencia, pagos y renovación) y cómo el cliente se conecta al Mobile BFF y a Room en modo offline-first. El bloque Identidad (derecha) concentra biometría, tokens y el interceptor JWT.

Capas (izquierda → derecha)

Capa Responsabilidad
Presentation (Jetpack + MVVM) MainActivity y fragments (LoginFragment, DetalleFragment, PagoFragment, RenovacionFragment) observan ViewModels (StateFlow / LiveData / UiState). Push vía FCM. El ViewModel invoca casos de uso; no habla con red ni con Room.
Domain Casos de uso (EntrarAlSistema, ReportarSiniestro, ValidarCodigos, ConsultarPagos, RenovarPoliza, SincronizarUsuario) y contratos de repositorio (Póliza / Siniestro / Pago). Sin APIs de Android.
Data (Repository) *RepositoryImpl orquesta remoto vs local: Retrofit y DTO → Mobile BFF; DAOs → Room (SQLite). WorkManager encola evidencia diferida.
Identidad BiometricPrompt (huella / rostro; fallback PIN) desbloquea la sesión en el dispositivo. TokenStore (DataStore / EncryptedPrefs) y AuthInterceptor (OkHttp) inyectan JWT solo en APIs protegidas. Login y refresh no llevan access token; Room y Push no pasan por el interceptor. El JWT se valida en el BFF.

Arquitectura Android Solventa — capas (Clean + MVVM + Repository)

Abrir el SVG completo: images/android-arquitectura-runtime.svg


1.2 Diseño detallado de arquitectura

1.2.1 Marco conceptual

Nivel Qué es Qué gobierna
Estilo arquitectónico Decisión de primer nivel y alto grado de abstracción. Establece vocabulario, reglas y lineamientos sobre la topología del modelo y su semántica. Determina qué atributos de calidad quedan intrínsecamente favorecidos o desfavorecidos.
Táctica arquitectónica Técnica que modifica, refina y especializa un estilo en puntos y componentes específicos. Asegura la respuesta y la medida de respuesta estipuladas en un escenario de calidad.
Patrón de diseño Solución conocida a un problema recurrente de estructuración y asignación de responsabilidades entre clases y objetos. Conecta la táctica con el código.
Familia de modelos Qué hace evidente Elementos
Módulo Unidades de implementación (tiempo de desarrollo). Clases, paquetes, capas; relaciones usa a / depende de.
Componente y Conector (C&C) Ejecución en tiempo de corrida. Componentes y conectores — el conector es el elemento determinante para el cumplimiento del atributo de calidad.
Asignación Asignación de software a entidades del mundo real. Despliegue (nodos), concurrencia (procesos/hilos), asignación de trabajo.

Catálogo de desempeño del curso. Desempeño = habilidad de cumplir requerimientos de tiempo; se subdivide en latencia (tiempo entre evento y respuesta) y escalabilidad (incrementar la carga sin perjudicar los tiempos de respuesta).

Familia I — control del acceso a recursos compartidos Familia II — incremento y manejo de recursos disponibles
Manejo de la prioridad de los eventos Introducción de concurrencia
Limitar la respuesta a los eventos Múltiples copias de computación (horizontal)
Incrementar la latencia de los recursos Incrementar los recursos de computación (vertical)
Múltiples copias de datos

La utilización de un API gateway está catalogada por el material como táctica de disponibilidad (ocultar localización e instancias, enmascarar fallas), con uso complementario en seguridad.


1.2.2 Modelos de referencia

Las decisiones de este documento se sustentan sobre los siguientes modelos:

Modelo Vista Enlace
Modelo de componentes Funcional — Componente y Conector §1.1.2 Vista funcional — Modelo de componentes
Modelo de despliegue Asignación §1.1.3 Vista de despliegue — AWS
Modelo de datos Información §1.1.4 Vista de información

1.2.3 Estilos arquitectónicos

Estilo Familia Dónde vive Favorece Sacrifica
Microservicios C&C Dominio · Venta y Dominio · Operación como unidades desplegables con almacén propio Escalabilidad selectiva, modificabilidad Latencia de red interna, consistencia distribuida
Llamada-retorno sincrónico (N-niveles) C&C APISocios → :MsCotización → :MotorRaiting Baja latencia y consistencia inmediata en el journey de venta Acoplamiento temporal
Publicador-suscriptor (EDA) C&C :BusEventos → :Analitica, :Notificaciones, :Documentos; :ColaPagos tras :MsPagos; :TopicoTelemetria → :MotorParametrico Escalabilidad: absorbe picos con contrapresión, admite consumidores nuevos sin tocar productores Consistencia eventual, idempotencia
Capas + adaptadores (anticorrupción) Módulo :AdaptadorOF, :AdaptadorOD, :AdaptadorPasarela, :AdaptadorKYC, :AdaptadorTelemetria Modificabilidad e integrabilidad Una indirección más por llamada

Regla de reparto. Es síncrono lo que el usuario espera mirando la pantalla (cotizar, perfilar, suscribir, emitir). Es asíncrono lo que puede converger después (notificar, analizar, conciliar, telemetría paramétrica). Esa frontera es la decisión que más pesa sobre latencia y escalabilidad a la vez.


1.2.4 Tácticas de LATENCIA

Esta sección queda como índice de trazabilidad: cada táctica se detalla ahora dentro del modelo que la hace evidente, junto al diagrama correspondiente.

Táctica (nombre del catálogo) Familia Modelo donde está presente Detalle
Múltiples copias de datos II Modelo C&C §1.1.2.1 — Vista funcional
Limitar la respuesta a los eventos I Modelo C&C §1.1.2.1 — Vista funcional
Introducción de concurrencia II Modelo C&C y de Asignación §1.1.2.1 — Vista funcional · §1.1.3.1 — Vista de despliegue

Razonamiento asociado: §1.1.2.4 — protección del presupuesto de latencia frente a Open Finance — y §1.1.3.4 — aritmética que justifica la concurrencia.


1.2.5 Tácticas de ESCALABILIDAD

Esta sección queda como índice de trazabilidad: cada táctica se detalla ahora dentro del modelo que la hace evidente, junto al diagrama correspondiente.

Táctica (nombre del catálogo) Familia Modelo donde está presente Detalle
Múltiples copias de computación II Modelo de Asignación (despliegue) §1.1.3.2 — Vista de despliegue
Incrementar los recursos de computación II Modelo de Asignación (despliegue) §1.1.3.2 — Vista de despliegue
Introducción de concurrencia + contrapresión II Modelo C&C y de Asignación §1.1.2.2 — Vista funcional · §1.1.3.2 — Vista de despliegue

Razonamiento asociado: §1.1.2.4 — por qué :MsCotización y :MsPerfilamiento son componentes separados — y §1.1.3.4 — cómo se combinan los dos escalamientos.


1.2.6 Tácticas de MODIFICABILIDAD y otras del catálogo

Esta sección queda como índice de trazabilidad: cada táctica se detalla ahora dentro del modelo que la hace evidente, junto al diagrama correspondiente.

Táctica (nombre del catálogo) Atributo Modelo donde está presente Detalle
Reducción del acoplamiento Modificabilidad Modelo de Módulo §1.1.2.3 — Vista funcional
Mantener alta cohesión Modificabilidad Modelo de Módulo §1.1.2.3 — Vista funcional
Utilización de un API Gateway Disponibilidad y seguridad Modelo C&C §1.1.2.3 — Vista funcional
Redundancia activa Disponibilidad y latencia Modelo C&C §1.1.2.3 — Vista funcional · §1.1.4.3 — Estrategia de replicación
Redundancia pasiva + sincronización de estado Disponibilidad Modelo C&C §1.1.2.3 — Vista funcional · §1.1.4.3 — Estrategia de replicación

Razonamiento asociado: §1.1.2.4 — por qué el bajo acoplamiento no es un tema secundario aquí, y por qué la redundancia es activa en pólizas y pasiva en siniestros — §1.1.4.3 — mecanismos, medidas y disparador de la promoción — y §1.1.4.4 — consecuencias sobre el modelo de información.


1.2.7 Patrones de diseño que aterrizan las tácticas

Cada patrón se presenta con la táctica que aterriza (descrita en §1.2.4, §1.2.5 o §1.2.6), el componente donde vive, el modelo que lo hace evidente, el escenario que sostiene y la razón por la que se tomó la decisión — no solo qué hace, sino qué alternativa se descartó y qué se aceptó a cambio.


1.2.7.1 Fachada (GoF)
Táctica que aterriza Utilización de un API Gateway (disponibilidad y seguridad): ocultar la localización y disponibilidad de los microservicios y enmascarar fallas.
Componente del diagrama :ApiGateway con :APISocios, :BFFWeb, :BFFMovil, :ApiTelemetria
Modelo donde está presente Modelo C&C
Escenario EC-INT-04 — evolución compatible de contratos multicanal
ASR HA-31

Por qué esta decisión. Solventa expone su núcleo a cuatro canales con ciclos de vida independientes: una app móvil que queda instalada en el dispositivo del cliente, un portal web, más de treinta socios que integran una vez y no vuelven a tocar el código, y un flujo de telemetría. Sin un punto de entrada único, cada canal quedaría atado a la topología interna del backend: dividir un microservicio o cambiar su dirección obligaría a coordinar el redespliegue de apps ya instaladas y de integraciones de terceros que Solventa no controla. La alternativa —exponer los microservicios directamente— era más simple y más rápida, pero congelaba la estructura interna. Se aceptó un salto de red adicional en el camino crítico a cambio de poder reorganizar el backend sin romper contratos externos, y como beneficio secundario el punto único es donde se concentran el control de acceso y el enmascaramiento de fallas.

Patrón Fachada


1.2.7.2 BFF — Backend for Frontend (patrón de canal)
Táctica que aterriza Utilización de un API Gateway, especializada por canal. Protege además el presupuesto de latencia al agregar en el borde, aunque la agregación no es una táctica nombrada del catálogo de desempeño.
Componente del diagrama :BFFWeb y :BFFMovil, separados de :APISocios
Modelo donde está presente Modelo C&C
Escenarios EC-INT-04 · EC-LAT-05
ASR HA-31 · HA-05

Por qué esta decisión. Los tres canales no piden lo mismo. La web cubre la gestión completa del negocio; el móvil un subconjunto de tareas rápidas con evidencia, biometría y modo offline; los socios solo cotización y emisión embebidas. Una API única para los tres obligaría a servir el máximo común denominador, y el cliente compensaría la diferencia con varias llamadas encadenadas — un costo que se paga directamente contra el presupuesto de 1,5 s de EC-LAT-05. La alternativa era una sola API y clientes más gordos; se descartó porque traslada al canal un trabajo de composición que el borde hace mejor y más cerca de los datos. Se aceptó mantener tres piezas de borde en vez de una a cambio de que cada canal evolucione a su propio ritmo y de que la agregación ocurra donde no cuesta latencia.

Patrón BFF


1.2.7.3 Adaptador / Capa anticorrupción (GoF + DIP)
Táctica que aterriza Reducción del acoplamiento (modificabilidad): usar APIs e intermediarios para que el dominio no dependa de la implementación del proveedor.
Componente del diagrama :AdaptadorOF, :AdaptadorOD, :AdaptadorPasarela, :AdaptadorKYC, :AdaptadorTelemetria
Modelo donde está presente Modelo de Módulo
Escenarios EC-MOD-05 · EC-INT-03
ASR HA-28 · HA-30

Por qué esta decisión. El enunciado es explícito en que gran parte del valor del negocio depende de integraciones fuera del control de Solventa, y que la regulación de Finanzas Abiertas sigue madurando. Sin una capa de traducción, el esquema de cada proveedor se filtraría hasta el dominio: los campos de Open Finance aparecerían dentro del motor de riesgo y los de la pasarela dentro de pagos. Ese acoplamiento convierte un cambio de proveedor —o un cambio normativo del proveedor— en un cambio transversal que toca varios componentes. Se aceptó una indirección adicional por llamada a cambio de que la sustitución de un tercero quede contenida en un solo módulo, que es exactamente lo que EC-MOD-05 exige medir.

Patrón Adaptador


1.2.7.4 Mediador (GoF)
Táctica que aterriza Limitar la respuesta a los eventos (latencia, familia I) e introducción de concurrencia + contrapresión (escalabilidad, familia II).
Componente del diagrama :BusEventos
Modelo donde está presente Modelo C&C
Escenario EC-ESC-03
ASR HA-11

Por qué esta decisión. Un mismo hecho de negocio —una póliza emitida, un siniestro aprobado, un pago aplicado— le interesa a varios consumidores a la vez: analítica, notificaciones, documentos, y mañana fraude o reportes al regulador. Con comunicación punto a punto, cada consumidor nuevo obliga a modificar y redesplegar al productor, y la lista de consumidores solo crece con el negocio. El mediador invierte esa dependencia: el productor publica el hecho y deja de saber quién lo escucha. Se aceptó consistencia eventual —y la obligación de resolver idempotencia y trazabilidad— a cambio de poder sumar consumidores sin tocar productores y de absorber picos con contrapresión en lugar de propagarlos.

Patrón Mediador


1.2.7.5 Singleton (GoF)
Táctica que aterriza Es consecuencia obligada de Introducción de concurrencia (§1.2.4) y Múltiples copias de computación (§1.2.5), ambas de familia II: sin él, esas dos tácticas se anulan entre sí.
Componente del diagrama Pool de conexiones dentro de cada réplica de :MotorRaiting y :MotorRiesgo
Modelo donde está presente Modelo de Asignación (concurrencia y despliegue)
Escenarios EC-LAT-03 · EC-ESC-01
ASR HA-03 · HA-09

Por qué esta decisión. No es una elección estética: es la consecuencia obligada de haber adoptado concurrencia. La táctica de introducción de concurrencia multiplica los hilos dentro de cada réplica, y la de múltiples copias de computación multiplica las réplicas. Si cada hilo abriera su propio pool, las conexiones contra el almacén crecerían como hilos × réplicas — con 4 hilos y 20 réplicas son 80 pools golpeando la misma base. La contienda que se eliminó en el cómputo reaparecería en la persistencia, y las dos tácticas de escalamiento se anularían entre sí. Una única instancia por proceso acota las conexiones y deja que el paralelismo escale sin castigar el almacén.

Patrón Singleton


1.2.7.6 Experto (GRASP)
Táctica que aterriza Mantener alta cohesión (modificabilidad). Protege además el presupuesto de las tácticas de latencia al eliminar un salto de red del camino crítico.
Componente del diagrama :MotorRiesgo decide sobre el perfil; :MotorParametrico sobre el umbral
Modelo donde está presente Modelo de Módulo
Escenario EC-LAT-03 — p95 ≤ 400 ms
ASR HA-03

Por qué esta decisión. En una arquitectura distribuida cada decisión que se toma lejos de su dato cuesta un viaje de red, y ese viaje se descuenta de un presupuesto de 400 ms del que 120 ms ya están comprometidos por dependencia externa. La alternativa natural —un motor de reglas central que decidiera por todos los dominios— habría sido más fácil de gobernar, pero obligaría a que perfilamiento le enviara el perfil completo y esperara, y convertiría ese motor en cuello de botella común y en punto único de acoplamiento. Se prefirió pagar en gobierno (dos motores en vez de uno) para no pagar en latencia, poniendo cada decisión pegada al componente que ya tiene la información para tomarla.

Patrón Experto


1.2.7.7 Alta Cohesión (GRASP)
Táctica que aterriza Mantener alta cohesión (modificabilidad): que las responsabilidades de cada componente estén ligadas a un único propósito.
Componente del diagrama Paquete Dominio · Venta; :MotorRaiting como única razón de cambio del precio
Modelo donde está presente Modelo de Módulo
Escenario EC-MOD-03 — regla de precio
ASR HA-26

Por qué esta decisión. El precio y la política de aceptación de riesgo cambian con una frecuencia que dicta actuaría, no ingeniería, y cambian por razones distintas entre sí. Si esa lógica viviera dentro de los orquestadores, cada ajuste de fórmula obligaría a redesplegar la cotización completa y a arrastrar en el mismo despliegue código que no cambió. Se separó el motor de quien lo orquesta para que la unidad de cambio coincida con la unidad de despliegue, que es la condición que EC-MOD-03 mide: el 100 % del cambio se despliega sin tocar componentes ajenos al motor de rating.

Patrón Alta Cohesión


1.2.7.8 Bajo Acoplamiento (GRASP)
Táctica que aterriza Reducción del acoplamiento (modificabilidad). Es precondición de múltiples copias de computación: solo se replica de forma independiente lo que no arrastra a sus vecinos.
Componente del diagrama Interfaces provided/required entre componentes; :BusEventos como intermediario; capa de adaptadores
Modelo donde está presente Modelo de Módulo
Escenarios EC-MOD-05 · EC-INT-04
ASR HA-28 · HA-31

Por qué esta decisión. El bajo acoplamiento se suele justificar solo por modificabilidad, pero en este caso es precondición de los dos atributos priorizados: solo se puede replicar de forma independiente aquello que no arrastra a sus vecinos. Si :MsCotización dependiera de la implementación de sus colaboradores, escalarla obligaría a escalarlos con ella y desaparecería la ventaja de tener curvas de carga separadas. Por eso se aplicaron los tres mecanismos del catálogo a la vez —interfaz, intermediario orientado a mensajes y adaptador— en lugar de conformarse con uno. Se aceptó más piezas y más contratos que mantener a cambio de que el escalamiento selectivo sea realmente posible.

Patrón Bajo Acoplamiento


1.2.7.9 Inversión de dependencias (SOLID)
Táctica que aterriza Reducción del acoplamiento (modificabilidad), en su forma más estricta: el dominio no controla el ciclo de vida de su colaborador.
Componente del diagrama Contratos entre el dominio y la capa de adaptadores
Modelo donde está presente Modelo de Módulo
Escenarios EC-MOD-05 · EC-INT-03
ASR HA-28 · HA-30

Por qué esta decisión. Tener adaptadores no basta: si el dominio conociera al adaptador concreto y controlara su creación, seguiría atado a una implementación y el beneficio se perdería en el primer cambio de proveedor. Invertir la dependencia significa que el dominio declara qué necesita y recibe una abstracción ya construida, sin saber quién la implementa ni gestionar su ciclo de vida. Ese detalle es lo que convierte la contención del cambio en una propiedad verificable: por eso EC-MOD-05 puede exigir que el 100 % del cambio quede dentro del módulo de integración, y EC-INT-03 que el 100 % de los consumidores existentes siga operando sin modificación.

Patrón Inversión de dependencias


1.2.7.10 Creador (GRASP)
Táctica que aterriza Reducción del acoplamiento (modificabilidad): concentrar la creación en un solo responsable evita que varios objetos dependan entre sí para instanciarse.
Componente del diagrama :MsCotización crea la oferta; :MsSiniestros crea la evidencia y la evaluación
Modelo donde está presente Modelo de Módulo y modelo de dominio
Escenario EC-MOD-01
ASR HA-25

Por qué esta decisión. En una arquitectura de microservicios con base de datos por servicio, la pregunta de quién instancia cada entidad no es un detalle de código: determina qué servicio es dueño de su ciclo de vida y, por lo tanto, de su almacén. Si un componente ajeno creara la evidencia de un siniestro, tendría que conocer el estado de la reclamación y quedaría acoplado al servicio que la gobierna, rompiendo la frontera del dato. Aplicar la regla de que crea quien contiene y usa estrechamente al objeto confina el ciclo de vida de cada entidad a su microservicio, que es la precondición del almacén propio por servicio y de la trazabilidad entre las tres vistas: componente que crea → entidad de dominio → esquema propietario.

Patrón Creador


1.2.7.11 Única Responsabilidad (SRP) y Abierto/Cerrado (OCP)
Táctica que aterriza Mantener alta cohesión y reducción del acoplamiento (modificabilidad): unidades pequeñas, con una sola razón de cambio y un punto de extensión propio.
Componente del diagrama Tres pares orquestador / motor: :MsCotización–:MotorRaiting, :MsPerfilamiento–:MotorRiesgo, :MsSiniestros–:MotorParametrico
Modelo donde está presente Modelo de Módulo
Escenarios EC-MOD-01 · EC-MOD-04
ASR HA-25 · HA-27

Por qué esta decisión. El negocio de Solventa crece incorporando ramos: viaje, dispositivos, microseguros de vida, paramétricos, protección de pagos. Si cada ramo nuevo obligara a modificar los orquestadores, el costo de crecer aumentaría con el tamaño del portafolio y la meta de expansión regional se volvería inviable. Al concentrar la variabilidad del negocio en los motores, cada motor tiene una sola razón de cambio (SRP) y a la vez es el único punto por donde el producto se extiende (OCP). Son las dos caras de la misma decisión: lo que hace barato modificar es exactamente lo que hace barato extender. Que el patrón aparezca tres veces, y no una, es lo que lo convierte en principio aplicado y no en coincidencia.

Principios SRP y OCP


1.2.8 Trade-offs asumidos

Un trade-off es lo que se sacrifica para conseguir algo. Ninguna decisión mejora todos los atributos a la vez; lo que sigue no son defectos ni deuda pendiente, sino decisiones conscientes con su mitigación.

Decisión Se gana Se sacrifica Mitigación
Microservicios sobre monolito modular Escalamiento selectivo por curva de carga Latencia de red interna, complejidad operativa Presupuesto de latencia por salto; fronteras alineadas con capacidades de negocio para evitar el monolito distribuido
:BusEventos para el flujo paramétrico Absorción de picos; consumidores nuevos sin tocar productores Consistencia eventual Idempotencia por clave de evento
:CacheOF / :CacheOD en el camino crítico Presupuesto protegido ante terceros degradados Decidir con datos menos frescos TTL por fuente + linaje de toda cotización resuelta con respaldo
:ColaPagos solo en :MsPagos, no en los demás dominios Durabilidad y reintento idempotente donde se mueve dinero Asimetría respecto de los demás recorridos Es deliberada: el flujo de dinero exige durabilidad y aplicación exactamente una vez, exigencia que los demás recorridos no tienen
:ApiGateway como punto único Enmascaramiento de fallas y superficie de ataque reducida Un salto extra en el camino crítico y un punto de congestión Replicado y multi-zona; sin lógica de negocio en el gateway
Escalamiento horizontal como decisión por defecto Elasticidad y tolerancia a la falla de una zona Mayor tiempo de aprovisionamiento en la rampa inicial Escalamiento vertical de los motores de cálculo para cubrir los primeros segundos del pico

1.2.9 Fuentes

  • Enunciado del caso: files/MISW4501-202614-Proyecto.pdf — §4 Ecosistema de integraciones, §6.1 Latencia, §6.2 Escalabilidad, §8 Decisiones de arquitectura, §9 Preguntas de discusión.
  • Hoja de trabajo — objetivos de negocio y escenarios de calidad EC-*.
  • Visión de arquitectura — modelos de contexto, dominio, componentes, datos y despliegue.

1.3 Resultados finales de experimentación

Los dos experimentos de arquitectura quedan ejecutados y cerrados. En la semana 6, HA-01 estaba al 60 % —montaje implementado, sin corridas—; en esta semana se ejecutó la campaña completa y ambos experimentos llegan al 100 %.

1.3.1 Evidencias de la experimentación

Experimento ASR que valida Montaje y carga ejecutada Métricas medidas % de avance Evidencias
HA-08 — Modelo de lectura de baja latencia para el estado de siniestro (CQRS con proyección materializada y caché) EC-LAT-11 — Latencia, prioridad (A,A) Docker Compose con API de consulta (tres brazos: A lectura directa normalizada, B proyección materializada, C proyección + caché), proyector, simulador de eventos, PostgreSQL, Redis, Redpanda, Prometheus y Grafana. Dataset de 1.000.000 de siniestros. 20 corridas ejecutadas: 9 contrabalanceadas (cuadrado latino, rampa 10→80 req/s), 8 de sensibilidad al TTL (0 s / 300 s, n=3 cada una) y 3 de alta carga (pico de 600 req/s). p95, p50 y p99 extremo a extremo (k6); latencia interna del servicio; hit-rate de caché; lag de proyección; CPU y memoria por contenedor en serie; tasa de error y dropped_iterations. 100 % · Diseño del experimento
· Informe del experimento
· Informe detallado
· Implementación y datos crudos
HA-01 — Protección del presupuesto de latencia de la cotización embebida EC-LAT-01, EC-LAT-02 y EC-LAT-09 — Latencia, prioridad (A,A); restricciones EC-LAT-07 (≤ 120 ms por dependencia) y EC-LAT-08 (timeout duro de 700 ms) Docker Compose con :MsCotización (cuatro brazos: A invocación bloqueante sin caché, B cache-aside bloqueante en fallo, C actualización oportunista con valor de respaldo, C′ C + coalescencia), :AdaptadorOF con circuit breaker y aislamiento por proveedor, doble del proveedor con latencia log-normal, Toxiproxy para inyección de fallas, Redis, PostgreSQL, Prometheus y Grafana. 56 corridas ejecutadas sobre un protocolo de tres fases (120 s sana + 120 s degradada + 60 s de recuperación): seis estados del proveedor, cinco tasas de acierto (99/98/96/90/50 %), dos políticas de interruptor en dos niveles de tráfico, cuatro escalones de llegada (20/50/100/200 sol/s) y celdas de estampida para aislar la coalescencia. p95 y p99 en el servicio; fracción exacta de cotizaciones por encima de 475 ms (conteo directo de buckets, métrica decisoria); proporción resuelta con valor de respaldo; latencia del adaptador cortada por fase; tiempo hasta la apertura del interruptor; invocaciones en vuelo y coalescidas; lag del bucle de eventos. 100 % · Diseño del experimento
· Informe del experimento
· Informe detallado
· Estado de las corridas
· Implementación y datos crudos

Trazabilidad de la evidencia cruda. En ambos experimentos cada cifra citada es recalculable sin reproducir las corridas: los datos crudos por corrida están versionados en el repositorio de código (métricas finales, configuración efectiva, verificaciones de sanidad, resumen de k6 y series temporales segundo a segundo), junto con el consolidado en CSV y las figuras del informe. En HA-01 se versiona además una instantánea completa de la base de Prometheus (raspado de 1 s, 20 MB comprimidos) que cubre toda la campaña, de modo que cualquier percentil puede recalcularse por fase sin volver a correr nada.

1.3.2 Análisis de resultados: ¿se cumplieron las hipótesis de diseño?

Dictamen global

Experimento Hipótesis de diseño ¿Se cumplió? Lectura
HA-08 HD-08 — La separación del modelo de lectura (CQRS) es necesaria para cumplir EC-LAT-11 (p95 ≤ 150 ms) No se confirma La línea base sin CQRS ya satisface el ASR con 19× de margen. El experimento no fracasó: su aportación es precisamente demostrar que la complejidad propuesta no hace falta al volumen ensayado.
HA-01 HD-01 — Tratar la invocación de Open Finance como actualización oportunista permite cumplir EC-LAT-01/EC-LAT-02 con el proveedor sano y también degradado (EC-LAT-09) Se confirma, con un matiz que el diseño no anticipaba El brazo C cumple en los seis estados del proveedor. El matiz: el desacople no hace falta frente a cualquier degradación, sino frente al proveedor que falla a medias —lento o intermitente—. Con el proveedor caído, el circuit breaker basta por sí solo.

Detalle por sub-hipótesis — HA-08 (informe completo: Informe HA-08 · detallado)

Sub-hipótesis Veredicto Evidencia
HD-08.1 — La lectura directa sobre el modelo normalizado no alcanza el p95 objetivo Refutada Brazo A: p95 = 7,86 ms contra un umbral de 150 ms — 19× de margen, 0 % de error en las 9 corridas contrabalanceadas. Validado además con shared_buffers reducido 4× y el conjunto caliente dispersado: el p95 solo sube a 8,19 ms (+4,2 %).
HD-08.2 — La proyección materializada reduce el p95 en ≥ 60 % Refutada en magnitud Brazo B: p95 = 6,19 ms. La reducción real frente a A es del 21 %, no del 60 %, y representa < 1,2 % del umbral.
HD-08.3 — El caché en memoria aporta una mejora adicional Refutada en la dirección contraria Brazo C: p95 = 6,72 ms — 9 % peor que B. Con el hit-rate real (7,6 % a TTL 30 s) la mayoría de peticiones paga la serialización y escritura a Redis sin beneficiarse. Subir el TTL a 300 s eleva el hit-rate a 32-33 % pero empeora el p95.
HD-08.4 — El lag de la proyección se mantiene ≤ 2 s Aceptada Lag p95 ≤ 50 ms bajo carga concurrente de lectura y escritura (~5 eventos/s sostenidos).

Detalle por sub-hipótesis — HA-01 (informe completo: Informe HA-01)

Sub-hipótesis Veredicto Evidencia
HD-01.1 — Con el proveedor sano cumplen los tres brazos Confirmada p95: A 174,1 ms · B 64,9 ms · C 64,9 ms, contra un umbral de 225 ms.
HD-01.2 — Con el proveedor degradado solo cumple el brazo C Confirmada solo en parte C cumple en los seis estados. B también cumple en degradado, sin respuesta y caído; solo incumple con el proveedor lento (1,28 % sobre 475 ms) e intermitente (1,10–1,25 %).
HD-01.3 — El camino degradado es más rápido que el camino frío Depende del estado Solo se cumple con el interruptor abierto. Con el proveedor lento el interruptor nunca abre, y el camino degradado (189 ms) resulta más lento que el frío con proveedor sano (159 ms).
HD-01.4 — C sostiene el umbral con tasa de acierto ≥ 96 % Refutada En C el acierto no decide el percentil: el peor caso es ~190 ms con cualquier acierto, incluso al 50 %. Quien depende del acierto es B, cuyo mínimo está alrededor del 97 %.
HD-01.5 — Las peticiones sacrificadas hasta abrir el interruptor son < 1 % con tráfico alto Se mide en B, no en C En C las cuatro celdas cumplen con holgura porque ninguna petición espera más que el presupuesto: el efecto es invisible. En C el interruptor no protege la latencia, protege el pool y al proveedor.
HD-01.6 — Con tráfico bajo el umbral por conteo no mantiene las sacrificadas bajo el 1 %, y el de tasa sí Confirmada Política por conteo con tráfico bajo: 1,19 % sobre 475 ms y p99 de 716 ms — rompe el ASR. Política por tasa: 0,24 % (alto) y 0,77 % (bajo), nunca incumple.
HD-01.7 — Sin coalescencia, los fallos concurrentes sobre la misma clave saturan el pool Confirmada Celda de estampida (20 claves, TTL 2 s): C llega a 101 invocaciones en vuelo sobre un pool de 40; C′ coalesce 577 y queda en 20. La latencia apenas cambia (183 contra 184 ms).
HD-01.8 — Al recuperarse el proveedor, el interruptor cierra sin estampida en ≤ 60 s Confirmada El interruptor cierra entre 5 y 14 s; el respaldo vuelve bajo el 5 % entre 0 y 26 s; el pico de invocaciones no supera la línea base (8,4 contra 10,3/s).

Restricciones de presupuesto evaluadas en HA-01

Restricción Veredicto Evidencia
EC-LAT-08 — timeout duro de 700 ms en el adaptador Se cumple Aplicado de forma idéntica en los cuatro brazos; ninguna llamada lo excede.
EC-LAT-07 — ≤ 120 ms por dependencia externa Se incumple Con el proveedor lento, el p95 del adaptador cortado por fase es de 495,6 ms y el 99,78 % de sus llamadas excede el presupuesto. El único estado degradado en que se cumple es caído (19,7–85,1 ms), y se cumple por el interruptor, que al abrir corta las llamadas sin tocar al proveedor. Con el proveedor sano se cumple al filo: 114,9–121,8 ms.

El incumplimiento de EC-LAT-07 no debilita HD-01, la refuerza. Si la dependencia cupiera en 120 ms cabría preguntar para qué hace falta la actualización oportunista. Lo que muestra la evidencia es lo contrario: con el proveedor degradado la dependencia no cabe, y por eso el desacople no es una optimización sino la condición para cumplir el ASR de cotización. El brazo C cumple justamente porque abandona al agotar el presupuesto, que es el mecanismo bajo prueba.

El hallazgo principal de HA-01: el mérito del interruptor y el del desacople son separables

Con fallos intermitentes del 30 %, el circuit breaker no llega a abrir en ningún brazo —no se alcanzan diez fallos consecutivos ni el 50 % de la ventana, breaker_max = 0 en las ocho corridas— y aun así B incumple (1,10–1,25 %) y C cumple (0,00 %). Como el interruptor no interviene en ninguno de los dos, la diferencia es atribuible solo al desacople. Es el argumento más fuerte del experimento porque elimina la explicación alternativa, y se verificó bajo los dos modelos de fallo posibles (fallo atado al cliente y fallo derivado de un contador por petición), con el resultado manteniéndose en ambos.

Decisiones que merecen ser corregidas o revisadas (se materializan en Hoja de trabajo semana 7 · §3.1)

# Decisión Estado
1 Atribuir la protección del presupuesto de latencia únicamente a la actualización oportunista (§1.2.4 semana 5) 🔧 Corregir — separar qué hace el interruptor y qué hace el desacople
2 Modelo de fallas de cinco estados del proveedor 🔧 Corregir — añadir intermitente; lento es el que materializa EC-LAT-09; degradado es en la práctica una caída
3 Política del interruptor sin definir 🔧 Decidir — adoptar por tasa sobre ventana deslizante; la de conteo rompe el ASR con tráfico bajo
4 EC-LAT-09 medido solo por latencia 🔧 Revisar — añadir la proporción con respaldo como segunda medida de respuesta
5 EC-LAT-07 como restricción de diseño (≤ 120 ms) Revisar — se incumple con el proveedor degradado; el diseño lo absorbe por abandono, pero la restricción debe redactarse con esa salvedad
6 CQRS para el estado de siniestro Confirmada su no adopción — HA-08 demuestra que no hace falta para EC-LAT-11
7 Umbral de respaldo aceptable para actuaría ⏳ Brecha abierta — no se resuelve con más corridas; requiere decisión de negocio

2. Historias de usuario detalladas del Sprint 1 del Proyecto 2

Backlog / tablero Jira: SOLV — Backlog · Sprint 1

2.1 Detalle de historias de usuario refinadas para el Sprint 1

Backlog del Sprint 1 en Jira: SOLV — Sprint 1

Criterio de «historia refinada». Una HU está refinada cuando su descripción en Jira trae las 7 piezas del modelo de referencia (SOLV-215 · HU-90 Login):

# Pieza Qué contiene
1 Como / quiero / para Rol, capacidad y beneficio
2 Figma Etiquetas Ejecutar en Figma: (prototipo navegable) y Pantalla en Figma: (frame)
3 Imagen Captura del frame embebida en la historia
4 Navegación De dónde llega, a dónde sale, qué barra se ve
5 Criterios de aceptación Lista de viñetas verificables
6 Gherkin Mínimo 2 escenarios: camino feliz + alterno o de error
7 Paridad y Fuera Gemelo del otro canal y qué no incluye

Las 69 historias comprometidas están refinadas, incluidas las 14 del Sprint 1. Cada una tiene en Jira su lista de criterios de aceptación, Gherkin con camino feliz y camino alterno, dependencias y bloque Fuera; las 24 que tienen pantalla traen además navegación, prototipo, enlace de Figma e imagen del frame, y los 13 slices de BFF declaran los servicios que consumen y la historia de canal que los usa.

Grupo HU Criterios y Gherkin Prototipo, Figma e imagen
Historias con pantalla 24 ✅ ✅
Núcleo, API e infraestructura 29 ✅ ➖ no aplica
Técnicas de pruebas (HU-83, HU-86, HU-87) 3 ✅ ➖ no aplica
Slices de BFF del borde de canal 13 ✅ ➖ no aplica
Total 69

Las historias que pertenecen a un recorrido medido citan además el escenario de calidad con su meta: HU-6 y HU-7 el presupuesto de la cotización (EC-LAT-01 / EC-LAT-02), HU-13 el de suscripción y emisión (EC-LAT-05 / EC-LAT-06), HU-18 y HU-31 el de consulta (EC-LAT-10 / EC-LAT-11), HU-33 el pico paramétrico (EC-ESC-03 / EC-ESC-04), HU-53 la revocación del consentimiento (EC-SEG-03) y HU-55 el perfilamiento en línea (EC-LAT-03 / EC-LAT-04) junto con la reconstrucción de decisiones (EC-SEG-04).

La evidencia viva, historia por historia, está en el tablero de Jira.


3. Presentación del prototipo web/móvil final

3.1 Se incluye el prototipo final

El prototipo navegable en Figma se cierra en esta semana. La versión final del cliente es Screens · S7 validación (web y Android). Screens de S6 no se toca. Frente al avance de la semana 6, S7 incorpora el contexto de ramo y estado de la validación del 18 sep, y el archivo web suma el back-office de asesor y operador.

Página completa del entregable: Prototipo web/móvil · Cliente y back-office

Versión final (S7): Abrir y recorrer el prototipo web · Abrir y recorrer el prototipo móvil · Abrir y recorrer el back-office · Design web S7 · Design Android S7 · Design back-office

Alcance del prototipo final Cliente web Cliente móvil Back-office
Design system compartido (tokens, Style Tile, Component Gallery, modos Light/Dark) ✅ ✅ ✅ (hereda del de cliente)
Prototipo navegable de punta a punta, sin cuenta de Figma ✅ ✅ ✅
Los 6 recorridos críticos del enunciado §5.1 ✅ ✅ ➖ (soporte a los recorridos 3 y 4)
Accesibilidad ✅ ✅ ✅
Internacionalización y localización (4 locales) ✅ ✅ ✅
Ubicación geográfica ✅ (opcional del navegador) ✅ (permiso nativo JIT) ➖

3.1.1 Versión web que incluye navegación a la funcionalidad definida y condiciones de usabilidad

Navegación a la funcionalidad definida

Condiciones de usabilidad

Condición Cómo se resuelve en el canal web Evidencia
Accesibilidad Pares Light/Dark del design system con contraste garantizado (fill primary → texto on-primary); hotspots nombrados como los pronuncia el lector de pantalla (Continuar, Volver); orden de tabulación derivado del orden de capas; el estado seleccionado se marca con borde + check + texto, nunca solo con color. Verificable con Adapt content for screen readers y VoiceOver / NVDA / JAWS. S7 web · §4 · Cumplimiento Axe y Nielsen · cliente
Internacionalización Locales es-CO, es-MX, es-CL y es-PE. Selección en el primer arranque (idioma-region) y luego desde Perfil. El núcleo solo entrega prima y código de moneda; el formateo de monto y fecha es responsabilidad del canal. Play S7 · i18n · §4 · i18n
Localización Mismo monto con distinto formato según locale: es-CO $48.900 COP · 07/09/2026 frente a es-MX $1,234.56 MXN · 09/07/2026. §4
Ubicación geográfica Dirección escrita siempre disponible; geolocalización del navegador opcional al adjuntar archivo. Si el usuario la niega, el aviso se envía sin geoetiqueta. Play S7 · evidencia · §4 · Ubicación
Responsividad Cuatro breakpoints diseñados como frames independientes: 390 (teléfono), 768 (tablet), 1024 y 1440 (escritorio), con cambio de gutters, columnas y TopNav ↔ hamburguesa. Design system · Web

3.1.2 Versión móvil que incluye navegación sobre la funcionalidad definida y condiciones de usabilidad

Navegación sobre la funcionalidad definida

Condiciones de usabilidad

Condición Cómo se resuelve en el canal móvil Evidencia
Accesibilidad Mismos tokens y pares Light/Dark que web; nombres de capa usados como especificación para el lector de pantalla; estado seleccionado con borde + check + texto. Limitación declarada: TalkBack y VoiceOver iOS no leen prototipos de Figma en el teléfono, así que la validación con lector real queda para el canal implementado (Compose). S7 Android · §4 · Cumplimiento Axe y Nielsen · cliente
Internacionalización Selección de locale en Splash → idioma-region y luego desde Perfil (sheet). Recursos previstos values-es-rMX / rCL / rPE. Se implementa en PF2 como HU-94, comprometida en el Sprint 2. Play S7 · i18n · §4 · i18n
Localización Misma prima con distinto formato de monto y fecha según el locale elegido. §4
Ubicación geográfica Permiso nativo JIT (just-in-time): el sistema pregunta en el momento de geoetiquetar la foto del siniestro (HU-24, enunciado §5.2), no en el splash ni en la instalación. No hay rastreo en segundo plano. Si el usuario niega, la ruta evidencia-geo-denegada continúa el recorrido con UI distinta. Play S7 · ubicación JIT · §4 · Ubicación

3.1.3 Versión back-office que incluye navegación a la funcionalidad definida y condiciones de usabilidad

Herramienta de escritorio para asesor y operador. Vive en la página Back-office · Asesor / Operador del archivo web (127:2); no se clona a Screens · S7. Cierra las 8 HU del grupo A que en Lucid figuraban como Falta UI.

Navegación a la funcionalidad definida

Condiciones de usabilidad

Condición Cómo se resuelve en el back-office Evidencia
Accesibilidad Mismos pares Light/Dark y tokens del design system de cliente. TopNavAdmin nombra destinos como los pronuncia el lector (Clientes, Cotizaciones, Pólizas, Avisos). Cada BadgeBO lleva texto (Activo / Inactivo, En revisión, …), nunca solo color. Un rol sin permiso conserva el shell y sustituye el contenido por EmptyState / SinPermiso. Design back-office · Cumplimiento Axe y Nielsen · back-office
Internacionalización Locales es-CO, es-MX, es-CL y es-PE, heredados del canal web. Prima y código de moneda vienen del núcleo; el formateo de monto y fecha es del canal. §4 · i18n · §6
Localización Mismo monto con distinto formato según locale, igual que en el prototipo de cliente. §4
Ubicación geográfica No aplica: el asesor y el operador no geoetiquetan evidencia. El GPS JIT queda en el canal del asegurado. ➖
Responsividad Solo 1440: es una herramienta de escritorio. No hay frames 768/390. §6

Fuera del alcance del prototipo, declarado explícitamente: portal de socio (aliados), back-office en 768/390 —es una herramienta de escritorio, solo se diseñó 1440— y el código Angular / Compose, que es objeto del Proyecto Final 2. Ver Fuera de este avance.


3.2 Se incluye la documentación técnica

Documentación Técnica UX/UI — Solventa

Referencia de diseño para construir los canales de Solventa: tokens, componentes, pantallas y flujos, con el identificador exacto de cada frame en Figma.

Fuentes de diseño

Archivo Rol Canvas
Solventa — Design System Design system y app Android 390
Solventa — Web Customer Experience Portal cliente y back-office 1440 · 768 · 390

Stack de implementación. Web: AngularJS + TypeScript, unitarias con Karma y E2E con Cucumber/Gherkin. Móvil: Android nativo (Kotlin + Jetpack Compose), Clean Architecture + MVVM + Repository, unitarias con JUnit. No es híbrido ni comparte código de UI entre canales. Detalle en Estrategia de pruebas §4.

Páginas relacionadas: Arquitectura de información · Prototipo navegable · Cumplimiento axe/Nielsen · cliente · · back-office · Validación con usuario


Índice

  1. Guía de estilos (design tokens)
  2. Catálogo de componentes UI
  3. Inventario de pantallas por plataforma
  4. Flujos de navegación
  5. Consideraciones técnicas

3.2.1 Guía de estilos (design tokens)

Ambos archivos comparten paleta, tipografía y escala. La diferencia está en cómo se declaran: el archivo móvil usa cuatro colecciones de variables con primitives aliasados por rol semántico; el web usa una sola colección de color con modos Light/Dark.

Style Tile — Web

3.2.1.1 Paleta de colores

Material 3 con primary #005050. Cada token existe en Light y Dark; en Android los roles apuntan a un primitivo mediante alias.

Token Light Dark Uso principal
primary #005050 #84d4d3 Acción principal, destino activo, marca
on-primary #ffffff #003737 Texto e icono sobre primary
primary-container #006a6a #004f4f Contenedor de énfasis medio
on-primary-container #97e7e6 #a0f0f0 Texto sobre primary-container
secondary-container #cce8e7 #324b4b Tab activo, chip seleccionado, badge
on-secondary-container #506969 #cce8e7 Texto sobre secondary-container
surface #f7faf9 #101414 Fondo de pantalla
on-surface #181c1c #e0e3e3 Texto principal
on-surface-variant #3e4948 #bec9c8 Texto secundario, labels
surface-container #ebeeee #1d2020 Encabezado de tabla, fila resaltada
surface-container-low #f1f4f4 #191c1c TopNav, tarjetas KPI
surface-container-lowest #ffffff #0c0f0f Tarjetas, diálogos, campos
outline #6e7979 #889392 Borde de campo y botón outlined
outline-variant #bec9c8 #3e4948 Divisores, bordes sutiles
error #ba1a1a #ffb4ab Error, acción destructiva
error-container #ffdad6 #93000a Fondo de bloque de error

Regla de pares. Un fill primary siempre lleva texto on-primary; nunca texto primary sobre fill primary. Los pares verificados en S7 cumplen WCAG 2.2 §1.4.3 AA: on-surface / surface 16.4:1, on-surface-variant / surface 8.9:1, on-primary / primary 9.3:1.

Deuda registrada. El helper de campos (#6e7979 sobre #f7faf9) da 4.28:1 a 12 px; AA exige 4.5:1. Corregir subiendo el tamaño o oscureciendo el token. Ver Cumplimiento axe/Nielsen.

Color modes — Light / Dark · Web

3.2.1.2 Tipografía

Hanken Grotesk para UI, JetBrains Mono para montos e identificadores. No se usa Inter.

Token Fuente Tamaño / interlineado Uso
display Hanken Grotesk Regular 57 / 64 Claim de marca (solo web pre-login)
headline-lg Hanken Grotesk SemiBold 32 / 40 Título de pantalla (web)
headline-lg-mobile Hanken Grotesk SemiBold 28 / 36 Título de pantalla (Android)
headline-sm Hanken Grotesk Medium 24 / 32 Título de sección y de tarjeta
title-md Hanken Grotesk Medium 16 / 24 Título de fila, etiqueta de campo
body-lg Hanken Grotesk Regular 16 / 24 Texto corrido, valor de campo
body-md Hanken Grotesk Regular 14 / 20 Texto secundario, ayuda
label-md-tabular JetBrains Mono Medium 12 / 16 Montos, POL-88421, claves de idempotencia

Por qué mono en cifras. Los dígitos tabulares alinean verticalmente en tablas y listas, y distinguen POL-90102 de texto corrido. Todo monto pasa por el formateador de locale: el núcleo entrega prima y código de moneda, el canal formatea (PL-01).

3.2.1.3 Espaciado (rejilla Base-4)
Token Valor Uso
sp-1 / spacing/xs 4 px Separación mínima intra-componente
sp-2 / spacing/sm 8 px Inline entre elementos hermanos
sp-3 12 px Padding vertical de campo
sp-4 / spacing/md 16 px Padding de tarjeta, gutter móvil
sp-5 20 px Padding de tarjeta amplia
sp-6 / spacing/lg 24 px Gutter desktop, padding de panel
sp-7 / spacing/xl 32 px Separación entre secciones
sp-8 40 px Bloque mayor
sp-10 64 px Respiro de página

El archivo móvil declara además padding/xs…xl con los mismos valores, para distinguir separación de relleno al bindear.

3.2.1.4 Bordes, radios y elevación
Token Valor Uso
radius/sm 4 px Chip pequeño, indicador
radius/md / sm inputs 8 px Campos, selects, notas
radius/lg / lg cards 12 px Tarjetas, tablas, paneles
xl paneles 16 px Diálogos, hojas
radius/full 9999 px Botones (pills), avatar, badges
Nivel 0 sin sombra Contenido plano
Nivel 1 y:1 r:4 a:0.08 Tarjetas, TopNav
Nivel 2 y:4 r:12 a:0.12 Diálogos web
Nivel 3 — Bottom sheets Android
3.2.1.5 Breakpoints

Breakpoint = ancho de canvas en el que cambia el layout web. No aplica a la app Android, que es nativa a 390.

Ancho Plataforma Comportamiento
390 Web móvil Una columna, hamburger → nav-menu / 390
768 Tablet Misma IA, gutters condensados
1024 Desktop TopNav completo
1440 Desktop amplio Canvas de referencia del diseño

El back-office solo existe a 1440: es herramienta de escritorio.

3.2.1.6 Iconografía

Material Symbols (Rounded). El archivo móvil publica 15 iconos como componentes individuales bajo Icon/*:

placeholder · back · home · description · emergency_home · person · check · cancel · info · chevron_right · visibility · add · lock · menu · error

Un icono nunca comunica estado por sí solo: siempre lleva texto asociado.


3.2.2 Catálogo de componentes UI

3.2.2.1 Componentes Android

Cada uno vive en su propia página del archivo de design system, con variantes formales y slots de texto expuestos como propiedades.

Componente Variantes Propiedades Uso
Button Style: Filled · Tonal · Outlined · Text × State: Default · Disabled (8) Label Acción primaria, secundaria y terciaria
IconButton Style: Default · On-surface (2) — Acción compacta en barras
TextField Style: Outlined · Filled × State: Default · Error · ReadOnly (6) Label, Value, Helper Captura de datos
Select Selected: 6 ramos × State: Closed · Open (12) — Elección de ramo en cotización
Chip Selected: True · False (2) — Filtro de lista
Switch Checked: True · False (2) — Consentimientos, preferencias
Banner Type: Info · Error (2) — Aviso en pantalla, degradación
StatusIcon Kind: Success · Error · Processing (3) — Resultado de emisión y de aviso
TopAppBar Variant: Root · Back (2) — Barra superior
BottomNav Selected: Inicio · Polizas · Siniestros · Perfil (4) — Shell de cuatro destinos
Card — — Contenedor de resumen
ListRow — — Fila de lista
FAB — — Reportar siniestro
BottomSheet — — Overlays de Perfil
Skeleton — — Carga

Component Gallery — Android

Select con seis ramos. Las opciones son los ramos L1 renombrados tras la validación con usuario: Protección de dispositivo, Microseguro de vida, Clima y vuelos, Vida hipotecario, Pagos, Viaje. Reemplazan a «SOAT» y «Hogar», que no se entendían fuera de contexto colombiano.

3.2.2.2 Componentes web · cliente

Definidos en la página Chrome del archivo web.

Componente Variantes Medidas Uso
Button Style: Filled · Outlined · Text padding 14/24, gap 8, radio full, texto Medium 16 Acciones
TopNav Selected: Inicio · Pólizas · Siniestros · Perfil 1440 × 64, padding lateral 24 Shell cliente desktop
TopNavCompact Selected: los mismos 4 390 × 56 Shell cliente móvil (hamburger)
Footer — 1440 × 88, padding 24/48 Pie legal

Component Gallery — Web

Estados de campo documentados en la galería: DEFAULT, FOCUS, ERROR (con mensaje) y DISABLED (40 % de opacidad). Badges de cliente: Vigente · En curso · Oferta · Rechazada · Pendiente. El stepper de emisión marca Cotizar → Oferta → Emisión → Póliza → Aviso.

3.2.2.3 Componentes web · back-office

Cuatro sets propios en la página Back-office · Asesor / Operador. Nacen porque el cliente administra sus pólizas mientras el asesor opera carteras de terceros: la arquitectura de información es distinta, no una variante de la de cliente.

Componente Variantes Uso
TopNavAdmin Selected: Clientes · Cotizaciones · Pólizas · Avisos Shell de back-office, con tag «Back-office», selector de rol y cerrar sesión
BadgeBO Estado: En revisión · Aprobada · Rechazada · Pagada · Cancelada · Activo · Inactivo Estados que los badges de cliente no cubren
DialogConfirm Estado: Default · MotivoVacio Confirmación destructiva con motivo obligatorio
EmptyState Estado: ColaVacia · SinPermiso · SinClientes Sin contenido y sin permiso de rol

Todos reutilizan Button y Footer del cliente como instancias, y bindean la misma colección Color: el back-office hereda el design system, no lo duplica.

3.2.2.4 Patrones compartidos
Patrón Regla
Estado nunca solo por color Todo badge y toda selección llevan texto o icono además del color
Monto en mono Cifras e identificadores en JetBrains Mono, formateados por locale en el canal
Error en la misma vista Un dato inválido se resuelve donde se capturó; no se navega ni se pierde lo escrito
Acción destructiva con motivo Confirmación explícita + motivo obligatorio + aviso de irreversibilidad
Permiso JIT El diálogo del SO aparece al usar la función, nunca en splash
Hit target ≥ 48 px Botones a 49 px de alto (verificado en S7)

3.2.3 Inventario de pantallas por plataforma

82 frames en total. El identificador abre el frame directamente en Figma.

3.2.3.1 Aplicación móvil — Android (38 frames)

Canvas 390 × 844. Página Screens del archivo de design system.

# Pantalla Shell node-id HU
1 splash-solventa A 4:3 HU-95
2 idioma-region A 66:585 HU-94
3 idioma-region-mx A 128:777 HU-94
4 onboarding A 4:6 HU-45
5 login A 4:23 HU-90
6 login-error A 53:525 HU-90
7 consentimiento-datos A 4:49 HU-46
8 inicio B 4:138 HU-93
9 nueva-cotizacion C 4:181 HU-92
10 ver-oferta C 4:223 HU-11
11 emision-progreso D 4:261 HU-20
12 poliza-emitida E 4:275 HU-20
13 suscripcion-rechazada D 4:287 HU-99
14 consentimiento-hipotecario C 5:165 HU-53
15 oferta-hipotecario C 5:200 HU-57
16 lista-polizas B 5:239 HU-47
17 detalle-poliza C 5:297 HU-47
18 aviso-vencimiento C 5:349 HU-64
19 aviso-renovacion C 5:398 HU-65
20 lista-siniestros B 6:324 HU-31
21 aviso-siniestro C 6:394 HU-22
22 evidencia-siniestro C 6:451 HU-23
23 confirmacion-siniestro C 54:557 HU-97
24 parametrico C 6:500 HU-36
25 hub-perfil B 6:559 HU-91

Estados de permiso y denegación (HU-101, HU-24) — misma ruta, otra UI:

# Pantalla node-id
26 permiso-camara 70:677
27 permiso-fotos 70:692
28 permiso-ubicacion 66:592
29 evidencia-camara-denegada 70:707
30 evidencia-geo-denegada 66:599

Overlays (bottom sheets; cierran con Close y no empujan el NavHost): overlay-idioma-region [102:738] · overlay-permiso-ubicacion [102:782] · overlay-permiso-camara [102:811] · overlay-permiso-fotos [102:840] · overlay-consentimiento-datos [111:773] · overlay-consentimiento-vida-crediticia [111:784] · overlay-cerrar-sesion [54:768]

3.2.3.2 Portal web — Cliente (28 frames + 8 responsive)

Canvas 1440. Página Screens.

# Pantalla Shell node-id HU
1 login A 4:15 HU-103
2 idioma-region A 4:32 HU-108
3 idioma-region-mx A 61:380 HU-108
4 registro A 4:55 HU-102
5 consentimiento-datos A 4:80 HU-115
6 inicio B 5:9 HU-109
7 lista-polizas B 5:43 HU-118
8 lista-siniestros B 5:72 HU-117
9 hub-perfil B 5:103 HU-106
10 nueva-cotizacion C 6:128 HU-104
11 ver-oferta C 6:162 HU-113
12 emision-progreso D 6:186 HU-114
13 poliza-emitida E 6:191 HU-114
14 suscripcion-rechazada D 6:199 HU-112
15 detalle-poliza C 7:122 HU-18
16 aviso-vencimiento C 7:145 HU-119
17 aviso-renovacion C 7:168 HU-120
18 aviso-siniestro C 7:191 HU-116
19 evidencia-siniestro C 7:216 HU-100
20 evidencia-siniestro-geo C 62:361 HU-100
21 parametrico C 7:241 HU-37
22 consentimiento-hipotecario C 7:265 HU-105
23 oferta-hipotecario C 7:292 HU-105

Overlays web (diálogos que cierran con Close, no rutas): overlay-idioma-region [7:318] · overlay-consentimiento-datos [7:326] · overlay-consentimiento-vida-crediticia [7:334] · overlay-cerrar-sesion [7:342] · overlay-ubicacion-navegador [62:391]

Responsive (página Responsive) — demuestra que la IA se conserva y solo cambia el layout:

Ancho Frames
390 login [28:49] · inicio [28:68] · nav-menu [30:9] · lista-polizas [30:23] · lista-siniestros [30:38] · hub-perfil [30:51]
768 login [30:117] · inicio [30:72]
3.2.3.3 Portal web — Back-office asesor / operador (29 frames)

Canvas 1440, solo desktop. Página Back-office · Asesor / Operador.

# Pantalla Rol node-id HU
1 bo-login ambos 221:1128 —
2 shell-asesor asesor 131:2 HU-8
3 shell-asesor-sin-permiso asesor 137:591 HU-8
4 asesor-cotizacion asesor 132:31 HU-10
5 asesor-cotizacion-error asesor 132:126 HU-10
6 asesor-emision asesor 134:79 HU-19
7 asesor-emision-rechazo asesor 134:161 HU-19
8 bo-cola-avisos operador 135:129 HU-26
9 bo-cola-avisos-vacia operador 135:247 HU-26
10 bo-aviso-decision operador 136:189 HU-27
11 bo-aviso-decision-sin-motivo operador 136:235 HU-27
12 bo-pago-parametrico operador 136:282 HU-29
13 bo-pago-reintento operador 136:357 HU-29
14 bo-renovar-poliza operador 137:312 HU-59
15 bo-renovar-no-vigente operador 137:381 HU-59
16 bo-cancelar-poliza operador 137:450 HU-61
17 bo-cancelar-ya-cancelada operador 137:519 HU-61

Gestión de clientes y listas (ampliación posterior del equipo):

# Pantalla node-id
18 lista-cotizaciones 213:465
19 lista-polizas 213:534
20 lista-clientes-vacia 213:879
21 cliente-detalle 213:603
22 cliente-form 213:672
23 cliente-form-editar 213:741
24 cliente-baja 213:810

Cotización por ramo — cinco variantes del formulario, una por ramo L1: asesor-cotizacion-viaje [254:1191] · -vida [254:1289] · -clima [254:1387] · -pagos [254:1485] · -hipotecario [254:1583]

Asesor · cartera Operador · cola de avisos
Shell asesor Cola de avisos
3.2.3.4 Iteración S7 · validación

Ambos archivos tienen una página Screens · S7 validación con la versión revisada tras la inspección de accesibilidad y la prueba con usuario: 34 frames en web y 39 en móvil. Cada uno cierra con su propio tablero de hallazgos — web 178:382, móvil 216:811.

Esta es la versión vigente para implementar el canal cliente. Las páginas Screens originales quedan como historial del prototipo de la semana 6.

Qué cambió respecto a Screens

Cambio Heurística Dónde se ve
Ramos renombrados: Protección de dispositivo · Microseguro de vida · Clima y vuelos · Vida hipotecario en lugar de SOAT y Hogar H2 lenguaje del usuario nueva-cotizacion
Indicador «paso N de 4» en el flujo de compra H1 visibilidad del estado cotización → oferta → emisión → póliza
Ayuda contextual y enlace al documento legal en cada consentimiento H10 ayuda consentimiento-*
«Pago automático» en lugar de «paramétrico»; habeas data con Ley 1581 de 2012 H2 lenguaje del usuario parametrico, consentimiento-datos
Columna Ramo en tablas y ramo + estado en cada fila H6 reconocer antes que recordar listas
5 variantes de cotización, una por ramo H4 consistencia nueva-cotizacion-*

Galería de los seis recorridos críticos (PDF §5.1) en ambos canales. El resto de frames se consulta en Figma.

Recorrido 1 · Alta e identidad
Web · login Web · registro Web · consentimiento-datos
login web registro consentimiento
Móvil · onboarding Móvil · login
onboarding login móvil
Recorrido 1 · i18n y destino raíz
Web · idioma-region Web · inicio Móvil · idioma-region Móvil · inicio
idioma web inicio web idioma móvil inicio móvil
Recorrido 1–2 · Cotización, oferta y emisión
Web · nueva-cotizacion Web · ver-oferta Web · poliza-emitida
cotización web oferta web póliza web
Móvil · nueva-cotizacion Móvil · ver-oferta Móvil · poliza-emitida
cotización móvil oferta móvil póliza móvil

El indicador «paso N de 4» y el CTA de continuidad cierran el salto Aceptar → Ver mi póliza que detectó la validación.

Recorrido 3 · Siniestro y evidencia
Web · aviso-siniestro Móvil · aviso-siniestro Móvil · permiso-camara Móvil · evidencia-siniestro
aviso web aviso móvil permiso JIT evidencia

La diferencia de canal se ve aquí: el móvil pide permiso JIT al usar la cámara; el web adjunta archivo y usa el prompt del navegador.

Recorridos 4–6 · Paramétrico, hipotecario y ciclo de vida
Web · parametrico Móvil · parametrico Web · oferta-hipotecario Móvil · oferta-hipotecario Web · detalle-poliza
paramétrico web paramétrico móvil hipotecario web hipotecario móvil detalle

3.2.4 Flujos de navegación

3.2.4.1 Shells de navegación
Shell Android Web cliente Back-office
A Pre-login NavigationBar oculta Sin TopNav de destinos; split 1440 / stacked 390 bo-login
B Destino raíz BottomNav, tab activo en secondary-container TopNav, destino subrayado TopNavAdmin, destino subrayado
C Anidada BottomNav del tab padre TopNav del padre + ← Volver TopNavAdmin del padre + ← Volver
D / E Emisión · resultado Nav oculta Nav oculta Nav visible: el asesor puede atender otro caso
Overlay Bottom sheet, cierra con Close Diálogo, cierra con Close DialogConfirm sobre scrim
3.2.4.2 Móvil — alta, identidad y cotización
flowchart TB
  Splash["splash-solventa"] --> Idioma["idioma-region"]
  Idioma -->|"Mexico"| IdiomaMx["idioma-region-mx<br/>$1,234.56 MXN"]
  Idioma --> Onboarding["onboarding<br/>datos + documento"]
  IdiomaMx --> Onboarding
  Idioma -->|"Ya tengo cuenta"| Login["login"]
  Onboarding --> Consent["consentimiento-datos<br/>habeas data"]
  Consent --> Inicio["inicio"]
  Login -->|"credenciales invalidas"| LoginErr["login-error<br/>estado, no ruta"]
  LoginErr --> Login
  Login -->|"exito"| Inicio

  Inicio -->|"CTA Nueva cotizacion"| Cotizar["nueva-cotizacion<br/>paso 1 de 4"]
  Cotizar --> Oferta["ver-oferta<br/>prima, moneda, venceEn"]
  Oferta -->|"vencida"| Cotizar
  Oferta -->|"Aceptar"| Emision["emision-progreso"]
  Emision -->|"aprobada"| Emitida["poliza-emitida"]
  Emision -->|"rechazada HU-13"| Rechazo["suscripcion-rechazada<br/>motivo persistido"]
  Emitida -->|"Ver mi poliza"| Detalle["detalle-poliza"]
  Emitida -->|"Ir al inicio"| Inicio
  Rechazo --> Inicio

  classDef navOff fill:#ffdad6,stroke:#ba1a1a,color:#410002
  class Splash,Idioma,IdiomaMx,Onboarding,Consent,Login,LoginErr,Emision,Emitida,Rechazo navOff
Loading

Los nodos en rojo tienen la NavigationBar oculta: shell A pre-login y shell D/E durante la emisión. El cliente no puede cambiar de tab a mitad del proceso.

3.2.4.3 Móvil — siniestro con permisos JIT
flowchart TB
  Lista["lista-siniestros<br/>destino raiz"] -->|"FAB Reportar"| Aviso["aviso-siniestro<br/>formulario + foto"]
  Aviso -->|"adjuntar foto"| PermCam{"permiso-camara<br/>dialogo del SO"}

  PermCam -->|"Permitir"| Evidencia["evidencia-siniestro"]
  PermCam -->|"Denegar"| PermFotos{"permiso-fotos<br/>galeria"}
  PermFotos -->|"Permitir"| Evidencia
  PermFotos -->|"Denegar"| SinCam["evidencia-camara-denegada<br/>misma ruta, otra UI"]

  Evidencia -->|"geoetiquetar"| PermGps{"permiso-ubicacion"}
  PermGps -->|"Permitir"| ConGps["evidencia con GPS"]
  PermGps -->|"No permitir"| SinGps["evidencia-geo-denegada<br/>misma ruta, otra UI"]

  ConGps --> Confirma["confirmacion-siniestro<br/>siniestroId"]
  SinGps --> Confirma
  SinCam --> Confirma
  Confirma --> Lista
  Confirma --> Inicio["inicio"]

  classDef permiso fill:#cce8e7,stroke:#005050,color:#00201f
  classDef degradado fill:#ffdad6,stroke:#ba1a1a,color:#410002
  class PermCam,PermFotos,PermGps permiso
  class SinCam,SinGps degradado
Loading

Tres reglas que el diagrama hace explícitas:

  • El permiso se pide al usar la función, nunca en splash ni al instalar (PDF §5.2).
  • Todos los caminos llegan a confirmacion-siniestro: ningún permiso denegado bloquea el envío del aviso.
  • Denegar no crea una ruta nueva — es la misma pantalla con otra UI.
3.2.4.4 Móvil — vida hipotecario
flowchart LR
  Inicio["inicio<br/>card Vida Crediticia"] --> Consent{"consentimiento-hipotecario<br/>perfilamiento"}
  Consent -->|"No otorgar"| Inicio
  Consent -->|"Otorgar"| Adaptador["HU-54 adaptadores<br/>Open Finance / Open Data"]
  Adaptador -->|"responde a tiempo"| OfertaOk["oferta-hipotecario"]
  Adaptador -->|"falla o excede el limite"| OfertaDeg["oferta-hipotecario<br/>banner de degradacion"]
  OfertaOk -->|"Aceptar"| Emision["emision HU-20"]
  OfertaDeg -->|"Aceptar"| Emision

  classDef degradado fill:#ffdad6,stroke:#ba1a1a,color:#410002
  class OfertaDeg degradado
Loading

Sin consentimiento no se invoca ningún adaptador. Si el perfilamiento se degrada (HU-56), la oferta se entrega igual con valor de respaldo y el banner lo advierte: la degradación nunca es silenciosa ni cancela la originación.

3.2.4.5 Web cliente — destinos, emisión y ciclo de vida
flowchart TB
  Login["login"] --> Inicio["inicio"]

  Inicio --> Polizas["lista-polizas"]
  Inicio --> Siniestros["lista-siniestros"]
  Inicio --> Perfil["hub-perfil"]
  Inicio -->|"CTA Nueva cotizacion"| Cotizar["nueva-cotizacion"]

  Polizas --> Detalle["detalle-poliza<br/>solo lectura"]
  Detalle --> AvisoV["aviso-vencimiento"]
  Detalle --> AvisoR["aviso-renovacion"]

  Siniestros --> AvisoS["aviso-siniestro"]
  AvisoS --> Evidencia["evidencia-siniestro<br/>archivo adjunto"]
  Evidencia -->|"Usar ubicacion del navegador"| Prompt{"overlay-ubicacion-navegador"}
  Prompt -->|"Permitir"| Geo["evidencia-siniestro-geo"]
  Prompt -->|"Bloquear"| Evidencia

  Perfil --> Overlays["overlays: idioma,<br/>consentimientos, cerrar sesion"]

  Cotizar --> Oferta["ver-oferta"]
  Oferta -->|"Aceptar"| Emision["emision-progreso"]
  Emision --> Emitida["poliza-emitida"]
  Emitida --> Detalle

  classDef navOff fill:#ffdad6,stroke:#ba1a1a,color:#410002
  classDef overlay fill:#ebeeee,stroke:#6e7979,color:#181c1c
  class Emision,Emitida navOff
  class Prompt,Overlays overlay
Loading

En 390 el TopNav colapsa a hamburger → nav-menu / 390, con los mismos cuatro destinos. Los overlays son diálogos que cierran con Close, no rutas: no empujan el historial.

Diferencia con Android: aquí la evidencia es un archivo adjunto y la ubicación usa el prompt del navegador, no el permiso del sistema operativo.

3.2.4.6 Back-office — asesor y operador
flowchart TB
  BoLogin["bo-login"] --> Shell["shell-asesor<br/>Mi cartera: KPIs + cola"]

  Shell --> Clientes["Clientes"]
  Shell --> Cotizaciones["Cotizaciones"]
  Shell --> PolizasBO["Polizas"]
  Shell --> Avisos["Avisos"]

  Clientes --> ListaCli["lista-clientes-vacia<br/>cliente-detalle"]
  ListaCli --> FormCli["cliente-form<br/>cliente-form-editar"]
  ListaCli --> Baja["cliente-baja"]

  Cotizaciones --> ListaCot["lista-cotizaciones"]
  ListaCot --> Cotiza["asesor-cotizacion<br/>5 variantes por ramo"]
  Cotiza -->|"dato invalido"| CotErr["asesor-cotizacion-error<br/>CTA bloqueado"]
  CotErr --> Cotiza
  Cotiza -->|"Continuar a emision"| EmisionBO["asesor-emision<br/>stepper"]
  EmisionBO -->|"aprobada"| PolizaOk["poliza emitida"]
  EmisionBO -->|"rechazada"| EmisionRech["asesor-emision-rechazo"]

  PolizasBO --> ListaPol["lista-polizas"]
  ListaPol --> Renovar["bo-renovar-poliza"]
  ListaPol --> Cancelar["bo-cancelar-poliza"]
  Renovar -->|"no vigente"| RenovarNo["bo-renovar-no-vigente<br/>bloqueo"]
  Cancelar -->|"ya cancelada"| CancelarNo["bo-cancelar-ya-cancelada<br/>bloqueo"]

  Avisos --> Cola["bo-cola-avisos<br/>bo-cola-avisos-vacia"]
  Cola -->|"Rechazar"| Decision{"bo-aviso-decision<br/>modal sobre la cola"}
  Decision -->|"sin motivo"| SinMotivo["bo-aviso-decision-sin-motivo<br/>CTA deshabilitado"]
  SinMotivo --> Decision
  Decision -->|"con motivo"| Cola
  Cola -->|"Aprobar"| Pago["bo-pago-parametrico"]
  Pago -->|"reintento misma clave"| Reintento["bo-pago-reintento<br/>mismo comprobante"]

  Shell -.->|"rol sin permiso"| SinPermiso["shell-asesor-sin-permiso<br/>conserva el shell"]

  classDef bloqueo fill:#ffdad6,stroke:#ba1a1a,color:#410002
  classDef modal fill:#ebeeee,stroke:#6e7979,color:#181c1c
  class CotErr,RenovarNo,CancelarNo,SinMotivo,SinPermiso bloqueo
  class Decision modal
Loading

Los nodos en rojo son bloqueos de negocio, no errores técnicos: el CTA queda deshabilitado y la pantalla explica por qué, con una salida alternativa. shell-asesor-sin-permiso conserva el TopNavAdmin y solo sustituye el contenido — es la consecuencia visible de la autorización del servidor (HU-75), no su implementación.

A diferencia del cliente, el asesor conserva la navegación durante la emisión: puede atender otro caso sin perder el progreso.


3.2.5 Consideraciones técnicas

3.2.5.1 Diferencias entre plataformas

Los canales no son la misma interfaz redimensionada. Estas diferencias son deliberadas y se validan con pruebas de regresión visual.

Aspecto Android Web cliente Back-office
Navegación NavigationBar inferior, 4 tabs TopNav superior; hamburger en 390 TopNavAdmin, 4 destinos + rol
Evidencia Cámara y galería del SO, GPS Archivo adjunto, geolocalización del navegador Solo lectura de la evidencia del cliente
Permisos Diálogo nativo JIT Prompt del navegador No aplica
Perfil Bottom sheets Diálogos Selector de rol (lectura)
i18n values-es-rMX / rCL / rPE @angular/localize Hereda locale del usuario
Anchos 390 nativo 390 · 768 · 1024 · 1440 Solo 1440
Emisión Nav oculta (shell D/E) Nav oculta Nav visible

Ni el cliente web ni el móvil tienen campana de notificaciones ni destinos Open Finance / Risk Analysis.

3.2.5.2 Mapa componente → implementación
Figma Android (Compose) Web (AngularJS)
Button Button / FilledTonalButton / OutlinedButton / TextButton M3 <solv-button style="filled|outlined|text">
TextField OutlinedTextField con isError y supportingText <solv-textfield> con estados default/focus/error/disabled
BottomNav / TopNav NavigationBar + NavHost Componente de layout con destino activo subrayado
Chip / Select FilterChip / ExposedDropdownMenuBox <solv-chip> / <select> accesible
BottomSheet ModalBottomSheet <dialog> con foco atrapado
StatusIcon / Banner Composable de estado Componente de alerta con role="status"
BadgeBO — (no aplica) <solv-badge estado="...">
DialogConfirm — (no aplica) <dialog> con motivo obligatorio

Tokens como código. La colección Color tiene modos Light/Dark: en Android se exporta a Theme.kt / colors.xml (values-night), y en web a custom properties bajo prefers-color-scheme. El valor nunca se escribe a mano en un componente.

3.2.5.3 Reglas que la implementación debe preservar
  1. El canal formatea, el núcleo no. El núcleo entrega prima y código de moneda; NumberFormat / Intl aplican el locale. Cambiar de locale no cambia la prima.
  2. El canal no inventa estado. Emisión, suscripción y siniestro muestran el estado real del núcleo. Si el núcleo rechazó, nunca se muestra «emitida».
  3. Idempotencia visible. Reintentar un pago o un aviso devuelve el mismo comprobante o siniestroId; la UI lo comunica en vez de ocultarlo.
  4. Autorización en el servidor. Ocultar un botón no es un control: shell-asesor-sin-permiso refleja lo que el servidor ya denegó (HU-75).
  5. Estado nunca solo por color, y contraste AA en los pares del design system.
  6. Permisos JIT, nunca en splash, y denegar jamás bloquea el recorrido.
3.2.5.4 Relación con la arquitectura

El canal web consume :BFFWeb y el móvil :BFFMovil; ninguno llama al núcleo directamente. Cada BFF valida el JWT que emite ms-identidad y expone payloads pensados para su pantalla — el móvil los lleva acotados por operar en redes variables. Ver Vista funcional y Backlog BFF.

3.2.5.5 Fuera de alcance
  • Portal de socio (aliados): no diseñado.
  • Back-office en 768 / 390: es herramienta de escritorio.
  • axe-core y TalkBack no corren sobre Figma; la verificación automatizada queda para el canal implementado (PF2).
  • Modo oscuro: los tokens existen en ambos modos, pero las pantallas están compuestas en Light.

3.3 Se incluye la guía de usuario

3.3.1 Manual de usuario · Back-office

Manual de Usuario — Solventa Back-office

Herramienta de escritorio para asesor y operador

Guía de usuario de la Semana 8 (rúbrica Proyecto Final 1, §3.c). Explica el prototipo Back-office · Asesor / Operador, solo a 1440 px.

Detalle
Aplicación Solventa — Back-office web
Superficie Escritorio (1440). No hay versión de 768 ni de 390
Audiencia Asesor comercial y operador de siniestros
Fuente Prototipo S7 en el archivo web. Hereda el design system del cliente
Fecha 2026

Recorrer el prototipo: Abrir el back-office — inicia en Login

Otras guías: Portal web del cliente · App móvil · Mapa del prototipo


Tabla de contenidos

  1. Introducción
  2. Requisitos y acceso
  3. Cómo navegar
  4. Cómo iniciar sesión
  5. Cómo gestionar clientes
  6. Cómo cotizar y emitir para un cliente
  7. Cómo renovar o cancelar una póliza
  8. Cómo trabajar la cola de avisos
  9. Cómo decidir un aviso y registrar el pago
  10. Mensajes, bloqueos y permisos
  11. Accesibilidad y formato regional

3.3.1.1 Introducción
3.3.1.1.1 ¿Qué es el back-office?

Es la herramienta con la que Solventa atiende carteras y colas de otras personas. El cliente, en el portal o en la app, solo ve sus propias pólizas. Aquí el asesor crea clientes y cotiza por ellos; el operador resuelve avisos, pagos de bajo monto y el ciclo de vida de la póliza.

3.3.1.1.2 ¿Para quién es este manual?
  • Asesor. Administra clientes, cotizaciones y pólizas. No decide avisos.
  • Operador. Trabaja la cola de avisos, el pago paramétrico y la renovación o cancelación. El rol lo asigna Solventa: no hay alta de cuenta en la pantalla de login.
3.3.1.1.3 ¿Qué puedes hacer?
  • Entrar con correo corporativo y ver el rol activo.
  • Consultar, crear, editar y dar de baja clientes del canal web o Android.
  • Armar una cotización COT-* eligiendo el ramo y emitir o ver el rechazo de suscripción.
  • Consultar la cola POL-*, renovar una póliza vigente y cancelarla con motivo.
  • Filtrar avisos, aprobar con pago o rechazar con motivo obligatorio.
  • Reintentar un pago de bajo monto sin generar un segundo desembolso.
  • Reconocer colas vacías, cartera vacía y secciones sin permiso.

3.3.1.2 Requisitos y acceso
Requisito Mínimo
Pantalla Escritorio. El prototipo está diseñado a 1440 px.
Navegador Navegador actual. No se instala una aplicación.
Cuenta Correo corporativo. El rol (asesor u operador) lo asigna Solventa.
Cuenta Figma No hace falta para recorrer el prototipo.
  1. Abre Recorrer el back-office.
  2. Empiezas en Iniciar sesión.
  3. Si no ves las zonas activas, presiona la tecla E.
Recorrido Empieza en
Clientes Lista de personas. Entra antes por el login del prototipo.
Cotizaciones Cola COT-*.
Pólizas Cola POL-*.
Avisos Cola del operador.
Ciclo de vida Renovar y cancelar.

3.3.1.3 Cómo navegar

La barra de administración no es la del cliente. Identifica la herramienta con la etiqueta Back-office, el selector de rol y Cerrar sesión.

Destino Quién lo usa Qué abre
Clientes Asesor Cartera de personas (web o Android).
Cotizaciones Asesor Cola COT-* y Nueva cotización.
Pólizas Asesor y operador Cola POL-*. Renovar y cancelar.
Avisos Operador Cola de casos. El asesor entra y ve que no tiene permiso.

El destino activo queda subrayado. En una ficha, un formulario o un caso, la barra sigue en el destino padre y aparece ← Volver.

Los diálogos (dar de baja, rechazar un aviso, cancelar) se abren encima de la lista. El fondo queda visible y bloqueado hasta que confirmas o cierras.

Estado en la interfaz Significado
En revisión Caso o cotización pendiente de decisión.
Aprobada Decisión favorable.
Rechazada Decisión con motivo.
Pagada Desembolso registrado.
Cancelada Póliza cancelada.
Activo / Inactivo Estado de la ficha del cliente.

Cada estado lleva texto. El color no es la única señal.

Clientes · barra de back-office


3.3.1.4 Cómo iniciar sesión
  1. En Iniciar sesión escribe el correo corporativo y la contraseña.
  2. Pulsa Entrar.
  3. Llegas a Clientes.

No hay Crear cuenta. Si el rol visible no es el que necesitas, usa el selector de rol de la barra. Cerrar sesión vuelve al login.

Iniciar sesión


3.3.1.5 Cómo gestionar clientes

La lista muestra documento, canal (web o Android), estado y consentimiento.

3.3.1.5.1 Consultar
  1. Abre Clientes.
  2. Pulsa una fila para abrir la ficha.
  3. Desde la ficha puedes Editar, Dar de baja o Cotizar.

Ficha del cliente

3.3.1.5.2 Crear
  1. Pulsa Nuevo cliente.
  2. Completa el formulario de alta.
  3. Guarda. La persona queda en la cartera y puede usarse en una cotización.

Nuevo cliente

3.3.1.5.3 Dar de baja
  1. En la ficha, pulsa Dar de baja.
  2. El diálogo pide el motivo. Sin motivo, la confirmación no sigue.
  3. Al confirmar, la ficha pasa a Inactivo.

Dar de baja

3.3.1.5.4 Cartera vacía

Si no hay terceros, la lista se sustituye por el estado vacío Sin clientes. El camino de salida es Nuevo cliente.

Cartera vacía


3.3.1.6 Cómo cotizar y emitir para un cliente
3.3.1.6.1 Cola de cotizaciones
  1. Abre Cotizaciones.
  2. La cola lista referencias COT-* con el ramo (dispositivo, vida, clima y vuelos, hipotecario, y el resto del portafolio L1).
  3. Pulsa Nueva cotización.

Cola de cotizaciones

3.3.1.6.2 Formulario
  1. Elige el ramo: Dispositivo, Viaje, Vida, Clima y vuelos, Pagos o Hipotecario.
  2. Los datos del riesgo cambian con el ramo. Los datos del cliente se mantienen.
  3. El panel de la derecha muestra la oferta en firme: prima, moneda y vigencia.
  4. Pulsa la acción de cotizar cuando los campos son válidos.

Cotización del asesor

3.3.1.6.3 Entrada inválida

Si el valor asegurado queda fuera de rango (ejemplo de dispositivo):

  • El campo se marca en error y el texto explica el problema.
  • El botón de continuar queda deshabilitado.
  • El panel de oferta pasa a Sin oferta.

Corrige el dato. La oferta vuelve cuando el valor entra en el rango.

Cotización con error

3.3.1.6.4 Emisión

El avance es Cotizar → Oferta → Emisión → Póliza.

Resultado Qué ves Qué puedes hacer
Aprobada El stepper termina en póliza y la referencia POL-* queda en la cola de pólizas. Abrir la póliza.
Rechazada El paso de emisión queda en error y se muestra el motivo. No hay póliza. Cotizar otro producto.
Aprobada Rechazada
Emisión aprobada Emisión rechazada

3.3.1.7 Cómo renovar o cancelar una póliza
  1. Abre Pólizas.
  2. Localiza la referencia POL-*.
  3. En la fila, elige Renovar o Cancelar.

Cola de pólizas

3.3.1.7.1 Renovar
Situación Qué ocurre
Póliza vigente Confirmas la renovación y el estado se actualiza.
Póliza no vigente La acción queda bloqueada, con una nota escrita además del color. No se renueva.
Vigente No vigente
Renovar póliza Póliza no vigente
3.3.1.7.2 Cancelar

La cancelación es destructiva.

  1. Pulsa Cancelar.
  2. Escribe el motivo en el diálogo.
  3. Confirma.
Situación Qué ocurre
Motivo vacío El botón de confirmar permanece bloqueado.
Póliza vigente y motivo informado La póliza pasa a Cancelada.
Póliza ya cancelada La acción no se repite. Ves la nota de bloqueo.
Cancelar Ya cancelada
Cancelar póliza Póliza ya cancelada

3.3.1.8 Cómo trabajar la cola de avisos

Esta sección es del operador.

  1. Abre Avisos.
  2. Filtra por estado.
  3. Selecciona una fila. La fila muestra una barra de acento y el panel de detalle incluye la evidencia que cargó el cliente.
  4. Entra al caso para decidir.

Cola de avisos

3.3.1.8.1 Cola vacía

Si no hay pendientes, el contenido se sustituye por el estado Cola sin pendientes. No hay un caso que abrir.

Cola vacía

3.3.1.8.2 Asesor sin permiso

Si entras como asesor a Avisos, la ruta es la misma y el contenido se sustituye por el estado Sin permiso. No ves la cola ni puedes aprobar o rechazar. Vuelve a Clientes, Cotizaciones o Pólizas.

Asesor sin permiso en Avisos


3.3.1.9 Cómo decidir un aviso y registrar el pago

El diálogo se abre sobre la cola, así el caso sigue visible.

3.3.1.9.1 Aprobar
  1. Revisa evidencia, ramo y monto.
  2. Pulsa la acción de aprobar.
  3. Si el pago es de bajo monto (clima y vuelos u otro paramétrico bajo el umbral), registra el desembolso. Queda un comprobante y una clave de idempotencia, por ejemplo junto a referencias como POL-88421.

Pago de bajo monto

3.3.1.9.2 Rechazar
  1. Pulsa rechazar.
  2. Escribe el motivo.
  3. Confirma.

Sin motivo, el botón de rechazo permanece bloqueado y el diálogo lo indica. El caso sigue en la cola.

Con motivo Sin motivo
Decisión del aviso Rechazo sin motivo
3.3.1.9.3 Reintentar un pago

Si el primer intento no confirma:

  1. Abre el pago pendiente.
  2. Pulsa reintentar.
  3. El sistema devuelve el mismo comprobante. La clave de idempotencia evita un segundo desembolso y el intento queda en la trazabilidad.

Reintento con el mismo comprobante


3.3.1.10 Mensajes, bloqueos y permisos
Situación Dónde Qué hacer
Cartera sin clientes Clientes Nuevo cliente.
Valor asegurado fuera de rango Cotización Corregir el campo. El llamado sigue deshabilitado y no hay oferta.
Suscripción rechazada Emisión Leer el motivo y cotizar otro producto.
Cola de avisos vacía Avisos Esperar nuevos casos. No hay fila que abrir.
Asesor en Avisos Avisos Cambiar de destino. La decisión es del operador.
Rechazo o baja sin motivo Diálogo Escribir el motivo. Hasta entonces la confirmación no sigue.
Póliza no vigente Renovar No renovar. La nota de bloqueo permanece.
Póliza ya cancelada Cancelar No repetir la acción.
Reintento de pago Pago de bajo monto Usar el mismo comprobante. No se gira dos veces.

3.3.1.11 Accesibilidad y formato regional
  • Los pares de color claro y oscuro siguen el design system del cliente.
  • Los controles se nombran como los lee un lector de pantalla.
  • Cada estado (En revisión, Aprobada, Rechazada, Pagada, Cancelada, Activo, Inactivo) incluye texto. Los bloqueos suman una nota escrita al color del recuadro.
  • El título visible de Clientes coincide con el encabezado de esa página.
  • Montos y referencias usan un tipo monoespaciado ($148.900 COP, POL-88421). El formato regional lo aplica el canal; el núcleo entrega prima y código de moneda.
  • En el visor de escritorio: Options → Accessibility settings → Adapt content for screen readers.

Detalle: Usabilidad del prototipo · Cumplimiento Axe y Nielsen · back-office.

Esta herramienta no incluye el portal del cliente ni el portal de socios. Tampoco tiene layout de tablet ni de teléfono.


3.3.2 Manual de usuario · Cliente móvil

Manual de Usuario — Solventa App Móvil

Seguros digitales para el cliente asegurado — Android

Guía de usuario de la Semana 8 (rúbrica Proyecto Final 1, §3.c). Explica el prototipo final de la app, Screens · S7 validación, a 390 px.

Detalle
Aplicación Solventa — App móvil (Android)
Superficie Teléfono. Barra inferior de cuatro destinos
Audiencia Persona que contrata y consulta sus propios seguros en el teléfono
Fuente Prototipo S7. El código en Jetpack Compose se construye en el Proyecto Final 2
Fecha 2026

Recorrer el prototipo: Abrir la app — inicia en Splash

Otras guías: Portal web · Back-office · Mapa del prototipo


Tabla de contenidos

  1. Introducción
  2. Requisitos, permisos y acceso
  3. Cómo navegar por la app
  4. Cómo empezar: splash, idioma, registro y login
  5. Cómo usar Inicio
  6. Cómo cotizar un seguro
  7. Cómo revisar la oferta y emitir la póliza
  8. Cómo consultar tus pólizas y avisos
  9. Cómo reportar un siniestro
  10. Cómo consultar un pago automático
  11. Cómo pedir protección ligada a un crédito
  12. Cómo usar Perfil
  13. Accesibilidad, idioma y ubicación

3.3.2.1 Introducción
3.3.2.1.1 ¿Qué es la app móvil de Solventa?

Es la aplicación Android para cotizar, aceptar una oferta, llevar tus pólizas y reportar un siniestro con foto. Hace el mismo trabajo de producto que el portal web, con la navegación y los permisos propios del teléfono.

3.3.2.1.2 ¿Para quién es este manual?

Está dirigido a la persona asegurada que usa Solventa en un teléfono Android.

3.3.2.1.3 ¿Qué puedes hacer?
  • Pasar por la pantalla de carga, elegir región y crear la cuenta o entrar con una existente.
  • Aceptar el tratamiento de datos antes de llegar a Inicio.
  • Moverte con la barra inferior: Inicio, Pólizas, Siniestros y Perfil.
  • Cotizar por ramo. Los datos del riesgo cambian con el producto.
  • Aceptar la oferta y ver la póliza emitida o el rechazo de suscripción.
  • Leer vencimiento y renovación desde el detalle de la póliza.
  • Reportar un siniestro con cámara o galería. El GPS se pide al geoetiquetar la foto.
  • Consultar un pago automático y el flujo de vida hipotecaria.
  • Cambiar idioma y revisar permisos en hojas que se cierran sobre Perfil.

3.3.2.2 Requisitos, permisos y acceso
3.3.2.2.1 Requisitos del dispositivo
Requisito Mínimo
Plataforma Android. El prototipo está compuesto a 390 px.
Conectividad Conexión a internet para abrir el prototipo y, en el producto, para cotizar y emitir.
Cuenta Figma No hace falta para recorrer el prototipo en el navegador.

Esta guía describe el prototipo navegable. La publicación en una tienda de aplicaciones corresponde al canal ya programado.

3.3.2.2.2 Abrir el prototipo
  1. Abre Recorrer la app.
  2. El recorrido empieza en el Splash.
  3. Si no ves las zonas activas, presiona la tecla E.
  4. Toca los controles como lo harías en el teléfono.
Recorrido Para qué
Idioma y región Primer arranque. Continuar sigue al onboarding.
Ubicación al geoetiquetar Diálogo del sistema. Permitir o no permitir.
3.3.2.2.3 Permisos

La app no pide cámara, fotos ni ubicación en el splash ni al instalar. El diálogo aparece cuando usas esa función (justo a tiempo).

Permiso Cuándo se pide Si lo niegas
Cámara Al fotografiar la evidencia del siniestro. Puedes usar la galería, si otorgas fotos.
Fotos Al elegir una imagen de la galería, o si la cámara no está disponible. El aviso no lleva esa imagen hasta que concedas el permiso o elijas otro origen.
Ubicación Al geoetiquetar la foto. No hay rastreo en segundo plano. Sigues en la evidencia, con la pantalla de ubicación denegada. El aviso continúa sin GPS.

Desde Perfil puedes abrir la explicación de cada permiso. Esas hojas se cierran y vuelven al hub. No disparan la cámara ni el GPS por sí solas. Para cambiar un permiso ya decidido, el camino es Abrir ajustes.


3.3.2.3 Cómo navegar por la app
3.3.2.3.1 Pantalla de carga

Al abrir la app ves el splash de Solventa con el indicador de avance. No pide permisos ni muestra la barra inferior.

Splash

3.3.2.3.2 Barra de navegación inferior

Después de entrar, cuatro destinos permanecen en la parte baja. El activo usa el contenedor secundario y el ícono relleno. Los demás quedan al mismo nivel visual.

Destino Función
Inicio Resumen: oferta vigente, póliza, siniestro en curso y crédito si hay originación.
Pólizas Billetera de tus pólizas.
Siniestros Casos y botón para reportar.
Perfil Identidad, idioma, consentimientos, permisos y cierre de sesión.

Inicio · barra inferior

3.3.2.3.3 Pantallas internas

Cotización, oferta, detalle, aviso, evidencia e hipotecario mantienen visible la barra, con el destino padre seleccionado. Arriba aparece la flecha Volver.

3.3.2.3.4 Emisión

En Emitiendo tu póliza y en Póliza emitida la barra inferior se oculta. No cambias de destino a mitad de la emisión. Sales con Ver mi póliza o Ir al inicio.

Emitiendo tu póliza Póliza emitida
Emisión en progreso Póliza emitida
3.3.2.3.5 Hojas de Perfil

Idioma, permisos y consentimientos se abren como hoja inferior. Perfil sigue detrás. Cerrar, Listo, Guardar, Revocar o Entendido vuelven al hub. No abren el registro ni una oferta.


3.3.2.4 Cómo empezar: splash, idioma, registro y login

El alta es un paso a paso numerado. La barra inferior permanece oculta.

Splash → Idioma y región → Onboarding | Login → Consentimiento de datos → Inicio
3.3.2.4.1 Idioma y región

Es el paso 1 y solo se muestra completo en el primer arranque. Elige Colombia, México, Chile o Perú. La selección lleva borde, check y el nombre de la región.

  1. Toca la región. El ejemplo de monto y fecha cambia (en México, $1,234.56 MXN y 09/07/2026).
  2. Toca Continuar.
  3. Sigues al onboarding.
Colombia · es-CO México · es-MX
Idioma y región · es-CO Idioma y región · es-MX
3.3.2.4.2 Onboarding y cuenta

El onboarding presenta para qué sirve la app, en lenguaje de seguros.

  1. Completa el registro.
  2. Si ya tienes cuenta, entra por Login (Ya tengo cuenta / Ingresar).
  3. Un inicio de sesión fallido es un estado de la misma pantalla de login.
Registro Iniciar sesión Error de acceso
Onboarding Login Login con error
3.3.2.4.3 Consentimiento de datos

Paso 3, antes de Inicio. Lee el texto legal enlazado y otorga el tratamiento de datos personales (habeas data). Al confirmar entras a Inicio y aparece la barra inferior.

Consentimiento de datos


3.3.2.5 Cómo usar Inicio

Inicio saluda y agrupa tarjetas por objeto. Cada una muestra ramo, estado y el siguiente paso:

  • Oferta vigente, con acceso a verla y aceptarla.
  • Póliza activa, con acceso al detalle.
  • Siniestro en curso.
  • Vida hipotecaria, si hay una originación.

Nueva cotización es el botón de la pantalla. No es una quinta pestaña. También aparece si abres Pólizas y todavía no tienes ninguna.

Inicio


3.3.2.6 Cómo cotizar un seguro
  1. En Inicio, toca Nueva cotización (o Ver oferta si ya hay una cotización vigente).
  2. Elige el ramo. La descripción y los campos cambian; no se reutiliza el formulario de dispositivo para vida, viaje o crédito.
Ramo Datos del riesgo
Dispositivo Valor del equipo, marca, modelo y si tiene más de 12 meses.
Viaje Destino y duración.
Vida Suma asegurada y edad.
Clima y vuelos Evento, referencia (vuelo o zona) y umbral.
Pagos Cuota y plazo.
Hipotecario Valor y plazo del crédito. El consentimiento de perfilamiento es el paso siguiente.
  1. Toca Cotizar.
  2. La oferta muestra la prima, la moneda y hasta cuándo vale. La prima es el precio del seguro, no el valor del bien.

La pestaña seleccionada sigue siendo Inicio. Volver regresa al resumen.

Nueva cotización


3.3.2.7 Cómo revisar la oferta y emitir la póliza
3.3.2.7.1 Aceptar
  1. En el detalle de la oferta revisa ramo, estado, prima y vigencia.
  2. Toca Aceptar.
  3. Emitiendo tu póliza muestra el avance. La barra inferior no está.

Ver oferta

3.3.2.7.2 Resultado
Resultado Qué ves Cómo sales
Póliza emitida Ramo y número. La cotización quedó creada como póliza. Ver mi póliza o Ir al inicio.
Suscripción rechazada Motivo del rechazo. No hay póliza. Volver al inicio para cotizar otro producto.

Suscripción rechazada


3.3.2.8 Cómo consultar tus pólizas y avisos
  1. Toca Pólizas.
  2. Cada tarjeta muestra ramo, estado y un resumen del tipo, más recomendaciones de siniestro de ese ramo.
  3. Toca una póliza para ver coberturas, vigencia y estado.

Desde el detalle, en modo lectura:

Aviso Qué informa
Vencimiento La póliza está por vencer.
Renovación La renovación ya quedó aplicada.

Activar la renovación automática no está en esta versión. Volver regresa a la billetera y la pestaña activa sigue siendo Pólizas.

Lista Detalle Vencimiento Renovación
Pólizas Detalle de póliza Vencimiento Renovación

3.3.2.9 Cómo reportar un siniestro

Hace falta una póliza vigente. Los campos del aviso son los del ramo de esa póliza.

3.3.2.9.1 Abrir el aviso
  1. Toca Siniestros.
  2. Toca Reportar (acción principal de la lista).
  3. Completa el formulario y continúa a la evidencia.
Siniestros Reportar
Lista de siniestros Aviso de siniestro
3.3.2.9.2 Foto y permisos
  1. Para tomar la foto, la app pide cámara en ese momento.
  2. Para elegir una imagen existente, pide fotos.
  3. Cuando la imagen está lista, puedes geoetiquetarla. Ahí aparece el diálogo de ubicación del sistema.
En el diálogo de ubicación Qué ocurre
Mientras usas la app o Solo esta vez La evidencia muestra la foto con la marca GPS.
No permitir Permaneces en la evidencia, en el estado de ubicación denegada. Puedes enviar el aviso sin coordenadas.
  1. Confirma. Vuelves a la lista, donde el caso muestra su estado.
  2. Ver avance abre el detalle. La aprobación y el pago los resuelve el operador, no la app.
Cámara Fotos Ubicación Sin GPS Evidencia
Permiso de cámara Permiso de fotos Permiso de ubicación Ubicación denegada Evidencia

3.3.2.10 Cómo consultar un pago automático

En clima y vuelos el cliente no arma un aviso con foto. El evento, al superar el umbral, produce un Pago automático.

  1. Abre Siniestros o el aviso correspondiente.
  2. Revisa el resumen y los montos.
  3. El título en la app es Pago automático.

Pago automático


3.3.2.11 Cómo pedir protección ligada a un crédito
  1. En Inicio, abre la tarjeta de crédito o entra a Nueva cotización y elige Hipotecario o Pagos.
  2. En hipotecario, acepta el consentimiento de perfilamiento y consulta el texto legal. Es un paso de este flujo, no una fila de Perfil.
  3. Revisa la oferta (factores y prima).
  4. Toca Aceptar. Sigues a la emisión y al resultado (póliza o rechazo).
Consentimiento Oferta
Consentimiento hipotecario Oferta hipotecaria

3.3.2.12 Cómo usar Perfil
  1. Toca Perfil.
  2. El encabezado muestra tu identidad. Debajo están idioma, ubicación, cámara, fotos, consentimiento de datos, consentimiento de vida crediticia y Cerrar sesión.
Hoja Cómo se cierra
Idioma y región Guardar o Cerrar. Actualiza el formato de prima y fecha.
Ubicación, cámara o fotos Abrir ajustes, Listo o Cerrar. No abre la cámara ni el mapa.
Consentimiento de datos Revocar o Cerrar, con el texto legal a la vista.
Vida crediticia Entendido. No crea una cotización hipotecaria.
Cerrar sesión Confirmas y vuelves al acceso, sin barra inferior.
Perfil Cerrar sesión
Perfil Cerrar sesión

3.3.2.13 Accesibilidad, idioma y ubicación
3.3.2.13.1 Accesibilidad
  • El destino seleccionado de la barra usa el contenedor secundario, no un relleno primario sobre texto primario.
  • Los controles se nombran como se pronuncian (Continuar, Volver, Español · México).
  • El estado elegido combina borde, check y texto.
  • En el visor de escritorio puedes activar Adapt content for screen readers. TalkBack y VoiceOver del teléfono no leen un prototipo de Figma abierto en el dispositivo; esa prueba queda para la app compilada.

Detalle: Usabilidad del prototipo · Cumplimiento Axe y Nielsen · cliente.

3.3.2.13.2 Qué no incluye esta versión
  • No hay campana de notificaciones ni favoritos. Los avisos de la póliza están en Pólizas.
  • No hay mapa, billetera offline, escáner, biometría ni pago con pasarela dentro de la app.
  • No se pide la ubicación en segundo plano.
  • El menú hamburguesa del sitio estrecho no existe aquí: en el teléfono la navegación es la barra inferior.

3.3.3 Manual de usuario · Cliente web

Manual de Usuario — Solventa Portal Web

Seguros digitales para el cliente asegurado — navegador

Guía de usuario de la Semana 8 (rúbrica Proyecto Final 1, §3.c). Explica el prototipo final del canal web, Screens · S7 validación.

Detalle
Aplicación Solventa — Portal web (cliente asegurado)
Superficie Navegador. Escritorio 1440, tablet 768 y teléfono 390
Audiencia Persona que contrata y consulta sus propios seguros
Fuente Prototipo S7. El código del canal se construye en el Proyecto Final 2
Fecha 2026

Recorrer el prototipo: Abrir el portal web — inicia en Login

Otras guías: App móvil · Back-office · Mapa del prototipo


Tabla de contenidos

  1. Introducción
  2. Requisitos y acceso
  3. Cómo navegar por el portal
  4. Cómo elegir idioma, registrarte e iniciar sesión
  5. Cómo usar Inicio
  6. Cómo cotizar un seguro
  7. Cómo revisar la oferta y emitir la póliza
  8. Cómo consultar tus pólizas y avisos
  9. Cómo reportar un siniestro
  10. Cómo consultar un pago automático
  11. Cómo pedir protección ligada a un crédito
  12. Cómo usar Perfil
  13. Accesibilidad, idioma y ubicación

3.3.3.1 Introducción
3.3.3.1.1 ¿Qué es el portal web de Solventa?

El portal web es el canal en el navegador para cotizar, aceptar una oferta, consultar tus pólizas y reportar un siniestro. Administras tus seguros. La cartera de terceros, las colas de avisos y la decisión de pago pertenecen al back-office.

3.3.3.1.2 ¿Para quién es este manual?

Está dirigido a la persona asegurada que usa Solventa en el navegador, en computador, tablet o teléfono.

3.3.3.1.3 ¿Qué puedes hacer?
  • Elegir idioma y región (es-CO, es-MX, es-CL, es-PE) y ver montos y fechas en ese formato.
  • Crear una cuenta, aceptar el tratamiento de datos (habeas data) e iniciar sesión.
  • Cotizar por ramo. Los datos del riesgo cambian según el producto: dispositivo, viaje, vida, clima y vuelos, pagos o hipotecario.
  • Revisar la prima, aceptar la oferta y ver el resultado de la emisión o el rechazo.
  • Consultar la lista y el detalle de tus pólizas, y leer avisos de vencimiento y renovación.
  • Reportar un siniestro adjuntando un archivo. La ubicación del navegador es opcional.
  • Consultar un pago automático de clima o vuelos.
  • Pedir protección de pagos o vida hipotecario, con el consentimiento de perfilamiento como paso de ese flujo.
  • Cambiar idioma, revisar consentimientos y cerrar sesión desde Perfil.

3.3.3.2 Requisitos y acceso
3.3.3.2.1 Requisitos
Requisito Mínimo
Navegador Navegador actual con JavaScript. No se instala una aplicación.
Pantalla El contenido se adapta a 390, 768, 1024 y 1440 px.
Conectividad Conexión a internet para abrir el prototipo.
Cuenta Figma No hace falta para recorrer el prototipo.
3.3.3.2.2 Abrir el prototipo
  1. Abre el enlace Recorrer el portal web.
  2. El recorrido empieza en Login a 1440 px.
  3. Si no ves las zonas activas, presiona la tecla E.
  4. Haz clic en botones y enlaces para avanzar. La flecha del visor de Figma también cambia de pantalla.

Otros puntos de entrada:

Recorrido Para qué
Idioma y región Primer arranque, paso 1 de 3.
Evidencia del siniestro Adjuntar archivo y ubicación opcional.
Ancho 768 Misma información, márgenes más cortos.
Ancho 390 Menú hamburguesa y una sola columna.

3.3.3.3 Cómo navegar por el portal
3.3.3.3.1 Antes de iniciar sesión

Login, idioma y región, registro y consentimiento de datos se muestran sin la barra de destinos. En escritorio el panel de marca queda a un lado y el formulario al otro. En 390 el bloque de marca queda arriba y el formulario abajo.

Iniciar sesión · portal web

3.3.3.3.2 Barra superior después de iniciar sesión

En Inicio, Pólizas, Siniestros y Perfil la barra muestra:

Elemento Función
Logo Solventa Identifica el portal.
Inicio Resumen de tus objetos: oferta, póliza, siniestro y, si aplica, crédito.
Pólizas Lista y detalle de tus pólizas.
Siniestros Lista de casos y alta de un aviso.
Perfil Idioma, consentimientos y cierre de sesión.
Nueva cotización Botón para cotizar. Es una acción, no un quinto destino.
Avatar Acceso a tu identidad en la barra.

El destino activo queda subrayado. Nueva cotización no se subraya como destino.

En pantallas anidadas (cotización, oferta, detalle, aviso, evidencia) la barra sigue mostrando el destino padre y aparece ← Volver.

Inicio · barra superior

3.3.3.3.3 Teléfono (390 px)

La barra se compacta: logo, botón de menú y avatar. El menú abre la lista de destinos. Ciérralo para volver al contenido. No hay barra inferior: esa navegación es de la app Android.

Menú en 390 px

3.3.3.3.4 Emisión en curso

Mientras la póliza se emite, y en la pantalla de póliza emitida, la barra de destinos se oculta. Sales con Ver mi póliza o Ir al inicio.

Emitiendo Póliza emitida
Emisión en progreso Póliza emitida

3.3.3.4 Cómo elegir idioma, registrarte e iniciar sesión
3.3.3.4.1 Idioma y región (primer arranque)

Es el paso 1 de 3. Elige una región. La opción seleccionada se marca con borde, check y texto.

Región Ejemplo de formato
Colombia · es-CO $48.900 COP · 07/09/2026
México · es-MX $1,234.56 MXN · 09/07/2026
Chile · es-CL Mismo monto, formato de Chile
Perú · es-PE Mismo monto, formato de Perú
  1. Toca la región. El ejemplo de fecha y monto cambia en la misma pantalla.
  2. Pulsa Continuar. El siguiente paso es el registro.

Puedes cambiar la región después desde Perfil. El núcleo entrega la prima y el código de moneda; el portal aplica el formato.

Colombia · es-CO México · es-MX
Idioma y región · es-CO Idioma y región · es-MX
3.3.3.4.2 Registro y consentimiento
  1. Completa el alta (paso 2). Si ya tienes cuenta, usa Ya tengo cuenta para ir al login.
  2. En el consentimiento de datos (paso 3) lee el texto legal enlazado y otorga el tratamiento de datos personales.
  3. Al terminar entras a Inicio.
Registro Consentimiento de datos
Registro Consentimiento de datos
3.3.3.4.3 Iniciar sesión
  1. En Login ingresa correo y contraseña.
  2. Pulsa el botón de ingreso.
  3. Con sesión válida llegas a Inicio.

Si los datos no son válidos, el login muestra el estado de error en la misma pantalla. No es otra sección del menú.


3.3.3.5 Cómo usar Inicio

Inicio agrupa lo que ya tienes, con ramo, estado y siguiente paso:

  • Oferta vigente, si hay una cotización por aceptar.
  • Póliza, con acceso al detalle.
  • Siniestro en curso, si hay un caso.
  • Protección ligada a crédito, si hay una originación hipotecaria.

Nueva cotización está en Inicio y también en Pólizas cuando la lista está vacía (primera póliza).

Inicio · resumen


3.3.3.6 Cómo cotizar un seguro
3.3.3.6.1 Abrir el formulario
  1. Pulsa Nueva cotización en Inicio, o el mismo llamado en Pólizas si aún no tienes pólizas.
  2. Elige el ramo. Hay un solo formulario: al cambiar el ramo cambian la descripción y los datos del riesgo. Los datos de identidad se mantienen.
Ramo Qué te pide Qué no te pide
Dispositivo Valor del equipo, marca y modelo, y si tiene más de 12 meses. Destino de viaje ni datos de crédito.
Viaje Destino y duración. Valor o marca de un dispositivo.
Vida Suma asegurada y edad. Datos de un equipo.
Clima y vuelos Tipo de evento, referencia (vuelo o zona) y umbral. Un aviso de siniestro. El evento dispara el pago.
Pagos Cuota y plazo del crédito de consumo. Datos de un dispositivo.
Hipotecario Valor y plazo del crédito. Sigue en el consentimiento de perfilamiento. Empezar desde Perfil.

Nueva cotización

3.3.3.6.2 Obtener la oferta
  1. Revisa la descripción corta del ramo.
  2. Completa los datos de ese riesgo.
  3. Pulsa Cotizar.
  4. La oferta en firme muestra la prima (el precio del seguro), la moneda y la vigencia. La prima no es el valor del bien.

Ver oferta


3.3.3.7 Cómo revisar la oferta y emitir la póliza
3.3.3.7.1 Aceptar
  1. En Ver oferta confirma ramo, estado, prima y vigencia.
  2. Pulsa Aceptar.
  3. La pantalla Emisión en progreso oculta la navegación mientras se procesa la suscripción.
3.3.3.7.2 Póliza emitida

Si la suscripción aprueba:

  • Ves el ramo y el número de la póliza. La cotización queda creada como póliza.
  • Ver mi póliza abre el detalle en Pólizas.
  • Ir al inicio vuelve al resumen.
3.3.3.7.3 Suscripción rechazada

Si el núcleo rechaza:

  • La pantalla explica el motivo.
  • No se crea póliza.
  • Volver al inicio regresa al resumen para cotizar otro producto.

Suscripción rechazada


3.3.3.8 Cómo consultar tus pólizas y avisos
3.3.3.8.1 Lista
  1. Pulsa Pólizas en la barra superior.
  2. Cada fila o tarjeta muestra ramo, estado y un resumen del tipo.
  3. También verás recomendaciones de siniestro propias de ese ramo.
  4. Si la lista está vacía, usa Nueva cotización.

Lista de pólizas

3.3.3.8.2 Detalle

Abre una póliza para ver coberturas, vigencia y estado. Desde ahí puedes leer:

Aviso Qué informa
Vencimiento La póliza está por vencer. Es lectura: no renuevas desde el portal.
Renovación La renovación ya aplicada. Configurar la renovación automática queda fuera de esta versión.

Usa ← Volver para regresar a la lista. El destino subrayado sigue siendo Pólizas.

Detalle Vencimiento Renovación
Detalle de póliza Aviso de vencimiento Aviso de renovación

3.3.3.9 Cómo reportar un siniestro

Necesitas una póliza vigente. El formulario usa los campos y las recomendaciones del ramo de esa póliza.

3.3.3.9.1 Crear el aviso
  1. Pulsa Siniestros.
  2. Pulsa Reportar.
  3. Completa el aviso. En dispositivo, la evidencia es la foto del daño. Otros ramos no reutilizan ese mismo formulario.
  4. Continúa a la evidencia.
Lista de siniestros Aviso
Lista de siniestros Reportar siniestro
3.3.3.9.2 Adjuntar el archivo

La evidencia en la web es una zona para soltar o elegir un archivo. No se abre la cámara del teléfono.

  1. Arrastra el archivo o selecciónalo desde el equipo.
  2. Escribe la dirección. Ese dato siempre está disponible.
  3. Si quieres geoetiquetar, pulsa Usar ubicación del navegador.

Evidencia · archivo

3.3.3.9.3 Ubicación del navegador

El navegador pregunta en ese momento, no al entrar al portal.

Elección Resultado
Permitir El aviso queda con coordenadas.
Bloquear El aviso se envía igual, sin geoetiqueta.

Confirma el envío. El caso vuelve a la lista de siniestros, donde puedes ver el avance. La decisión de aprobar, rechazar o pagar la toma el operador en el back-office.


3.3.3.10 Cómo consultar un pago automático

Clima y vuelos no se reportan como un siniestro asistido. Cuando el evento supera el umbral, el resultado aparece como Pago automático en Siniestros.

  1. Abre Siniestros.
  2. Abre el caso de pago automático.
  3. Revisa el resumen del evento y el monto. El título en el canal es Pago automático.

Pago automático


3.3.3.11 Cómo pedir protección ligada a un crédito

La vida hipotecaria y la protección de pagos no se inician desde Perfil.

  1. En Inicio, abre la tarjeta de crédito o pulsa Nueva cotización y elige Hipotecario o Pagos.
  2. En hipotecario, el paso siguiente es el consentimiento de perfilamiento. Lee el texto legal y continúa.
  3. Revisa la oferta hipotecaria (factores y prima).
  4. Pulsa Aceptar. El resto es el mismo camino de emisión: progreso, póliza emitida o rechazo.
Consentimiento de perfilamiento Oferta hipotecaria
Consentimiento hipotecario Oferta hipotecaria

3.3.3.12 Cómo usar Perfil
  1. Pulsa Perfil.
  2. Cada fila abre un diálogo encima de la página. No es una pantalla nueva de registro.
Diálogo Acción al terminar
Idioma y región Guardar o Cerrar. El formato de montos y fechas se actualiza.
Consentimiento de datos Consultar el texto o Revocar.
Vida crediticia Entendido o Cerrar. No inicia una cotización hipotecaria.
Cerrar sesión Confirmar. Vuelves a Login.

Cierra el diálogo para seguir en Perfil. El diálogo no te lleva al onboarding ni a una oferta.

Perfil Idioma y región
Perfil Diálogo de idioma

3.3.3.13 Accesibilidad, idioma y ubicación
3.3.3.13.1 Accesibilidad
  • Los colores de botón usan el par de contraste del design system: fondo primario con texto sobre primario.
  • El foco por teclado sigue el orden visual. Un enlace navega; el resto de controles son botones.
  • Una opción elegida se indica con borde, check y texto, no solo con color.
  • En el visor de Figma en escritorio: Options → Accessibility settings → Adapt content for screen readers. VoiceOver, NVDA y JAWS pueden leer el prototipo.
  • La validación automática con axe sobre el sitio publicado corresponde al canal ya programado.

Detalle: Usabilidad del prototipo · Cumplimiento Axe y Nielsen · cliente.

3.3.3.13.2 Qué no incluye este canal
  • No hay campana de notificaciones. Los avisos de la póliza se leen en Pólizas.
  • No hay cámara del sistema ni permisos de Android. La evidencia es un archivo.
  • No hay destinos de Open Finance ni de análisis de riesgo.
  • No se instala desde una tienda de aplicaciones.

4. Documento de lecciones aprendidas Proyecto I


Índice


4.1 Propósito y alcance

Este documento registra el conocimiento adquirido por el equipo durante la primera iteración del entregable (Proyecto Final 1) con dos fines explícitos: mejorar la ejecución del Proyecto Final 2, cuyo plan ya está comprometido en tres sprints, y dejar constancia verificable de por qué el equipo decidió lo que decidió, de modo que las decisiones sean auditables después de que se pierda el contexto conversacional.

Dentro del alcance. Las siete semanas del PF1: definición de alcance, requisitos de calidad y ASR, escenarios de calidad y árbol de utilidad, diseño de la arquitectura y del diseño detallado, catálogo de historias de arquitectura HA-01–HA-31, diseño y ejecución de los dos experimentos de arquitectura (HA-01 y HA-08), prototipo navegable web/móvil/back-office, refinamiento del backlog y versión inicial del plan de trabajo del PF2.

Fuera del alcance. La ejecución de los sprints del PF2 (aún no ha empezado), la evaluación individual de desempeño de los integrantes y cualquier juicio sobre personas. El registro documenta situaciones y decisiones, no responsables de fallas.

Una lección aprendida no es una queja ni un pendiente. Para que una entrada figure en §4.5 tiene que cumplir tres condiciones: describe una situación que efectivamente ocurrió y está respaldada por un artefacto; permite extraer un enunciado reutilizable más allá de este proyecto; y se traduce en una acción concreta para la iteración siguiente. Lo que no cumple las tres cosas va a §4.8 (riesgo o brecha abierta) o al backlog, no aquí.


4.2 Formato adoptado y cómo se llena

El formato es un híbrido deliberado de dos estándares, porque ninguno de los dos cubre solo el caso:

Componente Origen Qué aporta
Registro de lecciones aprendidas (§4.5) — ficha por lección con ID, categoría, situación, impacto, causa raíz, lección y recomendación Lessons Learned Register del PMBOK (PMI), práctica estándar de gestión del conocimiento del proyecto Trazabilidad, causa raíz explícita y accionabilidad. Es el formato que un evaluador o un equipo entrante reconoce sin explicación previa
Retrospectiva Continuar / Empezar / Dejar de hacer (§4.6) Scrum / DAD, el marco híbrido que el equipo declaró en sus acuerdos La voz del equipo sobre el proceso, en el formato en que el equipo ya trabaja. Es lo que hace que el documento se use y no solo se archive
Plan de acción con responsable, sprint y criterio de verificación (§4.7) Acción correctiva/preventiva (PMI) aterrizada al sprint Cierra el ciclo: una lección sin acción verificable en el plan del PF2 es una observación, no una lección

Por qué este híbrido y no otro. Un post-mortem técnico puro habría dejado fuera la gestión de alcance y de equipo, que es donde está la mitad del aprendizaje de esta iteración. Una retrospectiva ágil pura no habría dejado registro de causa raíz ni trazabilidad a la evidencia, que es justamente lo que el curso evalúa. Un informe de cierre de fase estilo ISO/IEC/IEEE 15288 habría sido desproporcionado para un equipo de cuatro personas en siete semanas.

Escala y convenciones del registro

Campo Valores admitidos
ID LA-nn, secuencial y estable. Un ID nunca se reutiliza ni se renumera
Tipo ✅ Práctica a replicar · 🔧 Oportunidad de mejora · ⚠️ Situación a evitar
Impacto observado Alto (afectó el entregable, el cronograma o una decisión de arquitectura) · Medio (generó retrabajo acotado) · Bajo (fricción sin consecuencia en el entregable)
Estado de validación ☑ Validada · ✖ Rechazada (se conserva con la razón del rechazo)
Evidencia Enlace al artefacto versionado que respalda la situación. Una lección sin evidencia no entra al registro

Cómo se validó

El registro se validó en la sesión de retrospectiva del equipo: se recorrió el índice de §4.5.1 y se decidió ☑ o ✖ por lección. Las 19 lecciones quedaron validadas; ninguna fue rechazada ni se añadieron lecciones nuevas. Cada acción de §4.7 salió con responsable nombrado y criterio de verificación, y el documento quedó cerrado en su versión 1.0 con la firma de los cuatro integrantes en §4.10. A partir de aquí se revisa al cierre de cada sprint del PF2.


4.3 Contexto de la iteración

El PF1 no produjo software de producción: produjo una arquitectura con evidencia empírica detrás y un plan de ejecución calibrado. Esa distinción explica la naturaleza de casi todas las lecciones que siguen — el aprendizaje de la iteración es sobre cómo se decide y cómo se evidencia, no sobre cómo se construye.

Trayectoria de las siete semanas

Bloque Qué se produjo Estado al cierre
Semanas 1–4 Alcance, requisitos de calidad, ASR, escenarios de calidad en seis partes, árbol de utilidad, vistas de arquitectura y diseño detallado, catálogo HA-01–HA-31, backlog refinado Cerrado
Semana 5 Diseño formal de los dos experimentos de arquitectura, con hipótesis de diseño y sub-hipótesis declaradas antes de medir Cerrado
Semana 6 HA-08 ejecutado al 100 %. HA-01 al 60 %: montaje completo y validado sintácticamente, cero corridas. Prototipo con 8 pantallas de back-office pendientes Parcial
Semana 7 Campaña completa de HA-01 (56 corridas), prototipo cerrado con back-office, documento de arquitectura ajustado conforme a la evidencia, versión inicial del plan del PF2 Cerrado

Los dos experimentos y su dictamen

Experimento Hipótesis de diseño Veredicto Consecuencia sobre la arquitectura
HA-08 — modelo de lectura de baja latencia para el estado de siniestro (CQRS con proyección materializada y caché) HD-08: la separación del modelo de lectura es necesaria para cumplir EC-LAT-11 (p95 ≤ 150 ms) ❌ No se confirma Se descarta introducir proyector, almacén de proyección y caché. La línea base cumple el ASR con 19× de margen
HA-01 — protección del presupuesto de latencia de la cotización embebida HD-01: tratar la invocación de Open Finance como actualización oportunista permite cumplir EC-LAT-01/EC-LAT-02 con el proveedor sano y también degradado ✅ Se confirma, con un matiz no anticipado Ninguna vista cambia. Se corrigen el razonamiento, el modelo de fallas, la redacción de dos escenarios de calidad y la parametrización de tres tácticas

El resultado más útil de la iteración fue un experimento que refutó su propia hipótesis. HA-08 no falló: demostró que la complejidad propuesta no hacía falta al volumen ensayado, y ese dictamen ahorró tres componentes y un nodo de despliegue. Es el hecho del que se derivan las lecciones LA-01 y LA-02, y conviene tenerlo presente al leer el resto del registro.


4.4 Métricas de la iteración

Las métricas de producto (velocidad real, cumplimiento del compromiso, defectos) no existen todavía: el PF1 no ejecutó sprints de construcción. Lo que sigue son las métricas de la iteración de arquitectura y la línea base contra la cual se medirá el PF2.

Métrica Valor al cierre del PF1 Observación
Experimentos de arquitectura diseñados y ejecutados 2 / 2 HA-01 y HA-08, ambos al 100 %
Corridas ejecutadas 76 20 en HA-08 · 56 en HA-01
Hipótesis y sub-hipótesis con veredicto explícito 14 4 de HA-08 · 8 de HA-01 · 2 restricciones de presupuesto
Sub-hipótesis refutadas o confirmadas solo en parte 7 de 12 58 %. Ver LA-01
Vistas de arquitectura modificadas por la evidencia 0 Los ajustes se concentraron en diseño detallado, razonamiento y escenarios
Decisiones marcadas para corregir, decidir o revisar tras la experimentación 7 5 correcciones/decisiones · 1 confirmación · 1 brecha abierta de negocio
Historias de arquitectura catalogadas 31 (23 en el tablero) HA-01–HA-31
Historias de usuario en el tablero 120 HU · 399 SP 89 del backlog refinado + 31 de pantallas de cliente
Catálogo MVP 100 HU · 304 SP —
Capacidad calculada de los tres sprints del PF2 137 SP Sin histórico: derivada de la historia base. Ver LA-06
Comprometido en el plan del PF2 131 SP · 58 HU (96 % de la capacidad) 6 SP de holgura, todos en el Sprint 1
Alcance declarado explícitamente fuera del compromiso 117 SP No es deuda oculta. Ver LA-05
Versiones que necesitó el plan de trabajo antes de estabilizarse 3 (v1 borrador → v2 → v2.1) Ver LA-17
Historias comprometidas con refinamiento completo al cierre 50 de 58 A 8 les falta el número medible del escenario de calidad
Factor de conversión horas ↔ puntos 2,4 h/SP Derivado, no validado empíricamente. Ver LA-06
Bus factor del canal móvil 1 39 de los 131 SP comprometidos son móviles. Ver LA-16

4.5 Registro de lecciones aprendidas

4.5.1 Índice del registro

ID Categoría Lección Tipo Impacto Validación
LA-01 Experimentación Un experimento que refuta su hipótesis entrega el mismo valor que uno que la confirma ✅ Alto ☑
LA-02 Experimentación La atribución causal se diseña antes de medir, no se argumenta después ✅ Alto ☑
LA-03 Experimentación El esfuerzo de un experimento no está en el montaje 🔧 Alto ☑
LA-04 Experimentación Versionar la evidencia cruda cuesta menos que repetir una corrida ✅ Medio ☑
LA-05 Alcance La capacidad es un dato de entrada, no una variable de ajuste ✅ Alto ☑
LA-06 Estimación Sin histórico, la velocidad se deriva de una historia base — y se declara provisional 🔧 Alto ☑
LA-07 Arquitectura Dos tácticas sobre el mismo escenario deben tener méritos separados en el razonamiento 🔧 Alto ☑
LA-08 Arquitectura El modelo de fallas se deriva del estímulo del escenario, e incluye el fallo a medias 🔧 Alto ☑
LA-09 Arquitectura Una medida de respuesta única puede satisfacerse degradando lo que el escenario protege 🔧 Alto ☑
LA-10 Arquitectura Una restricción de presupuesto debe declarar bajo qué estado del entorno es exigible 🔧 Medio ☑
LA-11 Arquitectura El parámetro de una táctica es parte de la decisión, no un detalle de implementación ⚠️ Alto ☑
LA-12 Arquitectura El aislamiento de recursos se dimensiona por consumidor, no solo por proveedor ⚠️ Alto ☑
LA-13 Arquitectura El alcance de lo validado se declara, o la evidencia se extiende por analogía ✅ Medio ☑
LA-14 Prototipo Un hueco de diseño es una dependencia de planificación, no deuda de UX 🔧 Medio ☑
LA-15 Prototipo Declarar la limitación es preferible a reportar la condición como cumplida ✅ Medio ☑
LA-16 Equipo La concentración de conocimiento es un riesgo de cronograma ⚠️ Alto ☑
LA-17 Documentación Dos fuentes de verdad divergen; una de ellas tiene que ser la vigente 🔧 Medio ☑
LA-18 Proceso Los acuerdos de equipo caducan si no se revisan al cierre de la iteración 🔧 Bajo ☑
LA-19 Proceso Una brecha de decisión no se cierra con más corridas ✅ Medio ☑

4.5.2 Experimentación y validación de ASR

LA-01 · Un experimento que refuta su hipótesis entrega el mismo valor que uno que la confirma
Tipo ✅ Práctica a replicar
Categoría Experimentación y validación de ASR
Fase Semanas 5–6
Impacto observado Alto — evitó introducir tres componentes y un nodo de despliegue
Evidencia Informe HA-08 · detallado · semana 7 §2.2
Validación ☑

Situación. El experimento HA-08 se diseñó para demostrar que la separación del modelo de lectura (CQRS con proyección materializada y caché) era necesaria para cumplir EC-LAT-11 (p95 ≤ 150 ms en la consulta de estado de siniestro). El resultado fue el contrario: el brazo A —lectura directa sobre el modelo normalizado, sin CQRS— midió p95 = 7,86 ms, 19× por debajo del umbral, con 0 % de error en las nueve corridas contrabalanceadas. Tres de las cuatro sub-hipótesis quedaron refutadas, y una de ellas en la dirección contraria: el caché (brazo C) resultó 9 % peor que la proyección sola, porque con el hit-rate real de 7,6 % la mayoría de las peticiones paga la serialización y la escritura a Redis sin beneficiarse de un acierto.

Impacto. El dictamen descartó introducir proyector, almacén de proyección desnormalizado (siniestros_r) y una instancia de Redis para este camino de lectura. La arquitectura publicada quedó confirmada sin cambios, no porque nadie la revisara, sino porque se puso a prueba y resistió.

Causa raíz del acierto. Tres decisiones tomadas antes de medir: se declararon las sub-hipótesis por separado (HD-08.1 a HD-08.4) en lugar de una sola afirmación global; se incluyó un brazo de línea base sin la táctica propuesta; y el criterio de éxito se fijó contra el umbral del ASR, no contra la mejora relativa entre brazos. Sin el brazo A no habría habido nada con lo que comparar, y la mejora del 21 % del brazo B sobre A —que es real— habría parecido un argumento de necesidad cuando representa menos del 1,2 % del umbral.

Lección aprendida. Un experimento de arquitectura se diseña para decidir, no para confirmar lo que ya se decidió. La refutación de una hipótesis de diseño es un resultado de primera clase: ahorra complejidad que habría entrado al sistema sin que nadie pudiera después justificar por qué está ahí. Corolario operativo: todo experimento debe incluir un brazo de línea base sin la táctica bajo prueba, y el criterio de éxito debe ser el umbral del ASR y no la mejora relativa entre brazos.

Recomendación. Incorporar a la plantilla de diseño de experimentos del PF2 dos casillas obligatorias: brazo de línea base y umbral del ASR como criterio de decisión. Aplicar a HA-02, HA-07, HA-09 y HA-10 (Sprint 2) y a HA-03–HA-06, HA-11 y HA-12 (Sprint 3).


LA-02 · La atribución causal se diseña antes de medir, no se argumenta después
Tipo ✅ Práctica a replicar
Categoría Experimentación y validación de ASR
Fase Semanas 5 y 7
Impacto observado Alto — es el argumento que sostiene la decisión de arquitectura más importante de la iteración
Evidencia Informe HA-01 · semana 7 §2.2
Validación ☑

Situación. HA-01 tenía que distinguir el mérito de dos tácticas que actúan sobre el mismo escenario: el circuit breaker y el desacople por actualización oportunista. El hallazgo decisivo apareció en la celda de fallos intermitentes del 30 %: allí el interruptor no llega a abrir en ningún brazo —no se alcanzan diez fallos consecutivos ni el 50 % de la ventana, breaker_max = 0 en las ocho corridas— y aun así el brazo B incumple (1,10–1,25 % de cotizaciones sobre 475 ms) y el brazo C cumple (0,00 %). Como el interruptor no interviene en ninguno de los dos, la diferencia es atribuible únicamente al desacople.

Impacto. Ese resultado elimina la explicación alternativa y convierte una correlación en una atribución. Además se verificó bajo los dos modelos de fallo posibles —fallo atado al cliente y fallo derivado de un contador por petición— con el resultado manteniéndose en ambos, lo que descarta que el hallazgo sea un artefacto del doble del proveedor.

Causa raíz del acierto. El diseño del experimento previó la necesidad de aislar factores: seis estados del proveedor en lugar de dos, protocolo de tres fases (sana / degradada / recuperación), corridas contrabalanceadas, y celdas específicas —la de estampida, la de sensibilidad al acierto, la de política del interruptor a dos niveles de tráfico— construidas cada una para aislar una variable. La celda que produjo el hallazgo existe porque alguien previó que el interruptor podía no abrir.

Lección aprendida. Cuando dos mecanismos actúan sobre el mismo escenario de calidad, la única forma de saber cuál sostiene el ASR es diseñar una condición experimental en la que uno de los dos esté inactivo. Esa condición se diseña antes de medir; después de medir solo se puede argumentar, y un argumento no es evidencia. El costo de prever esa celda es bajo; el costo de no tenerla es no poder defender la decisión.

Recomendación. En el diseño de cada experimento del PF2, incluir explícitamente la pregunta ¿qué otra cosa podría explicar este resultado? y, por cada respuesta, la celda que la descarta. Documentarlo en la sección de amenazas a la validez, que en HA-08 ya existe y debe volverse obligatoria.


LA-03 · El esfuerzo de un experimento no está en el montaje
Tipo 🔧 Oportunidad de mejora
Categoría Experimentación y validación de ASR
Fase Semanas 6–7
Impacto observado Alto — concentró la campaña completa de un experimento en la última semana de la iteración
Evidencia semana 6 §1.1 · semana 7 §2
Validación ☑

Situación. Al cierre de la semana 6, HA-01 reportaba 60 % de avance: montaje implementado y validado sintácticamente —:MsCotización con sus cuatro brazos, :AdaptadorOF con interruptor y aislamiento, doble del proveedor con latencia log-normal, Toxiproxy, Redis, PostgreSQL, Prometheus, Grafana y escenarios k6— y cero corridas ejecutadas. Las 56 corridas del protocolo de tres fases, su análisis y la redacción del dictamen se ejecutaron enteramente en la semana 7, en paralelo con el cierre del prototipo, el ajuste del documento de arquitectura y la elaboración del plan del PF2.

Impacto. El entregable se cerró completo, pero sin margen. Cualquier hallazgo que hubiera obligado a rediseñar el montaje —y HA-01 produjo varios hallazgos inesperados— habría llegado sin tiempo de reacción. La semana 7 absorbió simultáneamente el trabajo de dos semanas de experimentación y el cierre de tres entregables más.

Causa raíz. La estimación del experimento trató «montaje listo» como el hito relevante, y el porcentaje de avance se reportó contra la implementación. Pero un experimento con 56 corridas sobre seis estados del proveedor, cinco tasas de acierto, dos políticas de interruptor y cuatro escalones de llegada tiene su esfuerzo repartido en al menos cuatro actividades de tamaño comparable: montaje, ejecución de la campaña, análisis de los datos y redacción del dictamen con su trazabilidad. Reportar 60 % con el montaje terminado sobreestimó el avance real.

Lección aprendida. En un experimento de arquitectura, el montaje es la parte más visible y no la más costosa. El hito que se debe planificar y comprometer es la fecha de la primera corrida válida, no la de montaje terminado, porque es la primera corrida la que revela si el montaje mide lo que se pretende medir. Corolario: el porcentaje de avance de un experimento no debe calcularse sobre la implementación.

Recomendación. Estimar cada experimento del PF2 desglosado en cuatro actividades con esfuerzo propio (montaje · campaña · análisis · dictamen y trazabilidad) y comprometer la fecha de la primera corrida. Como los experimentos del PF2 están repartidos entre S2 y S3 sobre las HU que ya están en el sprint, fijar esa fecha en la mitad del sprint, no al final.


LA-04 · Versionar la evidencia cruda cuesta menos que repetir una corrida
Tipo ✅ Práctica a replicar
Categoría Experimentación y validación de ASR
Fase Semanas 6–7
Impacto observado Medio — permitió recalcular percentiles por fase sin reejecutar 56 corridas
Evidencia semana 7 §2.1 · repositorios de experiments/ha-08-lectura-siniestro y experimentos/ha01
Validación ☑

Situación. En ambos experimentos se versionaron, por corrida, las métricas finales, la configuración efectiva, las verificaciones de sanidad, el resumen de k6 y las series temporales segundo a segundo, junto con el consolidado en CSV y las figuras del informe. En HA-01 se versionó además una instantánea completa de la base de Prometheus (raspado de 1 s, 20 MB comprimidos) cubriendo toda la campaña.

Impacto. Cualquier cifra citada en los informes es recalculable sin reproducir las corridas, y los percentiles pueden recalcularse por fase del protocolo. Eso fue lo que permitió producir, después de terminada la campaña, análisis que no estaban previstos en el diseño original: el corte del p95 del adaptador por fase que reveló el incumplimiento de EC-LAT-07, y la verificación del hallazgo bajo los dos modelos de fallo.

Causa raíz del acierto. Se decidió versionar la evidencia cruda durante la campaña y no al final, cuando ya se sabe qué figuras irán al informe. Los análisis más valiosos del experimento fueron los que no estaban planeados, y solo fueron posibles porque el dato seguía ahí.

Lección aprendida. El dato crudo de un experimento vale más después de terminarlo que durante. Veinte megabytes comprimidos son un costo despreciable frente a reejecutar una campaña de 56 corridas, y la disponibilidad del dato crudo es lo que permite responder la pregunta que nadie previó — que, en esta iteración, resultó ser la pregunta decisiva.

Recomendación. Mantener como práctica obligatoria en el PF2: instantánea de la serie temporal completa por campaña, configuración efectiva por corrida y consolidado en CSV, versionados en el repositorio del experimento. Incluirlo en la definición de terminado de las historias de arquitectura.


4.5.3 Arquitectura y diseño

LA-07 · Dos tácticas sobre el mismo escenario deben tener méritos separados en el razonamiento
Tipo 🔧 Oportunidad de mejora
Categoría Arquitectura y diseño
Fase Semana 5 (origen) · semana 7 (detección)
Impacto observado Alto — obligó a corregir el razonamiento de la decisión de arquitectura central del proyecto
Evidencia semana 7 §2.2, decisión 1 · semana 7 §3.1
Validación ☑

Situación. El razonamiento publicado en §1.2.4 de la semana 5 atribuía toda la protección del presupuesto de latencia de la cotización a la actualización oportunista. HA-01 mostró que los méritos son separables y distintos: el circuit breaker protege frente al proveedor caído —fallo limpio y detectable—, mientras que el desacople es el único que protege frente al proveedor lento o intermitente, donde el interruptor nunca llega a abrir porque el proveedor responde dentro del timeout duro de 700 ms. Con el proveedor lento, además, el interruptor no abre nunca y el camino degradado (189 ms) resulta más lento que el camino frío con proveedor sano (159 ms), refutando HD-01.3 tal como estaba enunciada.

Impacto. La topología no cambió —el brazo C validado es exactamente el modelo publicado—, pero el razonamiento que la justificaba era incorrecto en su atribución. Un razonamiento mal atribuido es peligroso de una forma particular: invita a retirar la táctica que parece redundante. Si alguien hubiera leído §1.2.4 y concluido que el interruptor sobra porque el desacople ya protege el presupuesto, habría quedado el sistema sin protección frente al proveedor caído.

Causa raíz. Las dos tácticas se adoptaron juntas, contra el mismo escenario, y el razonamiento se escribió sobre el efecto agregado observado en el diseño, no sobre el mecanismo de cada una. No existía una condición —ni analítica ni experimental— en la que una de las dos estuviera inactiva, así que no había forma de distinguirlas sobre el papel.

Lección aprendida. Cuando varias tácticas responden al mismo escenario de calidad, el documento de arquitectura debe declarar qué hace cada una y frente a qué estímulo concreto. Un razonamiento que describe el efecto conjunto no permite saber qué se pierde al retirar una pieza, que es precisamente la pregunta que alguien hará cuando haya que simplificar.

Recomendación. Adoptar en el diseño detallado del PF2 una tabla táctica ↔ estímulo que neutraliza, con una fila por táctica y no por escenario. Revisar con ese criterio las demás decisiones donde coexisten varias tácticas, empezando por las de escalabilidad (HA-09, HA-10) y las del canal paramétrico (HA-11, HA-12).


LA-08 · El modelo de fallas se deriva del estímulo del escenario, e incluye el fallo a medias
Tipo 🔧 Oportunidad de mejora
Categoría Arquitectura y diseño
Fase Semana 5 (origen) · semana 7 (detección)
Impacto observado Alto — el estado omitido es el que materializa el ASR
Evidencia semana 7 §2.2, decisión 2
Validación ☑

Situación. El modelo de fallas del proveedor externo tenía cinco estados y resultó incorrecto en dos sentidos. Faltaba intermitente, que es el estado donde se produjo el hallazgo principal del experimento. Y degradado —que el modelo trataba como un estado propio— resulta ser en la práctica una caída, mientras el estado que realmente materializa el estímulo de EC-LAT-09 es lento: el proveedor que responde, pero no dentro de su presupuesto.

Impacto. El escenario EC-LAT-09 estaba redactado contra un estímulo que no era el crítico. Con el proveedor caído el interruptor basta por sí solo, así que el escenario tal como estaba enunciado no ejercitaba el mecanismo que el diseño necesitaba defender. Si el experimento hubiera ensayado solo los cinco estados originales, habría concluido que el desacople es prescindible.

Causa raíz. El modelo de fallas se construyó enumerando estados del proveedor desde la perspectiva de su disponibilidad —arriba, abajo, y grados intermedios nombrados informalmente— en lugar de derivarlos del estímulo que el escenario de calidad necesita representar. Un escenario de latencia se rompe por respuestas tardías, no por ausencia de respuesta: la ausencia de respuesta es el caso fácil, porque es detectable.

Lección aprendida. El modelo de fallas de una dependencia externa se deriva del estímulo del escenario de calidad, no de una enumeración de estados de disponibilidad. Y debe incluir explícitamente las formas de fallar a medias —lento, intermitente, respuesta parcial, respuesta incorrecta—, porque son las que derrotan los mecanismos de detección: un componente que responde dentro del timeout no dispara ningún contador.

Recomendación. Añadir intermitente como sexto estado del modelo (ya acordado en §3.1 de la semana 7) y revisar el modelo de fallas de las demás dependencias externas con la pregunta ¿cómo falla esto a medias?: los adaptadores de Open Finance y Open Data, la firma electrónica, la pasarela de cobro y el canal de eventos paramétricos.


LA-09 · Una medida de respuesta única puede satisfacerse degradando lo que el escenario protege
Tipo 🔧 Oportunidad de mejora
Categoría Arquitectura y diseño
Fase Semana 7
Impacto observado Alto — un escenario de calidad era satisfacible por un camino que el propio diseño declara inaceptable
Evidencia semana 7 §2.2, decisión 4 · §3.1, escenarios de calidad
Validación ☑

Situación. EC-LAT-09 estaba definido con una sola medida de respuesta: la latencia. El experimento mostró que el brazo A —invocación bloqueante sin caché— cumple el umbral con el proveedor caído, y lo cumple tarifando el 98,9 % de las cotizaciones con perfil por defecto. Es decir: satisface el escenario de calidad por el procedimiento de renunciar al dato que le da sentido a la cotización.

Impacto. Un escenario que puede aprobarse degradando el resultado de negocio no discrimina entre diseños. De haberse quedado la medición en la latencia, el brazo A habría pasado y el argumento a favor del desacople se habría debilitado por una razón espuria.

Causa raíz. La medida de respuesta se escribió pensando en el atributo de calidad (latencia) y no en qué significa responder bien para ese escenario. En un escenario de degradación, responder rápido es trivial: basta con no intentar. Lo que hay que medir es si la respuesta rápida conserva el valor.

Lección aprendida. En todo escenario de calidad que describe una degradación, una sola medida de respuesta es insuficiente: hay que añadir la medida que impide satisfacerla por la vía trivial. Para EC-LAT-09 esa medida es la proporción de cotizaciones resueltas con valor de respaldo. Generalizando: por cada escenario de degradación, preguntar ¿cómo se aprobaría este escenario haciendo trampa? y medir también eso.

Recomendación. Incorporar la proporción con respaldo como segunda medida de respuesta de EC-LAT-09 (ya acordado) y revisar con el mismo criterio los demás escenarios de degradación del catálogo, señaladamente EC-LAT-08 (degradación del perfilamiento, que sostiene HU-56) y los de disponibilidad de HA-14 en adelante.


LA-10 · Una restricción de presupuesto debe declarar bajo qué estado del entorno es exigible
Tipo 🔧 Oportunidad de mejora
Categoría Arquitectura y diseño
Fase Semana 7
Impacto observado Medio — obligó a reredactar una restricción de diseño
Evidencia semana 7 §2.2, restricciones de presupuesto
Validación ☑

Situación. EC-LAT-07 fijaba un presupuesto de ≤ 120 ms por dependencia externa. La medición lo incumple: con el proveedor lento, el p95 del adaptador cortado por fase es de 495,6 ms y el 99,78 % de sus llamadas excede el presupuesto. Con el proveedor sano se cumple al filo (114,9–121,8 ms), y el único estado degradado en que se cumple es caído, donde se cumple por el interruptor, que al abrir corta las llamadas sin tocar al proveedor. EC-LAT-08 (timeout duro de 700 ms), en cambio, se cumple en los cuatro brazos sin excepción.

Impacto. El incumplimiento no debilita la hipótesis de diseño, la refuerza: si la dependencia cupiera en 120 ms, cabría preguntar para qué hace falta la actualización oportunista. Lo que muestra la evidencia es que con el proveedor degradado la dependencia no cabe, y por eso el desacople no es una optimización sino la condición para cumplir el ASR de cotización. Pero la restricción, tal como estaba redactada, quedaba formalmente incumplida y habría figurado así en cualquier auditoría del diseño.

Causa raíz. La restricción se derivó de una descomposición aritmética del presupuesto total de latencia entre los participantes del camino, asumiendo implícitamente el estado sano del entorno. Un presupuesto repartido de esa forma es una herramienta de diseño válida, pero no es una afirmación sobre el comportamiento del sistema bajo degradación.

Lección aprendida. Una restricción de presupuesto derivada de una descomposición aritmética es exigible solo en el estado del entorno bajo el cual se derivó. Si no declara ese estado, se convierte en un incumplimiento aparente en cuanto el entorno se degrada, y ese falso incumplimiento compite por atención con los reales. La redacción correcta declara el estado y el mecanismo con que el diseño absorbe el exceso — en este caso, abandonando la espera.

Recomendación. Mantener EC-LAT-07 como presupuesto objetivo con la salvedad medida explícita (ya acordado) y revisar todas las restricciones del catálogo derivadas por descomposición para que declaren su estado de exigibilidad.


LA-11 · El parámetro de una táctica es parte de la decisión, no un detalle de implementación
Tipo ⚠️ Situación a evitar
Categoría Arquitectura y diseño
Fase Semana 5 (origen) · semana 7 (detección)
Impacto observado Alto — una de las dos parametrizaciones posibles rompe el ASR
Evidencia semana 7 §2.2, decisión 3 · sub-hipótesis HD-01.6
Validación ☑

Situación. El diseño adoptaba la táctica de circuit breaker sin definir su política de apertura. El experimento midió las dos alternativas a dos niveles de tráfico: la política por conteo con tráfico bajo produce 1,19 % de cotizaciones sobre 475 ms y un p99 de 716 ms — rompe el ASR. La política por tasa sobre ventana deslizante da 0,24 % con tráfico alto y 0,77 % con tráfico bajo, y no incumple en ninguna condición.

Impacto. La táctica figuraba como adoptada en el documento de arquitectura, de modo que el escenario aparecía como cubierto. Pero una de las dos formas razonables de implementarla rompe el ASR precisamente en la condición menos vigilada: tráfico bajo, donde diez fallos consecutivos tardan en acumularse y la ventana por conteo se llena despacio. Es un incumplimiento que ninguna prueba de carga a tráfico nominal habría encontrado.

Causa raíz. El catálogo de tácticas se documentó al nivel de qué táctica y no de con qué parámetros, tratando la parametrización como una decisión de implementación delegada al desarrollo. Para tácticas cuyo comportamiento depende de una ventana, un umbral o un timeout, esa delegación traslada la garantía del ASR a quien escribe el código sin darle el criterio para decidir.

Lección aprendida. Una táctica adoptada sin sus parámetros no cubre el escenario: cubre a lo sumo la mitad de él. El parámetro pertenece a la decisión de arquitectura, con su valor adoptado y la evidencia que lo respalda, y debe quedar en el documento — no en el código. Señal de alerta reutilizable: si el comportamiento de una táctica depende de una ventana, un umbral o un tiempo de espera, el documento de arquitectura tiene que fijar ese número.

Recomendación. Adoptar la política por tasa sobre ventana deslizante (ya decidido) y auditar el catálogo de tácticas del diseño detallado: cada táctica adoptada debe listar sus parámetros, el valor adoptado y la evidencia o el criterio que lo sostiene. Las que no lo tengan quedan marcadas como parametrización pendiente, visible, en lugar de figurar como cubiertas.


LA-12 · El aislamiento de recursos se dimensiona por consumidor, no solo por proveedor
Tipo ⚠️ Situación a evitar
Categoría Arquitectura y diseño
Fase Semana 7
Impacto observado Alto — modo de fallo silencioso con el tercero sano
Evidencia semana 7 §3.1, diseño detallado · sub-hipótesis HD-01.7
Validación ☑

Situación. El aislamiento de recursos de :AdaptadorOF está dimensionado por proveedor, y :MsCotización y :MsPerfilamiento comparten ese mismo pool, pese a tener picos no correlacionados por diseño. La celda de estampida de HA-01 (20 claves, TTL 2 s) midió 101 invocaciones en vuelo sobre un pool de 40. Y como PoolTimeout se excluye del cómputo de fallas del proveedor, el interruptor no abriría: la cotización se degradaría con el tercero sano y sin ninguna señal que lo explicara.

Impacto. Es un modo de fallo silencioso: el síntoma es degradación del recorrido crítico #1, la causa está en el consumo del recorrido #5, y ningún indicador lo relaciona. La coalescencia por clave (brazo C′) lo contiene —coalesce 577 invocaciones y deja el vuelo en 20, con la latencia prácticamente igual: 183 contra 184 ms— pero con el patrón de acceso normal ensayado hubo 0 coalescencias, así que es una táctica condicionada que protege el pool y al proveedor, no el percentil.

Causa raíz. El aislamiento se pensó como protección frente al proveedor —evitar que un tercero lento consuma todos los recursos— y no como protección entre consumidores del mismo recurso interno. Y el contador de fallas del interruptor se definió sobre fallas del proveedor, dejando fuera el agotamiento de un recurso propio, que produce el mismo efecto observable sin activar ninguna defensa.

Lección aprendida. Un recurso compartido necesita aislamiento en ambas direcciones: por proveedor y por consumidor. Y los contadores de falla de un mecanismo de protección deben incluir el agotamiento de los recursos propios, no solo los fallos de la dependencia: si no, el mecanismo queda ciego justo en el caso en que la culpa es de la casa. Corolario: todo componente compartido por dos recorridos con picos no correlacionados es un punto de acoplamiento operacional que hay que dimensionar explícitamente.

Recomendación. Dimensionar el aislamiento por proveedor y por consumidor, incluir las tareas de refresco en segundo plano en el dimensionamiento (no solo las conexiones) e incorporar PoolTimeout a la señal observable. Añadir al PF2 un inventario de recursos compartidos entre recorridos, con su dimensionamiento y su indicador.


LA-13 · El alcance de lo validado se declara, o la evidencia se extiende por analogía
Tipo ✅ Práctica a replicar
Categoría Arquitectura y diseño
Fase Semana 7
Impacto observado Medio — acota correctamente el valor probatorio del experimento
Evidencia semana 7 §3.1, alcance de lo validado
Validación ☑

Situación. El documento de arquitectura ajustado declara explícitamente que HA-01 ejercitó el camino de cotización (:MsCotización → :CacheOF → :AdaptadorOF) y que el camino de perfilamiento —el fan-out de :MsPerfilamiento hacia :AdaptadorOF y :AdaptadorOD— comparte el mismo adaptador y no se ejercitó. La misma práctica aparece en HA-08, donde se declara que la evidencia de aislamiento de carga (~2,5× de CPU sobre PostgreSQL en el brazo A) es insumo para un experimento futuro sobre ese atributo, no de latencia.

Impacto. Sin esa declaración, la conclusión de HA-01 se habría leído como validación del adaptador completo, cuando el camino de perfilamiento tiene un patrón de acceso distinto (fan-out a dos proveedores) sobre el recurso compartido que LA-12 identifica como punto de acoplamiento. Declarar el límite es lo que mantiene visible ese hueco.

Causa raíz del acierto. Se trató el alcance de la validación como parte del dictamen y no como una salvedad de cortesía. Un experimento valida un camino, una carga y un rango; todo lo demás es extrapolación, y la extrapolación se nombra como tal.

Lección aprendida. Un experimento valida el camino que ejercitó, con la carga que aplicó, en el rango que midió. Declarar ese alcance es lo que impide que la evidencia se extienda por analogía a caminos que comparten componentes pero no patrón de uso — que es exactamente donde aparecen los modos de fallo no previstos.

Recomendación. Mantener la declaración de alcance como sección obligatoria del dictamen de cada experimento del PF2, y llevar una matriz camino crítico ↔ experimento que lo cubre, de forma que los caminos sin cobertura sean visibles en lugar de quedar cubiertos por analogía. Primer hueco a registrar: el camino de perfilamiento sobre :AdaptadorOF.


4.5.4 Gestión de alcance y estimación

LA-05 · La capacidad es un dato de entrada, no una variable de ajuste
Tipo ✅ Práctica a replicar
Categoría Gestión de alcance y estimación
Fase Semana 7
Impacto observado Alto — determina la viabilidad del compromiso del PF2 completo
Evidencia Plan PF2 §5 y §6 · semana 7 §4.1
Validación ☑

Situación. El catálogo MVP sumaba 304 SP contra una capacidad calculada de 137 SP para los tres sprints: un factor de 2,2. Había tres salidas posibles — inflar la velocidad, recortar recorridos críticos, o renegociar el tamaño de las historias. El equipo tomó la tercera: renegoció 45 historias (canal delgado, fusiones por capacidad y reestimación de lo ya resuelto en el PF1) hasta llegar a 131 SP comprometidos, y declaró explícitamente 117 SP fuera del compromiso, historia por historia y con su motivo — diferida, fusionada o ya resuelta. Los seis recorridos críticos del enunciado §5.1 siguen cerrando.

Impacto. El compromiso quedó al 96 % de la capacidad con una trazabilidad completa de lo que no se hará y por qué. Las 117 SP excluidas no son deuda oculta: siguen en el tablero con su prioridad original, y nueve de esas historias desaparecen por fusión o porque ya estaban resueltas, mientras ocho son diferimientos reales que no rompen ningún recorrido.

Causa raíz del acierto. Se trató la capacidad como un dato medido y el alcance como la variable negociable, en ese orden. Y la renegociación se hizo historia por historia con su razón, no aplicando un factor global de recorte, lo que permite auditar cada decisión y revertirla individualmente si aparece holgura.

Lección aprendida. Cuando el alcance no cabe en la capacidad, la respuesta profesional es renegociar el tamaño de las historias y declarar lo que queda fuera, no ajustar la velocidad hasta que la aritmética cierre. Una velocidad inflada convierte el problema en invisible durante dos sprints y lo devuelve, agravado, en el tercero. Un alcance declarado fuera es una decisión; un alcance que no se alcanza es un incumplimiento.

Recomendación. Mantener la tabla de alcance declarado fuera actualizada durante los tres sprints y revisarla en cada planeación, con dos reglas: una historia solo entra al compromiso si otra sale o si hay holgura medida, y las 117 SP excluidas se revisan como candidatas antes de considerar cualquier historia nueva.


LA-06 · Sin histórico, la velocidad se deriva de una historia base — y se declara provisional
Tipo 🔧 Oportunidad de mejora
Categoría Gestión de alcance y estimación
Fase Semana 7
Impacto observado Alto — los 131 SP comprometidos dependen de un factor no validado empíricamente
Evidencia Velocidad del equipo · Plan PF2 §2
Validación ☑

Situación. El equipo no tiene histórico de sprints —el PF2 es el primero que ejecuta junto—, así que la velocidad no se pudo promediar hacia atrás. Se derivó hacia adelante: se fijó HU-6 como historia de referencia (5 SP), se desglosó en actividades técnicas, el planning poker de los cuatro integrantes dio 3, 5, 3 y 3, y se llegó a 12 h para 5 SP → 2,4 h por punto. Con 12 h/semana por desarrollador, 4 desarrolladores y 2 h de ceremonias por sprint, la capacidad sale en 39 · 39 · 59 = 137 SP.

Impacto. El plan tiene una cifra defendible y con evidencia detrás en lugar de un número de manual, y el Sprint 1 se alivió deliberadamente al 85 % reconociendo que el arranque consume capacidad en organización, infraestructura y primer contacto con el stack. Pero todo el compromiso de 131 SP cuelga de un factor de 2,4 h/SP que aún no ha sido validado contra ninguna ejecución real, y de un supuesto de 12 h/semana por integrante que tampoco se ha medido en un equipo que cursa otras asignaturas en paralelo.

Causa raíz. Es una limitación estructural, no un error: no hay forma de tener histórico antes del primer sprint. Lo que sí es una oportunidad de mejora es que el plan no fija todavía el momento ni el criterio para recalibrar ese factor, ni qué pasa con el compromiso de S2 y S3 si el real se aparta del estimado.

Lección aprendida. Una velocidad derivada de una historia base es el mejor dato disponible en el primer sprint, y es legítima si se declara como provisional con fecha de recalibración. La estimación derivada resuelve el arranque; lo que la vuelve peligrosa es tratarla después como si fuera histórico. Segundo aprendizaje: derivar la velocidad de una sola historia de referencia deja el factor expuesto a que esa historia no sea representativa del resto del catálogo.

Recomendación. Recalibrar el factor h/SP al cierre del Sprint 1 con los puntos efectivamente terminados y las horas realmente invertidas, y fijar de antemano el umbral que obliga a renegociar el compromiso de S2 y S3 — umbral acordado: una desviación superior al 20 %. Registrar además las horas reales por integrante durante S1 para validar el supuesto de 12 h/semana. Considerar añadir una segunda historia de referencia de otra épica para no depender de una sola.


4.5.5 Diseño de experiencia y prototipo

LA-14 · Un hueco de diseño es una dependencia de planificación, no deuda de UX
Tipo 🔧 Oportunidad de mejora
Categoría Diseño de experiencia y prototipo
Fase Semanas 6–7
Impacto observado Medio — 8 historias del PF2 no podían refinarse hasta cerrar el hueco
Evidencia semana 7 §1 · HU pendientes de refinamiento, grupo A
Validación ☑

Situación. Al cierre de la semana 6, las 8 pantallas del back-office de asesor y operador (HU-8, 10, 19, 26, 27, 29, 59, 61) figuraban como Falta UI. Esas 8 historias están comprometidas en los sprints 2 y 3 del PF2 y no podían alcanzar la definición de refinada —que exige frame de Figma, imagen embebida y navegación— hasta que el diseño existiera. El hueco se cerró en la semana 7 y las 8 historias quedaron refinadas en el refinamiento del 18 de septiembre.

Impacto. Se resolvió dentro de la iteración, sin consecuencia en el entregable. Pero durante dos semanas hubo 8 historias comprometidas que no eran tomables, y el cierre coincidió con la semana más cargada de la iteración (LA-03).

Causa raíz. El prototipo se priorizó por recorrido de cliente, que es el criterio correcto para validar la experiencia con usuarios, pero no coincide con el criterio de desbloqueo del backlog: las pantallas de back-office no aparecen en los recorridos del cliente y sostienen recorridos completos del enunciado (los #3 y #4) desde el otro lado. Con dos criterios de priorización implícitos y solo uno explícito, el segundo se atendió tarde.

Lección aprendida. En un proyecto donde la definición de historia refinada exige diseño, un hueco de diseño es una dependencia de planificación con fecha, no deuda de experiencia de usuario. La cola de diseño tiene que priorizarse por dos criterios simultáneos: valor de validación con usuarios y desbloqueo de historias comprometidas. El segundo es el que se olvida, porque sus pantallas no salen en las demos.

Recomendación. Llevar en el PF2 un tablero visible de huecos de diseño (los G-02…G-10 ya identificados en el backlog de UI) con la historia que cada uno bloquea y el sprint en que esa historia está comprometida. Regla: ninguna historia de canal entra a un sprint con su hueco de diseño abierto. Nota: HU-25 y HU-98 están hoy fuera del compromiso precisamente por falta de frame de Figma, lo que confirma que la regla ya se está aplicando de hecho.


LA-15 · Declarar la limitación es preferible a reportar la condición como cumplida
Tipo ✅ Práctica a replicar
Categoría Diseño de experiencia y prototipo
Fase Semanas 6–7
Impacto observado Medio — traslada una verificación real al PF2 en lugar de darla por hecha
Evidencia semana 7 §1.2, condiciones de usabilidad
Validación ☑

Situación. La accesibilidad del canal móvil se diseñó con el mismo rigor que la del canal web —tokens y pares Light/Dark con contraste garantizado, nombres de capa usados como especificación para el lector de pantalla, estado seleccionado marcado con borde + check + texto y nunca solo con color— pero TalkBack y VoiceOver iOS no leen prototipos de Figma en el teléfono. El equipo no reportó la condición como satisfecha: la declaró como limitación explícita y trasladó la validación con lector real al canal implementado en Compose.

Impacto. La condición de usabilidad quedó registrada como diseñada pero no verificada con lector real, que es exactamente su estado. El canal web, donde sí es verificable con VoiceOver, NVDA o JAWS, se reportó como verificable.

Causa raíz del acierto. Se distinguió entre diseñado conforme al criterio y verificado contra la herramienta real, y se reportó cada cosa en su nivel. La alternativa —marcar accesibilidad como cumplida en ambos canales porque el diseño es el mismo— habría sido más cómoda y habría ocultado una verificación pendiente en el canal con menos capacidad de equipo (LA-16).

Lección aprendida. Una condición de calidad se reporta en el nivel en que la evidencia la respalda. Diseñado conforme al criterio y verificado contra la herramienta son estados distintos, y confundirlos convierte una verificación pendiente en un supuesto invisible. La limitación declarada es un activo: se puede planificar. El supuesto invisible aparece en la demo.

Recomendación. Incluir en la definición de terminado de las HU móviles del PF2 la validación con lector de pantalla real (TalkBack sobre la app en Compose), y no solo la conformidad con los tokens del design system. Aplicar el mismo criterio de reporte por nivel de evidencia a internacionalización, localización y responsividad.


4.5.6 Equipo, proceso y herramientas

LA-16 · La concentración de conocimiento es un riesgo de cronograma
Tipo ⚠️ Situación a evitar
Categoría Equipo
Fase Semana 7 (identificado al planificar el PF2)
Impacto observado Alto — 39 de los 131 SP comprometidos dependen de una persona
Evidencia Plan PF2 §8, estrategia de canal móvil
Validación ☑

Situación. El canal móvil tiene bus factor 1: John es el único integrante con Kotlin/Jetpack Compose y Swift. Y la carga móvil comprometida es de 39 SP de los 131 (15 en S2 y 22 en S3), que es más de lo que una sola persona entrega en dos sprints. El plan lo identificó al elaborarse, no al ejecutarse, y respondió con tres medidas: harness JUnit en el Sprint 1 como red de seguridad, pairing obligatorio desde S2 con John como revisor de toda HU móvil y un segundo integrante como autor en las de menor riesgo técnico (HU-94, HU-97, HU-99, HU-31), y el sacrificio consciente del E2E móvil antes que del producto móvil.

Impacto. El riesgo está mitigado en el plan pero no eliminado: las medidas son un plan, no un hecho consumado, y su eficacia depende de que el segundo integrante llegue a ser productivo en Kotlin dentro del Sprint 2. Además, la reclasificación de HU-53 en la versión 2.1 del plan reveló que la carga móvil real era mayor de la declarada en el borrador (39 SP contra 23): el borrador omitía HU-22 y HU-53, cuya pantalla la construye el canal Android aunque la historia lleve etiqueta de núcleo en Jira.

Causa raíz. Es una composición de equipo dada, no una decisión. Lo que sí es aprendizaje es el error de medición que el borrador contenía: la carga por canal se contó por la etiqueta de la historia en el tablero y no por qué canal construye la pantalla, subestimando la exposición en un 70 %.

Lección aprendida. Una habilidad concentrada en una persona es un riesgo de cronograma, y se mitiga con estructura —red de seguridad técnica primero, pairing después, y un entregable designado para sacrificar— no con voluntad. Segundo aprendizaje, más transferible: la carga por canal se mide por quién construye el artefacto, no por la etiqueta de la historia; contarla por etiqueta subestimó la exposición del canal más frágil.

Recomendación. Verificar el pairing como práctica efectiva, no declarada: al cierre del Sprint 2, medir cuántas HU móviles tienen un autor distinto de John. Criterio de éxito acordado: al menos 2 de las 6 HU móviles de S2. Si no se cumple, activar la renegociación de la carga móvil de S3 antes de que empiece.


LA-18 · Los acuerdos de equipo caducan si no se revisan al cierre de la iteración
Tipo 🔧 Oportunidad de mejora
Categoría Proceso y herramientas
Fase Semana 1 (origen) · cierre del PF1 (detección)
Impacto observado Bajo — sin consecuencia en el entregable
Evidencia Home · acuerdos del equipo contra semana 7 §5 y Plan PF2 §3
Validación ☑

Situación. Los acuerdos iniciales publicados en Home declaran GitHub Projects como tablero Kanban del equipo y ciclos de sprint semanales. La ejecución del PF1 y el plan del PF2 usan Jira (tableros SA y SOLV) y sprints de 2 y 3 semanas. Los acuerdos sobre ramas (GitFlow desde develop), revisión por pares obligatoria, DoR/DoD y escalamiento de bloqueantes sí se mantienen vigentes y se reflejan en la definición de terminado del plan del PF2.

Impacto. Ninguno en el entregable: el cambio de herramienta y de cadencia fue acertado y está documentado en los artefactos vigentes. El efecto es que la página de acuerdos —que es lo primero que lee alguien que llega al proyecto— describe un proceso que el equipo ya no sigue en dos de sus puntos.

Causa raíz. Los acuerdos se escribieron al inicio, cuando aún no se conocía la cadencia real del curso ni la herramienta que el equipo terminaría usando, y no se sometieron a revisión al cierre de la iteración. No hay un momento definido en el proceso para actualizarlos.

Lección aprendida. Los acuerdos de equipo son un artefacto vivo: describen cómo trabaja el equipo hoy, no cómo pensaba trabajar antes de empezar. Si no tienen un momento fijo de revisión, divergen en silencio de la práctica real, y el costo lo paga quien los lee creyendo que están vigentes.

Recomendación. Actualizar Home con la herramienta y la cadencia vigentes, y añadir la revisión de los acuerdos como punto fijo de la retrospectiva de cierre de cada sprint del PF2.


LA-19 · Una brecha de decisión no se cierra con más corridas
Tipo ✅ Práctica a replicar
Categoría Proceso
Fase Semana 7
Impacto observado Medio — evita gastar capacidad de experimentación en una pregunta que no es empírica
Evidencia semana 7 §2.2, decisión 7
Validación ☑

Situación. HA-01 dejó una brecha abierta que el equipo clasificó explícitamente como no resoluble con más corridas: el umbral de respaldo aceptable para actuaría — qué proporción de cotizaciones tarifadas con valor de respaldo en lugar de dato real es admisible para el negocio. El experimento puede medir esa proporción con precisión en cualquier estado del proveedor; lo que no puede es decidir qué valor es aceptable.

Impacto. La brecha quedó registrada como pendiente de decisión de negocio y no como pendiente de experimentación, así que no consume capacidad de los sprints del PF2. Relacionado: la instrumentación del origen y la edad del dato con que se tarifica (origen ∈ {cache, open_finance, fallback, default}) se mantuvo deliberadamente en el nivel de instrumentación y no se promovió a atributo persistido de la entidad de cotización, porque promoverla es una decisión de alcance que depende justamente de ese umbral.

Causa raíz del acierto. Se distinguió entre dos tipos de pendiente que se parecen: la brecha de evidencia, que se cierra midiendo, y la brecha de decisión, que se cierra preguntando a quien tiene la autoridad. Confundirlas produce el patrón de correr experimentos cada vez más finos sobre una pregunta que ninguna medición puede responder.

Lección aprendida. Antes de diseñar un experimento, hay que verificar que la pregunta sea empírica. Una brecha de decisión se escala; una brecha de evidencia se mide. La distinción parece obvia enunciada así y no lo es cuando la pregunta viene envuelta en números, como ¿cuánto respaldo es demasiado?.

Recomendación. Mantener en el PF2 dos listas separadas de pendientes —brechas de evidencia y brechas de decisión— con responsable distinto: las primeras al equipo, las segundas escaladas al cliente o al instructor con la pregunta formulada y el dato que el equipo ya puede aportar.


4.5.7 Documentación y trazabilidad

LA-17 · Dos fuentes de verdad divergen; una de ellas tiene que ser la vigente
Tipo 🔧 Oportunidad de mejora
Categoría Documentación y trazabilidad
Fase Semana 7
Impacto observado Medio — obligó a sanear restricciones en conflicto y a realinear nombres
Evidencia Plan PF2 §11, restricciones saneadas · HU pendientes de refinamiento
Validación ☑

Situación. El plan de trabajo del PF2 necesitó tres versiones para estabilizarse (v1 borrador de la semana 7 → v2 → v2.1) y la divergencia se manifestó en tres frentes. Las restricciones del borrador entraron en conflicto con la versión 2 —ocho de las doce quedaron reemplazadas, ajustadas o eliminadas— y hubo que publicar una tabla única y vigente contra la cual se leen todas las demás menciones en el tablero y la wiki. Los nombres de las historias en la wiki ya no coincidían con Jira, y la v2 tuvo que adoptar los del tablero (HU-11, HU-22, HU-31, HU-47). Y un documento de seguimiento (HU-pendientes-refinamiento-PF2) quedó obsoleto dos días después de escribirse, al refinarse el backlog completo el 18 de septiembre.

Impacto. Se resolvió con dos decisiones acertadas —la tabla única de restricciones vigentes y la adopción de los nombres de Jira— y con una práctica que conviene conservar: el documento obsoleto no se borró, se marcó como superado con la fecha y el enlace al estado vigente, conservando el registro de dónde estaba el backlog antes del refinamiento. Pero se gastaron dos reversiones del plan en detectar y sanear conflictos que no eran de contenido sino de sincronización.

Causa raíz. La wiki y Jira sostenían ambos la misma información —nombres, criterios de aceptación, alcance, estimaciones— sin que estuviera declarado cuál manda. Mientras el backlog se movía a diario, la wiki quedaba desactualizada en horas, y cada lectura de un documento requería verificar si seguía vigente.

Lección aprendida. Cuando dos artefactos sostienen la misma información, hay que declarar cuál es la fuente de verdad y qué contiene el otro. La convención que el equipo terminó adoptando es buena y conviene enunciarla: los criterios de aceptación definitivos viven en Jira, la wiki contiene el razonamiento, las decisiones y la trazabilidad. Segundo aprendizaje: un documento de seguimiento de un estado transitorio caduca rápido — o se marca como superado con enlace al vigente, o no se escribe.

Recomendación. Enunciar explícitamente la política de fuente de verdad en Home (Jira para criterios y estimaciones, wiki para razonamiento y decisiones), mantener la tabla única de restricciones vigentes del plan como el único lugar donde se leen, y marcar con encabezado de documento superado —no borrar— todo documento de estado transitorio que quede obsoleto.


4.6 Retrospectiva del equipo

Prácticas acordadas por el equipo en la sesión de retrospectiva, a partir del registro de §4.5.

Continuar haciendo

# Práctica Por qué Origen
C-1 Declarar las sub-hipótesis por separado e incluir siempre un brazo de línea base Es lo que hizo utilizable el dictamen de HA-08 LA-01
C-2 Versionar la evidencia cruda por corrida, incluida la serie temporal completa Permitió los análisis que no estaban planeados LA-04
C-3 Declarar el alcance de lo validado y lo que queda fuera del compromiso, con su razón Hace auditables tanto la evidencia como el plan LA-13, LA-05
C-4 Reportar cada condición de calidad en el nivel en que la evidencia la respalda Convierte supuestos invisibles en pendientes planificables LA-15
C-5 Marcar como superado, sin borrar, todo documento de estado transitorio Conserva el registro de la decisión y evita lecturas de material caduco LA-17

Empezar a hacer

# Práctica Resultado esperado Origen
E-1 Comprometer la fecha de la primera corrida de cada experimento, no la de montaje terminado Elimina la concentración de la campaña al final del sprint LA-03
E-2 Fijar en el documento de arquitectura los parámetros de cada táctica adoptada, con su evidencia Ningún escenario figura como cubierto con la táctica sin parametrizar LA-11
E-3 Tabla táctica ↔ estímulo que neutraliza, una fila por táctica Hace imposible atribuir a una táctica el mérito de otra LA-07
E-4 Revisar cada dependencia externa con la pregunta ¿cómo falla esto a medias? Cierra el hueco que produjo el modelo de cinco estados LA-08
E-5 Recalibrar el factor h/SP al cierre del Sprint 1, con umbral de renegociación acordado de antemano El compromiso de S2 y S3 se ajusta con dato real, no con el derivado LA-06
E-6 Tablero de huecos de diseño con la historia y el sprint que cada uno bloquea Ninguna HU de canal entra a un sprint con su hueco abierto LA-14
E-7 Dos listas separadas: brechas de evidencia y brechas de decisión La capacidad de experimentación no se gasta en preguntas no empíricas LA-19

Dejar de hacer

# Práctica Riesgo que elimina Origen
D-1 Reportar el avance de un experimento sobre el porcentaje de montaje implementado Sobreestimación del avance real LA-03
D-2 Adoptar una táctica dejando su parametrización al desarrollo Trasladar la garantía del ASR a quien no tiene el criterio para decidir LA-11
D-3 Medir la carga por canal según la etiqueta de la historia en el tablero Subestimación de la exposición del canal con bus factor 1 (70 % en el borrador) LA-16
D-4 Mantener la misma información en la wiki y en Jira sin declarar cuál manda Divergencia silenciosa y reversiones de saneamiento LA-17
D-5 Definir un escenario de degradación con una sola medida de respuesta Escenarios satisfacibles por la vía trivial LA-09

4.7 Plan de acción para el Proyecto Final 2

Una lección sin acción verificable es una observación. Cada acción tiene responsable nombrado y se revisa en la retrospectiva del sprint indicado.

# Acción Lección Responsable Sprint Criterio de verificación
A-01 Añadir a la plantilla de diseño de experimentos las casillas obligatorias de brazo de línea base y umbral del ASR como criterio de decisión LA-01 Martin Romero S1 Los diseños de HA-02, HA-07, HA-09 y HA-10 las traen antes de la primera corrida
A-02 Sección obligatoria de amenazas a la validez con una celda por explicación alternativa LA-02 Juan Acevedo S1 Presente en el diseño de cada experimento de S2 y S3
A-03 Estimar cada experimento en cuatro actividades (montaje · campaña · análisis · dictamen) y comprometer la fecha de la primera corrida LA-03 Martin Romero S1 Fecha de primera corrida registrada en Jira para cada HA de S2
A-04 Incluir en la DoD de las HA: instantánea de serie temporal, configuración efectiva por corrida y consolidado en CSV versionados LA-04 Juan Acevedo S1 DoD actualizada en el plan y aplicada en la primera HA que cierre
A-05 Revisar la tabla de alcance declarado fuera en cada planeación; una historia entra solo si otra sale o hay holgura medida LA-05 Mauricio Rodriguez S1–S3 Acta de cada planeación referencia la tabla
A-06 Recalibrar el factor h/SP con puntos y horas reales de S1; acordar el umbral de desviación que obliga a renegociar S2 y S3 LA-06 Mauricio Rodriguez S1 Nuevo factor publicado en Velocidad-Equipo antes de la planeación de S2
A-07 Registrar horas reales por integrante durante S1 para validar el supuesto de 12 h/semana LA-06 Mauricio Rodriguez S1 Serie de horas disponible en la retrospectiva de S1
A-08 Publicar la tabla táctica ↔ estímulo que neutraliza en el diseño detallado LA-07 Martin Romero S1 Una fila por táctica adoptada, empezando por las de HA-01
A-09 Revisar el modelo de fallas de cada dependencia externa con la pregunta ¿cómo falla a medias? LA-08 John Guerrero S2 Modelo revisado para Open Finance, Open Data, firma, cobro y canal paramétrico
A-10 Añadir segunda medida de respuesta a los escenarios de degradación del catálogo LA-09 Martin Romero S2 EC-LAT-09 actualizado y criterio aplicado a los demás escenarios de degradación
A-11 Reredactar las restricciones derivadas por descomposición declarando su estado de exigibilidad LA-10 Juan Acevedo S2 EC-LAT-07 y las demás restricciones de presupuesto revisadas
A-12 Auditar el catálogo de tácticas: parámetros, valor adoptado y evidencia; marcar las que queden sin parametrizar LA-11 Mauricio Rodriguez S1 Ninguna táctica figura como adoptada sin parámetros o sin la marca de pendiente
A-13 Inventario de recursos compartidos entre recorridos, con dimensionamiento por consumidor e indicador observable LA-12 Juan Acevedo S2 Inventario publicado; PoolTimeout incorporado a la señal
A-14 Matriz camino crítico ↔ experimento que lo cubre, con los huecos visibles LA-13 Martin Romero S2 Matriz publicada; el camino de perfilamiento registrado como hueco
A-15 Tablero de huecos de diseño (G-02…G-10) con historia bloqueada y sprint comprometido LA-14 John Guerrero S1 Ninguna HU de canal entra a un sprint con hueco abierto
A-16 Añadir validación con lector de pantalla real a la DoD de las HU móviles LA-15 John Guerrero S2 DoD actualizada; primera HU móvil verificada con TalkBack
A-17 Medir el pairing efectivo del canal móvil al cierre de S2 y activar renegociación si no se alcanza el criterio LA-16 Mauricio Rodriguez S2 Número de HU móviles con autor distinto de John, contra el criterio acordado
A-18 Enunciar la política de fuente de verdad en Home (Jira: criterios y estimaciones · wiki: razonamiento y decisiones) LA-17 Juan Acevedo S1 Política publicada y aplicada en la siguiente actualización del plan
A-19 Actualizar Home con herramienta y cadencia vigentes; añadir la revisión de acuerdos a la retrospectiva de sprint LA-18 Juan Acevedo S1 Home actualizado con Jira y la cadencia de sprints vigente
A-20 Mantener listas separadas de brechas de evidencia y brechas de decisión, con responsable distinto LA-19 Martin Romero S1 Ambas listas publicadas; el umbral de respaldo de actuaría escalado

4.8 Riesgos y brechas que se trasladan al PF2

Lo que sigue no son lecciones: son pendientes reales que la iteración no cerró. Se listan aquí para que no se confundan con aprendizaje ni se pierdan al cambiar de iteración.

# Riesgo o brecha Tipo Estado al cierre del PF1 Mitigación vigente
R-01 El factor de 2,4 h/SP y el supuesto de 12 h/semana por integrante no están validados contra ninguna ejecución real, y los 131 SP comprometidos cuelgan de ellos Estimación Abierto Sprint 1 al 85 % con 6 SP de colchón; recalibración comprometida en A-06
R-02 Bus factor 1 en el canal móvil, con 39 de 131 SP comprometidos en ese canal Equipo Mitigado, no cerrado Harness JUnit en S1, pairing obligatorio desde S2, E2E móvil sacrificable
R-03 Umbral de respaldo aceptable para actuaría: proporción de cotizaciones tarifadas con valor de respaldo admisible para el negocio Brecha de decisión Abierto Escalar; no se cierra con más corridas (LA-19)
R-04 El camino de perfilamiento comparte :AdaptadorOF con la cotización y no fue ejercitado por HA-01 Brecha de evidencia Abierto Registrar en la matriz de cobertura (A-14); candidato a experimento en S3
R-05 El pool compartido de :AdaptadorOF produce un modo de fallo silencioso: la cotización se degrada con el tercero sano y sin señal, porque PoolTimeout no computa como falla Arquitectura Identificado, sin implementar Dimensionamiento por consumidor e instrumentación (A-13)
R-06 S2 y S3 están comprometidos al 100 % de la velocidad, sin holgura: cualquier desviación se propaga al sprint siguiente Planificación Abierto por decisión El overflow se resuelve en la planeación del sprint, no con una regla fija (R8 del plan)
R-07 8 de las 58 historias comprometidas no tienen todavía el número medible del escenario de calidad en su criterio de aceptación Refinamiento Abierto Cerrar antes de que la historia entre a un sprint
R-08 La evidencia de aislamiento de carga de HA-08 (~2,5× de CPU sobre PostgreSQL en el brazo A) queda sin experimento asignado: es sobre otro atributo de calidad, no sobre latencia Brecha de evidencia Registrada Candidato a experimento futuro; no ordena el tablero en este corte
R-09 La accesibilidad del canal móvil está diseñada pero no verificada con lector de pantalla real Calidad Declarado como limitación Validación con TalkBack en la DoD de las HU móviles (A-16)

4.9 Preguntas de la sesión de retrospectiva

Preguntas sobre lo que los artefactos no registran, respondidas por el equipo en la sesión de retrospectiva.

Sobre el proceso y la cadencia

  1. La cadencia declarada era Sync los lunes, tres encuentros de desarrollo semanales y reuniones de emergencia según necesidad. ¿Se cumplió? ¿Cuántas reuniones de emergencia hubo y qué las disparó?

    Sí, la cadencia fue adecuada, dado que la sesión de los lunes permitió planear adecuadamente las actividades y su distribución.

  2. ¿Hubo bloqueantes que tardaron más de 48 horas en resolverse? ¿El mecanismo de escalamiento de los acuerdos funcionó, o los bloqueantes se resolvieron por otra vía?

    Los bloqueantes siempre fueron resueltos en menos de 48 horas. La comunicación efectiva del equipo mediante los canales establecidos permitió resolver los imprevistos.

  3. ¿El cambio de GitHub Projects a Jira fue una decisión acordada o una deriva? (LA-18 depende de esta respuesta)

    Sí, la decisión fue acordada entre todos los integrantes del equipo.

Sobre la carga y la distribución del trabajo

  1. ¿Cómo se repartió realmente el esfuerzo entre los cuatro integrantes? ¿Hubo semanas en que alguien absorbió trabajo que no le correspondía?

    La carga de trabajo se repartió de manera equitativa y se aprovecharon las fortalezas de cada integrante del equipo.

Sobre las herramientas y la fricción técnica

  1. ¿Qué parte del montaje de los experimentos costó más de lo previsto y por qué? (Toxiproxy, los dobles, la instrumentación de Prometheus, la reproducibilidad de las corridas)

    Tuvimos varios problemas al lanzar el segundo experimento relacionados con la configuración del entorno, pero fueron resueltos en su momento.

  2. ¿Hubo retrabajo por problemas de ambiente, versiones o configuración que no quedó documentado?

    No, todo fue documentado en los experimentos.

Sobre las decisiones

  1. ¿Hubo alguna decisión de arquitectura que se tomó por falta de tiempo y que el equipo revisaría con más margen?

    Las decisiones de arquitectura estuvieron respaldadas por los ASR; siempre se tomaron priorizando el desempeño de la solución y no hubo decisiones tomadas de afán.

  2. ¿Alguna decisión se tomó sin que todos la entendieran igual, y se detectó después?

    No, todos estuvieron siempre de acuerdo.


4.10 Validación del equipo

Integrante Rol en la iteración Revisó §4.5 Acuerdo con el registro Fecha
Juan Acevedo Desarrollador ☑ ☑ 24/09/2026
John Guerrero Desarrollador ☑ ☑ 24/09/2026
Mauricio Rodriguez Desarrollador ☑ ☑ 24/09/2026
Martin Romero Desarrollador ☑ ☑ 24/09/2026

Lecciones rechazadas en la sesión

ID Razón del rechazo
Ninguna —

Lecciones añadidas en la sesión

ID Lección Evidencia
Ninguna — —

4.11 Trazabilidad y fuentes

Artefactos de la iteración

  • Hoja de trabajo semana 7 — cierre del PF1: prototipo final, resultados finales de experimentación, documento de arquitectura ajustado, versión inicial del plan del PF2
  • Hoja de trabajo semana 6 — avance de experimentación (HA-08 al 100 %, HA-01 al 60 %) y del prototipo
  • Hoja de trabajo semana 5 — vistas de arquitectura, diseño detallado, diseño de los experimentos
  • Plan de trabajo · Proyecto Final 2 v2.1 — velocidad, renegociación de alcance, plan por sprint, estrategia de canal móvil, restricciones saneadas
  • Velocidad del equipo — plantillas EstimaciónHUBase y VelocidadEquipo, derivación del factor h/SP
  • Home — acuerdos del equipo y metodología declarada

Experimentos de arquitectura

Backlog, calidad y diseño

Tableros


4.12 Control de versiones

Versión Fecha Autor Cambios
0.9 21/09/2026 Equipo Solventa Borrador inicial: registro de 19 lecciones derivadas de los artefactos versionados del PF1. Formato: registro PMI + retrospectiva ágil
1.0 24/09/2026 Equipo Solventa Versión cerrada. 19 lecciones validadas, retrospectiva acordada, responsables asignados en el plan de acción, preguntas de la sesión respondidas y §4.10 firmado por los cuatro integrantes

5. Plan de trabajo y tablero cerrados

5.1 Plan de trabajo

Tablero: SOLV — backlog por sprint · equipo Mauricio, Juan, Martin, John.

El alcance del Proyecto Final 2 se reparte en tres sprints (S1 de 2 semanas, S2 de 2 semanas, S3 de 3 semanas), con la velocidad del equipo detrás de cada cifra y con el Sprint 1 aliviado. Incluye las historias de pantalla del cliente asegurado que los recorridos críticos necesitan para poder recorrerse de punta a punta en la app, y la internacionalización del canal móvil (HU-94).


5.1.1 Resumen

Historias de usuario en SOLV (sin etiqueta ha) 131 HU · 342 SP (89 del backlog refinado, 31 de pantallas del cliente HU-90–HU-120 y 13 slices de BFF HU-121–HU-139)
De ellas, MVP (mvp) 111 HU · 247 SP
Capacidad de los tres sprints (velocidad calculada) 137 SP
Comprometido en el plan 130 SP · 69 HU
Holgura reservada 7 SP

Las historias de arquitectura (etiqueta ha, 23 en SOLV del catálogo HA-01–HA-31) quedan fuera de este conteo: no se desarrollan como producto. Cada una se evidencia con un experimento o spike sobre las HU que ya están en el sprint correspondiente (§7).

El catálogo MVP no cabe en 137 SP de capacidad. El plan no infla la velocidad ni recorta recorridos: acota el alcance de cada historia hasta que los seis recorridos del enunciado §5.1 quepan en la capacidad real, y declara explícitamente qué queda fuera (§6).

Los puntos de este documento son los del alcance acotado y son los mismos que están cargados en el tablero. No se maneja una doble cifra: el reestimado sustituyó al valor original del catálogo en cada historia de Jira, de modo que el tablero suma exactamente lo que dice §3.

El contrato de BFF se compromete como slices, no como paraguas. El borde de canal entra al plan con 13 slices de 1 SP del Backlog BFF · Web / Móvil y back-office, uno por recorrido y canal. Cada slice es trabajo de borde: vive en :BFFWeb o :BFFMovil, no en el núcleo ni en la UI, y se compromete solo si una historia de canal del plan lo consume. De los 21 del catálogo entran 13 por esa regla; los 8 restantes quedan fuera y su motivo está en §6.

5.1.2 Velocidad del equipo

Fuente: plantilla EstimaciónHUBase + VelocidadEquipo. No hay histórico de sprints — este es el primer sprint del equipo junto —, así que la velocidad se deriva de la estimación por desarrollador sobre la historia de referencia.

Conversión horas ↔ puntos. HU-6 (historia base, 5 SP) se desglosó en actividades técnicas y el planning poker de los cuatro integrantes (3, 5, 3, 3) dio 12 h para 5 SP → 2,4 h por punto de historia.

Capacidad por sprint.

Sprint 1 Sprint 2 Sprint 3
Semanas 2 2 3
Horas/semana por desarrollador 12 12 12
Desarrolladores 4 4 4
Capacidad bruta (h) 96 96 144
Horas transversales (refinamiento, daily, retro, planeación, revisión) 2 2 2
Capacidad neta (h) 94 94 142
÷ 2,4 h/SP → velocidad (SP) 39 39 59

Capacidad total de los tres sprints: 137 SP.


5.1.3 Distribución de los tres sprints

Se aplica la recomendación de la clase: el Sprint 1 no se carga igual que el Sprint 2 aunque ambos duren dos semanas, porque se va en organización del equipo, infraestructura, pipelines y primer contacto con el stack.

Sprint Semanas Velocidad Comprometido Holgura % de la velocidad
Sprint 1 2 39 33 6 85 %
Sprint 2 2 39 38 1 97 %
Sprint 3 3 59 59 0 100 %
Total 7 137 130 7 95 %

Colchón de S1: 15 %. El Sprint 1 carga 33 de sus 39 SP. Las 6 SP de colchón no se redistribuyen: absorben el arranque del equipo. La semana de receso se usa para dejar instalado el tutorial, las imágenes base y una corrida de prueba de los GitHub Actions; si eso se cumple, el colchón queda disponible para adelantar historias de S2.

Sprint 3 al 100 %. Los ocho slices de BFF que cierran los recorridos #2 a #6 caben en el sprint porque el alcance de cuatro historias se ajustó a lo que el recorrido exige: HU-20, HU-30 y HU-55 entregan su resultado verificable en 2 SP y HU-59 en 1. Es el mismo criterio de §5 aplicado a la última iteración del plan.

Tema de cada sprint

Sprint Tema Recorridos §5.1 que quedan cerrados al final
S1 Fundación + motor de cotización + reconsulta + harness web y móvil — (núcleo del #1 sin canal)
S2 Recorrido #1 completo con canal, BFF, carga e identidad; app móvil navegable e internacionalizada; núcleo del #2 #1 cotización embebida
S3 Cierre de los cinco recorridos restantes, login y estados de canal #2, #3, #4, #5, #6

5.1.4 Criterio de asignación

En este orden:

  1. ASR de latencia y escalabilidad primero. El equipo tomó EC-LAT-* y EC-ESC-* (HA-01–HA-13). Las HU que sostienen esos escenarios (cotización, emisión, perfilamiento, paramétrico) entran antes que las que no tienen ASR asociado. Por eso el ciclo de vida de póliza (#6, sin ASR LAT/ESC) cierra en S3 y es el primero en adelgazarse.
  2. El lab antes del experimento. Repos, imágenes, nube, dobles y ambiente de carga están en S1/S2 porque sin ellos no hay evidencia que mostrar de HA-01, HA-02, HA-07, HA-09 y HA-10.
  3. Móvil desde el Sprint 1. S1 monta el harness JUnit, S2 entrega la app navegable (shell, idioma, onboarding, oferta) y S3 cierra los recorridos. Detalle en §8.
  4. Dependencias INVEST. Catálogo → prima → oferta → aceptación → emisión. Consentimiento antes del adaptador de perfilamiento. Cada slice de BFF viaja en el mismo sprint que la pantalla que lo consume, nunca después: por eso HU-122, HU-123, HU-125, HU-126 y HU-139 caen en S2 y los ocho restantes en S3. Shell e idioma antes de las pantallas que formatean moneda y fecha (HU-93/HU-94 junto a HU-11). Login junto al validador JWT móvil (HU-90 con HU-76).
  5. Recorrido recorrible, no solo demostrable. Una historia de pantalla del cliente entra si sin ella el recorrido no se puede completar en la app (entrar, navegar, pedir permiso al SO, ver el resultado de negocio). Las que agregan riqueza a un recorrido que ya cierra quedan fuera (§6).

5.1.5 Alcance acotado por historia

El catálogo MVP no cabía en 137 SP de capacidad. La diferencia se cerró adelgazando el alcance de cada historia, no eliminando recorridos. Tres movimientos:

a) Historias ya resueltas en Proyecto Final 1. Los mockups navegables web y móvil ya se construyeron y se validaron con usuarios en las semanas 6–7; la infraestructura IaC y el ambiente de experimentos ya están montados y corriendo. Esas historias se cierran con la evidencia existente o se reestiman a lo que falta (versionar, hacer destruible, documentar).

b) Fusiones. Una capacidad, una historia: la foto entra dentro del aviso de siniestro; la consulta ligera de póliza es la misma consulta de póliza; un solo validador de JWT sirve a web y móvil; un solo mecanismo de aviso in-app cubre estado de siniestro y pago paramétrico.

c) Canal delgado. Las reglas del canal están en §11. En resumen: una vista por paso del recorrido, sin estados vacíos ricos, errores solo donde el negocio, el sistema operativo o el ASR los imponen, e internacionalización acotada a formato regional en el canal móvil. Las UIs bajan de 3–5 SP a 1–3 SP.

Alcance por historia
HU SP Alcance comprometido
HU-3 Recibir solicitud de cotización 2 Contrato mínimo; el cotizacionId no persiste histórico en MVP
HU-5 Combinar factor de riesgo (stub) 2 Stub de 2 atributos + valor de respaldo; sin caché de perfil (eso es HA-07)
HU-11 Ver oferta (Android) 3 Una pantalla de precio firme; formato por locale de HU-94
HU-13 Decisión automática de suscripción 2 Regla única aceptar/rechazar con motivo
HU-15 Cobro de prima (stub) 2 Solo clave de idempotencia; sin conciliación
HU-19 UI web suscripción y emisión 2 Canal delgado
HU-20 UI móvil aceptar y póliza 2 Emitiendo → póliza emitida, sin navegación visible
HU-22 Reportar siniestro 2 Formulario único que absorbe HU-23 (foto); permiso y confirmación van en HU-101 / HU-97
HU-26 Ver aviso en back-office 2 Una pantalla de lectura
HU-29 Pagar siniestro de bajo monto 2 Stub idempotente, sin autorización por montos
HU-31 Lista de siniestros (Android) 2 Lista con estado; absorbe el aviso in-app de HU-35
HU-32 / HU-34 Evento y pago paramétrico 2 / 2 Stub con un valor comparable; la historia no implementa reintentos ni DLQ: esa capacidad se diseña y se mide en HA-11, aunque el criterio de aceptación cite la meta del escenario
HU-36 Vista móvil paramétrico 2 Canal delgado; absorbe la traza de HU-37
HU-45 Onboarding con datos y documento 2 Sin OCR ni validación externa del documento
HU-46 Consentimiento de datos 2 Otorgar/revocar con auditoría; la propagación es HA-21
HU-54 Adaptadores stub OF/OD 2 Dos atributos propios detrás del adaptador
HU-55 Perfil y oferta explicable 2 Factores internos en lista, sin visualización
HU-56 Degradar perfilamiento lento 2 Timeout + valor de respaldo
HU-59 Renovar póliza 1 Un verbo, un comando, sin recálculo de prima
HU-71 Imágenes Docker base 2 Base ya construida en PF1; se documenta y se versiona
HU-121…HU-139 Slices de BFF (13) 1 c/u Un slice por recorrido y canal. Contrato de Solventa sobre stub ok / fallo / lento; sin OpenAPI de proveedores
HU-30 Estados del siniestro 2 Máquina de estados del siniestro y su lectura; sin histórico de transiciones
HU-74 Validar JWT Web 1 Validación sobre el gateway existente; sin emisión ni rotación de token
HU-75 Autorizar roles Web 2 RBAC sobre el gateway existente
HU-76 Validar JWT Móvil 2 Absorbe HU-77 (mismo validador, misma política de roles)
HU-78 Red y clúster cloud 3 IaC de PF1; falta versionarlo y hacerlo destruible
HU-79 Pruebas de carga de cotización 3 Script K6 del experimento PR-01 reutilizado
HU-83 Framework E2E 1 Runner instalado y un recorrido feliz web corriendo en CI; el E2E móvil pasa a operación
HU-86 / HU-87 Harness Karma y JUnit 2 / 2 CI ya existe; se agrega el runner y un caso semilla
HU-88 Ambiente de integración con dobles 3 Los dobles ya existen del experimento PI-01; falta Pact
HU-89 Ambiente cloud de experimentos 3 Ya montado en PF1; se versiona y se documenta
HU-8 / HU-10 / HU-57 UIs web y móvil 2 c/u Canal delgado
HU-90 Login con correo y contraseña 2 Correo + contraseña; error de credenciales y de red inline en la misma vista; sin recuperación de contraseña ni biometría
HU-93 Shell de navegación cliente (Android) 2 NavigationBar de 4 destinos que alojan las pantallas ya comprometidas; Inicio con los CTA de los recorridos (sin el Inicio rico de HU-96); Perfil solo con la entrada a Idioma y región
HU-94 Idioma y región (Android) 3 Sin recorte: selector al primer arranque + cambio desde Perfil, 4 locales y formato de moneda y fecha en todas las pantallas móviles
HU-97 Confirmación de aviso de siniestro (Android) 1 Estado final de HU-22 con siniestroId y salida a la lista
HU-99 UI de suscripción rechazada (Android) 1 Estado de rechazo dentro del flujo de HU-20 con motivo y volver a Inicio
HU-101 Permisos JIT de cámara y fotos 2 Rationale + diálogo del SO al evidenciar; estado de permiso denegado en la misma ruta

Efecto: 130 SP comprometidos en 69 HU + 117 SP declarados fuera (§6). Los seis recorridos del enunciado §5.1 cierran.


5.1.6 Plan por sprint

Cómo leer estas tablas. La columna SP es el valor comprometido, el mismo que está cargado en el tablero. La columna Nivel de dependencia dice qué tan abajo en la cadena está la historia: las de nivel 1 no dependen de ninguna otra y arrancan primero; una de nivel 3 necesita que las de nivel 1 y 2 estén terminadas. No es prioridad de negocio ni orden de ejecución dentro del sprint — eso está en §9.

Sprint 1 — 33 SP · 14 HU
Jira HU Nombre Épica Nivel de dependencia SP
SOLV-94 HU-1 Catálogo mínimo (1 ramo) E1 1 2
SOLV-95 HU-2 Publicar catálogo al socio E1 1 2
SOLV-96 HU-3 Recibir solicitud de cotización E1 1 2
SOLV-97 HU-4 Calcular prima con reglas E1 1 5
SOLV-98 HU-5 Combinar factor de riesgo (stub) E1 1 2
SOLV-99 HU-6 Devolver oferta en firme E1 1 2
SOLV-100 HU-7 Reconsultar oferta por id E1 2 2
SOLV-163 HU-70 Repositorios del equipo E7 1 2
SOLV-164 HU-71 Imágenes Docker base E7 1 2
SOLV-171 HU-78 Red y clúster cloud (mínimo) E7 1 3
SOLV-178 HU-85 Harness unitario del núcleo (PyTest) E7 1 2
SOLV-179 HU-86 Harness unitario web (Karma) E7 2 2
SOLV-180 HU-87 Harness unitario móvil (JUnit) E7 2 2
SOLV-182 HU-89 Ambiente cloud de experimentos E7 1 3
Sprint 2 — 38 SP · 19 HU
Jira HU Nombre Épica Nivel de dependencia SP
SOLV-101 HU-8 Shell UI Web E1 3 2
SOLV-103 HU-10 UI web cotización E1 3 2
SOLV-104 HU-11 Ver oferta (Android) E1 3 3
SOLV-105 HU-12 Aceptar oferta vigente E2 2 2
SOLV-106 HU-13 Decisión automática de suscripción E2 2 2
SOLV-108 HU-15 Cobro de prima (stub idempotente) E2 2 2
SOLV-109 HU-16 Emitir póliza E2 2 3
SOLV-110 HU-17 Firma electrónica (stub) E2 2 2
SOLV-138 HU-45 Onboarding con datos y documento E4 3 2
SOLV-139 HU-46 Consentimiento de datos E4 3 2
SOLV-218 HU-93 Shell de navegación cliente (Android) E4 3 2
SOLV-219 HU-94 Idioma y región (Android) E4 3 3
SOLV-172 HU-79 Pruebas de carga de cotización E7 1 3
SOLV-181 HU-88 Ambiente de integración con dobles E7 1 3
— HU-122 BFF web sesión e identidad E7 2 1
— HU-123 BFF móvil alta y consentimiento E7 2 1
— HU-125 BFF móvil cotización y oferta E7 2 1
— HU-126 BFF web cotización y oferta E7 2 1
— HU-139 BFF web cartera del asesor E7 2 1
Sprint 3 — 59 SP · 36 HU
Jira HU Nombre Épica Nivel de dependencia SP
SOLV-111 HU-18 Consultar póliza emitida E2 3 2
SOLV-112 HU-19 UI web suscripción y emisión E2 3 2
SOLV-113 HU-20 UI móvil aceptar y póliza E2 3 2
SOLV-223 HU-99 UI de suscripción rechazada (Android) E2 3 1
SOLV-115 HU-22 Reportar siniestro E3 3 2
SOLV-224 HU-101 Permisos JIT de cámara y fotos E3 3 2
SOLV-221 HU-97 Confirmación de aviso de siniestro (Android) E3 3 1
SOLV-119 HU-26 Ver aviso en back-office E3 3 2
SOLV-120 HU-27 Aprobar o rechazar aviso E3 3 2
SOLV-122 HU-29 Pagar siniestro de bajo monto (stub) E3 3 2
SOLV-123 HU-30 Estados del siniestro E3 3 2
SOLV-124 HU-31 Lista de siniestros (Android) E3 3 2
SOLV-125 HU-32 Recibir evento paramétrico (stub) E3 3 2
SOLV-126 HU-33 Evaluar umbral paramétrico E3 3 2
SOLV-127 HU-34 Disparar pago paramétrico (stub) E3 3 2
SOLV-129 HU-36 Vista móvil paramétrico E3 3 2
SOLV-146 HU-53 Consentimiento de perfilamiento E5 2 2
SOLV-147 HU-54 Adaptadores stub Open Finance / Open Data E5 2 2
SOLV-148 HU-55 Perfil y oferta explicable E5 2 2
SOLV-149 HU-56 Degradar perfilamiento lento E5 2 2
SOLV-150 HU-57 UI móvil oferta vida hipotecario E5 3 2
SOLV-152 HU-59 Renovar póliza E6 4 1
SOLV-154 HU-61 Cancelar póliza E6 4 2
SOLV-215 HU-90 Login con correo y contraseña E4 3 2
SOLV-167 HU-74 Validar JWT Web E7 3 1
SOLV-168 HU-75 Autorizar roles Web E7 3 2
SOLV-169 HU-76 Validar JWT Móvil E7 3 2
SOLV-176 HU-83 Framework E2E E7 1 1
— HU-121 BFF móvil sesión e identidad E7 2 1
— HU-127 BFF móvil aceptar, emitir y billetera E7 2 1
— HU-128 BFF web aceptar, emitir y consultar póliza E7 2 1
— HU-129 BFF móvil aviso, evidencia y estado E7 2 1
— HU-130 BFF web siniestros cliente y cola operador E7 2 1
— HU-131 BFF móvil pago automático E7 2 1
— HU-133 BFF móvil perfil y oferta hipotecario E7 2 1
— HU-136 BFF web ciclo de vida de póliza E7 2 1
Fuera del compromiso — 117 SP

Backlog refinado (47 SP)

Jira HU Nombre SP Motivo
SOLV-102 HU-9 Mockup Web 3 Resuelta en PF1
SOLV-107 HU-14 Reconstruir decisión de suscripción 3 Diferida
SOLV-116 HU-23 Una foto del siniestro 3 Fusionada en HU-22
SOLV-117 HU-24 Geoetiquetar evidencia 3 Diferida
SOLV-118 HU-25 Conservar evidencia sin red 5 Diferida (sin frame Figma)
SOLV-121 HU-28 Enrutar aviso a perito 2 Diferida
SOLV-128 HU-35 Aviso de pago paramétrico 2 Fusionada en HU-31
SOLV-130 HU-37 Vista web paramétrico 2 Fusionada en HU-36
SOLV-137 HU-44 Mockup Móvil 3 Resuelta en PF1
SOLV-140 HU-47 Consulta de póliza 3 Fusionada en HU-18
SOLV-151 HU-58 UI web perfil y oferta 3 Fusionada en HU-57
SOLV-153 HU-60 Modificar póliza 3 Diferida
SOLV-155 HU-62 Reporte al regulador (stub) 3 Diferida
SOLV-156 HU-63 Reporte a reaseguradora (stub) 3 Diferida
SOLV-157 HU-64 Aviso de vencimiento 2 Diferida
SOLV-158 HU-65 Aviso de renovación efectiva 2 Fusionada en HU-31
SOLV-170 HU-77 Autorizar roles Móvil 2 Fusionada en HU-76

Pantallas del cliente no comprometidas (70 SP)

HU Nombre SP Motivo
HU-91 Hub Perfil y cierre de sesión 3 Perfil mínimo vive en HU-93
HU-92 Cotización in-app (1 ramo) 3 Opcional: el #1 lo inicia socio (HU-3) o asesor (HU-10)
HU-95 Splash de primer arranque 2 La app abre en Idioma y región (HU-94)
HU-96 Inicio 3 Inicio mínimo con CTA dentro de HU-93
HU-98 Detalle de siniestro 3 Sin frame Figma (G-03); el estado se ve en HU-31
HU-100, HU-102–HU-120 Portal web del cliente (20 HU) 56 El canal web del plan son los portales de asesor y operador; los recorridos ya cierran en web con ellos

Estas 117 SP no son deuda oculta: son historias mvp que el equipo decide no comprometer en el Proyecto Final 2 y que quedan en el tablero con su prioridad original. Nueve desaparecen por fusión o porque ya están resueltas (HU-9, HU-23, HU-35, HU-37, HU-44, HU-47, HU-58, HU-65, HU-77); ocho son diferimientos que no rompen ningún recorrido §5.1 (HU-14, HU-24, HU-25, HU-28, HU-60, HU-62, HU-63, HU-64), y las pantallas del cliente restantes son riqueza sobre recorridos que ya cierran.


5.1.7 Evidencia de los ASR por sprint

Las HA no consumen velocidad de producto. Cada una se ejecuta como experimento sobre las HU que ya están en el sprint; el esfuerzo (45 SP de HA-01–HA-11) es diseño, corrida, análisis y nota de arquitectura, y se reparte entre los cuatro integrantes fuera del compromiso de producto.

Sprint HA que se evidencian HU habilitadoras ya en el sprint Qué se corre
S1 — HU-1…HU-7, HU-78, HU-89 Línea base de latencia en local y en el ambiente de experimentos (no es aún evidencia formal)
S2 HA-01 p95 ≤ 250 ms · HA-02 p99 ≤ 500 ms · HA-07 degradación · HA-09 50k cot/min · HA-10 autoescalado ≤ 60 s HU-1…HU-7, HU-79, HU-88, HU-89 Campaña K6 sobre cotización en el ambiente de experimentos; stub lento para HA-07
S3 HA-05 p95 aceptación→póliza ≤ 1,5 s · HA-06 p99 ≤ 3 s · HA-03 p95 perfilamiento ≤ 400 ms · HA-04 p99 ≤ 800 ms · HA-08 p95 estado de siniestro ≤ 150 ms · HA-11 1M eventos/10 min HU-12…HU-17, HU-53…HU-56, HU-26, HU-30, HU-31, HU-32…HU-34 Reloj extremo a extremo del recorrido #2; medición sobre el stub OF/OD; ráfaga de eventos contra el canal paramétrico

Correspondencia de códigos. Las historias de arquitectura se nombran HA-xx en el tablero y EC-* en la hoja de escenarios de calidad: son el mismo escenario con dos numeraciones. HA-01 ↔ EC-LAT-01, HA-02 ↔ EC-LAT-02, HA-03 ↔ EC-LAT-03, HA-04 ↔ EC-LAT-04, HA-05 ↔ EC-LAT-05, HA-06 ↔ EC-LAT-06, HA-07 ↔ EC-LAT-08, HA-08 ↔ EC-LAT-11 y HA-11 ↔ EC-ESC-03. El procesamiento exactamente una vez (EC-ESC-04) y la consulta de póliza (EC-LAT-10) no tienen historia de arquitectura propia: se verifican dentro de la aceptación de HU-32/HU-34 y HU-18 respectivamente.

HA-13 (aislamiento de cuota entre socios) queda como spike de SBA solo si sobra cupo en S3: su producto, HU-81, es ola 5 y está fuera del MVP. HA-14–HA-31 (disponibilidad, seguridad, modificabilidad, integrabilidad) no ordenan el tablero SOLV en este corte. HU-94 no altera HA-01/HA-02: el núcleo sigue devolviendo solo prima y código de moneda, y el formato ocurre en el canal (PL-01).


5.1.8 Estrategia de canal móvil

El canal móvil tiene bus factor 1 (John es el único con Kotlin/Jetpack y Swift). Dejarlo para el final es el patrón que hace que los equipos no cierren el Proyecto Final 2, así que el plan lo ataca desde el Sprint 1:

Sprint Entregable móvil SP
S1 HU-87 harness JUnit de Kotlin en CI, sin emulador 2
S2 HU-93 shell de navegación (2) + HU-94 idioma y región (3) + HU-45 onboarding (2) + HU-46 consentimiento (2) + HU-11 ver oferta (3) + BFF móvil HU-123 y HU-125 (1 + 1) 14
S3 HU-90 login (2) + HU-76 JWT móvil (2) + HU-20 aceptar y póliza (2) + HU-99 rechazo (1) + HU-22 reportar siniestro (2) + HU-101 permisos (2) + HU-97 confirmación (1) + HU-31 lista de siniestros (2) + HU-36 paramétrico (2) + HU-57 hipotecario (2) + HU-53 consentimiento hipotecario (2) + BFF móvil HU-121, HU-127, HU-129, HU-131 y HU-133 (1 c/u) 25

41 SP de los 130 tocan el canal móvil, pero solo 34 son Kotlin. Los 7 slices de :BFFMovil son código de servidor: sirven a la app, no se escriben en ella. Eso importa para el bus factor, porque esos 7 SP los puede tomar cualquiera del equipo sin depender de John. HU-53 lleva etiqueta de núcleo en el tablero, pero su pantalla de consentimiento hipotecario la construye el canal Android, así que cuenta como carga móvil. La carga supera lo que una sola persona entrega en S2 y S3, así que el trabajo en pareja es obligatorio desde S2: cada HU móvil tiene a John como revisor y a un segundo integrante (Python/React) como autor en las de menor riesgo técnico (HU-94, HU-97, HU-99, HU-31). El harness JUnit de S1 existe precisamente para que ese segundo integrante pueda tocar el módulo con red de seguridad. El E2E móvil se sacrifica conscientemente antes que el producto móvil.

Recorrido del cliente en Android:

Primer arranque  Idioma y región (HU-94) → Onboarding (HU-45) | Login (HU-90) → Consentimiento (HU-46) → Inicio (HU-93)
#1  Inicio → Ver oferta (HU-11)
#2  Ver oferta → Emitiendo → Póliza emitida (HU-20) | Rechazo (HU-99)
#3  Siniestros (HU-31) → Reportar (HU-22) → Permiso (HU-101) → Confirmación (HU-97)
#4  Aviso in-app (HU-31) → Paramétrico (HU-36)
#5  Inicio → Consentimiento de perfilamiento (HU-53) → Oferta hipotecario (HU-57)
#6  Póliza emitida (HU-20) · renovar y cancelar por operador (HU-59, HU-61)

5.1.9 Arranque del backlog del Sprint 1

Los criterios de aceptación definitivos viven en Jira. Cada una de las 58 historias comprometidas tiene en su descripción: aceptación en viñetas, Gherkin con camino feliz y alterno, dependencias y bloque Fuera; las de canal traen además navegación, prototipo, enlace de Figma e imagen. La tabla siguiente es el resumen de arranque del Sprint 1.

Orden de ejecución dentro del S1

HU-70 ──▶ HU-71 ──┬──▶ HU-78 ──▶ HU-89
                  ├──▶ HU-85 ──▶ HU-1 ──▶ HU-2
                  │               └────▶ HU-3 ──▶ HU-4 ──▶ HU-5 ──▶ HU-6 ──▶ HU-7
                  ├──▶ HU-86  (paralelo, canal web)
                  └──▶ HU-87  (paralelo, canal móvil)

Detalle inicial

HU Criterio de aceptación Esquema de pruebas
HU-70 Repositorios Tres repos (web, móvil, backend) con protección de rama, plantilla de PR y CODEOWNERS; el equipo completo tiene acceso Verificación manual + un PR de humo por repo
HU-71 Imágenes Docker base Una imagen base documentada que arranca igual en local y en CI; docker build reproducible Job de CI que construye la imagen y corre --version de las herramientas
HU-78 Red y clúster cloud IaC versionado que levanta y destruye el ambiente mínimo; terraform destroy deja la cuenta limpia terraform plan en CI + corrida completa apply/destroy documentada
HU-89 Ambiente de experimentos Ambiente separado del de HU-78, con K6 instalado y apuntando al servicio de cotización Corrida de humo de K6 con 10 usuarios virtuales
HU-85 Harness PyTest PyTest corre en CI sobre el dominio Python y falla el pipeline ante un test rojo Un test semilla del cálculo de prima
HU-86 Harness Karma web Karma corre en CI sobre el proyecto web y falla el pipeline ante un test rojo Un test semilla de un componente
HU-87 Harness JUnit móvil JUnit de Kotlin corre en CI sin emulador y falla el pipeline ante un test rojo Un test semilla de la capa de presentación
HU-1 Catálogo mínimo Un ramo con coberturas fijas persistido; misma definición para todos los canales Unitaria de dominio
HU-2 Publicar catálogo GET del catálogo devuelve el ramo y sus coberturas Unitaria + contrato
HU-3 Recibir solicitud POST con producto y datos mínimos devuelve cotizacionId; entrada inválida devuelve error de validación Unitaria + contrato
HU-4 Calcular prima Mismos insumos → misma prima; las reglas viven fuera del código compilado Unitaria con tabla de casos (es la historia base de la estimación)
HU-5 Combinar factor (stub) El adaptador ajusta la prima; si el stub falla o tarda, se usa el valor de respaldo y la cotización se completa Unitaria + doble con modos ok/fallo/lento
HU-6 Devolver oferta La oferta trae prima, moneda y venceEn; se puede recuperar dentro de la vigencia Unitaria + contrato
HU-7 Reconsultar oferta GET por cotizacionId devuelve la misma oferta sin recalcular mientras esté vigente; vencida devuelve estado explícito Unitaria + contrato

Definición de terminado

  • Todas las HU: código en main vía PR revisado · pruebas unitarias verdes en CI · imagen construida por el pipeline · IaC aplicable y destruible · historia demostrable en la revisión de sprint.
  • HU móviles (desde S2): además, revisión de John · textos y formato de moneda y fecha a través del formateador de HU-94 (sin cadenas de moneda armadas a mano) · seleccionado con borde + check + texto, no solo color.
  • HU de un recorrido medido: su aceptación cita el escenario de calidad con su meta (p. ej. EC-LAT-01, p95 ≤ 250 ms) y la historia no se cierra sin ese dato. Aplica a HU-3 a HU-7, HU-12 a HU-18, HU-31, HU-32 a HU-34, HU-53 a HU-56.

5.1.10 Internacionalización (HU-94)

Alcance comprometido
Canal Android (app del cliente)
Locales es-CO, es-MX, es-CL, es-PE
Qué cambia por locale Formato de moneda y de fecha en el canal (p. ej. es-MX → $1,234.56 MXN, 09/07/2026)
Dónde se elige Primer arranque (antes de onboarding) y Perfil (entrada mínima dentro de HU-93), sin reiniciar el alta
Contrato con el núcleo El núcleo devuelve solo prima y código de moneda (PL-01); no se traduce ni se formatea en el backend
Fuera Traducir el núcleo · idiomas distintos al español · locales fuera de LatAm · paridad web HU-108 · portales de asesor y operador (quedan en es-CO)

5.1.11 Restricciones de alcance

Reglas vigentes para todo el plan; cualquier otra mención en el tablero o la wiki se lee contra esta lista.

# Regla
R1 Internacionalización acotada a lo definido en §10
R2 Una vista por paso del recorrido en cada canal (canal delgado, §5c); no se agregan vistas que no sean paso del recorrido
R3 Solo cuatro variantes de error: degradación del ASR · resultado de negocio (rechazo, HU-99) · permiso denegado por el sistema operativo (HU-101) · credenciales inválidas o fallo de red resueltos en la misma vista (HU-90)
R4 Sin estados vacíos ricos
R5 El colchón de S1 (6 SP) no se redistribuye
R6 HU-22 es un formulario único con foto; el permiso (HU-101) y la confirmación (HU-97) son historias propias
R7 Sin OCR ni validación externa del documento (HU-45) · sin caché de perfil (HU-5) · sin histórico de cotizacionId (HU-3) · regla única de suscripción (HU-13) · sin conciliación (HU-15) · sin autorización por montos (HU-29) · sin reintentos ni DLQ (HU-32 / HU-34) · sin visualización de factores (HU-55) · sin recálculo de prima (HU-59)
R8 El E2E móvil queda fuera de HU-83
R9 HA-14 a HA-31 no ordenan el tablero; HA-13 entra solo si sobra cupo en S3
R10 Sin recuperación de contraseña ni biometría (HU-90) · sin splash (HU-95) · sin notificaciones push ni campana · sin cierre de sesión en Perfil (HU-91)
R11 El BFF entra como 13 slices de 1 SP, no como contrato paraguas. Un slice solo entra si una HU de canal comprometida lo consume; los 8 restantes del catálogo quedan fuera (§6)
R12 El destino Clientes del back-office se llama Cartera y muestra lo que sostiene HU-139. No se construye CRUD de clientes (HU-140 / HU-141): el enunciado no lo pide

5.2 Tablero cerrado


6. Video con evidencias

Pendiente de agregar el enlace del video con las evidencias de la semana 8.

⚠️ **GitHub.com Fallback** ⚠️