01 // qué
Reemplazar un sistema sin código ni documentación por una réplica determinista, byte a byte, frente a casos que no conocemos.
movingparticle@caja-negra:~$ cat ./SYSTEM_DESIGN.txt
.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~.
/ \
/ \
/ \
/ \
+---------------------------------------------------------------------------------+
| |
| ██████╗ ██╗ █████╗ ██████╗ ██╗ ██╗ ██████╗ ██████╗ ██╗ ██╗ |
| ██╔══██╗ ██║ ██╔══██╗ ██╔════╝ ██║ ██╔╝ ██╔══██╗ ██╔═══██╗ ╚██╗██╔╝ |
| ██████╔╝ ██║ ███████║ ██║ █████╔╝ ██████╔╝ ██║ ██║ ╚███╔╝ |
| ██╔══██╗ ██║ ██╔══██║ ██║ ██╔═██╗ ██╔══██╗ ██║ ██║ ██╔██╗ |
| ██████╔╝ ███████╗ ██║ ██║ ╚██████╗ ██║ ██╗ ██████╔╝ ╚██████╔╝ ██╔╝ ██╗ |
| ╚═════╝ ╚══════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝ |
+---------------------------------------------------------------------------------+
FRONTIER Bogotá 2026 · Reto 2 · hito 12:00.
Un servicio lleva 10 años en producción y nadie sabe cómo funciona. Vamos a descubrir su comportamiento observándolo y construir una réplica que responda exactamente igual — errores incluidos — sin llamarlo nunca en ejecución.
Reemplazar un sistema sin código ni documentación por una réplica determinista, byte a byte, frente a casos que no conocemos.
Probing guiado por hipótesis para inferir la regla real, y un Worker de Cloudflare (con Durable Object para un estado único) que emula comandos, estados y errores.
Comparación diferencial oráculo vs. réplica, batería adversarial y paridad exacta de status y cuerpo.
Lectura en 30 segundos. El detalle técnico está más abajo, en el mismo documento.
El interior es desconocido. Solo vemos INPUT → CAJA → OUTPUT. Hay que reconstruir la regla, no memorizar ejemplos.
Un harness de descubrimiento que pregunta al original, y un entrypoint HTTP (Cloudflare Worker + Durable Object) que responde igual.
Cada comportamiento cita una línea del log. Cada respuesta se compara contra el original. Nada se afirma sin prueba.
| punto crítico | estado | resolución |
|---|---|---|
| Réplica no implementada | resuelto | 6 comandos + 17 errores en src/engine.mjs; paridad 20/20. |
| Algoritmo del control desconocido | resuelto | ISO 7064 Mod 97-10 (16/16 casos + probes de borde). |
| Estado no aislado / multi-instancia | resuelto | Durable Object único global-caja-negra (un solo estado). |
| Entrypoint no desplegado | resuelto | Cloudflare Workers: https://caja-negra-reemplazo.parsec-ai-labs.workers.dev. |
| Incidente de las 15:30 | abierto | Baseline congelado + adaptación sin regresión (INCIDENT.md). |
GET /health exige token: sin él → 401 E001 (el arnés manda token en todas las llamadas). El cuerpo de /__reset es {"ok":true} y no es comparado por el arnés. Ambos quedan como supuestos hasta verificar contra el original.Dos fuentes lado a lado: verde = 20 ejemplos públicos (pruebas/ejemplos.jsonl) · cian = 14 sondas en vivo contra el oráculo (experimentos.jsonl). Barras de bloque, ordenadas, con n visible. Sin tortas.
BASELINE (20) n barra PRUEBAS (14) n barra 200 OK 11 ███████████ 400 BAD 9 █████████ 400 BAD 4 ████ 404 MISS 3 ███ 201 NEW 2 ██ 200 OK 2 ██ 422 LIM 2 ██ 404 MISS 1 █
experimentos.jsonl). El probing fijó la precedencia de errores (E303→E304→E401→E506), los límites de monto y el algoritmo de control (checksum mod 97).arc42 §1–3 y el criterio de entendimiento de la rúbrica: objetivo, límites, supuestos, lo que queda fuera y por qué.
Réplica autónoma, determinista y pública que responda igual que el original — mismos status y cuerpos — ante un set oculto de 100 tests.
POST /msg con {"m":"CMD;arg;...;ctrl"} + Bearer token.GET /health, POST /__reset.;./__reset vuelve a cero.Producción en Cloudflare Workers con un Durable Object que garantiza un estado único global; el mismo motor corre en un servidor Node local. Integridad con ISO 7064 Mod 97-10.
Entrypoint público: https://caja-negra-reemplazo.parsec-ai-labs.workers.dev
Cada ADR dice qué se descartó, por qué, qué se gana, qué se sacrifica y cuándo se cambiaría.
npm ci && npm test && npm start en entorno limpio./__reset antes de cada uno de 100 tests y asume un único proceso/estado.global-caja-negra garantiza un solo estado lógico, con reset en memoria (< 1 ms) sin disco.Cómo sabremos que funciona antes de construirlo. Sin número, no hay defensa.
Tras /__reset, los 20 ejemplos dan 20/20 en status y cuerpo (test automatizado).
| test | qué intenta romper | esperado | prio |
|---|---|---|---|
| happy path | PING → ALTA → DEPOSITO → CONSULTA | status y saldos exactos | P0 |
| vacío | /msg sin cuerpo | mismo error que el original | P0 |
| desconocido | SALDOS;... | 400 E301 | P0 |
| aridad | demasiados o pocos ; | 400 E302 | P0 |
| control | campo no numérico | 400 E201 / E202 | P0 |
| cuenta | CONSULTA;AC-9999 | 404 E401 | P0 |
| límite | transferencia sobre umbral | 422 E506 | P1 |
| saldo | transferir más de lo que hay | 422 E507 | P1 |
| anula x2 | ANULA de operación ya anulada | ok:false, ya anulada | P1 |
| ruta mala | GET /msg, path desconocido | mismo 404/405 | P1 |
| payload | cuerpo grande o encoding roto | rechazo con el código exacto | P1 |
| reset | /__reset sin token | como el original, sin filtrar el mecanismo | P0 |
| incidente | el caso que cambie a las 15:30 | adaptado, sin regresión | P0 |
| latencia | cada paso | < 5 s | P2 |
confirmado se repite · probable se vio una vez o se infiere · supuesto es el default del reemplazo.
| id | comportamiento | evidencia | confianza |
|---|---|---|---|
| C1 | PING → {pong:true} sin estado | #1 | confirmado |
| C2 | comando case-insensitive | #11 CONSULTa | confirmado |
| C3 | ALTA crea AC-#### incremental | #3 #4 | confirmado |
| C4 | el control se valida antes de actuar | #2 #17 | probable |
| C5 | DEPOSITO acredita y devuelve operacionId | #6 #18 #19 | confirmado |
| C6 | TRANSFER mueve saldo | #7 #8 | confirmado |
| C7 | hay tope E506 y saldo E507 | #9 #16 | confirmado |
| C8 | ANULA es idempotente | #13 #14 | confirmado |
| C9 | comando desconocido → 400 E301 literal | #12 | confirmado |
| C10 | aridad inválida → 400 E302 | #20 | confirmado |
| C11 | control = ISO 7064 Mod 97-10 (A=1…Z=26 sin padding, CD = 98 − (N·100) mod 97) | 16/16 + probes | confirmado |
| H1 | el control es un dígito de verificación del payload | confirmado como ISO 7064 | confirmado |
| H2 | orden: forma → control → recurso → negocio | #15 vs #9 | probable |
| H3 | IDs por proceso, se reinician con reset | #3 #6 | probable |
| S1 | payload grande o encoding inválido → error estable | contrato | supuesto |
| S2 | ruta inexistente → mismo 404 | contrato | supuesto |
/health /__reset /*experimentos.jsonl)/saldo) existen en el original?Patrón: elegimos X por A y B; descartamos Y por C; el trade-off es D; si cambia E, pasamos a Y.