# The evidence app

The evidence app reads one recorded trace and shows it on six screens. It is read-only: it has no deploy, approval, reload, recovery or fleet controls, and it never contacts a runtime.

It runs locally. It is not a hosted service, and there is no account to sign in to.

## The six screens

| Screen | Question it answers | Where the answer comes from |
| --- | --- | --- |
| Overview | What is the latest state? | The last observation in the trace. |
| Releases | Which releases exist, and what is each one? | Every approved and reported identity in the trace. |
| Destination | Is what is loaded what was approved? | One observation: the approved identity, the reported identity and the runtime policy. |
| Observations | What evidence exists, and how far can it be trusted? | Each observation's provenance, reason code and source JSON. |
| Policy | What does the runtime have to be? | The trace's runtime policy and recorded toolchain. |
| Traces | Which trace is open, and what did opening it check? | The loaded file and the checks run on it. |

### Overview

The latest state as one sentence, then the destination, the approved release and a count of observations. In the captured run it reads: cpu-2 is approved. Nothing reports what is loaded.

![Vraelis Contour app overview: cpu-2 is approved and nothing reports what is loaded.](https://vraelis.com/v8/contour/app-overview.webp)

*Read-only evidence app, inside the controlled ONNX reference experiment.*

### Releases

A release's identity digests, its approval, and where it appears in each observation: approved and loaded, approved and not loaded, or approved with its loaded state unknown.

![Release cpu-2 in Vraelis Contour with its identity digests and approval.](https://vraelis.com/v8/contour/app-release-cpu2.webp)

*Read-only evidence app, inside the controlled ONNX reference experiment.*

### Destination

One observation in full: the approved release beside the reported loaded release, Same or Differs on every row, the runtime policy verdict, and the timeline of observations.

![Vraelis Contour comparing approved cpu-2 with reported loaded cpu-1; reload pending.](https://vraelis.com/v8/contour/app-destination-pending.webp)

*Read-only evidence app, inside the controlled ONNX reference experiment.*

### Observations

Each observation's provenance, reason code and source JSON, with how far its evidence goes. The reported side is a self-report from the managed ONNX session, not independent attestation.

![An observation's details in Vraelis Contour, with its reason code RUNTIME_UNAVAILABLE.](https://vraelis.com/v8/contour/app-observations-unavailable.webp)

*Read-only evidence app, inside the controlled ONNX reference experiment.*

### Policy

The policy's execution requirements, the destination and roles, and the recorded toolchain. Python and Node.js are marked as pinned by the test harness, not part of the signed policy.

![The runtime policy in Vraelis Contour: ONNX Runtime 1.23.2 and CPUExecutionProvider.](https://vraelis.com/v8/contour/app-policy.webp)

*Read-only evidence app, inside the controlled ONNX reference experiment.*

### Traces

Which trace is open, where it came from, and what opening it checked.

![The trace screen in Vraelis Contour, listing what opening a trace checks.](https://vraelis.com/v8/contour/app-traces.webp)

*Read-only evidence app, inside the controlled ONNX reference experiment.*

## What opening a trace checks

Opening a trace checks its structure and consistency. The app refuses the file if any check fails.

- The file is a supported Contour runtime trace, with a schema version, a capture time, a scope and at least one observation.
- There is a runtime policy with an ONNX Runtime version and execution providers.
- Every observation has an approved identity, with 64-character digests.
- Every matched or pending observation has a reported runtime, and it satisfies the policy.
- An observation is matched only when every identity field is equal, and pending only when one differs.
- An observation marked unavailable carries no loaded report, and any reason code is well formed.

## Imported, not verified

Signatures are not checked. A file can pass every check and still have been edited, so the checks show consistency, not authenticity.

Every value from an opened file is labelled Imported, not verified. The app's navigation says Imported trace, not verified, and Return to captured run restores the captured evidence. One of the app's tests documents that a self-consistent edited trace passes, which is why the label exists.

## The app's tests

The trace checks have their own tests. This is their output.

contour-app 7ecb6d0, tests:

```
$ node --test trace.test.mjs import-safety.test.mjs
✔ the captured run has no unvalidated fields and its checked trace is the file, unchanged
✔ top-level trust flags are listed as extras and left out of the checked trace
✔ trust flags on every nested object are listed by path and left out of the checked trace
✔ a "__proto__" field is an extra, not a prototype
✔ displayed text that claims verification, attestation, signing or trust is refused
✔ claims are caught through camelCase, snake_case and digits, but ordinary words are not
✔ look-alike letters, control and bidirectional characters in displayed text are refused
✔ where a trace came from is set by the app, never by the file
✔ valid calendar timestamps with an explicit zone are accepted
✔ impossible dates and times are refused
✔ timestamps without an explicit zone, and garbage, are refused
✔ a trace with an invalid timestamp is refused with TRACE_TIMESTAMP_INVALID
✔ the checked trace shares nothing with the file: later edits to the file cannot reach the screens
✔ the raw file, extras included, is kept as-is for the source view and export
✔ defined fields with malformed values are refused, not passed through
✔ a refused file leaves the open state exactly as it was
✔ a refusal partway through the events builds no new state
✔ an accepted file builds a new state without touching the old one
✔ unreadable files are refused with a reason code
✔ every refusal carries a reason code and a readable message
✔ captured worker observations are internally consistent
✔ a pending release cannot be imported as matched
✔ wrong reported runtime cannot be imported as matched
✔ missing evidence cannot be imported as matched
✔ a trace without a runtime policy is refused
✔ a policy without a runtime is refused
✔ a matched observation without a reported runtime is refused
✔ a pending observation without a reported runtime is refused
✔ a malformed runtime version is refused
✔ a self-consistent edited trace validates, so imports must be labelled unverified
✔ an unavailable observation without an approved identity is refused
✔ an unavailable observation carrying a loaded report is refused
✔ a malformed reason code is refused
✔ the captured reason code is accepted
ℹ tests 34
ℹ pass 34
ℹ fail 0
```

These 34 tests cover the evidence app at revision 7ecb6d0: 14 trace checks and 20 import-safety checks. An imported file can never put a trusted label on screen, a timestamp must be a real date with an explicit zone, and a refused import leaves the open trace exactly as it was. The suite is separate from the experiment's internal tests (133 of 133 at the runtime rejection-diagnostics revision); no counts are added together.

## Export

Export trace downloads the open trace as JSON, unchanged. An exported trace that is opened again is labelled Imported, not verified, like any other file.

---

Vraelis documentation, Products. https://docs.vraelis.com/evidence-app
