Hoja de trabajo semana 8 - martin-hendricks/MISO-PROYECTO-FINAL-SOLVENTA GitHub Wiki
| 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.
- Documento final de arquitectura Proyecto I
- Historias de usuario detalladas del Sprint 1 del Proyecto 2
- Presentación del prototipo web/móvil final
- Documento de lecciones aprendidas Proyecto I
- Plan de trabajo y tablero cerrados
- Video con evidencias
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
- 1.1.2 Vista funcional — Modelo de componentes
- 1.1.3 Vista de despliegue — AWS
- 1.1.4 Vista de información
- 1.1.5 Arquitectura del portal web (MVVM)
- 1.1.6 Arquitectura del cliente móvil (Android)
| 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 |

| 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.
Abrir el SVG completo: files/componentes_semana5.svg
| 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.
| 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.
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
:Sincronizadory 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.
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.
| 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.
Abrir el SVG completo: files/DiagramaDespliegueSolventa.svg
| 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 |
| 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.
| 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.
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-07se 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 deEC-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:AdaptadorOFy no se ejercitó:EC-LAT-03yEC-LAT-04quedan sin evidencia frente a dependencia degradada, y su cumplimiento depende de que:CacheOD/:CacheOFapliquen 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.
| 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.
Abrir el SVG completo: files/ModeloDatosSolventa.svg
| 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 |

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
|
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.

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.
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.
| 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.

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
| 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. |
Abrir el SVG completo: images/android-arquitectura-runtime.svg
| 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.
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 |
| 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.
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.
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.
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.
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.
| 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.
| 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.
| 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.
| 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.
| 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.
| 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.
| 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.
| 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.
| 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.
| 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.
| 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.
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 |
- 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.
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 %.
| 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.
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-07no 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 |
Backlog / tablero Jira: SOLV — Backlog · 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.
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) | ➖ |
Navegación a la funcionalidad definida
- Abrir y recorrer el prototipo web — S7, inicia en Login (1440). Clickeable de punta a punta, sin cuenta de Figma.
- Screens · S7 validación · web — archivo de diseño de la versión final.
- Detalle del prototipo web · pantallas y navegación — recorridos, TopNav y trazabilidad pantalla ↔ HU.
- Recorridos críticos cubiertos — paridad con los seis recorridos del enunciado §5.1.
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
- Abrir y recorrer el prototipo móvil — S7, inicia en Splash (390). BottomNav y sheets.
- Screens · S7 validación · Android — archivo de diseño de la versión final.
- Detalle del prototipo móvil · pantallas y navegación — recorridos y trazabilidad pantalla ↔ HU.
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
-
Abrir y recorrer el back-office — inicia en Login del asesor (
bo-login). Entrar abre Clientes. - Back-office · Asesor / Operador — archivo de diseño (login, CRUD de clientes, colas COT/POL, avisos).
-
Detalle del prototipo back-office · pantallas y navegación —
TopNavAdmin, trazabilidad HU y estados alternos. - Asesor · clientes (CRUD) — lista de personas (web/Android) → ficha → editar / dar de baja / cotizar.
- Asesor · nueva cotización — picker de ramo (Dispositivo · Viaje · Vida · Clima y vuelos · Pagos · Hipotecario); los datos de riesgo cambian como en el canal del asegurado.
- Operador · avisos — cola con filtros → detalle → aprobar o rechazar.
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.
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
- Guía de estilos (design tokens)
- Catálogo de componentes UI
- Inventario de pantallas por plataforma
- Flujos de navegación
- Consideraciones técnicas
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.

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 (
#6e7979sobre#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.

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).
| 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.
| 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 |
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.
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.
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 |

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.
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 |

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.
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.
| 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) |
82 frames en total. El identificador abre el frame directamente en Figma.
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]
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] |
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 |
|---|---|
![]() |
![]() |
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
Screensoriginales 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.
Web · login
|
Web · registro
|
Web · consentimiento-datos
|
|---|---|---|
![]() |
![]() |
![]() |
Móvil · onboarding
|
Móvil · login
|
|---|---|
![]() |
![]() |
Web · idioma-region
|
Web · inicio
|
Móvil · idioma-region
|
Móvil · inicio
|
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Web · nueva-cotizacion
|
Web · ver-oferta
|
Web · poliza-emitida
|
|---|---|---|
![]() |
![]() |
![]() |
Móvil · nueva-cotizacion
|
Móvil · ver-oferta
|
Móvil · poliza-emitida
|
|---|---|---|
![]() |
![]() |
![]() |
El indicador «paso N de 4» y el CTA de continuidad cierran el salto Aceptar → Ver mi póliza que detectó la validación.
Web · aviso-siniestro
|
Móvil · aviso-siniestro
|
Móvil · permiso-camara
|
Móvil · evidencia-siniestro
|
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
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.
Web · parametrico
|
Móvil · parametrico
|
Web · oferta-hipotecario
|
Móvil · oferta-hipotecario
|
Web · detalle-poliza
|
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
| 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 |
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
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.
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
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.
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
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.
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
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.
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
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.
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.
| 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.
-
El canal formatea, el núcleo no. El núcleo entrega prima y código de moneda;
NumberFormat/Intlaplican el locale. Cambiar de locale no cambia la prima. - 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».
-
Idempotencia visible. Reintentar un pago o un aviso devuelve el mismo comprobante o
siniestroId; la UI lo comunica en vez de ocultarlo. -
Autorización en el servidor. Ocultar un botón no es un control:
shell-asesor-sin-permisorefleja lo que el servidor ya denegó (HU-75). - Estado nunca solo por color, y contraste AA en los pares del design system.
- Permisos JIT, nunca en splash, y denegar jamás bloquea el recorrido.
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.
- 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.
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
- Introducción
- Requisitos y acceso
- Cómo navegar
- Cómo iniciar sesión
- Cómo gestionar clientes
- Cómo cotizar y emitir para un cliente
- Cómo renovar o cancelar una póliza
- Cómo trabajar la cola de avisos
- Cómo decidir un aviso y registrar el pago
- Mensajes, bloqueos y permisos
- Accesibilidad y formato regional
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.
- 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.
- 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.
| 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. |
- Abre Recorrer el back-office.
- Empiezas en Iniciar sesión.
- 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. |
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.

