Saltar al contenido
a@o:~$

cat /work/el-carril.case

[002]PRODUCTIONPERSONAL2025 — presentevisitar sitio ↗

el-carril

Plataforma de apuestas con dinero real para carreras parejeras en México — wallet, ledger, eventos en vivo

stack: NestJS · Prisma · PostgreSQL · Redis · React · k6

──situación

situación

Las apuestas parejeras en México corren sobre efectivo, libretas y confianza. Diseñé y construí una plataforma que mueve dinero real entre personas reales: depósitos, empate de apuestas, liquidación, retiros. En un sistema así, un error de redondeo no es un bug: es el dinero de alguien.

──evidencia

evidencia

Exhibit 1
los floats están prohibidos

todo valor monetario es Decimal/NUMERIC de punta a punta; las fronteras de serialización se auditan por pérdida de precisión

Exhibit 2
una sola ruta de escritura

un único LedgerService es dueño de toda mutación de saldo; ningún otro código puede tocar dinero

Exhibit 3
spike: 200 VUs

pruebas de carga con k6 sobre datos con forma de producción encontraron el techo de CPU en el hashing de contraseñas (argon2), no en el ledger

──diagnóstico

diagnóstico

La integridad financiera no puede ser una convención de code review; tiene que ser estructural. El diseño hace irrepresentable el manejo incorrecto de dinero: ledger append-only, claves de idempotencia en cada mutación, aislamiento serializable en la liquidación, y snapshots de saldo recomputables desde el ledger en cualquier momento.

──intervención

intervención

  1. 01

    Ledger de doble partida, append-only, sobre PostgreSQL con transacciones serializables para liquidación y claves de idempotencia en cada mutación de dinero.

  2. 02

    El admin no puede otorgar saldo por diseño: la única entrada de dinero es un depósito con comprobante verificado — un invariante, no una política.

  3. 03

    Audit log acotado a lo que importa (movimientos de dinero, resultados de carreras, cambios de identidad), particionado por mes con archivado en almacenamiento frío, tras costear el enfoque ingenuo de loguearlo todo.

  4. 04

    Pruebas de carga con k6 sobre un dataset con forma de producción usando un runbook de backup → preparación → throttle off → prueba → restauración; establecí un techo de capacidad (~100 VUs sostenidos en la infra actual) y la ruta de upgrade para superarlo.

  5. 05

    Redis para sesiones y caché de hot paths; rate limiting en endpoints de auth y dinero.

──resultado · verificado

resultado · verificado

Exhibit 1
100% reconciliable

saldos recomputables desde el ledger en cualquier punto del tiempo

Exhibit 2
~100 VUs

carga sostenida en infra mínima, con techo medido (no adivinado)

Exhibit 3
argon2

identificado como el verdadero cuello de botella de CPU vía forense de carga, no por suposición

La línea de código más valiosa de este proyecto es la que hace imposible que el admin regale saldo.