AI Builders Hackathon · Reto 2

Caja Negra

El reemplazo como un capitolio que se arma pieza a pieza. Dentro, cada zona es una parte de la arquitectura y cada persona es un cliente; bajo la cúpula, la red de transferencias. Personas y montos simulados; reglas, códigos y mensajes del original (perfil v2).

0 requests0 cuentas0 operaciones0 rechazos0 bloqueadas

Ventanilla · últimos requests

Arrastra para girar · Ctrl + rueda o los botones + y − para acercar · toca a una persona para seguirla

AI Builders Hackathon · Reto 2

Reemplazo conductual

Un servicio sin código, entendido desde fuera

Un servicio bancario con 10 años en producción, sin código, sin documentación y sin sus autores. Lo entendimos experimento a experimento y lo reemplazamos. Responde igual, errores incluidos.

5.651experimentos registrados
127reglas en la spec
365casos idénticos de 365

El log de experimentos

5.651 preguntas al original

Cada cuadro es una línea de experimentos.jsonl: una hipótesis, el request que la pone a prueba y la respuesta del original. Repite el día para verlas en el orden en que se hicieron, o reordénalas por tema o por la respuesta que dio el original.

5.651 / 5.651

Pasa el cursor por un cuadro para leer la pregunta: hipótesis, request y respuesta del original.

Método

Cada request es un experimento

1 · HIPÓTESIS

2 · REQUEST

3 · OBSERVACIÓN

4 · REGLA EN LA SPEC

La tubería de validación

Gana el primer error

El original valida en un orden fijo y responde con el primer error que encuentra. El reemplazo sigue el mismo orden. Elige un mensaje real del log y mira dónde se detiene.

El número de control

Lo descubrimos sin ver una línea de código

Cada mensaje termina en un número de control. Ajustando hipótesis contra el log llegamos a la fórmula: ISO 7064 mod 97-10, la misma idea que valida un IBAN. Las letras valen su posición (A=1 … Z=26), los dígitos valen ellos mismos y el resto se ignora.

control 9

Errores incluidos

Rarezas que reproducimos a propósito

Un cliente de 10 años puede depender de cualquiera de estas. El reemplazo las devuelve igual, y la spec las marca para que un sistema nuevo no las herede.

Un typo en producción

DEPOSITO;AC-0001;98765;20
→ 200 {"status":"recieved","operacionId":"OP-0001"}

log 1253 · CD-01

Dos estilos de nombre

ALTA;maria;85     → {"cuentaId":"AC-0001"}
CONSULTA;AC-0001;14 → {"cuenta_id":"AC-0001",…}

log 1249 · CA-01 · RI-08

Un espacio al final

CONSULTA ;AC-0001;14
→ 400 {"error":"E301",
       "mensaje":"comando desconocido␣",
       "sugerencia":"CONSULTA"}

log 1307 · ER-12

PING no mira el control

PING;64           → 200 {"pong":true}
PING;cualquier-cosa → 200 {"pong":true}

log 4, 1274–1277 · CP-01

Cómo sabemos que funciona

Medido con el comparador del jurado

365 / 365

casos grabados del original, reproducidos idénticos contra el reemplazo

v1
154/154
v2
211/211
0

errores 500 en más de 150.000 peticiones de fuzzing y red team, en los perfiles v1 y v2

CT-15

la regla que ninguna prueba manual vio: entre cuentas del mismo titular no hay límite de transferencia. La encontró el fuzzer diferencial.

Las 20 pruebas de ejemplo

El formato del set oculto, ejecutado en vivo

Los organizadores dieron 20 ejemplos con la respuesta exacta del original: una sola secuencia con estado, como los tests del jurado. Aquí corren contra el reemplazo real, paso a paso. Las respuestas del reemplazo son las que devuelve app/, no una copia.

0/20 idénticas

Los ejemplos se grabaron con el original de la mañana (v1).

    Debrief

    Las preguntas que nos van a hacer

    Toca una tarjeta para ver la respuesta corta y su evidencia. El modo ensayo las recorre una a una con un tiempo por respuesta.

    El incidente

    El original cambió sin avisar

    Las vueltas del centinela de 15:30, 15:40 y 15:50 vieron todavía v1. Entre las 15:50 y las 15:55 el proveedor desplegó v2. A las 15:55 la regresión completa lo detectó y a las 16:17 el reemplazo ya respondía como v2.

    15:2515:3515:4515:5516:0516:1516:25 centinela 46/46 v1 46/46 v1 cambio 15:50–15:55 regresión: 43/491 distintas 3 causas 16:17 v2 en producción

    Saldo

    "saldo":0"saldo":"0.00"

    centavos con 2 decimales · CB-04

    Límite de TRANSFER

    10000050000

    por operación, inclusivo · CB-05

    Antifraude E510

    409423 + "intentos"

    contador por cuenta · CB-06

    Regresión del corpus de la mañana contra v2: 491 respuestas

    Las 43 distintas se reducen a 3 causas

    19 formato del saldo · 4 E506 en TRANSFER de 100000 · 9 E510 con 423 · 11 consecuencias del límite nuevo (saldos, ANULA → E402, números de operación). Fuente: bench/regresion_v2.json, spec CB-07.

    No adivinamos. Cada comportamiento tiene un experimento detrás.

    Jorge Fajardo · Joan Pellegrino