Evidence and observations
Every observation keeps the approved identity, the identity the runtime reports, and whether the runtime satisfied its policy. Observations that cannot confirm anything are kept too.
Statuses
| In the trace | Shown as | What it means |
|---|---|---|
matched | Matched | Every identity field is equal, and the reported runtime satisfies the policy. |
pending | Reload pending | The reported identity differs from the approved one. In baseline mode the runtime waits for an explicit reload. |
unknown | Evidence unavailable | There is no loaded report. The observation carries a reason code and no loaded identity. |
The app shows each state in words. Matched is drawn at full contrast; Reload pending and Evidence unavailable are drawn a step quieter.
Reason codes
An observation with the status unknown says why. The captured run has one reason code, RUNTIME_UNAVAILABLE: the worker was stopped, so nothing reported what was loaded.
A reason code is upper-case letters, digits and underscores, starts with a letter, and is at most 64 characters long. The evidence app refuses a trace with a malformed code.
The four recorded observations
The captured run was recorded on October 10, 2026 at 07:41:29 UTC. It holds four observations.
| Number | Observation | Received (UTC) | Status | What happened |
|---|---|---|---|---|
| 01 | Approved release loaded | 07:41:29.606 | Matched | Approved and loaded cpu-1 in the controlled CPU session. |
| 02 | Update awaiting reload | 07:41:29.613 | Reload pending | Approved cpu-2. The baseline keeps serving cpu-1 until an explicit reload. |
| 03 | Reload completed | 07:41:29.619 | Matched | Explicitly reloaded cpu-2. Its reported identity matches the approved release. |
| 04 | Runtime report unavailable | 07:41:29.723 | Evidence unavailable | Stopped the local worker. cpu-2 stays approved, and loaded evidence is unavailable. |

The trace shape
A trace is one JSON document. Its top level names the format, when it was captured, its scope, the recorded toolchain, the runtime policy and the observations.
{
"schemaVersion": 1,
"kind": "contour-local-runtime-trace",
"capturedAt": "2026-10-10T07:41:29.723Z",
"scope": "Controlled synthetic ONNX CPU experiment. Worker self-reports; not hardware attestation or a customer deployment.",
"toolchain": {
"node": "v24.19.0",
"ortVersion": "1.23.2",
"executionProviders": ["CPUExecutionProvider"],
"pythonVersion": "3.12.14"
},
"policy": { "policyId": "cpu-lab", "version": "1", ... },
"events": [
{ "id": 1, "title": "Approved release loaded", "observation": { "status": "matched", ... } },
{ "id": 2, "title": "Update awaiting reload", "observation": { "status": "pending", ... } },
{ "id": 3, "title": "Reload completed", "observation": { "status": "matched", ... } },
{ "id": 4, "title": "Runtime report unavailable", "observation": { "status": "unknown", ... } }
]
}Each event holds an observation with its scope and status, the approved identity under desired, and the reported identity and runtime under loaded. This is observation 2, unchanged.
{
"id": 2,
"title": "Update awaiting reload",
"action": "Approved cpu-2. The baseline continues serving its loaded cpu-1 until explicit reload.",
"receivedAt": "2026-10-10T07:41:29.613Z",
"observation": {
"scope": "managed-onnx-session-self-report",
"status": "pending",
"desired": {
"generation": 2,
"releaseSha256": "375de916f3f9128dd8284a9dae474c1fe5edcf253c8a7ab69a1c5f720f31ea12",
"releaseId": "cpu-2",
"modelSha256": "444602040ca9aaa4b1a990799fbe6b697763d1a08144ee1f9711eb12adc49d2d",
"configurationSha256": "6289dfd4c088e75fa4725c3269d9ba6316e0d9e11d863c17af0b2955315bd382",
"receiptSha256": "d621d4c70a127586002f1261b79ff6cf1e48f258cf819b184f0ff8a68a819e33"
},
"loaded": {
"runtime": {
"ortVersion": "1.23.2",
"executionProviders": ["CPUExecutionProvider"],
"pythonVersion": "3.12.14"
},
"sessionId": "4ef27956b34246b5be6c64a6109d9212",
"metadata": {
"generation": 1,
"releaseSha256": "611e3ac6eb818530873c76bac0cd3f328ce87ce99cbcad6407ad47abb96dc0e1",
"releaseId": "cpu-1",
"modelSha256": "c1b943a655da728daea6b43332ff557af3da6466b4f9e0c938b42595222dc5ac",
"configurationSha256": "6289dfd4c088e75fa4725c3269d9ba6316e0d9e11d863c17af0b2955315bd382",
"receiptSha256": "15357f4908031bbeeb5aae187cb2c28d3d0ea17c5c2bea120176b1a750754ab7"
}
}
}
}When the runtime stops reporting, loaded is null and the observation says why. This is observation 4, unchanged.
{
"id": 4,
"title": "Runtime report unavailable",
"action": "Stopped the local worker. The desired release remains available; loaded evidence does not.",
"receivedAt": "2026-10-10T07:41:29.723Z",
"observation": {
"scope": "managed-onnx-session-self-report",
"status": "unknown",
"code": "RUNTIME_UNAVAILABLE",
"desired": {
"generation": 2,
"releaseSha256": "375de916f3f9128dd8284a9dae474c1fe5edcf253c8a7ab69a1c5f720f31ea12",
"releaseId": "cpu-2",
"modelSha256": "444602040ca9aaa4b1a990799fbe6b697763d1a08144ee1f9711eb12adc49d2d",
"configurationSha256": "6289dfd4c088e75fa4725c3269d9ba6316e0d9e11d863c17af0b2955315bd382",
"receiptSha256": "d621d4c70a127586002f1261b79ff6cf1e48f258cf819b184f0ff8a68a819e33"
},
"loaded": null,
"loadedEvidence": "unavailable"
}
}Self-report scope
Every observation in the trace has the scope managed-onnx-session-self-report. The loaded identity is what the managed ONNX session reports about itself.
- The host and the worker are trusted in the experiment. A compromised host is out of scope.
- A self-report is not independent attestation, and there is no hardware attestation.
- A missing or inconsistent observation stays unresolved. It is never counted as a match.
What is preserved
Vraelis Contour keeps discrepancies, unavailable evidence and recovery records in order. In the captured run that means the pending update, the explicit reload that resolved it, and the moment the runtime stopped reporting.
Heartbeat freshness. The trace records when each observation was received, but nothing yet checks that a runtime is still reporting between observations. Live fault runs are not built either.
Last updated: October 10, 2026