Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 96 additions & 0 deletions .github/workflows/evidencebound-core-conformance.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
name: evidencebound-core conformance

on:
push:
paths:
- "integrations/evidencebound-core/**"
- ".github/workflows/evidencebound-core-conformance.yml"
pull_request:
paths:
- "integrations/evidencebound-core/**"
- ".github/workflows/evidencebound-core-conformance.yml"
schedule:
- cron: "0 6 * * 1"
workflow_dispatch:

permissions:
contents: read

jobs:
conformance:
strategy:
fail-fast: false
matrix:
python: ["3.11", "3.12", "3.13"]
os: [ubuntu-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
with:
persist-credentials: false

- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065
with:
python-version: ${{ matrix.python }}

- name: Install exact released dependencies
run: |
python -m pip install --upgrade pip==26.2.1
python -m pip install --no-cache-dir \
"evidencebound-core[crypto]==0.4.0" \
"agentrust-trace==0.11.0" \
"agentrust-trace-tests==0.6.2" \
"pytest==9.1.1"

- name: Verify released EvidenceBound install
run: |
python - <<'PY'
import importlib.metadata as metadata

assert metadata.version("evidencebound-core") == "0.4.0"
dist = metadata.distribution("evidencebound-core")
assert not any(
str(path).endswith("direct_url.json")
for path in (dist.files or ())
)
PY

- name: Install only the thin integration locally
run: python -m pip install --no-deps -e "integrations/evidencebound-core"

- name: Integration tests
run: python -m pytest integrations/evidencebound-core/tests -q

- name: Emit synthetic TRACE record
run: |
python integrations/evidencebound-core/examples/emit_record.py \
--out evidencebound.trace.json

- name: Determine TRACE conformance level
run: |
trace-tests report \
--record evidencebound.trace.json \
--max-level 2 \
--json evidencebound-trace-report.json
python - <<'PY'
import json
from pathlib import Path

report = json.loads(Path("evidencebound-trace-report.json").read_text())
assert report["tooling"]["suite"] == "0.6.2"
assert report["tooling"]["library"] == "0.11.0"
assert report["highest_level_passed"] == 0
assert report["levels"][0]["passed"] is True
assert report["levels"][1]["passed"] is False
assert report["levels"][2]["passed"] is False
PY

- name: Enforce declared TRACE Level 0
run: trace-tests verify --record evidencebound.trace.json --level 0

- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
with:
name: evidencebound-conformance-${{ matrix.os }}-py${{ matrix.python }}
path: |
evidencebound.trace.json
evidencebound-trace-report.json
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ TRACE only works as a standard if it is genuinely neutral. Integrations are list
| [DecisionAssure](integrations/decisionassure/) | DecisionAssure (a1k7) | trace | community |
| [Docker Sandbox Kit](integrations/docker-sandbox-kit/) | agentrust-io | trace | community |
| [EPI Recorder](integrations/epilabs-epi-recorder/) | EPI Labs | trace, wcm | verified |
| [EvidenceBound Core](integrations/evidencebound-core/) | EvidenceBound | trace | community |
| [Google ADK](integrations/google-adk/) | agentrust-io | trace | verified |
| [LangChain](integrations/langchain/) | agentrust-io | trace | verified |
| [SOVP](integrations/litzki-systems-sovp/) | Litzki Systems | trace | verified |
Expand Down
192 changes: 192 additions & 0 deletions integrations/evidencebound-core/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,192 @@
# EvidenceBound Core integration with TRACE

This integration re-verifies explicit current EvidenceBound state and signed-receipt binding, then emits a signed TRACE v0.2 record only when the released EvidenceBound verifier returns current `ALLOW` with an ACTIVE verification key.

The acceptance boundary is:

`historical integrity != current applicability`

A previously signed EvidenceBound receipt can remain historically authentic while changed, stale, missing, refuted, or policy-drifted current state is no longer applicable. The adapter therefore re-runs EvidenceBound verification at an explicit verification time before emitting TRACE.

## Released versions reproduced

The acceptance run uses only released EvidenceBound artifacts:

- Python: `3.13.1`
- `evidencebound-core==0.4.0`
- `agentrust-trace==0.11.0`
- `agentrust-trace-tests==0.6.2`

The integration source itself is this directory. EvidenceBound is not installed from GitHub, an editable EvidenceBound checkout, a local wheel, or unreleased source.

## Clean-room reproduction

From the repository root on a machine with Python 3.13.1:

### POSIX shell

```bash
python3 -m venv .venv-evidencebound
. .venv-evidencebound/bin/activate
python -m pip install --upgrade pip==26.2.1
python -m pip install --no-cache-dir \
"evidencebound-core[crypto]==0.4.0" \
"agentrust-trace==0.11.0" \
"agentrust-trace-tests==0.6.2" \
"pytest==9.1.1"

python - <<'PY'
import importlib.metadata as metadata
import sys

expected = {
"evidencebound-core": "0.4.0",
"agentrust-trace": "0.11.0",
"agentrust-trace-tests": "0.6.2",
}
print("PYTHON=" + sys.version.replace("\n", " "))
for package, version in expected.items():
actual = metadata.version(package)
print(f"{package}={actual}")
assert actual == version

dist = metadata.distribution("evidencebound-core")
assert not any(str(path).endswith("direct_url.json") for path in (dist.files or ()))
print("EVIDENCEBOUND_DIRECT_URL=absent")
PY

python -m pip install --no-deps -e "integrations/evidencebound-core"
python -m pytest integrations/evidencebound-core/tests -q
python integrations/evidencebound-core/examples/emit_record.py \
--out evidencebound.trace.json

trace-tests report \
--record evidencebound.trace.json \
--max-level 2 \
--json evidencebound-trace-report.json

trace-tests verify \
--record evidencebound.trace.json \
--level 0
```

### PowerShell

```powershell
python -m venv .venv-evidencebound
$python = ".\.venv-evidencebound\Scripts\python.exe"
& $python -m pip install --upgrade pip==26.2.1
& $python -m pip install --no-cache-dir `
"evidencebound-core[crypto]==0.4.0" `
"agentrust-trace==0.11.0" `
"agentrust-trace-tests==0.6.2" `
"pytest==9.1.1"

@'
import importlib.metadata as metadata
import sys

expected = {
"evidencebound-core": "0.4.0",
"agentrust-trace": "0.11.0",
"agentrust-trace-tests": "0.6.2",
}
print("PYTHON=" + sys.version.replace("\n", " "))
for package, version in expected.items():
actual = metadata.version(package)
print(f"{package}={actual}")
assert actual == version

dist = metadata.distribution("evidencebound-core")
assert not any(str(path).endswith("direct_url.json") for path in (dist.files or ()))
print("EVIDENCEBOUND_DIRECT_URL=absent")
'@ | & $python -

& $python -m pip install --no-deps -e "integrations/evidencebound-core"
& $python -m pytest integrations/evidencebound-core/tests -q
& $python integrations/evidencebound-core/examples/emit_record.py `
--out evidencebound.trace.json

& ".\.venv-evidencebound\Scripts\trace-tests.exe" report `
--record evidencebound.trace.json `
--max-level 2 `
--json evidencebound-trace-report.json

& ".\.venv-evidencebound\Scripts\trace-tests.exe" verify `
--record evidencebound.trace.json `
--level 0
```

Expected deterministic integration result:

```text
15 passed
POSITIVE=TRACE_EMITTED
NEGATIVE_STALE=REFUSED
```

The conformance report determines the level rather than assuming one in advance. With the released versions above, the reproduced result is:

```text
Level 0 PASS
Level 1 FAIL
Level 2 FAIL
highest_level_passed = 0
```

Level 1 fails because this integration deliberately declares a software-only runtime and a non-affirming appraisal; the current suite also requires the verifier challenge nonce at Level 1+. Level 2 additionally requires transcript and transparency-anchor evidence that this adapter does not produce.

## What is verified

The deterministic tests cover:

- positive current-state emission;
- changed evidence rejection;
- stale evidence rejection;
- missing evidence rejection;
- explicitly refuted evidence rejection;
- expected-policy drift rejection;
- tampered EvidenceBound signed-receipt rejection;
- unknown EvidenceBound verification-key rejection;
- revoked EvidenceBound verification-key rejection;
- EvidenceBound v0.4.0 retired-key semantics: `VERIFIED_RETIRED_KEY` remains historically verifiable but is refused for fresh TRACE emission;
- EvidenceBound `valid_until` boundary and timezone-equivalent verification instants;
- exact recomputed-result / signed-receipt binding;
- exact signed EvidenceBound envelope digest binding in the TRACE reference;
- TRACE signature verification against the explicit TRACE signing key;
- the current official `agentrust-trace-tests==0.6.2` suite.

At the EvidenceBound v0.4.0 time boundary, evidence is still current when `verification_time == valid_until`; it becomes stale after that instant. Equivalent timezone-aware instants produce the same applicability result. Naive verification times are refused by the adapter.

The emitted TRACE record is a **record-producer, software-only Level 0** record. It sets:

- `runtime.platform: software-only`;
- `policy.enforcement_mode: declared`;
- `appraisal.status: none`;
- `origin.kind: third-party-control-plane`.

The TRACE signature binds the emitted record. The EvidenceBound reference digest binds the exact signed EvidenceBound receipt envelope used for the current verification.

## What this does not claim

This integration does **not** claim:

- TEE or hardware attestation;
- truth of upstream evidence;
- non-bypassability or mandatory mediation of the caller's wider system;
- certification;
- independent appraisal;
- that a historical EvidenceBound signature makes stale or changed evidence currently applicable;
- that caller-supplied model, subject, runtime-measurement, build-digest, or data-class metadata was independently observed by EvidenceBound;
- production safety or guarantees outside the released packages and deterministic fixture exercised here.

A TRACE Level 0 PASS is a conformance result for the emitted record and supplied evidence, not a certification of EvidenceBound or of an entire deployment.

## Files

- `evidencebound_trace.py` — thin current-state verification and TRACE emission adapter.
- `tests/test_evidencebound_trace.py` — deterministic positive, negative-control, binding, key-state, time-boundary, and signature tests.
- `examples/emit_record.py` — synthetic positive fixture plus stale-evidence negative control.
- `integration.yaml` — AgenTrust integration manifest.

The fixture authorities, evidence, policy, subject, model metadata, keys, and outcomes are synthetic.
Loading
Loading