driver.profile in the descriptor and the driver block in the local plan.
What your agent receives
Each drill is a series of steps. A step is a user message, a task, or an event. Your agent only receives the step itself. It never sees the persona’s goals or the evaluation criteria. Every step carries a session key that identifies the drill’s conversation. Use it to keep conversation state per session. Your agent’s answer becomes the reply in the drill. A non-empty string is used as it is. Any other JSON value is stored as JSON. An empty answer means no reply. If a step may have reached your agent but no full answer came back, Firedrill marks it as unknown and does not retry it.http.v1
Firedrill sends each step as an HTTP request to your service on your machine.Plan driver block
Your service must answer with a 2xx status. Redirects are not followed. The service needs
http readiness in the plan.
With the example above, your agent receives:
jsonl-process.v1
Firedrill starts your program for each drill and talks to it over stdin and stdout.Plan driver block
id and either output or error:
- Set
stdoutreadiness in the plan, for example{"kind": "stdout", "pattern": "READY"}, and print that line when your program is ready. - After the ready line, every stdout line must be a JSON object. Write logs to stderr.
- Firedrill sends one step at a time.
- The service must use
mode: launch.
function-wrapper.v1
Use this when your agent is a function. You write a short wrapper that imports it and speaks the same JSON lines protocol asjsonl-process.v1.
Plan driver block
firedrill_wrapper.py
firedrill-wrapper-ready before the first step. Set the descriptor’s adapter_sha256 to the SHA-256 of the wrapper file. If the file changes, run stops and asks you to approve again.
playwright.v1
Use this for an agent people use through a web page. Firedrill opens a fresh headless Chromium context for each session and runs your flow file.Plan driver block
firedrill.flow.mjs
The
step object has step_id, sequence, kind, session_key, text and input.
Install Playwright in your project first. Firedrill does not install it. Set adapter_sha256 to the SHA-256 of the flow file. To capture masked screenshots, add "screenshots": {"mask_selectors": ["#card-number"]} to the driver block.
signed-http-event.v1
Use this for an agent that reacts to webhooks. Each scenario sends one signed event to your service.Plan driver block
The signing secret is read from
WEBHOOK_SECRET in your environment. It never leaves your machine. Any 2xx response counts as delivered. The drill ends with delivery_acknowledged, because Firedrill sees that you received the event, not the work it started.
The scenario for this driver needs a target_input of kind event. See Scenarios.
Signed-in test users
Setauthentication to synthetic-session in the descriptor when your agent needs a signed-in user. Firedrill passes a test session to your agent: in a request header for HTTP, in a headers object for JSON lines, and through login(page, identity) for Playwright. Credentials are never put in environment variables. MFA, passkeys and single sign-on flows are not supported.
Connect synthetic tools
Route your agent’s API and MCP calls.
Run drills
Plan, apply and run.