Changelog

Product updates, new features, and improvements.

2026

Lint and Static Analysis Findings (Beta)

Nov 3

Upload SARIF results from ruff, ESLint, clippy, Semgrep and more, then see what's new on a branch and what has sat on main.

Gaffer now parses SARIF 2.1.0, so any tool that emits it works with a plain gaffer upload results.sarif. A linter annotation disappears with its PR. Gaffer keeps every upload.

The new findings view has three tabs: New on this branch, Chronic for findings that keep showing up, and Hotspots, which ranks files by findings alongside line coverage and failing tests. Locations link to the exact line on GitHub when the project has a linked repo.

Mutation Testing Reports (Beta)

Nov 3

Upload Stryker-format reports and see mutation score per file next to line coverage.

Line coverage says a line ran. A surviving mutant says no test would notice if that line were wrong. Gaffer now accepts Stryker-format JSON from StrykerJS, Stryker.NET, Stryker4s and PIT through gaffer upload or the upload API.

The mutation view shows score per file beside line coverage, a weekly score trend, and the surviving mutants with the tests that cover them. The Coverage gap toggle puts high-coverage, low-score files first.

Stack Traces on Failed Tests

Nov 3

The API and MCP server now return stack traces for failed tests in newly uploaded reports.

The test run details endpoint and the MCP get_test_run_details tool promised an errorStack field but always returned null, because the stack was never stored. It’s now kept for reports uploaded from here on, including JUnit <failure> bodies. Failure clustering and categorization also read more of each error, up to 2,000 characters instead of 500.

Reports uploaded earlier stay without stacks, and runs synced through gaffer test don’t carry them yet.

HTML Reports Now Served from gaffer.report

Nov 2

Uploaded HTML reports run on their own domain, separate from your dashboard session, and share links open them correctly.

Playwright, Vitest and coverage HTML reports contain third-party script. They now load from a separate domain, gaffer.report, so that script can’t run alongside a logged-in dashboard session. Access rules haven’t changed, and existing links redirect.

Also fixed: share links for Vitest HTML uploads downloaded a gzip file instead of opening the report. They now open the report.

Empty Runs No Longer Tank Your Health Score

Nov 1

Runs that deliver no tests are now counted separately instead of scoring 0.

A run with no tests used to score 0 and read as critical, which could drag the project trend down. Those runs now stay out of the score. A project with no test data shows -- / No test data, and the health card links the count of empty runs from the last 7 days to the uploads audit page.

Fewer False Flaky Tests in Multi-Project Playwright Suites

Oct 31

A spec that passes on Chromium and fails on WebKit no longer reads as flaky.

Flaky detection grouped history by bare test title, so the same spec in two Playwright projects shared one history. A consistent pass on one browser and a consistent fail on another looked like alternating results. Tests are now tracked by full name, so each project keeps its own history. Flaky counts and newly-flaky alerts use the same identity.

CLI Fix for Large Report Bundles

Oct 28

gaffer upload no longer fails with a 413 on bundles between 75 and 200 MiB.

Bundles totalling 75 to 200 MiB, and single files of 75 to 90 MiB, were sent as one request above the server’s limit, so they always failed with a 413. This is a common size for Playwright reports with artifacts. CLI 0.8.0 routes them correctly and keeps them as one upload, so hosted reports can still find their traces.

The gaffer CLI

Aug 28

Install in one line, then wrap any test runner for flaky detection, health scores, and failure clustering, or query test history without running tests.

Install the gaffer CLI with curl -fsSL https://app.gaffer.sh/install.sh | sh (or brew install gaffer-sh/tap/gaffer), then wrap any test command: gaffer test prints flaky detection, health scores, and failure clustering before you open the dashboard, and syncs the run automatically once you’ve added a token.

gaffer affected-tests maps changed source files to the tests that cover them, so CI runs only what changed. gaffer query reads health scores, flaky tests, and failure history straight out of the local .gaffer/data.db that previous runs wrote, without re-running the suite, useful for scripting or feeding an AI agent. gaffer doctor checks config, token validity, and report discovery when something isn’t syncing. One binary, no runtime dependencies. It wraps whatever command you give it, so the runner doesn’t matter.

WebMCP tools on gaffer.sh

Aug 28

Every page registers four read-only WebMCP tools on document.modelContext so browser agents can search the docs, read pricing, and fetch the MCP install command without scraping.

