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.
Shareable Public Links for Test Runs
Feb 6 Generate public URLs for test runs to share reports with anyone, no account required.
Share test run results with anyone using public share links. Generate a unique URL from any test run detail page, set an expiration (1 hour to never), and share with teammates, stakeholders, or anyone — no Gaffer account required. Recipients see the full test run summary, stats, and embedded HTML report.
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.