E2E Test Dashboard

Circuitry.ai — automated end-to-end test suite

View by tenant

Home filter only — does not change which tenant runs in the sidebar.

—
Total Tests
—
Pass Rate
—
Failures
—
Skipped
—
Avg Duration
Tenant test history
Show

Pass rate trend

Outcomes per run

▶ Frequent Defects tests that failed more than once
Loading…
Last 7 runs
No run history yet. Complete a test run to record history.
Latest run — tests
No test results yet. Select a page from the nav and run tests.
Scheduled Runs
Upcoming
Running
Completed (recent)
Failed
Quick Presets
Agent Validation Results
No validation results yet. Run agents_history_validate or agents_pcmi_validate suites.
No test running
IDLE
No browser active

Check the boxes on the left to select tests,
then click Run.

Results appear in the panel below as each test finishes (~25s per test).

Agent browser
No browser active

Start the agent to see the browser here.

Start the agent — it will log in automatically

Test Creator

Generate Playwright test code from recordings, descriptions, or AI analysis

Switch to Agent Mode to get a live browser,
then come back here to generate tests.

⏺ Guided Record
✎ Describe
✦ AI Auto

Use the Agent Mode page to record interactions, then return here to generate the test.

Internal Apps / Feedback

Feedback

Advisor conversations volume

Live API analysis (same source as the Streamlit panel): feedback messages per tenant, per day.

Agent runs volume

Live API analysis (same source as the Streamlit app): engaged agent runs per tenant, per day.

Tenant comparison

Tickets created, this range.

By assignee / status

Tickets created in the selected range — assignee / jira_status, live from Jira (refreshed on Apply).

Advisors — tickets by issue type

Tickets linked to this range's advisor feedback, grouped by advisor + triage issue type.

Advisor Issue type Tickets
No advisor tickets in range.

Agents — tickets per tenant

Tickets linked to this range's agent feedback, per agent per tenant.

Agent Tenant Tickets
No agent tickets in range.

Recently created tickets — Advisors

Tickets created (or matched as duplicates) in the selected range — same columns as the Streamlit proposed-tickets table.

# Action Parent Assignee Title Items Advisor Project Tenant Env Status Link
No advisor tickets in range.

Recently created tickets — Agents

Tickets created (or matched as duplicates) in the selected range — same columns as the Streamlit proposed-tickets table.

# Action Parent Assignee Title Items Agent Project Tenant Env Status Link
No agent tickets in range.
Internal Apps / Triage — distinct from the top-level QA "Triage" tab

Triage

Ticket Source Tenant Status (live) Assignee Issue Type Sprint
No data loaded yet.

General Settings

Per-Suite Test Timeouts (seconds)

The wall-clock limit before pytest-timeout kills a hung test's worker process (this is what causes the worker crash/restart behavior above). Each field below applies to every test in that suite — saving a value makes all of that suite's markers uniform. Stored in config/test_timeouts.yaml.
A test with its own hardcoded @pytest.mark.timeout(N) is never lowered below N by these fields — only raised.

Fallback for any suite without its own marker below. Default: 120s.

Covers advisor list, converse, and edit-shell tests (advisors_* markers).

Covers Power BI embed / vision tests (analysts_* markers) — these need more time for the PBI iframe to load.

Covers agent chat / validation tests (agents_* markers).

Visual-regression timeouts are normally computed from capture/settle/screenshot timing, not a flat number. Set a value here to force every visual-regression test to this timeout instead. 0 = use the computed defaults. Stored in config/visual_regression_config.py.

A different kind of timeout — how long a single click/wait_for_selector call waits, not how long the whole test runs. Default: 30 000 ms. Stored in config/tenants.yaml.

How many times a crashed worker is automatically restarted to complete its remaining tests. Set to 0 to disable restarts entirely.
Example: 5 = worker retries up to 5 times before remaining tests are marked not_executed.
Disabled when "Auto restart until complete" is on.