Every gaffer.sh page now registers four read-only WebMCP tools on document.modelContext: gaffer.search_docs, gaffer.get_pricing, gaffer.install_mcp, and gaffer.signup_url. Pricing is computed from the same package that renders the pricing page, so the tool cannot drift from it, and each call is recorded in analytics.

WebMCP is a W3C Community Group draft that Chrome ships only through an origin trial (149 to 156), and no mainstream agent calls page tools yet. The MCP server is still the way to give an assistant your test history; these tools cover the site itself. Background and the spec walkthrough: why we shipped it anyway.

Playwright reports up to 5 GB

May 9

Multi-gigabyte test reports now upload end-to-end through the gaffer CLI and gaffer-uploader@v2 GitHub Action.

The gaffer CLI and the gaffer-uploader@v2 GitHub Action now handle individual files up to 5 GB. Multipart elevation kicks in automatically above 90 MB, with 8-way concurrent part PUTs and automatic retry on transient errors. Your plan’s storage cap is the only practical ceiling.

The direct POST /api/upload endpoint is unchanged. Bump to gaffer-uploader@v2 (or run curl -fsSL https://app.gaffer.sh/install.sh | sh) to upload large Playwright traces and full HTML reports.

Correction (2026-08-08): this entry originally gave the single-POST ceiling as 100 MB, set by the Cloudflare edge. That figure was wrong on the day it published. The app enforces its own 75 MB cap on POST /api/upload, returning 413 with reason file_too_large_for_v1 (shipped 2026-05-07, two days before this entry). See Upload API.

Coverage Delta Commit Status Gating

Feb 18

Fail GitHub commit statuses when coverage drops by more than a configured percentage from the default branch.

You can now configure coverage commit statuses to use delta mode — failing the check if coverage drops by more than a configured percentage compared to your default branch. Head to Project Settings > GitHub > Coverage Status Settings and select “Delta” to set a maximum allowed coverage drop.

AI-Powered Failure Categorization

Feb 17

Test failure clusters are now automatically categorized as product bugs, automation bugs, or environment issues using AI.

Failure clusters now include AI-powered categorization that classifies each cluster as a product bug, automation bug, or environment issue — with a confidence level. Expand any cluster to see the AI’s reasoning for its classification. This helps teams quickly triage failures and focus on what matters most.

Health Score Alerts

Feb 14

Get notified when your test suite's health degrades or new flaky tests appear.

Gaffer now monitors your health score and sends alerts when it crosses a label boundary (e.g., “Healthy” to “Needs Attention”) or when new flaky tests are detected. Alerts are evaluated every 4 hours with a 24-hour cooldown to avoid noise. Notifications go to your configured Slack channels and webhooks.

Agentic CI: Failure Clustering & Upload Status

Feb 9

New API endpoints and MCP tools for AI agents to diagnose CI failures and check upload progress.

Two new API endpoints help AI agents work smarter with your test results. Failure clustering groups failed tests by error similarity so agents can identify root causes (“15 failures → 2 bugs”). Upload session status lets agents check if CI results are ready before querying. Both are available as MCP tools (get_failure_clusters, get_upload_status). The full OpenAPI spec has also been rewritten with complete coverage of all v1 endpoints.

Delete Test Runs, Hide Suite Names & Billing Email

Feb 7

Delete individual test runs, hide suite names from your dashboard, and set a billing email for your organization.

You can now delete individual test runs directly from the test run detail page, with full R2 artifact cleanup. New display settings let you hide suite names from the dashboard UI and Slack notifications. Organizations can also set a separate billing email that syncs with Stripe for invoicing.

OpenTelemetry Metrics Export

Feb 3

Export test run and coverage metrics to Datadog, Grafana Cloud, or any OTLP-compatible backend.

Export test pass rates, failure counts, and coverage percentages to your observability stack via OpenTelemetry. Built-in presets for Datadog and Grafana Cloud, plus a generic OTLP option for any compatible endpoint. Configure destinations, branch filters, and event types in Settings > OpenTelemetry.

Webhooks Now Free for All Plans

Feb 2

Webhook notifications are now unlimited on all plans, with visible signing secrets on creation.

Webhooks are now free and unlimited on all plans — no more plan-based limits. When you create or regenerate a webhook, the signing secret is now displayed in a one-time reveal modal with a copy button, so you can easily configure your endpoint’s signature verification.

Webhook Notifications

Jan 26

Receive HTTP POST requests when test runs complete or coverage reports are uploaded.

Configure HTTP webhooks to receive POST requests when events occur in your projects. Supports branch filtering, configurable notification triggers for test runs and coverage, and HMAC-SHA256 payload signing for verification. Set them up in Settings → Webhooks.

Coverage Analytics in MCP

Jan 22

Query test coverage metrics directly from Claude Code.

Four new MCP tools for coverage analysis: get_coverage_summary for overall metrics and trends, get_coverage_for_file for path-specific coverage, get_untested_files for finding gaps, and find_uncovered_failure_areas for high-risk code with both low coverage and failing tests.

More Coverage Report Formats

Jan 22

Support for Clover, Cobertura, and JaCoCo coverage reports.

Gaffer now parses Clover XML, Cobertura XML, and JaCoCo XML coverage reports in addition to LCOV. Upload your coverage reports alongside test results and see line/branch/function metrics in the dashboard.

README Badges

Jan 21

Add shields.io badges for test health, coverage, and flaky tests.

Generate shields.io-compatible badges for your project’s test health score, coverage percentage, and flaky test count. Find the embed codes in Project Settings → Badges.

Dashboard UI Refresh

Jan 18

Cleaner layouts and improved metadata display across project pages.

Updated the project dashboard, test run details, and settings pages with cleaner layouts and better metadata organization.

Coverage Change Notifications

Jan 17

Get notified when coverage changes significantly.

Slack and GitHub notifications now include coverage changes. See coverage deltas in your CI status checks and Slack messages when test runs complete.

MCP Server Enhancements

Jan 17

New tools for comparing test metrics between commits and analyzing test run details with filtering.

Added new MCP server tools for deeper test analytics:

  • compare_test_metrics - Compare test performance between two commits or test runs
  • get_test_run_details - Get parsed test results with status filtering
  • Enhanced query capabilities for better AI-assisted debugging

GitHub Commit Status Checks

Jan 15

Gaffer now posts test results as commit status checks directly to your GitHub PRs.

Your test results now appear as commit status checks on GitHub pull requests. No more switching between tabs to see if tests passed - the status is right there in your PR.

Slack Channel Selection

Jan 10

Choose which Slack channel receives your test notifications when connecting your workspace.

When connecting Slack to Gaffer, you can now select which channel receives test notifications. Pick your team’s testing channel, a dedicated CI channel, or anywhere else that makes sense for your workflow.

Flaky Test Detection

Jan 5

Automatically identify tests that flip between passing and failing across runs.

Gaffer now tracks test stability over time and flags tests with high flip rates. See which tests are unreliable so you can fix them before they erode trust in your test suite.

2025

Test Analytics Dashboard

Dec 20

A new analytics view showing test trends, pass rates, and performance over time.

The new analytics dashboard gives you a bird’s-eye view of your test suite health. Track pass rates, identify slow tests, and spot trends before they become problems.

GitHub App Integration

Dec 13

Connect your GitHub repositories to automatically post test results as commit statuses.

Install the Gaffer GitHub App to connect your repositories. Test results automatically appear as commit status checks on your pull requests, giving reviewers instant visibility into test health.

MCP Server for AI Assistants

Dec 12

Query your test data directly from Claude and other AI assistants using the Model Context Protocol.

Gaffer now includes an MCP server that lets AI assistants like Claude access your test data. Ask questions like “what tests failed yesterday?” or “show me flaky tests” and get answers from your actual test history.

Public API

Dec 11

Access your test data programmatically with the Gaffer API.

The new public API lets you query test runs, analytics, and project data from your own tools and scripts. Build custom dashboards, automate workflows, or integrate Gaffer data into your existing systems.

Slack Integration

Dec 7

Get test result notifications directly in your Slack channels.

Connect Gaffer to your Slack workspace to receive test notifications where your team already works. Get instant alerts when tests fail so you can respond quickly.

AI-Powered Test Analysis

Dec 6

Get AI-generated insights explaining why your tests failed and suggestions for fixes.

Gaffer now uses AI to analyze test failures and provide actionable insights. Instead of digging through stack traces, get plain-language explanations of what went wrong and suggestions for how to fix it.

Team Invitations

Dec 5

Invite team members to your organization via email.

Organization admins can now invite teammates by email. Invitees receive a link to join your organization and immediately get access to all your test reports.