The Binderdex audience database needed to grow, and the fastest way is pointing a discovery agent at five platforms and letting it search. That is also a great way to wake up to a surprise bill. So before I let it loose, it got a spending guard, and honestly the guard turned out to be the interesting part.
The guard rails the run
Merged last night: budgeted profile discovery with a hard total ceiling, a small per-run cap, and exactly one paid run active at a time. If a run dies halfway through, the results it already paid for get recovered on the next start instead of paying twice. Every claim comes back with source evidence attached: a candidate account is a link to where it was found, plus any aliases, so a human can verify it before it ever enters the outreach flow. The directory stays read-only, and existing contacts and suppression lists are untouched.
The shape of the spending guard, simplified from what shipped:
// illustrative: the shape of the spending guard
const run = await budget.begin({
totalCeilingUsd: CAMPAIGN_CEILING, // whole campaign dies at the ceiling
perRunCapUsd: RUN_CAP, // no single run can blow past this
});
if (await budget.hasActiveRun(campaign)) return; // one paid run at a time
const results = await discover(run.budget);
await budget.reconcile(run, results); // receipts or it didn't happen
First calibration run across all five platforms: 567 candidate URLs back, and the ceiling never got close. The bad news I'll take anyway: relevance sampling on the biggest platform failed the scale gate, so the 5,000-URL target stays open. That's the other half of the bargain. An agent that only reports good news is a liability with a credit card.
If you're wiring up paid agent runs of your own, the five rules that made this safe: cap the total, cap each run, one paid job at a time, recover interrupted results instead of repeating them, and demand receipts. With those in place, handing an agent a card stops being scary.