Evidence: what gets captured and why
Nine artifact kinds, hashed, tied to one result and one commit — and identical whether a machine or a person produced the run.
The nine kinds
| Kind | Typical source | What it answers |
|---|---|---|
SCREENSHOT | Playwright on failure, or one per manual step | What was on screen at that moment |
VIDEO | Playwright video, device-farm recording | What the whole run looked like |
TRACE | Playwright trace.zip | Every action, network call and DOM snapshot, replayable in the trace viewer |
HAR | Playwright or a browser export | Full request and response timing |
CONSOLE_LOG | Runner stdout, or the extension | What the app logged, errors first |
NETWORK_LOG | Runner or the extension | Which requests failed and with what status |
RRWEB | The extension, the widget, a capture | A scrubbable DOM replay of the session |
JUNIT_JSON | The reporter's own machine-readable output | The raw run as the runner saw it |
FILE | Anything else you attach | Whatever the case needs |
How an artifact gets stored
The producer asks for an evidence slot for one result and step, naming the artifact and its size.
BugMojo checks the caps and returns a presigned upload URL. Over-cap artifacts are refused here, before a large upload is wasted.
The producer uploads the bytes directly to storage — they never pass through the API.
The producer finalizes the slot with the artifact's SHA-256, which is stored on the evidence row alongside its kind, size, step and provenance.
Because the hash is recorded at finalize time, the evidence row is a claim about specific bytes. A file swapped afterwards stops matching what the result said it attached — which is what makes a signed report's evidence section worth anything.
Provenance: who produced it
Every row records the producer, not just the artifact. That is how a report can say a case was executed by a person and prove it, and how an agent-driven browsing session is distinguishable from a human one. The run itself carries more: the commit SHA, the deployed URL, the environment and the runner kind — local, CI, hosted, extension or mobile.
Caps and what happens at the edges
There is a maximum size per artifact, a maximum total per result and a maximum number of artifacts per result. The extension applies the same constants locally, so it drops an over-cap artifact with a visible warning rather than making a tester wait for an upload the server will reject.
Nothing in this path is fatal. An unmatched test, an over-cap trace or unconfigured storage becomes a warning on the ingest response — never an exception that turns a green test run red.
Reading evidence back
Open a run in Regression and choose a result: the evidence viewer plays the video, opens the trace, renders the console and network logs and scrubs the replay. Artifact URLs handed to agents and reports are presigned and expire, so a link that leaks stops working rather than exposing the artifact forever.
record_run_results ingest a run; returns a result id per test and an
evidence slot per artifact
upload_evidence presigned PUT for one artifact, then finalize with sha256Common questions
Is evidence stored for manual runs too?
Yes, through the same code path. A screenshot a tester took by hand is the same kind of row as one Playwright took in CI — same hashing, caps and provenance.
How long is evidence kept?
Retention follows your plan: 30 days on Free, 90 on Pro, 365 on Team. Retention is what we meter, because storage is what actually costs money.
What stops an artifact being swapped later?
Each artifact is finalized with its SHA-256. The hash is stored on the evidence row, so a substituted file no longer matches what the result recorded.
Will a huge trace fail my test run?
No. An over-cap artifact is reported as a warning and skipped. Nothing in the evidence path is allowed to turn a passing run red.
Related articles
- Record Playwright runs with the reporterThree lines in playwright.config.ts and two environment variables turn every test run you already do into recorded, provable results.
- The evidence-gated merge checkA GitHub check that maps a pull request's changed files to the test cases behind them, and asks whether they passed with evidence on this commit.
- Run a manual test with the extensionTest Run mode records replay, console, network and a screenshot per step while you work — the same evidence a CI run produces.
- Client reports and sign-offTurn a published plan version and its runs into a shareable, hashed report a client signs — with their name on it, not an email thread.

