# Test Reports That Outlive the CI Artifact — Report Sharing for QA

Canonical: https://commareports.com/for/qa-engineers
Published: 2026-09-11

> The Playwright trace that proved the regression expired in 30 days, and the artifact zip nobody on the team can open anyway. Publish the run to a URL that goes in the PR and stays there.

# Test reports that survive the week

A QA engineer's report has a short, brutal life. The run finishes, the HTML
lands in `playwright-report/`, CI zips it as an artifact, and from that moment
it is effectively unreadable: the zip has no origin, so CSS 404s and the page
renders blank; the artifact viewer refuses to serve HTML inline; and in thirty
days the whole thing is deleted along with the evidence for the bug you filed.

The report was the most useful thing the pipeline produced, and the pipeline
threw it away.

## Publish from the job that made it

Add one step after the test step. The report gets a URL, the URL goes in the
PR comment, and the developer clicks it instead of downloading 80 MB.

- [GitHub Actions](/ci/github-actions-html-report) ·
  [GitLab CI](/ci/gitlab-ci-html-report) ·
  [CircleCI](/ci/circleci-html-report) ·
  [Jenkins](/ci/jenkins-html-report) ·
  [Buildkite](/ci/buildkite-html-report) ·
  [Azure DevOps](/ci/azure-devops-html-report) ·
  [Bitbucket](/ci/bitbucket-pipelines-html-report) ·
  [TeamCity](/ci/teamcity-html-report) — and the rest at [/ci](/ci).

Publish the **whole output directory**, not the entry file. Playwright,
Allure, Cypress and Jest reporters all emit sibling assets, and the single
most common "the report is blank" ticket is an `index.html` sent without
them. See [share an HTML folder](/share-html-folder) and
[Playwright report blank](/fix/playwright-report-blank).

Per-runner detail:
[Playwright](/share-playwright-report) · [Cypress](/share-cypress-report) ·
[Allure](/share-allure-report) · [Jest](/share-jest-report) ·
[Vitest](/share-vitest-report) · [JUnit](/share-junit-report) ·
[pytest](/share-pytest-report) · [TestNG](/share-testng-report) ·
[Robot Framework](/share-robot-framework-report) ·
[Cucumber](/share-cucumber-report) · [Mochawesome](/share-mochawesome-report) ·
[WebdriverIO](/share-webdriverio-report) · [Nightwatch](/share-nightwatch-report) ·
[Appium](/share-appium-report) · [Xcode](/share-xcode-test-report) ·
[Android](/share-android-test-report).

## Update one report per branch, not one per run

A new URL on every push is noise. The pattern that works: create the report
once per PR, then `PATCH` a revision on each subsequent run.

```bash
curl -fsS -X PATCH "https://commareports.com/api/v1/reports/$COMMA_REPORT_ID" \
  -H "Authorization: Bearer $COMMA_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d @report.json
```

The link in the PR description points at the current run, and the revision
history shows how the failure count moved across pushes — which is exactly the
question a reviewer asks and exactly what a stream of artifact links can't
answer.

## Flake triage in the report, not in Slack

Flaky-test arguments are unwinnable in chat because nobody is looking at the
same row. Anchored comments put the conversation on the test: highlight the
failing case, leave "webkit only, and only after the login spec," and it stays
there for whoever picks it up on Monday. See
[commenting on HTML](/comment-on-html).

If an agent is doing the triage, it can read those threads and reply in them —
see [letting an agent respond to comments](/agents/let-an-agent-respond-to-comments).

## Worth knowing

- **Retention is yours.** A published report outlives the artifact that
  produced it. See [CI artifact expired](/fix/ci-artifact-expired).
- **File count, not size, is the usual wall.** 500 files and 250 MB per report;
  per-test JSON trees blow the count first. Most runners have a merged or
  single-file export mode.
- **Private by default.** A test report can leak internal URLs, fixture data
  and staging credentials in a stack trace. Publish private, widen when you've
  looked — see [sharing & access control](/docs/sharing).
- **Readers are free.** Developers, PMs and support staff who only read are
  never charged and never counted as seats.

## Try it

Comma is free — unlimited reports, unlimited commenters, unlimited revision
history.

**[Start free →](/login)**

### Related

- [For SRE and incident teams](/for/sre-teams) ·
  [For engineering managers](/for/engineering-managers)
- [Publish reports from CI](/ci) ·
  [GitHub Actions artifact HTML not viewable](/fix/github-actions-artifact-html-not-viewable)
- [Share a coverage report](/share-coverage-report) ·
  [Share an accessibility report](/share-accessibility-report)
