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.
Drive through MCP
Configure the Chatterfly MCP server as described in the Agent Quickstart. Load get_dsl_reference with the testing section, then repeat:
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
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.
