Mike (@mikerb95)CodeByMike

Tres flujos de control internos en notación de actividades UML 2.5.1. No repiten lo que ya está en los diagramas BPMN: aquellos documentan procesos de negocio (quién habla con quién para cobrar, para dar acceso, para responder a un incidente); estos documentan algoritmos, que es donde esta notación aporta lo que BPMN no tiene tan a mano: la rama concurrente que nunca se vuelve a unir y el bucle de reintento.

El SVG se genera en el servidor desde un modelo tipado (src/data/actividades.ts); las posiciones, el ruteo y el corte de etiquetas los calcula src/lib/uml-activity.ts. Los tests no solo verifican el dibujo (nada encimado, ninguna transición atravesando una figura ajena): también verifican la notación - que toda decisión tenga al menos dos salidas y todas con guarda, que una unión tenga una sola salida, que ningún nodo final tenga transiciones salientes y que no queden nodos inalcanzables.

No se usó Mermaid a propósito: su flowchart no es notación de actividad (no tiene barra de bifurcación, ni particiones, ni distingue el final de flujo del final de actividad), y esas tres cosas son justo lo que estos diagramas afirman.

Notación

  • Nodo inicialCírculo relleno. Donde arranca la actividad; no admite transiciones entrantes.
  • AcciónRectángulo de esquinas redondeadas: un paso ejecutable.
  • DecisiónRombo con una entrada y varias salidas, cada una con su guarda entre corchetes.
  • Unión de decisiónEl mismo rombo al revés: varias entradas, una sola salida sin guarda.
  • BifurcaciónBarra que reparte el control en ramas concurrentes.
  • Unión concurrenteLa misma barra sincronizando: no sigue hasta que llegan todas las ramas.
  • Envío de señalPentágono con la punta hacia fuera: el sistema notifica.
  • Recepción de eventoPentágono con la muesca: el sistema espera algo de fuera.
  • Final de actividadDiana. Termina la actividad completa, incluidas las ramas vivas.
  • Final de flujoCírculo con aspa. Termina ESTA rama y deja la actividad corriendo.

Atención de una solicitud en el middleware

El camino completo de un request desde que entra al edge hasta que sale con sus cabeceras. Concentra en un solo punto la normalización de idioma, el chaos del LAB, la blocklist, el límite de peticiones y las dos autenticaciones, en ese orden.

src/middleware.ts · src/lib/security/{sensor,blocklist,ratelimit-durable}.ts · src/i18n/routing.ts

ClienteNavegador o agenteMiddlewaresrc/middleware.tsMicro-SIEMsrc/lib/security/*AplicaciónAstro SSR · /api[privada bajo /en][resto][bloqueada][limpia][honeypot][tráfico normal][excede][dentro del límite][admin o portal][pública][no válida][válida]Emite la solicitud HTTPSNormaliza la ruta condelocalizePath¿ruta privada con prefijode idioma?404Evalúa las banderas dechaos del LAB¿IP en la blocklist?403La observación no bloquea el requestClasifica la amenaza yregistra el evento¿coincide con un patrón dehoneypot?Escala el bloqueo de laIPFinal de flujo: termina la rama, no la actividad¿excede el límite depeticiones?429¿la ruta exige sesión?Revalida la sesión y laallowlist¿sesión válida?Redirección al loginEjecuta la página o elendpointAñade cabeceras CSP,HSTS y de caché

La ruta se normaliza con delocalizePath UNA sola vez, al principio, y todos los guardas posteriores comparan contra la ruta canónica. Si el prefijo de idioma sobreviviera hasta la comprobación de sesión, /en/admin sería una copia del panel sin vigilancia.

Integración, despliegue y verificación con rollback

Del push a main hasta producción verificada. Las dos ramas de verificación (pruebas y seguridad/accesibilidad) corren concurrentes y se sincronizan antes de desplegar; después del deploy hay una etapa más, la que decide si la versión nueva se queda o se revierte.

.github/workflows/{ci,security,a11y,dast}.yml · src/pages/api/health.ts · src/pages/docs/pipeline-en-vivo.astro

Desarrollopush a mainCI · pruebasci.ymlCI · seguridadsecurity · a11y · dastVercelbuild, deploy y promoción[algún job falla][todo pasa][no sana][sana]Publica los commits enmainLas dos ramas arrancan a la vezUnitarios, cobertura ycontratosSuite e2e con basesdesechablesnpm audit y análisisestáticoaxe sobre las páginaspúblicasEspera a las dos ramas¿todo en verde?Sin desplegarConstruye y despliega aproducciónConsulta /api/health deldeploy nuevo¿la versión nueva respondesana?Promueve de vuelta eldeploy anteriorAlerta push aloperadorProducción en la versiónpreviaRegistra el run en elpanel

La barra de unión no es decorativa: si una sola de las dos ramas falla, el token de control nunca se completa y el despliegue no ocurre. El rollback se dispara desde el resultado del health check contra el deploy ya publicado, no desde el resultado de los tests.

Aplicación idempotente de un evento de la pasarela

Qué ocurre dentro del sistema cuando llega un webhook de pago. No es el proceso de cobro (ese está en BPMN): es el algoritmo que garantiza que un evento repetido, reenviado o simultáneo no cobre dos veces ni deje el pago a medias.

src/pages/api/payments/webhook.ts · src/lib/payments.ts · src/lib/payments-state.ts

PasarelaWompiEndpoint/api/payments/webhookDominiomáquina de estadosPersistenciaTurso · libSQL[no coinciden][coinciden][no existe][existe][ya aplicada][legal][ganó la carrera][otra escritura ganó][sin reintentos][quedan]Emite el evento dela transacciónRecibe el POST delwebhook¿firma y monto coinciden?Guarda el evento comoevidencia y alertaEvento descartadoCarga el pago por sureferencia¿existe el pago?Sin correspondenciaCalcula la transiciónsobre la versión leída¿la transición es legal?Evento ya aplicadoUPDATE condicionado a laversión¿actualizó alguna fila?Inserta el evento delpagoPago conciliado¿quedan reintentos?Reintentos agotados

La transición se calcula en un módulo puro (payments-state.ts) sin acceso a base de datos, para poder ejercitarla en pruebas y también en el navegador. La escritura es la única parte que toca Turso, y va condicionada a la versión leída.