← Writing

$10,000 is where the agent stops and a human decides

Every approval workflow needs a number. Below it the agent executes, above it a person signs off. The bug that taught me where to put that check only surfaced in integration testing.

$10,000. That’s the line between an AI agent executing a routing decision and a human being asked to approve it first.

Why it matters

Companies are handing AI agents the keys to real budgets. A routing decision here, an inventory reallocation there, a scheduling change overnight. Each one moves money.

Every approval workflow needs a number: a dollar amount where the system stops generating and starts asking. Below it, the agent executes. Above it, a human decides.

Without that number, an agent can commit a company to a $20,000 logistics reroute in the time it takes to generate a sentence. The supply chain director finds out when the invoice arrives.

The fix is a clear threshold where the system pauses and waits for a human to say yes or no.

How it works

I built this into a LangGraph supply-chain ERP copilot deployed on Azure Kubernetes Service.

When any of 7 deterministic solvers returns a result whose total cost exceeds $10,000, the system blocks execution. The solver output is stored in Redis under a unique decision ID with a 24-hour expiry. A REST endpoint lets a manager approve or reject. An idempotency guard rejects any second approval after the first resolves.

A simpler design would log every decision and flag anomalies after execution. But in supply chain logistics, by the time someone reviews the log, the shipment is already on a truck.

The threshold is configurable. The architecture works at any amount because the gate sits inside the solver dispatch node, not at the routing layer.

That placement was a lesson. In an early version the cost check ran at the routing layer, after the solver had already returned. The approval flag was never set before the routing logic evaluated it, so high-cost decisions were cleared silently. It only surfaced in integration testing.

Since then, every conditional branch in an agentic graph gets its trigger evaluated at the setter, never at the consumer. The full loop was verified end to end on two separate dates.