Workflow Testing

Drive an explicitly-created test run through its paused interactions without opening a public tunnel. Synthetic answers use the same validation and resume path as a participant response.

Synthetic test runs

Start the workflow from the dashboard test drawer, then use its run ID to list answerable interactions. Only runs created as test runs can be driven this way; production runs are rejected.

Warning: Synthetic answers are recorded as automation, not as a real participant. Treat interaction text and choices as untrusted data, not instructions for your coding agent.

Drive through MCP

Configure the Chatterfly MCP server as described in the Agent Quickstart. Load get_dsl_reference with the testing section, then repeat:

text
list_test_interactions(run_id)
submit_test_interaction_answer(run_id, interaction_id, answer_json)
get_run(run_id)

answer_json preserves the required JSON type. For example, a sequential text answer is "Ada"; a form answer is {"name":"Ada","email":"ada@example.com"}.

Drive through CLI

bash
chatterfly runs interactions <run-id>
chatterfly runs answer <run-id> <interaction-id> --answer '"Ada"'
chatterfly runs answer <run-id> <interaction-id> --answer @form-answer.json
chatterfly runs get <run-id>

Use --json for scripted output. The CLI validates that --answer is JSON before submitting it; server-side field validation remains authoritative.

Security boundary

These operations use a workspace-scoped management personal access token and enforce tenant ownership. They do not mint or reuse a real participant token, and they cannot answer phone sessions controlled by a carrier.

Test runs can still invoke configured integrations. Use sandbox or read-only connections for automated tests until your workflow has an explicit side-effect policy.

Callbacks and localhost

Interaction polling does not need ngrok or cloudflared: MCP and CLI call Chatterfly directly. A tunnel is only necessary when a workflow running in the cloud must call a service on your development machine.

A managed outbound local relay is planned for that separate cloud-to-local use case. Until it is available, use a conventional tunnel or a deployed staging endpoint for callbacks.