- En Iniciar sesión escribe el correo corporativo y la contraseña.
- Pulsa Entrar.
- 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.

La lista muestra documento, canal (web o Android), estado y consentimiento.
- Abre Clientes.
- Pulsa una fila para abrir la ficha.
- Desde la ficha puedes Editar, Dar de baja o Cotizar.

- Pulsa Nuevo cliente.
- Completa el formulario de alta.
- Guarda. La persona queda en la cartera y puede usarse en una cotización.

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

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

- Abre Cotizaciones.
- La cola lista referencias
COT-*con el ramo (dispositivo, vida, clima y vuelos, hipotecario, y el resto del portafolio L1). - Pulsa Nueva cotización.

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

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.

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 |
|---|---|
![]() |
![]() |
- Abre Pólizas.
- Localiza la referencia
POL-*. - En la fila, elige Renovar o Cancelar.

| 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 |
|---|---|
![]() |
![]() |
La cancelación es destructiva.
- Pulsa Cancelar.
- Escribe el motivo en el diálogo.
- 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 |
|---|---|
![]() |
![]() |
Esta sección es del operador.
- Abre Avisos.
- Filtra por estado.
- Selecciona una fila. La fila muestra una barra de acento y el panel de detalle incluye la evidencia que cargó el cliente.
- Entra al caso para decidir.

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

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.

El diálogo se abre sobre la cola, así el caso sigue visible.
- Revisa evidencia, ramo y monto.
- Pulsa la acción de aprobar.
- 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.

- Pulsa rechazar.
- Escribe el motivo.
- 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 |
|---|---|
![]() |
![]() |
Si el primer intento no confirma:
- Abre el pago pendiente.
- Pulsa reintentar.
- El sistema devuelve el mismo comprobante. La clave de idempotencia evita un segundo desembolso y el intento queda en la trazabilidad.

| 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. |
- 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.
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
- Introducción
- Requisitos, permisos y acceso
- Cómo navegar por la app
- Cómo empezar: splash, idioma, registro y login
- Cómo usar Inicio
- Cómo cotizar un seguro
- Cómo revisar la oferta y emitir la póliza
- Cómo consultar tus pólizas y avisos
- Cómo reportar un siniestro
- Cómo consultar un pago automático
- Cómo pedir protección ligada a un crédito
- Cómo usar Perfil
- Accesibilidad, idioma y ubicación
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.
Está dirigido a la persona asegurada que usa Solventa en un teléfono Android.
- 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.
| 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.
- Abre Recorrer la app.
- El recorrido empieza en el Splash.
- Si no ves las zonas activas, presiona la tecla
E. - 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. |
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.
Al abrir la app ves el splash de Solventa con el indicador de avance. No pide permisos ni muestra la barra 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. |

