Open format · Apache-2.0 · framework-agnosticv0.1.7 · contract 0.1
.evidence

One shape for what a test run produced

A browser agent, a Playwright suite, a Jest run, an API check — whatever made it, the .evidence pack is one readable, sealable format. Understandable by a CI dashboard, an auditor, or a human, without knowing the framework that wrote it. It is also the evidence layer behind the TestMu AI agent assurance platform.

npm install -g @testmuai/evidence-cli

kane-cli already emits it · point any of these at the same shape
PlaywrightCypressSeleniumJestVitestAPI suitesBrowser & mobile agents

The problem → the pack

Every framework reports differently. Read one shape instead.

A pack is a <name>.evidence/ directory (it zips to a <name>.evidence file), anchored by a top-level run.yaml. At L0 — the minimal profile — only three artifacts are load-bearing.

evidence-cli knows nothing about any framework's definition format. It references and hashes the definition; it never parses it. The format scales by adding optional files and profiles — never by rewriting the core.

run identitylifecyclederived totalshashed definitions
<name>.evidence/
  run.yaml        # required — manifest anchor
  tests/<id>/
    <definition>  # required — opaque, never parsed
    result.yaml   # required — per-step outcomes

The definition is whatever the framework already writes — a Markdown spec, a *.spec.ts, an API suite.

Try it yourself

Download a sample pack, drop it in the viewer

Grab the real .evidence pack that kane-cli produced from a browser run — a 27-step, nested-iframe e-commerce checkout — and drop it straight into the viewer at evidence.lambdatest.com to see it rendered.

Download the sample pack (2.8 MB)then drag it into the viewer ↓
evidence.lambdatest.comOpen in a new tab ↗

The sample is a real pack — 27 steps, 27 screenshots, a 110-request HAR.

Reference producer

kane-cli already speaks this format

The pack above wasn't made for a demo — kane-cli emits it on every run. It's the worked example: run.yaml, result.yaml, the opaque definition, and the L1 artifacts, with a walkthrough of who writes what.

Point your own framework — Playwright, Jest, an API suite, anything — at the example and emit the same shape. There's no viewer to build: any pack that conforms loads in evidence.lambdatest.com, exactly like this one.

Profiles — a ladder on one 0.1 contract

Start minimal. Add layers, never rewrites.

A profile only adds requirements — it never changes the version. Only a breaking change to an existing meaning bumps evidence (0.1 → 0.2).

L0the neutral core

Framework-agnostic minimum

The smallest thing that's still complete — three load-bearing artifacts.

  • run.yaml run identity, lifecycle, derived totals
  • definition the framework's own opaque artifact, hashed
  • result.yaml structured per-step outcomes
L1purely additive

L0 + captured artifacts

Everything in L0, plus the evidence the run actually captured.

  • execution logs per-test, with metadata
  • step screenshots plus a global coverage directory
  • video optional

A library and a CLI, same core

validate checks a pack against a profile; finalize rolls up totals, hashes definitions, and seals the directory into a flat, range-addressable .evidence zip — atomically.

Copied to Clipboard!

exit codes  0 valid ·  1 invalid ·  2 usage error

Resources

The spec, the package, the community

evidence-cli is governed by a living decision log — every change starts as a decision record, and the JSON Schemas are the single source of truth for both the validator and the viewer.

Apache-2.0 © LambdaTest Inc.🚀 LambdaTest is now TestMu AI