Skip to main content
In this article, you will learn how to run Superflow agents as an agent workflow — a gate that reviews your deployed site whenever a ticket enters QA, writes every finding back onto that ticket, and moves the card. This guide builds the loop on Jira, but the engine is tracker-agnostic; see Driving it from your own system.
Agent workflows are currently in Beta. Each pass runs its agents against your deployed page and consumes credits from your workspace balance.

Overview

Your AI builds a feature and marks the ticket ready for testing. Superflow’s QA agents review the deployed site against the ticket’s own acceptance checklist, write every finding back to the ticket, and move it to your fix column. Your coding agent fixes, resubmits, and the cycle repeats until the ticket lands in Done. There is no polling and no glue server: Jira Automation and Superflow’s workflow engine talk to each other directly over webhooks.

How it works

A single QA pass runs as one workflow execution. A status change in Jira dispatches the run; the verdict returns as a signed webhook that Jira Automation turns into a comment, labels, and a status move.

The ticket’s journey

Superflow decides which arrow fires; Jira Automation moves the card.

Ticket states and labels

Do not mirror. Statuses and labels always change together because each rule sets both. Never build mirror label-to-status rules alongside these — automation changes do not trigger other rules by default, so the mirrors half-sync.

What you need

A Superflow workspace

With your site added as a project. You need three values from it: the API key, the auth token, and the project’s organization id + document id.

A Jira project

Where you can create Automation rules, with board columns for QA, Fix, and Done.

A deployed site URL

Reachable by the agents over the public internet.

Your Superflow API base URL

The examples below use https://staging.velt.dev; your account team will confirm your host.
All calls are POST with the headers x-velt-api-key and x-velt-auth-token, and the body wrapped as {"data": ...}. Responses come back as {"result": ...}.

Setup

1

Create the UAT Checker agent

Superflow ships built-in agents — spell check, broken links, accessibility, Lighthouse, and more. Add one custom agent that verifies whatever acceptance checklist each ticket carries.
POST /v2/agents/create
The response returns the agent’s id, referenced in the next step.
Zero findings = pass is the loop’s termination test: a clean agent approves, any finding rejects.
2

Create the workflow definition

One workflow is the agents you picked, running in parallel, with two exits. Scope it to your project at document level so findings are pinned on the page.The two webhook URLs come from step 3 — create the definition with placeholders and update it after, or make the Jira rules first.
POST /v2/workflow/definitions/create
Add more agent nodes to the group for a stricter gate: broken links, accessibility, Lighthouse, or your own custom agents. The verdict is unanimous — every agent must pass for the ticket to go green.
3

Create three Automation rules in Jira

Rule 1 — QA-dispatch. Trigger: Work item transitioned, to QA. If you set a From filter, include your fix column and Done, so re-opened tickets can re-enter QA. Use no label conditions — the rule’s own label action keeps labels in sync.Actions: Edit labels (add qa, remove ai-fix, remove uat-passed), then Send web request with Wait for response enabled:
POST https://<YOUR_SUPERFLOW_HOST>/v2/workflow/executions/dispatch
Send the headers x-velt-api-key and x-velt-auth-token (hidden) with the request. The correlationId — the issue key — is what routes results back to the right ticket; it rides every webhook Superflow sends.
Leave out the idempotency key. There is deliberately no idempotencyKey: the server generates a unique one per dispatch. If you add your own, never build it with {{now.format("...")}} — Jira’s new flow editor renders it empty, the key goes constant, and the 24h dedup window silently swallows every run after the first.
Rule 2 — QA-findings. Trigger: Incoming webhook, with work-item criteria set to No work items from the webhook. Generate the secret it offers — that is the <FINDINGS_WEBHOOK_SECRET> used in step 2.Add a For: JQL branch, key = {{webhookData.correlationId}}, holding three actions: a Comment rendering every finding, Edit labels (add ai-fix, remove qa), and Transition to Fix.
Comment template
Enter each smart value as a single unbroken string in the rule editor, even where it is shown wrapped above.
Rule 3 — QA-passed. Same shape, second incoming webhook — its URL becomes <JIRA_INCOMING_WEBHOOK_URL_PASSED>. Comment ✅ Superflow QA — UAT passed, all agents clean, Edit labels (add uat-passed, remove qa), Transition to Done.Pick your Done status explicitly in the destination dropdown; the default Copy from trigger work item does not work for webhook-triggered rules.
Flow-editor tips that save real debugging time
  • Statuses added or renamed on the board do not appear in the editor’s dropdowns until you refresh it.
  • Hidden header values can blank when a rule is re-saved — re-enter the auth token after edits.
  • The editor’s Validate button only substitutes smart values when you give it a real work item key.
  • Successfully published web request means fire-and-forget: the response, including a 4xx, is ignored. Enable Wait for response so failures show in the audit log.