Cotización, oferta, detalle, aviso, evidencia e hipotecario mantienen visible la barra, con el destino padre seleccionado. Arriba aparece la flecha Volver.
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 |
|---|---|
![]() |
![]() |
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.
El alta es un paso a paso numerado. La barra inferior permanece oculta.
Splash → Idioma y región → Onboarding | Login → Consentimiento de datos → Inicio
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.
- Toca la región. El ejemplo de monto y fecha cambia (en México,
$1,234.56 MXNy09/07/2026). - Toca Continuar.
- Sigues al onboarding.
| Colombia · es-CO | México · es-MX |
|---|---|
![]() |
![]() |
El onboarding presenta para qué sirve la app, en lenguaje de seguros.
- Completa el registro.
- Si ya tienes cuenta, entra por Login (Ya tengo cuenta / Ingresar).
- Un inicio de sesión fallido es un estado de la misma pantalla de login.
| Registro | Iniciar sesión | Error de acceso |
|---|---|---|
![]() |
![]() |
![]() |
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.

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.

- En Inicio, toca Nueva cotización (o Ver oferta si ya hay una cotización vigente).
- 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. |
- Toca Cotizar.
- 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.

- En el detalle de la oferta revisa ramo, estado, prima y vigencia.
- Toca Aceptar.
- Emitiendo tu póliza muestra el avance. La barra inferior no está.

| 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. |

- Toca Pólizas.
- Cada tarjeta muestra ramo, estado y un resumen del tipo, más recomendaciones de siniestro de ese ramo.
- 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 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Hace falta una póliza vigente. Los campos del aviso son los del ramo de esa póliza.
- Toca Siniestros.
- Toca Reportar (acción principal de la lista).
- Completa el formulario y continúa a la evidencia.
| Siniestros | Reportar |
|---|---|
![]() |
![]() |
- Para tomar la foto, la app pide cámara en ese momento.
- Para elegir una imagen existente, pide fotos.
- 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. |
- Confirma. Vuelves a la lista, donde el caso muestra su estado.
- 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 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
En clima y vuelos el cliente no arma un aviso con foto. El evento, al superar el umbral, produce un Pago automático.
- Abre Siniestros o el aviso correspondiente.
- Revisa el resumen y los montos.
- El título en la app es Pago automático.

- En Inicio, abre la tarjeta de crédito o entra a Nueva cotización y elige Hipotecario o Pagos.
- En hipotecario, acepta el consentimiento de perfilamiento y consulta el texto legal. Es un paso de este flujo, no una fila de Perfil.
- Revisa la oferta (factores y prima).
- Toca Aceptar. Sigues a la emisión y al resultado (póliza o rechazo).
| Consentimiento | Oferta |
|---|---|
![]() |
![]() |
- Toca Perfil.
- 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 |
|---|---|
![]() |
![]() |
- 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.
- 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.
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
- Introducción
- Requisitos y acceso
- Cómo navegar por el portal
- Cómo elegir idioma, registrarte e iniciar sesión
- Cómo usar Inicio
- Cómo cotizar un seguro
- Cómo revisar la oferta y emitir la póliza
- Cómo consultar tus pólizas y avisos
- Cómo reportar un siniestro
- Cómo consultar un pago automático
- Cómo pedir protección ligada a un crédito
- Cómo usar Perfil
- Accesibilidad, idioma y ubicación
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.
Está dirigido a la persona asegurada que usa Solventa en el navegador, en computador, tablet o teléfono.
- 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.
| 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. |
- Abre el enlace Recorrer el portal web.
- El recorrido empieza en Login a 1440 px.
- Si no ves las zonas activas, presiona la tecla
E. - 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. |
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.

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.

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.

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 |
|---|---|
![]() |
![]() |
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ú |
- Toca la región. El ejemplo de fecha y monto cambia en la misma pantalla.
- 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 |
|---|---|
![]() |
![]() |
- Completa el alta (paso 2). Si ya tienes cuenta, usa Ya tengo cuenta para ir al login.
- En el consentimiento de datos (paso 3) lee el texto legal enlazado y otorga el tratamiento de datos personales.
- Al terminar entras a Inicio.
| Registro | Consentimiento de datos |
|---|---|
![]() |
![]() |
- En Login ingresa correo y contraseña.
- Pulsa el botón de ingreso.
- 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ú.
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).

- Pulsa Nueva cotización en Inicio, o el mismo llamado en Pólizas si aún no tienes pólizas.
- 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. |

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

- En Ver oferta confirma ramo, estado, prima y vigencia.
- Pulsa Aceptar.
- La pantalla Emisión en progreso oculta la navegación mientras se procesa la suscripción.
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.
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.