Maximum time to wait for the Power BI "Loading data…" spinner to clear before taking a vision screenshot. Default: 60 000 ms (1 min). Stored in config/test_timeouts.yaml.

Extra pause after the spinner disappears so charts finish rendering. Default: 3 000 ms. Set to 0 to skip the settle wait entirely.

Maximum time to wait for a History accordion field's loading spinner to clear before reading its text. Default: 15 000 ms. Stored in config/test_timeouts.yaml.

Extra pause after every History tab field finishes updating, before its section text is read for validation. Default: 5 000 ms (5 s).

How many claims' Claim Adjudicator/Claim Score Generator/dialogue-API lookups run concurrently in one "Parts + Labor Coverage (API)" run — pure HTTP, no browser, so cheap to parallelize, but bounded to avoid rate-limiting the tenant's real backend. Default: 5. Stored in config/test_timeouts.yaml.

How far apart a Claim Score Generator run's timestamp may be from the Claim Adjudicator run's timestamp for the same claim and still be treated as the same adjudication cycle. Default: 3600 s (1 hour).

Number of automatic retries for analyst vision and PBI tests when they fail or the PBI iframe is slow to load. Default: 2. Applies to all analyst test markers. Stored in config/test_timeouts.yaml.

Vision Screenshot — Scoring Thresholds

Minimum overall score a GPT-4o vision run must return to mark the test as passed. Default: 85. Stored in config/visual_regression_config.py.

Minimum content-relevance score. If the screenshot scores below this (e.g. login page, error state) the test fails immediately with score 0 — regardless of pass threshold. Default: 70.

Vision Screenshot — Analyst PBI Capture Timing

How long to wait for Power BI loading indicators to disappear before starting visual stability checks. Default: 45 000 ms.

How often a low-quality screenshot is taken during chart stability polling. Shorter = more responsive; longer = less CPU pressure on slow PBI pages. Default: 3 000 ms.

The page content hash must be unchanged for this long before the screenshot is accepted. Increase if charts are still animating. Default: 6 000 ms.

Hard cap on the stability-polling loop. If the page never stabilises within this time the screenshot is taken anyway. Default: 45 000 ms.

Vision Screenshot — Route Page Capture Timing

Fixed pause after the network goes idle so React finishes rendering before the stability poll begins (Dashboard, Advisors, Conversations…). Default: 5 000 ms.

Page content must be visually unchanged for this long on route pages. Default: 4 000 ms.

Hard cap on the stability-polling loop for route pages. Default: 20 000 ms.

Agent Categories

Categories available on the Category dropdown in the Agent test data panel (Agents page). Picking notification on a row there reveals its Expected senders / To email fields — every other category behaves like today's plain chat-agent row. Saved immediately — no need to click Save Settings below.

Agent LLM Model

Model used by Agent Mode's planner, step execution, and test code generation (Ticket Planner, Chat, Test Creator). Sol is the strongest reasoning, best for element identification accuracy; Terra balances cost/speed; Luna is cheapest/fastest for high-volume use. Saved immediately — no need to click Save Settings below.

JIRA Integration

Azure DevOps Integration

Used by the Ticket Planner's "Browse Azure Test Plans" modal to pull real Test Plan/Suite/Test Case steps. Create a PAT with Test Management (Read) and Work Items (Read) scope.

Tenants

Manage which tenants appear on Home → View by tenant and in the Home sidebar. Names are copied from config/tenants.yaml when the list is empty. Add or remove tenants here only.

Home tenant list

"Pull tenant IDs" resolves each tenant's tenant_id via the Knowledge API (knowledge_api_client.py) — this is what Internal Apps → Feedback/Triage uses to query Milvus per tenant. Sync now and the scheduled digest also pull IDs automatically at start. Requires CIRCUITRY_PASSWORD_TENANT_<ENV> to be set in .env for each tenant's environment.

Active run tenant

URL used for single-worker runs and when you click a tenant on Home.

sandbox.circuitry.ai
https://sandbox.circuitry.ai

How parallel runs work