4

Connect the webhooks and write the first ticket

Paste the two incoming-webhook URLs and secrets into the definition — re-send the full definition via POST /v2/workflow/definitions/update with ifVersion set to the current version.Then write tickets with one convention: the description is the UAT checklist, a numbered list of concrete, checkable statements about the deployed page.Move the ticket to QA and watch. Findings arrive as a comment in about one to two minutes, pinned to the exact elements on your live page in the Superflow project.

Driving it from your own system

If your software factory prefers direct API calls, or you use a different tracker, the same engine is fully drivable over REST. Jira Automation is just one possible client.

Troubleshooting

Rule 1’s trigger or conditions — check the rule’s Audit log. A label condition like does not contain ai-fix blocks re-runs, because the fixed ticket still wears the label when it re-enters QA. Let the rule’s own label action clear it instead.
Wrong x-velt-auth-token, or key and token from different workspaces. Also check the hidden headers — they can blank when a rule is re-saved.
The dispatch’s idempotencyKey resolves to the same value every time, so the 24h dedup window swallows every run after the first. Known trap: Jira’s new flow editor renders {{now.format("...")}} as empty. Simplest fix — omit the field entirely.
On the incoming-webhook rule: work-item criteria must be No work items from the webhook, the For: JQL branch must hold the actions, and the webhook node must send the rule’s secret in X-Automation-Webhook-Token. The rule’s Audit log shows each delivery.
A pass for the same agent + project is still running. Wait for it, or cancel it, before re-entering QA.
The comment template is printing agentResultsSummary.summary. Iterate agentFindings instead — see the Rule 2 template above.
The definition is not document-scoped, or the org / document ids don’t match the Superflow project.
Superflow caches fetched page content per URL for about two minutes. If the fix deploys and QA re-runs inside that window, agents may evaluate the cached page. Leave two to three minutes between deploy and re-QA; real fix cycles rarely hit this.
The editor caches the project’s status list when it loads. After adding or renaming board columns, refresh the browser tab and reopen the rule.

Good to know

  • Each QA pass is one workflow execution, correlated by ticket key. The back-and-forth is driven by ticket state, not a long-running process.
  • The verdict is unanimous. One finding from any agent fails the pass. Tune the agent set to match how strict the gate should be.
  • Findings in the webhook payload carry title, description, severity, and source URL — top 50 per agent by severity. For surgical detail (exact page text, suggested fix, element selector) fetch the agent execution with includeResults: true.
  • Loop guard: cap retries with a “QA passes” counter field incremented by Rule 2, and a Rule 1 condition that stops dispatching past your limit — escalate to a human instead.

Coming next

  • Native Jira connector: richer formatted comments, screenshots attached to findings, per-ticket run history, replacing the Automation-rule templates.
  • Ticket references as a first-class field on runs — today the ticket key travels as correlationId.
  • Cross-run loop accounting per ticket: pass counter, max-passes guard, and serialization of overlapping passes, inside Superflow instead of Jira fields.
  • Per-ticket deployed URLs via a custom field — today the URL is set per rule; preview-deploy-per-ticket works by passing it in triggerContext.page.url.
  • The same loop for Linear, Azure DevOps, and Slack-based trackers — the engine side is tracker-agnostic already.

Next steps

Create a new agent

Run an agent from the Agents tab