- Pulsa Pólizas en la barra superior.
- Cada fila o tarjeta muestra ramo, estado y un resumen del tipo.
- También verás recomendaciones de siniestro propias de ese ramo.
- Si la lista está vacía, usa Nueva cotización.

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 |
|---|---|---|
![]() |
![]() |
![]() |
Necesitas una póliza vigente. El formulario usa los campos y las recomendaciones del ramo de esa póliza.
- Pulsa Siniestros.
- Pulsa Reportar.
- Completa el aviso. En dispositivo, la evidencia es la foto del daño. Otros ramos no reutilizan ese mismo formulario.
- Continúa a la evidencia.
| Lista de siniestros | Aviso |
|---|---|
![]() |
![]() |
La evidencia en la web es una zona para soltar o elegir un archivo. No se abre la cámara del teléfono.
- Arrastra el archivo o selecciónalo desde el equipo.
- Escribe la dirección. Ese dato siempre está disponible.
- Si quieres geoetiquetar, pulsa Usar 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.
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.
- Abre Siniestros.
- Abre el caso de pago automático.
- Revisa el resumen del evento y el monto. El título en el canal es Pago automático.

La vida hipotecaria y la protección de pagos no se inician desde Perfil.
- En Inicio, abre la tarjeta de crédito o pulsa Nueva cotización y elige Hipotecario o Pagos.
- En hipotecario, el paso siguiente es el consentimiento de perfilamiento. Lee el texto legal y continúa.
- Revisa la oferta hipotecaria (factores y prima).
- Pulsa Aceptar. El resto es el mismo camino de emisión: progreso, póliza emitida o rechazo.
| Consentimiento de perfilamiento | Oferta hipotecaria |
|---|---|
![]() |
![]() |
- Pulsa Perfil.
- 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 |
|---|---|
![]() |
![]() |
- 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.
- 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.
Índice
- 4.1 Propósito y alcance
- 4.2 Formato adoptado y cómo se llena
- 4.3 Contexto de la iteración
- 4.4 Métricas de la iteración
- 4.5 Registro de lecciones aprendidas
- 4.6 Retrospectiva del equipo
- 4.7 Plan de acción para el Proyecto Final 2
- 4.8 Riesgos y brechas que se trasladan al PF2
- 4.9 Preguntas de la sesión de retrospectiva
- 4.10 Validación del equipo
- 4.11 Trazabilidad y fuentes
- 4.12 Control de versiones
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í.
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.
| 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 · |
| 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 |
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.
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.
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 |
| 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 | ☑ |
| 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).
| 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.
| 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.
| 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.
| 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).
| 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.
| 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.
| 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.
| Tipo | |
| 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.
| Tipo | |
| 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.
| 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.
| 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.
| 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.
| 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.
| 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.
| Tipo | |
| 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.
| 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.
| 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.
| 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.
Prácticas acordadas por el equipo en la sesión de retrospectiva, a partir del registro de §4.5.
| # | 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 |
| # | 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 |
| # | 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 |
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 |
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) |
Preguntas sobre lo que los artefactos no registran, respondidas por el equipo en la sesión de retrospectiva.
Sobre el proceso y la cadencia
-
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.
-
¿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.
-
¿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
- ¿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
-
¿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.
-
¿Hubo retrabajo por problemas de ambiente, versiones o configuración que no quedó documentado?
No, todo fue documentado en los experimentos.
Sobre las decisiones
-
¿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.
-
¿Alguna decisión se tomó sin que todos la entendieran igual, y se detectó después?
No, todos estuvieron siempre de acuerdo.
| 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 | — | — |
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ónHUBaseyVelocidadEquipo, derivación del factor h/SP - Home — acuerdos del equipo y metodología declarada
Experimentos de arquitectura
- HA-01 — Diseño · Informe · Informe detallado
- HA-08 — Diseño · Informe · Informe detallado
Backlog, calidad y diseño
- Backlog refinado semana 3 · Backlog UI cliente L1 · Backlog Jira
- Escenarios de calidad · hoja de trabajo · Revisión de escenarios ASR · Tácticas y patrones
- Prototipo web/móvil · Visión de arquitectura · Documento de alcance · Estrategia de pruebas
- HU pendientes de refinamiento · PF2 (documento superado, conservado como registro)
Tableros
| 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 |
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).
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.
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.
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 |
En este orden:
-
ASR de latencia y escalabilidad primero. El equipo tomó
EC-LAT-*yEC-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. - 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.
- 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.
- 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).
- 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).
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.
| 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.
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.
| 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 |
| 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 |
| 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 |
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.
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).
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)
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
mainví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.
| 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) |
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 |
Pendiente de agregar el enlace del video con las evidencias de la semana 8.




































