Turn whole features on or off and set a safety cap. Saved to config/dashboard-features.json (editable on disk).

Counts all running pytest browsers. Example: 3 customers × 2 browsers each = 6 — must be ≤ this cap.

Test Presets

PCMI Config

Credentials for the PCMI portal used in 3-way agent validation tests.
One entry per tenant + environment combination.

Loading…
Test Connection

Runs the same login (and, if you give it a claim number, the same claim-search flow) the real tests use, against the credentials already saved above — so you can check a tenant's PCMI login without running a full test.

Add / Update Entry

Visual Regression

Capture JPEG baselines per environment and tenant. Compare runs use the active tenant pill or each tenant in a multi-customer run.

Loading…

Several customers

Check each customer that needs baselines. Same idea as Several customers… on the test page — one capture per selected page per customer.

One customer, faster: split the selected baseline pages across several browsers (same URL as the primary tenant above).

Start = missing selected pages only · Re-capture = all selected pages per customer. Counts are tenant-aware (only analysts/advisors on that customer via API).

Browser Settings

Controls how the Playwright browser behaves during test runs. Changes take effect on the next test run.

Headless Mode
ON — browser runs silently in the background (recommended for CI/automated runs).
OFF — a real browser window opens so you can watch each step. Best for debugging.
OFF
Slow Motion
Adds a pause between every browser action. Use Slow or Very Slow combined with Headless OFF to watch each step clearly.
Saved to settings.json. Overrides the defaults in config/tenants.yaml for each new test run.

Autoheal

When a locator fails after all retries, Autoheal captures the page HTML and asks AI to suggest a better locator. You review suggestions here and apply or reject them individually — or click Fix All to apply every pending suggestion at once.

Only register a candidate after at least this many failed attempts. Example: 3 = triggers on the 3rd failed attempt.

Suggestions

Loading…

Scheduled Runs

Create recurring test jobs that fire automatically. Each schedule uses a preset, tenant, and worker count you define.

Loading…

Notification Center

Notify people when a run starts and/or when it finishes — PDF report attached to the finish email, failed-test screenshots inline, plus a summary and chart. Recipients are organized into named groups so different audiences can be notified for different events, instead of one list getting every message. SMTP credentials (host/username/password) are configured via .env, not here, and never displayed in the browser.

Notifications
Master switch. When OFF, no automatic run-start or run-end email is ever sent, regardless of the settings below — manual "Email This Report" sends are unaffected.
OFF
Checking SMTP configuration…
Must be a verified sending identity/domain in AWS SES, or SES will reject the send. Not editable here — set notification_from_email directly in settings.json and reload this page.
—
People you can add to groups, or notify individually when sending a report manually.
Named collections of recipients — assign one to run-start alerts, one to run-end reports, or use any of them ad hoc when sending a report manually.
Notify on Run Start
When ON, the selected group gets a short email the moment a run begins — manual, preset, or scheduled.
OFF
Notify on Run End
When ON, the selected group automatically gets the full results email (PDF attached) as soon as a run finishes.
OFF
Notify on Ticket Planner completion
When ON, the JIRA ticket's assignee gets an email — same comment text and attachments as the JIRA comment — once a Ticket Planner run is posted to their ticket.
OFF
Notify on Internal Apps digest
When ON, the selected group gets a daily two-section email (Advisors / Agents) — ticket count, like/dislike/comment totals, links — after the Internal Apps digest schedule runs.
OFF
CC assigned team members on digest
When ON, the digest email is also CC'd to the current Jira assignees of the range's tickets (their emails are resolved from Jira; the email lists them under "Assigned to"). When OFF, the digest goes to the selected group only.
OFF
Verify SMTP + From address work before relying on this for real runs.
All 0
Dashboard 0
Advisors 0
Conversations 0
Agents 0
Settings 0
Navigation 0
API Health 0
📋

Select tests from the sidebar
and click Run to start

Ready — Elapsed: —
— tests
0 passed
0 failed
0 skipped
OFFLINE
—
Loading…