S16 · llm failure simulation
A refund assistant that paid twice, in the wrong unit
People, data and outputs in this scenario are simulated. Each stage is recorded when you commit; the reveal comes after.
- 4stages
- 35 minabout
- 0stages committed
The brief
A synthetic airline pilots an assistant that handles schedule-change refunds by calling two tools. This is a fixture: a fictional booking system, simulated model behaviour and no real payment provider.
lookup_booking(pnr) -> {"fare_minor": int, "currency": str, "paid": bool, "refunds": [..]}
issue_refund(pnr, amount, currency, reason)
amount: refund amount as a decimal number in the given currency
The harness retries a tool call when the model asks again; there is no idempotency key. lookup_booking returns the
fare in minor units (cents). The refunds list in lookup_booking is updated by a separate job and lags by up to a
minute.
Stage 1 of 4
Simulated trace for one request:
1 lookup_booking("QX7K2M") -> {"fare_minor": 18450, "currency": "EUR", "paid": true, "refunds": []}
2 issue_refund("QX7K2M", 18450, "EUR", "schedule change") -> TIMEOUT after 10 s (no body)
3 issue_refund("QX7K2M", 18450, "EUR", "schedule change") -> {"refund_id": "R-90311", "status": "queued", "amount": 18450.0}
4 lookup_booking("QX7K2M") -> {"fare_minor": 18450, "currency": "EUR", "paid": true, "refunds": []}
5 issue_refund("QX7K2M", 18450, "EUR", "schedule change") -> {"refund_id": "R-90312", "status": "queued", "amount": 18450.0}
final message: "I have refunded 184.50 EUR to the passenger."
The fixture ledger afterwards shows R-90311 and R-90312, each 18,450.00 EUR. Whether call 2 also executed before the timeout is unknown.
Which defects are in the system design rather than in the model's wording? Select all that apply.