Skip to main content
A scenario describes one situation your agent should handle. It names the personas who take part, the evaluations that score the result, events that happen along the way and when the conversation stops.

Example

scenario.json
Save the persona and evaluation first. Their version ID, revision and digest come from the library save output or from firedrill library show <version-id>.

How a scenario runs

  • Turns. One completed answer from your agent is one turn.
  • Instruction. The simulated user follows it, together with the persona.
  • Personas. Each repetition uses the next persona in the list, in order.
  • Stop rules. The simulated user decides when they are met and ends the conversation as finished or as giving up.
  • Turn limit. When max_turns is reached, the drill ends with turn_limit.
  • Conditions. Notes for people. They are not sent to the simulated user or checked.
Your agent never sees the instruction, the persona’s goals or the evaluations.

Fields

A reference points at one exact version: {"origin": "native_library", "kind", "id", "revision", "digest"}.

Events

Events change the drill at a turn boundary.
While a dependency is unavailable, your agent’s calls to it return HTTP 503 with dependency_unavailable. Use this to see how your agent handles an outage.

Timed events (v3)

firedrill.native-scenario.v3 events can run after a delay instead of a turn. Set exactly one of after_turn or after_active_ms, plus occurrences and repeat_every_ms to repeat an event.
Timing uses real active time. It is never sped up. v3 also adds evolution. It decides what the simulated world does if your machine stops running the drill, for example when the runner disconnects:
  • {"mode": "pause_with_agent", "continuation_seconds": 0} pauses timed events with your agent.
  • {"mode": "world_only", "continuation_seconds": 600} keeps the simulated world running in Firedrill for up to that many seconds. The plan review asks you to approve this.

Task and event inputs

Not every agent is a chat. With firedrill.native-scenario.v2 or v3, target_input replaces the conversation with one input:
Task
Webhook event
Use null for a normal conversation. An event input needs the signed-http-event.v1 driver and cannot be combined with user_message events.

Evaluations

Score the result.

Worlds

Run scenarios with synthetic tools.