hello·ai
ExampleBest after Phase 44 min

An agent that books travel

#agents#security#risk

In one line

Sort the tools by what happens if the model is wrong, and every control in the system lands on the one row where money moves.

The situation

A travel is proposed: the user says "get me to Berlin on Tuesday, back Thursday, under the policy limit", and the assistant finds flights, checks the travel policy, holds a seat and pays. Four tools, one loop, and the demo is genuinely impressive.

The review question is not "will it pick good flights". It is: on the day the model picks the wrong one — and it will — what happens next, and who decided that?

search_flightsread · harmlessget_policyread · harmlesshold_seatreversible · idempotentcharge_cardirreversible · human clickthe model proposes,your code authorises,the tool runs.authority never crossesthe dashed line.Sort the tools by what happens if the model is wrong. The last row is where every control belongs.
Sort the tools by what happens if the model is wrong. The last row is where every control belongs.

Sort the tools by blast radius#

Lay the four tools out by what a wrong call costs.

search_flights and get_policy are reads. A wrong call returns wrong information, which the model may act on, but nothing in the world changes. These can be called freely, retried freely, and logged.

hold_seat changes state, but reversibly, and airlines expect holds to lapse. It should be — the model will call it twice occasionally, because that is how loops behave — so a second identical call must return the existing hold rather than making another.

charge_card is irreversible. Money moves, and unwinding it involves a refund, a customer, and a story. This is the row where the entire design concentrates.

That sorting is the design. The model has the same capability across all four rows; the machinery around each row is what differs.

Where the authority lives#

The model never executes anything. It emits a — a name and arguments — and your code decides whether to comply. That boundary is where every control goes.

For the read tools: rate limits and logging. For the hold: an idempotency key derived from user, flight and date, so duplicates collapse. For the charge: a in code that applies whatever the model said — amount under the policy limit, itinerary matches the approved hold, and above a threshold, a human confirms before anything is charged. Not a sentence in the prompt asking the model to be careful; a check the model cannot argue with.

The reason to be strict is . The policy document, the airline's fare rules, a previous tool result — any of them could contain text that reads as an instruction, and the model cannot reliably tell. If the charge tool trusts the model's arguments, a line in a fare-rules page can spend the company's money. If it checks them against the user's permissions and the approved hold, it cannot.

Questions to ask

  • For each tool, what happens if the model calls it with the wrong arguments?
  • Which calls are irreversible, and does a human confirm those?
  • Is every mutating tool idempotent, given that duplicate calls are normal?
  • Does the tool check the user's permissions, or trust the model's intent?

Mindset

Design an agent from its worst call outward. Sort the tools by blast radius, put the authority in code at the boundary, and reserve the human click for the one row where a mistake cannot be undone.

Where it connects

Got the shape of it?

Examples do not count toward phase progress — that stays on the topics. This is just so the list remembers what you have seen.

Next: The 3am bill