Guardrail de gasto para agentes de IA

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.

$ npm install @igarzatech/bridle
Publicado con provenance de npm Apache-2.0 Sin custodia Node ≥ 20 · TypeScript
En vivo · el bug, y el fix

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.

● cargando @igarzatech/bridle… presupuesto $50.00  ·  tx $4.00  ·  concurrencia 20
Reservado en esta ventana $0.00 / $50.00
$0límite $50$80
Inactivo — elige un modo y dispara los pagos.
Por qué es difícil

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.

01

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.

02

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.

03

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.

04

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.

05

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.

06

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.

Quickstart

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.

agent-spend.ts
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
Profundiza

Docs, código y la historia