Documentation Menu

AI Summaries

Most visual diff tools give you a red-pixel overlay and leave you to figure out what changed. RegressionBot groups changed pixels into labeled regions (A, B, C…) on the 3-panel visual diff image (Before, After, and Diff with letter labels) and produces one plain-English sentence per region — so you can read a six-line summary instead of hunting through screenshots.

pulse.com/docs/storage
Diff View
Pulsev2.4.1
A

Storage Configuration

Learn how to configure Pulse to preserve visual snapshot records and perform comparisons across pipeline runs.

Configure Pulse to preserve visual snapshot records securely in Csecure cloud storage and comparing from Dstored baseline images on future pipeline runs.

pulse.config.ts
const config = {
storage: "cloud",
baseline: "s3://my-baselines",
}
E
Project Configuration Locking

Lock parameters during a run to prevent visual baseline regression drift across environments.

On this page
Overview
F
How to Configure
Reference
Examples

Visual diff view: BEFORE (left), AFTER (middle), and DIFF (right). Yellow boxes A–F each correspond to one sentence in the summary below.

How it Works

After capturing screenshots, RegressionBot runs three steps to produce a summary.

1

Cluster

Changed pixels are grouped into discrete regions. Adjacent or nearby pixels that belong to the same visual element are merged into one cluster rather than treated as separate changes.

2

Label

Each cluster gets a letter (A, B, C…). The letter appears as a yellow badge in the top-left corner of the bounding box on the DIFF panel of the 3-panel visual diff image, so you always know which sentence refers to which part of the page.

3

Summarize

The AI-powered engine analyzes the changes within each region and writes one precise sentence describing what changed. Exact text, link names, and identifiers are quoted directly from the pixels.

Example Summary

The regressionbotSummary field is a structured JSON array — one element per labeled region, each with a label (the region letter) and a text sentence. This is the actual output for the six-region job shown above.

regressionbotSummary (array)
  • AIn the top-left header, the logo icon changed from a green checkmark to a red square with a white symbol.
  • BIn the left sidebar under "Core Concepts", an "Admin Dashboard" link was added.
  • CIn the main body paragraph, text changed from "S3 vaults" to "secure cloud storage".
  • DIn the main body paragraph, text changed from "stored S3 images" to "stored baseline images".
  • EIn the main content area, a "Project Configuration Locking" section with new content and code was added.
  • FIn the "ON THIS PAGE" sidebar, the "How to Configure" link now has a green left border.

In most cases, reading the summary is enough to approve or escalate a job. The 3-panel visual diff image is available if you need visual confirmation.

Reflow Intelligence

Reflow is what happens when inserting or removing content shifts downstream elements — a new block added mid-page pushes everything below it downward. Pixel-diff tools can't distinguish this shift from a real change.

To handle complex layouts, RegressionBot employs layout-aware column-segmented reflow. It detects multi-column pages (such as sidebars next to main content) and aligns rows independently for each column segment. This ensures that content added or removed inside one column does not falsely offset or invalidate visual alignment in neighboring columns.

Other tools

Flag the entire lower half of the page as changed — often dozens of regions — because every displaced element is in a different pixel position than the baseline.

RegressionBot

Detects that content below the insertion point shifted uniformly and labels only the inserted content as region A. Elements that moved but did not change are not reported as regressions.

pulse.com/docs/parallel
Diff View
Pulsev2.4.1

Storage Configuration

Learn how to configure Pulse to preserve visual snapshot records and perform comparisons across pipeline runs.

Pulse supports automatic layout comparison checks. The parser scans sitemaps and evaluates page structures recursively.

A
New: Worker Parallelism

Pulse now runs screenshot capture in parallel across serverless cloud environments for faster CI pipelines.

This paragraph sits below the insertion point and shifts downward when new content is introduced above it. It is unchanged.

On this page
Overview
How to Configure
Reference
Examples

A paragraph was inserted mid-page. One region (A) is labeled. The content below it shifted down but is not flagged as a change.

Layout Shift & Translation Check

In addition to reflow detection, RegressionBot automatically identifies harmless visual translations (such as floating header scroll misalignments or slight rendering offsets).

  • How it works: For each changed region, the comparison engine checks if translating the baseline pixels by a tiny amount (up to 3 pixels) resolves the differences. If a shift is detected, it is classified directly (e.g. "Section shifted by 1px - Potential Sticky Banner").
  • Performance Optimization: If all visual differences on a page are spatial layout shifts, RegressionBot records them directly and bypasses the AI-powered summary generation. This reduces processing latency.
  • Mutations are preserved: If the content or styling inside a shifted region changes, the translation check fails, and the region is processed through the visual summary engine to ensure nothing is missed.

Automated AI Verdicts

Visual regressions aren't always bugs; they are often the exact intended outcome of a code change. By passing developer intent via runContext (such as the PR title and description) when starting a job, RegressionBot will automatically assess whether the detected changes match the expected intent.

How Verdicts Work

  • Regression-Level Verdicts: Each visual regression receives a verdict field, evaluating whether the specific change is ACCOUNTED_FOR or UNACCOUNTED_FOR based on the runContext.
  • Job-Level Intent Assessment: The entire job receives an intentAssessment object. If intentAssessment.allAccountedFor is true, all visual changes perfectly match the PR intent, and you can safely auto-approve the build in CI.
  • Hallucination Guardrails: The AI rigorously checks for unintended side-effects and layout breakages. If a single pixel cluster changes unexpectedly (e.g. a footer shifts when a header was updated), allAccountedFor becomes false and lists the unaccountedRegressions.

For automation scripts and CI workflows, check intentAssessment.allAccountedFor or use the get_verdict MCP tool to securely pass CI without human intervention.

Using Summaries

The regressionbotSummary field is available wherever job results are returned.

waitForCompletion() waits for both the job and the AI summary to finish before returning. Access regressionbotSummary on each regression result:

import { RegressionBot } from '@regressionbot/sdk';

const client = new RegressionBot(); // reads REGRESSIONBOT_API_KEY from env
const job = await client.runProject('my-project');

await job.waitForCompletion(5000, undefined, { waitForSummaries: true }); // waits for both job and AI summary
const summary = await job.getSummary();
for (const r of summary.regressions) {
  // Typecast during transition period to avoid compilation errors on legacy SDK type declarations
  const aiSummary = (r.regressionbotSummary as unknown) as Array<{ label: string; text: string }> | undefined;
  for (const item of aiSummary ?? []) {
    // item.label = "A" | "B" | "" (empty for wholesale changes)
    // item.text  = single-sentence description
    console.log(item.label ? `${item.label}: ${item.text}` : item.text);
  }
}

Short Screenshot URLs

To make reviewing visual summaries as frictionless as possible, RegressionBot returns shortened, clickable redirect links for all screenshot fields (such as baselineUrl, currentUrl, and diffUrl).

Instead of cluttering your terminal logs or CI pipeline stdout with 600-character pre-signed URLs, you receive clean, 50-character clickable links:

https://screenshots.regressionbot.com/r/aB3xY7mQ

Links are valid for 1 hour after generation — long enough to paste into a PR comment, Slack message, or CI log and open later. Clicking the link generates a fresh pre-signed image URL on the fly, so there is no separate expiry to track.