Test evidence and lifecycle, in one system of record

Green you can prove.

Evalix binds every test result to the requirement it covers and the evidence it left behind, then gates your project on what actually ran. A pass with no evidence doesn't count. It halts the gate.

Apache-2.0 · Self-hosted · JUnit · Allure · Playwright
A release gate for project checkout. Five results passed, each with a trace or screenshot attached. Test case TC-208, saved address autofill, reads unevidenced-pass with an empty evidence slot, and the gate verdict is halted.

Your CI says green. Can you show why?

A green build is a claim. Tests get skipped, renamed or quietly loosened. A known bug gets fixed by accident and nobody notices. A runner reports "passed" for a test that never really executed. And when AI agents write both the code and the tests, the claim gets easier to make and harder to check.

Evalix treats every pass as something to prove, not something to believe.

Passes without proof.

A test that "passed" with no duration, no artifact and no step that ran.

Coverage on paper.

Requirements marked covered by tests that no longer exist or no longer run.

Silent fixes.

A known failure that starts passing, and nobody asked why.

How it works

From requirement to evidence, in four steps

  1. 01

    Define.

    Requirements, test requirements and test cases live as YAML files in your repo, next to the code. Every change to them is a reviewable diff.

  2. 02

    Run.

    Push results from any CI with the evalix CLI, or let Evalix run the suite itself: it clones your repo at a ref, runs the suite in isolated containers, and collects the evidence.

  3. 03

    Bind.

    Each result is matched to its test case. Results that match nothing are stored and flagged, never dropped.

  4. 04

    Gate.

    The reconciler compares what the lifecycle says against what actually ran, and answers pass, fail or halted, with a coverage report that says why.

$ evalix ingest --project checkout --format playwright --env staging --gate reports/playwright.json
run run-20261028-091512-4c2e: 312 results (0 unmatched), 41 artifacts
url: https://evalix.example/p/checkout/runs/run-20261028-091512-4c2e

# Coverage — run-20261028-091512-4c2e (staging)
**Verdict: halted**
**Halted:** unevidenced-pass: TC-208

| `unevidenced-pass` | fail | `TC-208` | "refund to original card" passed in run run-20261028-091512-4c2e
  with no duration, no completed artifact and no step that ran |
The gate

A gate that knows the difference between passed and proven

The reconciler looks for divergences between your lifecycle and your results. You choose which ones fail the build. Two of them stop everything.

halt

unevidenced-pass

A pass with nothing behind it.

No duration, no completed artifact, no step that ran. Raw output alone isn't evidence. The project halts.

halt

known-failure-now-passing

A known bug that fixed itself.

A case expected to fail just passed. Maybe it's fixed; maybe the test stopped testing. The project halts.

A halted project stays halted until a person clears it, with a reason, and that decision is recorded.

The other divergences
DivergenceWhat it catches
dead-referenceAn approved test case points at automation that no longer exists
unmatched-resultsResults that don't belong to any test case
failing-approvedA requirement's approved case failed
not-executedAn approved automated case didn't run
staleAn approved manual case has no recent result
claim-out-of-dateA retired case is still producing results
Oracle integrity

The tests can't quietly change under you

Evalix ships a freeze check for your CI. It reads the structure of your test files and lifecycle, not just the text, and blocks changes that weaken the oracle: a removed assertion, an added .skip or .only, an edited expected value on an approved case, a status flipped to approved. Overrides are possible, and every one is logged with a reason.

Built for teams where AI agents write code. An agent can't approve its own tests.

A diff of address.spec.ts: an expect line is removed and test.skip is added. A FROZEN[test-assertion] banner says the change is blocked in CI.
Evidence

Every pass leaves a trail

Trace chain: requirement REQ-114, test requirement TR-114.2, test case TC-208, run 1482, result passed, evidence trace.zip. Trace chain: requirement REQ-114, test requirement TR-114.2, test case TC-208, run 1482, result passed, evidence trace.zip.

Artifacts, kept.

Traces, screenshots, videos and logs are uploaded to your own S3-compatible storage, checksummed, and linked to the result they prove.

Traceability, measured.

Requirement → test requirement → test case → run → result → evidence. Coverage is a measurement, not a spreadsheet.

Every write, audited.

Halts, clears, imports and keys are recorded with who and why.

Inputs

Works with the tests you already have

Bring JUnit XML, Allure results or Playwright JSON from any CI. No rewrite, no lock-in to a runner.

  • JUnit
  • Allure
  • Playwright
  • REST API with OpenAPI
Coverage report for project checkout: verdict halted on unevidenced-pass, a divergence table with known-failure-now-passing, failing-approved, not-executed, unmatched-results and stale, and a legend explaining each kind.
Self-host

Yours to run

Evalix ships as one Docker Compose bundle: the API and web app, Postgres, the execution engine, and backups. Evidence goes to the S3-compatible storage you choose. The core is Apache-2.0. Your test data never has to leave your infrastructure.

  • One Compose bundle, built on your host
  • S3-compatible evidence storage you control
  • Suites run in isolated containers with short-lived, scoped keys
  • Apache-2.0 core
Inside your infrastructure: web, API and Postgres; an execution engine that writes evidence to your S3 bucket; suites running in isolated containers.

What's next (planned)

  • plannedRoles and single sign-on
  • plannedAI-assisted test authoring, with self-hosted models for sensitive data
  • plannedRobotic process automation on the same evidence model

Get early access

Evalix is in early access. Tell us about your team and we'll get in touch to help you set it up.