El presupuesto que bloquea de verdad.
Bridle se sienta delante de un pago: reserva el presupuesto antes de pagar, confirma al liquidar y libera si falla. Aguanta bajo concurrencia real y falla cerrado — un agente no puede sobregirar, ni cuando veinte peticiones llegan en el mismo milisegundo.
Mira cómo aguanta el presupuesto
Un agente, una ventana de $50, veinte pagos de $4 disparados a la vez. Cambia entre un guardrail ingenuo y Bridle, y dispara.
El fallo no es el límite. Es la concurrencia.
Un guardrail ingenuo comprueba gastado + monto ≤ límite y luego inserta. Dispara
veinte peticiones en paralelo y todas leen el mismo saldo restante, todas pasan, y el agente
sobregira — mientras los unit tests siguen en verde, porque un mock no tiene noción de
dos cosas pasando a la vez. No puedes hacer SELECT sum(…) FOR UPDATE sobre un
agregado, y los locks de fila no protegen a un agente nuevo con cero filas. Bridle bloquea la
decisión, no los datos — y trae la prueba.
Reserve → commit → release
El presupuesto se reserva antes del pago y se confirma al liquidar. Las decisiones ocurren antes de que se mueva el dinero, no se reconcilian después.
Garantía de concurrencia
Serializado por (agente, moneda) con un advisory lock de Postgres — incluso sin fila de ledger aún. Un test de ≥20 contra Postgres real falla el CI si no hay DB.
Motor de políticas declarativo
Allow/deny lists de destinatarios, límites por categoría y ventanas temporales — evaluados dentro del mismo lock, con precedencia determinista.
Decisiones auditables
Cada allow y deny va a un sink de auditoría enchufable con un reason code. Best-effort y aislado — un sink que falla nunca puede romper un pago válido.
Sin custodia, cross-rail
Bridle nunca guarda llaves ni mueve fondos — solo cuenta y decide. Se sienta encima de cualquier wallet, rail o facilitator x402 que traigas.
Falla cerrado, por diseño
Sin política, contexto faltante, regla desconocida → deny con un error tipado. Un guardrail que falla abierto no es un guardrail.
Envuelve un pago. Obtén la garantía.
Tú traes el pool de Postgres y la llamada de pago; Bridle decide. Fail-safe por defecto — sin política ni presupuesto por defecto, deniega.
import { BridleGuard } from '@igarzatech/bridle'; import { PostgresStorageAdapter } from '@igarzatech/bridle/postgres'; import { Pool } from 'pg'; // Tú eres dueño del pool. Bridle no crea conexiones ni guarda fondos. const storage = new PostgresStorageAdapter(new Pool()); await storage.migrate(); const guard = new BridleGuard({ storage, config: { defaultBudget } }); // Reserva antes de pagar. Bajo concurrencia, pasa exactamente el presupuesto. await guard.checkAndReserve({ agentAddress, currency: 'USDC', amount: '4.00', reservationId }); await pay(); // tu rail / facilitator x402 await guard.commit(reservationId); // o .release() si falla