Hero Background

Power Your Software Testing with AI Agents and Cloud

The Native AI-Agentic Cloud Platform to Supercharge Quality Engineering. Test Intelligently and Ship Faster.

TestMu AI UpdatesAutomationCI/CD

evidence-cli: An Open Format for Test Run Evidence

evidence-cli defines an open .evidence pack plus Apache-2.0 tooling to validate and seal it. A look at the profiles, exit codes, and what the package ships.

Published on:

Every test framework writes its own output. Playwright has its report, Jest has its JSON, and your API checks log something else again. A CI dashboard, an auditor, or a teammate has to know which framework produced a result before they can read it.

The question "what did this run produce, and did it pass" should not depend on what wrote it. That is the gap evidence-cli closes: an open, framework-agnostic container for what a test run produced, published under Apache-2.0 at github.com/LambdaTest/evidence-cli. Rather than summarize the README, I installed the published package and read what actually ships. The verified numbers below come from that teardown.

One Shape, Whatever Made It

A browser agent, a Playwright suite, a Jest run, an API check. Each can emit the same pack, and a reader can open any of them without knowing the producer. The container is open so anything can write one, and any tool can read one.

This matters most where a green tick is a claim rather than proof. A passing report that cannot be inspected asks you to trust it. A pack holds the artifacts behind the verdict, so the tick has something underneath it.

Anatomy of a Pack

A .evidence pack is a directory, or a sealed zip, built around three required files:

  • run.yaml - the manifest anchor. It describes the run itself: who produced it, when, and against what.
  • The definition - the test as it was written, opaque by design. The format references it and hashes it, and never parses it. It can be a test.md from Kane CLI, a login.spec.ts from Playwright, or anything else.
  • result.yaml - the verdict and the step-level outcomes.

Around those sit the artifacts: screenshots, network captures, logs, whatever the producer chose to include. Keeping the definition opaque is what lets one container hold a YAML flow and a TypeScript spec without the format needing to understand either. The replayable test format that Kane CLI writes is covered separately in Test.md.

Profiles, Not Rewrites

The format scales through a profile ladder rather than through breaking changes. L0 is the minimal, framework-neutral core. L1 is purely additive: it keeps all of L0 and adds requirements for the captured evidence artifacts on top, never rewriting what L0 means.

The contract version is a separate axis. It defines the meaning of the fields, and only a breaking change to an existing meaning bumps it. Adding a profile is additive, so the ladder grows without a migration.

The two CLIs default differently, which is the detail most likely to surprise you. Reading the constants out of the installed package settles it:

$ grep -E "DEFAULT_PROFILE|CONTRACT_VERSION" dist/contract.js
exports.CONTRACT_VERSION = "0.1";
exports.DEFAULT_PROFILE = "L0";

So the standalone evidence CLI validates against L0 unless told otherwise, while kane-cli evidence validate declares L1 as the default on its own --profile flag. Same format, stricter bar inside the product that produces the packs.

Note

Note: Kane CLI is the reference producer for this format and seals a pack on every run, so the verdict always has artifacts behind it. Try TestMu AI free!

Inside the Published Package

Method for the table below: install the package from npm into a clean project, read the shipped files, and run the documented entry points. Every value is what the artifact reports, not what the docs claim.

PropertyVerified valueWhere it came from
LicenseApache-2.0, LambdaTest Inc.The license field on the published package metadata.
Contract version0.1CONTRACT_VERSION in dist/contract.js.
Default profileL0 standalone, L1 inside Kane CLIDEFAULT_PROFILE in dist/contract.js, and the --profile default on kane-cli evidence validate.
Exit codes0 valid, 1 invalid, 2 usage errorThe process.exit calls in dist/cli.js.
Node requirementNode 18 or newerThe engines field on the package.
SchemasSeparate L0 and L1 directories under version 0.1The shipped schemas folder, one directory per profile.

The named exports resolve cleanly from an ES module project, which is worth confirming rather than assuming for a package whose build output is CommonJS:

import { validate, finalize } from "@testmuai/evidence-cli";
console.log("validate:", typeof validate, "finalize:", typeof finalize);

// validate: function finalize: function

validate is async and takes a target plus options, so a pack check is a single awaited call against a directory or a sealed zip. Validation exits 0 for a valid pack, 1 for an invalid one, and 2 for a usage error, which means a pipeline fails on it without extra scripting.

Next-generation test execution with TestMu AI

Capture Is the Producer's Job

The tooling captures nothing. It drives no browser and executes no tests. It validates a pack, derives what can be derived, and seals it. A screenshot is in your pack because the producer put it there.

That split is deliberate, and it is what makes the container open. Kane CLI is the reference producer: every run seals a pack into .testmuai/evidence/ holding results, per-step screenshots with annotated copies, a HAR network log, console output, and the failure record. A pack is a file you keep and diff in git, not a third-party artifact on a retention timer. If you are weighing CLI options for that job, AI browser testing CLIs compares the field.

If your framework already produces results, it can produce a pack:

# As a library (Node 18+)
npm install @testmuai/evidence-cli

# Or the CLI, globally
npm install -g @testmuai/evidence-cli

Open Governance and Getting Started

The repo is its own spec. Every change starts as a decision record covering the proposition, the options, the decision, and the reasoning, and the project states the rule plainly: no code lands without a decision, and no change lands without updating the structure. The JSON Schemas are the single source of truth, consumed by both the validator and the viewer.

Start by installing the package and validating a pack you already have, then point your own framework at the worked example and emit the same shape. The spec, the contract, the changelog, and the design log all live in the repo, and the Kane CLI documentation covers the producer side if you want packs without writing an emitter first.

Author

...

Bhawana

Blogs: 77

  • Twitter
  • Linkedin

Bhawana is a Community Evangelist at TestMu AI with over 3 years of experience creating technically accurate, strategy-driven content in software testing. She has authored 50+ blogs on test automation, cross-browser testing, mobile testing, and real device testing. She also serves as Product Marketing Manager for Kane CLI, the command-line tool that runs browser automation from the terminal using natural-language flows in a real Chrome browser. Bhawana is certified in KaneAI, Selenium, Appium, Playwright, and Cypress, reflecting her hands-on knowledge of modern automation practices. On LinkedIn, she is followed by 6000+ QA engineers, testers, AI automation testers, and tech leaders.

Add to Google preferred sources

Summarise with AI

Copied to Clipboard!
...

3000+ Browsers. One Platform.

See exactly how your site performs everywhere.

Try it free
...

Write Tests in Plain English with KaneAI

Create, debug, and evolve tests using natural language.

Try for free

evidence-cli FAQs

Did you find this page helpful?

More Related Blogs

TestMu AI forEnterprise

Get access to solutions built on Enterprise
grade security, privacy, & compliance

  • Advanced access controls
  • Advanced data retention rules
  • Advanced Local Testing
  • Premium Support options
  • Early access to beta features
  • Private Slack Channel
  • Unlimited Manual Accessibility DevTools Tests