agentrust-trace-tests 0.3.0__tar.gz → 0.4.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/.github/workflows/ci.yml +1 -1
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/.github/workflows/codeql.yml +3 -3
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/.github/workflows/contributor-check.yml +4 -1
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/.github/workflows/docs.yml +1 -1
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/.github/workflows/release.yml +2 -2
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/.github/workflows/scorecard.yml +2 -2
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/.gitignore +4 -0
- agentrust_trace_tests-0.4.1/CHANGELOG.md +38 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/PKG-INFO +3 -3
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/README.md +1 -1
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/docs/error-codes.md +2 -2
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/docs/levels.md +7 -7
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/docs/modules/tr-env.md +1 -1
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/docs/quickstart.md +2 -2
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/docs/tutorials/writing-conformance-tests.md +2 -2
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/pyproject.toml +2 -2
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/requirements-docs.txt +1 -1
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/schemas/trace-claim.json +3 -3
- agentrust_trace_tests-0.4.1/src/trace_tests/__init__.py +20 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/src/trace_tests/modules/tr_env.py +1 -1
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/tests/conftest.py +2 -2
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/tests/test_level0.py +1 -1
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/tests/test_level1.py +3 -3
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/tests/unit/test_cli.py +26 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/tests/unit/test_loader.py +2 -2
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/tests/unit/test_tr_env.py +1 -1
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/tests/unit/test_tr_sig.py +3 -3
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/tests/vectors/invalid_missing_runtime.json +1 -1
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/tests/vectors/valid_cmcp_runtime.json +1 -1
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/tests/vectors/valid_level0.json +1 -1
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/tests/vectors/valid_level0_with_transcript.json +1 -1
- agentrust_trace_tests-0.3.0/CHANGELOG.md +0 -20
- agentrust_trace_tests-0.3.0/src/trace_tests/__init__.py +0 -3
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/.github/CODEOWNERS +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/.github/dependabot.yml +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/.github/workflows/require-maintainer-approval.yml +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/CNAME +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/CODE_OF_CONDUCT.md +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/CONTRIBUTING.md +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/LICENSE +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/PRIVACY.md +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/SECURITY.md +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/docs/modules/tr-anc.md +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/docs/modules/tr-pol.md +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/docs/modules/tr-rte.md +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/docs/modules/tr-sca.md +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/docs/modules/tr-sig.md +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/docs/modules/tr-txn.md +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/docs/modules.md +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/docs/stylesheets/extra.css +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/docs/tutorials/ci-integration.md +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/mkdocs.yml +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/src/trace_tests/cli.py +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/src/trace_tests/loader.py +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/src/trace_tests/modules/__init__.py +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/src/trace_tests/modules/tr_anc.py +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/src/trace_tests/modules/tr_pol.py +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/src/trace_tests/modules/tr_rte.py +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/src/trace_tests/modules/tr_sca.py +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/src/trace_tests/modules/tr_sig.py +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/src/trace_tests/modules/tr_txn.py +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/src/trace_tests/result.py +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/src/trace_tests/runner.py +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/tests/__init__.py +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/tests/test_level0_negative.py +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/tests/test_level2.py +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/tests/test_schema.py +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/tests/test_software_only_platform.py +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/tests/unit/__init__.py +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/tests/unit/test_runner.py +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/tests/unit/test_tr_anc.py +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/tests/unit/test_tr_pol.py +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/tests/unit/test_tr_rte.py +0 -0
- {agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/tests/vectors/invalid_wrong_profile.json +0 -0
|
@@ -17,7 +17,7 @@ jobs:
|
|
|
17
17
|
python-version: ["3.11", "3.12", "3.13"]
|
|
18
18
|
steps:
|
|
19
19
|
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
20
|
-
- uses: actions/setup-python@
|
|
20
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v5.3.0
|
|
21
21
|
with:
|
|
22
22
|
python-version: ${{ matrix.python-version }}
|
|
23
23
|
- name: Install package and test deps
|
|
@@ -28,16 +28,16 @@ jobs:
|
|
|
28
28
|
uses: actions/checkout@v7
|
|
29
29
|
|
|
30
30
|
- name: Initialize CodeQL
|
|
31
|
-
uses: github/codeql-action/init@v4
|
|
31
|
+
uses: github/codeql-action/init@v4.37.4
|
|
32
32
|
with:
|
|
33
33
|
languages: python
|
|
34
34
|
queries: +security-extended
|
|
35
35
|
|
|
36
36
|
- name: Autobuild
|
|
37
|
-
uses: github/codeql-action/autobuild@v4
|
|
37
|
+
uses: github/codeql-action/autobuild@v4.37.4
|
|
38
38
|
|
|
39
39
|
- name: Perform CodeQL Analysis
|
|
40
|
-
uses: github/codeql-action/analyze@v4
|
|
40
|
+
uses: github/codeql-action/analyze@v4.37.4
|
|
41
41
|
continue-on-error: true
|
|
42
42
|
with:
|
|
43
43
|
category: /language:python
|
{agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/.github/workflows/contributor-check.yml
RENAMED
|
@@ -30,7 +30,10 @@ jobs:
|
|
|
30
30
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
31
31
|
with:
|
|
32
32
|
repository: agentrust-io/.github
|
|
33
|
-
|
|
33
|
+
# Pinned deliberately: this workflow runs on pull_request_target
|
|
34
|
+
# with a write-capable token, so the code it checks out must not
|
|
35
|
+
# track a mutable ref. Bump this SHA after reviewing the diff.
|
|
36
|
+
ref: 0fe4520ee71a743fcd33f409fe366ee3e1da6f86 # main as of 2026-08-01
|
|
34
37
|
persist-credentials: false
|
|
35
38
|
sparse-checkout: |
|
|
36
39
|
scripts
|
|
@@ -14,7 +14,7 @@ jobs:
|
|
|
14
14
|
steps:
|
|
15
15
|
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
16
16
|
|
|
17
|
-
- uses: actions/setup-python@
|
|
17
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
|
18
18
|
with:
|
|
19
19
|
python-version: "3.12"
|
|
20
20
|
|
|
@@ -41,4 +41,4 @@ jobs:
|
|
|
41
41
|
name: dist
|
|
42
42
|
path: dist/
|
|
43
43
|
|
|
44
|
-
- uses: pypa/gh-action-pypi-publish@
|
|
44
|
+
- uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
|
|
@@ -26,7 +26,7 @@ jobs:
|
|
|
26
26
|
fetch-depth: 0
|
|
27
27
|
|
|
28
28
|
- name: Run Scorecard
|
|
29
|
-
uses: ossf/scorecard-action@
|
|
29
|
+
uses: ossf/scorecard-action@2d1146689b8cda280b9bc96326124645441f03bc # v2.4.4
|
|
30
30
|
with:
|
|
31
31
|
results_file: scorecard-results.sarif
|
|
32
32
|
results_format: sarif
|
|
@@ -35,6 +35,6 @@ jobs:
|
|
|
35
35
|
publish_results: false
|
|
36
36
|
|
|
37
37
|
- name: Upload SARIF
|
|
38
|
-
uses: github/codeql-action/upload-sarif@v4
|
|
38
|
+
uses: github/codeql-action/upload-sarif@v4.37.4
|
|
39
39
|
with:
|
|
40
40
|
sarif_file: scorecard-results.sarif
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## Unreleased
|
|
4
|
+
|
|
5
|
+
## v0.4.1 — 2026-08-03
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
|
|
9
|
+
- **`--version` reported the wrong version.** `__version__` was a second hardcoded literal alongside `pyproject.toml` and never moved, so it sat at `0.2.0` through both the 0.3.0 and 0.4.0 releases: `trace-tests --version` printed `0.2.0` from a 0.4.0 install while `importlib.metadata` correctly returned `0.4.0`. It is now read from installed distribution metadata, so there is one source of truth and the value cannot fall behind a release again.
|
|
10
|
+
|
|
11
|
+
This mattered more than a wrong string usually would. The v0.2 profile cutover shipped in 0.4.0, and a 0.2.x suite rejects every v0.2 record, so `--version` is exactly the command someone runs to work out whether their suite matches their producer. It was the one command that could not answer.
|
|
12
|
+
|
|
13
|
+
## v0.4.0 — 2026-07-28
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- **BREAKING: the suite now conforms to TRACE v0.2.** `TR-ENV` requires the profile `tag:agentrust-io.com,2026:trace-v0.2` and fails a record carrying the v0.1 identifier. The v0.1 URI named `agentrust.io`, a domain this project never controlled, which RFC 4151 does not permit for a tag URI; see agentrust-io/trace-spec#107. Nothing else about the record format changed, so a producer migrates by updating the profile string and bumping `agentrust-trace` to 0.5.0.
|
|
18
|
+
|
|
19
|
+
This is a deliberate cutover rather than dual acceptance: a conformance suite that passed both identifiers would certify records minted under a domain we do not own. A v0.1 record is checked with the 0.3.x releases of this suite, which stay published.
|
|
20
|
+
|
|
21
|
+
- Registry, verifier, and documentation hosts moved from `agentrust.io` to `agentrust-io.com`.
|
|
22
|
+
|
|
23
|
+
## v0.3.0 — 2026-07-21
|
|
24
|
+
|
|
25
|
+
- `azure-cvm-sev-snp` platform accepted (`runtime.platform`): Azure confidential VMs run SEV-SNP behind a Hyper-V paravisor (vTPM-rooted). Added to the bundled schema enum and the TR-RTE valid-platform set so Azure TRACE records pass conformance. Matches `agentrust-trace>=0.4`.
|
|
26
|
+
|
|
27
|
+
## v0.2.0 — 2026-06-19
|
|
28
|
+
|
|
29
|
+
- DID subject support: `subject` now accepts `did:` URIs in addition to `spiffe://`.
|
|
30
|
+
- Embedded signature verification: plain TRACE records signed with `agentrust-trace sign_record()` are now cryptographically verified at all levels.
|
|
31
|
+
- SLSA Level 0: `build_provenance.slsa_level: 0` is now valid for software-only / development records.
|
|
32
|
+
- Software-only platform: `runtime.platform: "software-only"` accepted at Level 0.
|
|
33
|
+
- Private key leak detection: TR-SIG now fails records that embed a private key (`d` member) in `cnf.jwk`.
|
|
34
|
+
|
|
35
|
+
## v0.1.0 — 2026-05-01
|
|
36
|
+
|
|
37
|
+
- Initial release with 7 test modules: TR-ENV, TR-SIG, TR-RTE, TR-POL, TR-TXN, TR-ANC, TR-SCA.
|
|
38
|
+
- Conformance levels 0, 1, 2.
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agentrust-trace-tests
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.1
|
|
4
4
|
Summary: TRACE conformance test suite
|
|
5
5
|
Project-URL: Homepage, https://github.com/agentrust-io/trace-tests
|
|
6
6
|
Project-URL: Repository, https://github.com/agentrust-io/trace-tests
|
|
7
7
|
Project-URL: Documentation, https://github.com/agentrust-io/trace-tests#readme
|
|
8
8
|
Project-URL: Bug Tracker, https://github.com/agentrust-io/trace-tests/issues
|
|
9
|
-
Author: agentrust.
|
|
9
|
+
Author: agentrust-io.com
|
|
10
10
|
License: Apache-2.0
|
|
11
11
|
License-File: LICENSE
|
|
12
12
|
Keywords: ai-agents,attestation,conformance,provenance,trace
|
|
@@ -64,7 +64,7 @@ Description-Content-Type: text/markdown
|
|
|
64
64
|
|
|
65
65
|
> **Test suite v0.2.** Tracks [TRACE Spec v0.2](https://github.com/agentrust-io/trace-spec).
|
|
66
66
|
|
|
67
|
-
Conformance tests for TRACE
|
|
67
|
+
Conformance tests for TRACE (Trust Runtime Attestation and Compliance Evidence). Run this suite against your implementation to verify it meets the spec before claiming TRACE compliance.
|
|
68
68
|
|
|
69
69
|
Seven test modules covering the full specification: envelope structure, signature algorithms, TEE runtime claims, policy binding, tool-call transcripts, SCITT transparency anchoring, and supply chain provenance.
|
|
70
70
|
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
|
|
28
28
|
> **Test suite v0.2.** Tracks [TRACE Spec v0.2](https://github.com/agentrust-io/trace-spec).
|
|
29
29
|
|
|
30
|
-
Conformance tests for TRACE
|
|
30
|
+
Conformance tests for TRACE (Trust Runtime Attestation and Compliance Evidence). Run this suite against your implementation to verify it meets the spec before claiming TRACE compliance.
|
|
31
31
|
|
|
32
32
|
Seven test modules covering the full specification: envelope structure, signature algorithms, TEE runtime claims, policy binding, tool-call transcripts, SCITT transparency anchoring, and supply chain provenance.
|
|
33
33
|
|
|
@@ -6,7 +6,7 @@ All TRACE test failures emit a structured error code of the form `TR-<MODULE>-<N
|
|
|
6
6
|
|
|
7
7
|
| Code | Description | How to fix |
|
|
8
8
|
|------|-------------|------------|
|
|
9
|
-
| TR-ENV-001 | Missing or invalid `eat_profile` URI | Set `eat_profile` to `"tag:agentrust.
|
|
9
|
+
| TR-ENV-001 | Missing or invalid `eat_profile` URI | Set `eat_profile` to `"tag:agentrust-io.com,2026:trace-v0.2"` |
|
|
10
10
|
| TR-ENV-002 | `iat` is missing, not an integer, or out of range | Set `iat` to a Unix timestamp integer (e.g. `int(time.time())`) |
|
|
11
11
|
| TR-ENV-003 | `subject` does not match SPIFFE URI or DID pattern | Use `spiffe://<trust-domain>/<path>` or a `did:` URI |
|
|
12
12
|
| TR-ENV-004 | One or more required fields are absent | Add the missing field(s); check the [Schema Reference](https://trace.agentrust-io.com/schema) for the full required set |
|
|
@@ -47,7 +47,7 @@ All TRACE test failures emit a structured error code of the form `TR-<MODULE>-<N
|
|
|
47
47
|
| Code | Description | How to fix |
|
|
48
48
|
|------|-------------|------------|
|
|
49
49
|
| TR-ANC-001 | `transparency` field missing or empty | Submit the record to a SCITT transparency log and set `transparency` to the returned receipt URI |
|
|
50
|
-
| TR-ANC-002 | `transparency` URI does not use `https://` scheme | Only `https://` URIs are accepted; update the URI or use the agentrust registry at `https://registry.agentrust.
|
|
50
|
+
| TR-ANC-002 | `transparency` URI does not use `https://` scheme | Only `https://` URIs are accepted; update the URI or use the agentrust registry at `https://registry.agentrust-io.com` |
|
|
51
51
|
|
|
52
52
|
## TR-SCA — Provenance
|
|
53
53
|
|
|
@@ -16,7 +16,7 @@ Level 0 records are signed with a software key. The `runtime.platform` must be `
|
|
|
16
16
|
|
|
17
17
|
```json
|
|
18
18
|
{
|
|
19
|
-
"eat_profile": "tag:agentrust.
|
|
19
|
+
"eat_profile": "tag:agentrust-io.com,2026:trace-v0.2",
|
|
20
20
|
"iat": 1750000000,
|
|
21
21
|
"subject": "spiffe://trust.example.org/agent/my-agent",
|
|
22
22
|
"model": {
|
|
@@ -41,7 +41,7 @@ Level 0 records are signed with a software key. The `runtime.platform` must be `
|
|
|
41
41
|
"status": "none",
|
|
42
42
|
"verifier": "https://verifier.example.org"
|
|
43
43
|
},
|
|
44
|
-
"transparency": "https://registry.agentrust.
|
|
44
|
+
"transparency": "https://registry.agentrust-io.com/claim/placeholder",
|
|
45
45
|
"cnf": {
|
|
46
46
|
"jwk": {
|
|
47
47
|
"kty": "OKP",
|
|
@@ -73,7 +73,7 @@ Level 1 adds hardware attestation. `runtime.platform` must be one of: `tpm2`, `s
|
|
|
73
73
|
|
|
74
74
|
```json
|
|
75
75
|
{
|
|
76
|
-
"eat_profile": "tag:agentrust.
|
|
76
|
+
"eat_profile": "tag:agentrust-io.com,2026:trace-v0.2",
|
|
77
77
|
"iat": 1750000000,
|
|
78
78
|
"subject": "spiffe://trust.example.org/agent/my-agent",
|
|
79
79
|
"model": {
|
|
@@ -96,9 +96,9 @@ Level 1 adds hardware attestation. `runtime.platform` must be one of: `tpm2`, `s
|
|
|
96
96
|
},
|
|
97
97
|
"appraisal": {
|
|
98
98
|
"status": "affirming",
|
|
99
|
-
"verifier": "https://verifier.agentrust.
|
|
99
|
+
"verifier": "https://verifier.agentrust-io.com"
|
|
100
100
|
},
|
|
101
|
-
"transparency": "https://registry.agentrust.
|
|
101
|
+
"transparency": "https://registry.agentrust-io.com/claim/placeholder",
|
|
102
102
|
"cnf": {
|
|
103
103
|
"jwk": {
|
|
104
104
|
"kty": "OKP",
|
|
@@ -133,9 +133,9 @@ Level 2 adds tool transcript and transparency anchor requirements. The `transpar
|
|
|
133
133
|
"hash": "sha256:c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4",
|
|
134
134
|
"call_count": 4
|
|
135
135
|
},
|
|
136
|
-
"transparency": "https://registry.agentrust.
|
|
136
|
+
"transparency": "https://registry.agentrust-io.com/claim/01J3XKWP4NQZ8R5HT6YD7VMBCE",
|
|
137
137
|
"anchor": {
|
|
138
|
-
"log_id": "https://registry.agentrust.
|
|
138
|
+
"log_id": "https://registry.agentrust-io.com",
|
|
139
139
|
"leaf_hash": "sha256:f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5"
|
|
140
140
|
}
|
|
141
141
|
}
|
|
@@ -6,7 +6,7 @@ Tests the top-level EAT envelope structure of a TRACE Trust Record.
|
|
|
6
6
|
|
|
7
7
|
| Test ID | Description | Positive Case | Negative Case |
|
|
8
8
|
|---------|-------------|---------------|---------------|
|
|
9
|
-
| TR-ENV-001 | `eat_profile` present and correct URI | `tag:agentrust.
|
|
9
|
+
| TR-ENV-001 | `eat_profile` present and correct URI | `tag:agentrust-io.com,2026:trace-v0.2` | missing or wrong |
|
|
10
10
|
| TR-ENV-002 | `iat` is a valid Unix timestamp | integer, reasonable range | string, future date |
|
|
11
11
|
| TR-ENV-003 | `subject` matches SPIFFE URI or DID | `spiffe://trust.example/agent/x` or `did:key:z6Mk...` | bare string |
|
|
12
12
|
| TR-ENV-004 | Required fields present | all of: eat_profile, iat, subject, model, runtime, policy, data_class, build_provenance, appraisal | missing any |
|
|
@@ -22,7 +22,7 @@ from agentrust_trace import generate_key, sign_record
|
|
|
22
22
|
key = generate_key()
|
|
23
23
|
|
|
24
24
|
record = {
|
|
25
|
-
"eat_profile": "tag:agentrust.
|
|
25
|
+
"eat_profile": "tag:agentrust-io.com,2026:trace-v0.2",
|
|
26
26
|
"iat": int(time.time()),
|
|
27
27
|
"subject": "spiffe://trust.example.org/agent/sample",
|
|
28
28
|
"model": {
|
|
@@ -49,7 +49,7 @@ record = {
|
|
|
49
49
|
"status": "none",
|
|
50
50
|
"verifier": "https://verifier.example.org",
|
|
51
51
|
},
|
|
52
|
-
"transparency": "https://registry.agentrust.
|
|
52
|
+
"transparency": "https://registry.agentrust-io.com/claim/placeholder",
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
signed = sign_record(record, key)
|
|
@@ -193,7 +193,7 @@ def build_signed_cmcp_record(platform: str = "tpm2") -> dict:
|
|
|
193
193
|
record = {
|
|
194
194
|
"cmcp_version": "1.0",
|
|
195
195
|
"trace": {
|
|
196
|
-
"eat_profile": "tag:agentrust.
|
|
196
|
+
"eat_profile": "tag:agentrust-io.com,2026:trace-v0.2",
|
|
197
197
|
"iat": int(time.time()) - 30,
|
|
198
198
|
"subject": "spiffe://cmcp.gateway/session/my-test",
|
|
199
199
|
"runtime": {
|
|
@@ -228,7 +228,7 @@ Common codes you will encounter:
|
|
|
228
228
|
|
|
229
229
|
| Code | Field | Fix |
|
|
230
230
|
|------|-------|-----|
|
|
231
|
-
| TR-ENV-001 | `eat_profile` | Must be `tag:agentrust.
|
|
231
|
+
| TR-ENV-001 | `eat_profile` | Must be `tag:agentrust-io.com,2026:trace-v0.2` |
|
|
232
232
|
| TR-ENV-002 | `iat` | Must be a Unix timestamp in the last 24 hours |
|
|
233
233
|
| TR-SIG-001 | `signature` | Signature missing or does not verify |
|
|
234
234
|
| TR-SIG-002 | `cnf.jwk` | Key must be OKP/Ed25519 |
|
|
@@ -4,12 +4,12 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "agentrust-trace-tests"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.4.1"
|
|
8
8
|
description = "TRACE conformance test suite"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { text = "Apache-2.0" }
|
|
11
11
|
authors = [
|
|
12
|
-
{ name = "agentrust.
|
|
12
|
+
{ name = "agentrust-io.com" },
|
|
13
13
|
]
|
|
14
14
|
keywords = ["trace", "conformance", "attestation", "ai-agents", "provenance"]
|
|
15
15
|
classifiers = [
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"$id": "https://agentrust.
|
|
3
|
+
"$id": "https://agentrust-io.com/schema/trace-v0.1.json",
|
|
4
4
|
"title": "TRACE Trust Record",
|
|
5
|
-
"description": "A TRACE v0.
|
|
5
|
+
"description": "A TRACE v0.2 Trust Record — hardware-attested governance evidence for an AI agent execution.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"required": [
|
|
8
8
|
"eat_profile", "iat", "subject", "model", "runtime", "policy",
|
|
9
9
|
"data_class", "build_provenance", "appraisal", "transparency", "cnf"
|
|
10
10
|
],
|
|
11
11
|
"properties": {
|
|
12
|
-
"eat_profile": {"type": "string", "const": "tag:agentrust.
|
|
12
|
+
"eat_profile": {"type": "string", "const": "tag:agentrust-io.com,2026:trace-v0.2"},
|
|
13
13
|
"iat": {"type": "integer", "minimum": 1700000000},
|
|
14
14
|
"subject": {"type": "string", "pattern": "^(spiffe://|did:)"},
|
|
15
15
|
"model": {
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"""TRACE conformance test suite."""
|
|
2
|
+
|
|
3
|
+
from importlib.metadata import PackageNotFoundError, version
|
|
4
|
+
|
|
5
|
+
# Read the version from installed distribution metadata rather than restating it
|
|
6
|
+
# here. `pyproject.toml` is what the build and PyPI publish, so a second literal
|
|
7
|
+
# in this file is a copy that can fall behind silently: it sat at "0.2.0" through
|
|
8
|
+
# both the 0.3.0 and 0.4.0 releases, so `trace-tests --version` reported 0.2.0
|
|
9
|
+
# from a 0.4.0 install. That is worse than cosmetic, because the v0.2 profile
|
|
10
|
+
# cutover landed in 0.4.0 and `--version` is the command someone runs to find out
|
|
11
|
+
# whether they have a suite that accepts v0.2 records.
|
|
12
|
+
try:
|
|
13
|
+
__version__ = version("agentrust-trace-tests")
|
|
14
|
+
except PackageNotFoundError: # pragma: no cover - source tree with no install
|
|
15
|
+
# Importable without being installed (e.g. PYTHONPATH against a checkout).
|
|
16
|
+
# There is no metadata to read here, and guessing a number would reintroduce
|
|
17
|
+
# the drift this exists to prevent.
|
|
18
|
+
__version__ = "0.0.0+unknown"
|
|
19
|
+
|
|
20
|
+
__all__ = ["__version__"]
|
{agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/src/trace_tests/modules/tr_env.py
RENAMED
|
@@ -8,7 +8,7 @@ from typing import Any
|
|
|
8
8
|
|
|
9
9
|
from trace_tests.result import Finding, Status
|
|
10
10
|
|
|
11
|
-
_PROFILE = "tag:agentrust.
|
|
11
|
+
_PROFILE = "tag:agentrust-io.com,2026:trace-v0.2"
|
|
12
12
|
_SUBJECT_RE = re.compile(r'^(spiffe://[^/]+/.+|did:[a-z0-9]+:.+)$')
|
|
13
13
|
_IAT_MIN = 1_700_000_000
|
|
14
14
|
|
|
@@ -41,7 +41,7 @@ def _build_signed_cmcp_record(*, platform: str = "tpm2", nonce: str | None = Non
|
|
|
41
41
|
iat = int(time.time()) - 30 # fresh but not future-dated
|
|
42
42
|
|
|
43
43
|
trace: dict = {
|
|
44
|
-
"eat_profile": "tag:agentrust.
|
|
44
|
+
"eat_profile": "tag:agentrust-io.com,2026:trace-v0.2",
|
|
45
45
|
"iat": iat,
|
|
46
46
|
"subject": "spiffe://cmcp.gateway/session/conformance-test",
|
|
47
47
|
"runtime": {
|
|
@@ -135,7 +135,7 @@ def _build_software_only_record() -> dict:
|
|
|
135
135
|
record: dict = {
|
|
136
136
|
"cmcp_version": "1.0",
|
|
137
137
|
"trace": {
|
|
138
|
-
"eat_profile": "tag:agentrust.
|
|
138
|
+
"eat_profile": "tag:agentrust-io.com,2026:trace-v0.2",
|
|
139
139
|
"iat": iat,
|
|
140
140
|
"subject": "spiffe://cmcp.gateway/session/level2-test",
|
|
141
141
|
"runtime": {
|
|
@@ -18,7 +18,7 @@ class TestLevel0Conformance:
|
|
|
18
18
|
jsonschema.validate(valid_level0, schema)
|
|
19
19
|
|
|
20
20
|
def test_eat_profile_sentinel(self, valid_level0):
|
|
21
|
-
assert valid_level0["eat_profile"] == "tag:agentrust.
|
|
21
|
+
assert valid_level0["eat_profile"] == "tag:agentrust-io.com,2026:trace-v0.2"
|
|
22
22
|
|
|
23
23
|
def test_iat_is_positive_integer(self, valid_level0):
|
|
24
24
|
assert isinstance(valid_level0["iat"], int)
|
|
@@ -48,11 +48,11 @@ class TestLevel1Conformance:
|
|
|
48
48
|
|
|
49
49
|
In the cMCP profile the eat_profile field inside trace serves the role
|
|
50
50
|
of the COSE protected header content-type: it binds the record to the
|
|
51
|
-
TRACE v0.
|
|
51
|
+
TRACE v0.2 specification and prevents cross-profile replay.
|
|
52
52
|
"""
|
|
53
53
|
trace = signed_eat_fixture["trace"]
|
|
54
|
-
assert trace.get("eat_profile") == "tag:agentrust.
|
|
55
|
-
"trace.eat_profile must be 'tag:agentrust.
|
|
54
|
+
assert trace.get("eat_profile") == "tag:agentrust-io.com,2026:trace-v0.2", (
|
|
55
|
+
"trace.eat_profile must be 'tag:agentrust-io.com,2026:trace-v0.2'"
|
|
56
56
|
)
|
|
57
57
|
|
|
58
58
|
def test_signature_verifies_against_cnf_key(self, signed_eat_fixture):
|
|
@@ -57,3 +57,29 @@ def test_partial_cmcp_envelope_is_rejected(tmp_path):
|
|
|
57
57
|
result = CliRunner().invoke(main, ["verify", "--record", str(p), "--level", "0"])
|
|
58
58
|
assert result.exit_code == 2, result.output
|
|
59
59
|
assert "partial cmcp-runtime envelope" in result.output
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def test_version_matches_distribution_metadata():
|
|
63
|
+
"""`--version` must report the installed distribution version.
|
|
64
|
+
|
|
65
|
+
`__version__` was a second hardcoded literal alongside `pyproject.toml` and
|
|
66
|
+
fell behind through two releases, so a 0.4.0 install reported 0.2.0. Since
|
|
67
|
+
the v0.2 profile cutover shipped in 0.4.0, `--version` was the one command
|
|
68
|
+
that could not tell you whether your suite accepts v0.2 records.
|
|
69
|
+
"""
|
|
70
|
+
from importlib.metadata import version
|
|
71
|
+
|
|
72
|
+
expected = version("agentrust-trace-tests")
|
|
73
|
+
result = CliRunner().invoke(main, ["--version"])
|
|
74
|
+
|
|
75
|
+
assert result.exit_code == 0, result.output
|
|
76
|
+
assert expected in result.output, f"expected {expected!r} in {result.output!r}"
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def test_dunder_version_is_not_a_stale_literal():
|
|
80
|
+
"""Guard against reverting to a hardcoded `__version__`."""
|
|
81
|
+
from importlib.metadata import version
|
|
82
|
+
|
|
83
|
+
import trace_tests
|
|
84
|
+
|
|
85
|
+
assert trace_tests.__version__ == version("agentrust-trace-tests")
|
|
@@ -13,13 +13,13 @@ from trace_tests.loader import LoadError, load_record
|
|
|
13
13
|
|
|
14
14
|
VALID_CMCP = {
|
|
15
15
|
"cmcp_version": "1.0",
|
|
16
|
-
"trace": {"eat_profile": "tag:agentrust.
|
|
16
|
+
"trace": {"eat_profile": "tag:agentrust-io.com,2026:trace-v0.2"},
|
|
17
17
|
"gateway": {"session_id": "s1"},
|
|
18
18
|
"signature": "sig",
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
VALID_TRACE = {
|
|
22
|
-
"eat_profile": "tag:agentrust.
|
|
22
|
+
"eat_profile": "tag:agentrust-io.com,2026:trace-v0.2",
|
|
23
23
|
"iat": 1748000000,
|
|
24
24
|
"subject": "spiffe://example.org/agent/test",
|
|
25
25
|
}
|
|
@@ -6,7 +6,7 @@ from trace_tests.modules.tr_env import check
|
|
|
6
6
|
from trace_tests.result import Status
|
|
7
7
|
|
|
8
8
|
_VALID = {
|
|
9
|
-
"eat_profile": "tag:agentrust.
|
|
9
|
+
"eat_profile": "tag:agentrust-io.com,2026:trace-v0.2",
|
|
10
10
|
"iat": int(time.time()) - 600, # fresh: 10 minutes old
|
|
11
11
|
"subject": "spiffe://example.org/agent/test",
|
|
12
12
|
"cnf": {"jwk": {"kty": "OKP", "crv": "Ed25519", "x": "dGVzdA"}},
|
|
@@ -28,7 +28,7 @@ def _make_signed_record() -> dict:
|
|
|
28
28
|
record = {
|
|
29
29
|
"cmcp_version": "1.0",
|
|
30
30
|
"trace": {
|
|
31
|
-
"eat_profile": "tag:agentrust.
|
|
31
|
+
"eat_profile": "tag:agentrust-io.com,2026:trace-v0.2",
|
|
32
32
|
"iat": 1748000000,
|
|
33
33
|
"subject": "spiffe://cmcp.gateway/session/unit-test",
|
|
34
34
|
"runtime": {
|
|
@@ -111,7 +111,7 @@ def test_plain_trace_embedded_ed25519_signature_passes():
|
|
|
111
111
|
x = _b64url(pub.public_bytes_raw())
|
|
112
112
|
|
|
113
113
|
trace: dict = {
|
|
114
|
-
"eat_profile": "tag:agentrust.
|
|
114
|
+
"eat_profile": "tag:agentrust-io.com,2026:trace-v0.2",
|
|
115
115
|
"iat": 1748000000,
|
|
116
116
|
"subject": "did:mesh:spiffe://example.org/agent/test",
|
|
117
117
|
"runtime": {"platform": "software-only", "measurement": "sha256:" + "a" * 64},
|
|
@@ -135,7 +135,7 @@ def test_plain_trace_tampered_embedded_signature_fails():
|
|
|
135
135
|
x = _b64url(pub.public_bytes_raw())
|
|
136
136
|
|
|
137
137
|
trace: dict = {
|
|
138
|
-
"eat_profile": "tag:agentrust.
|
|
138
|
+
"eat_profile": "tag:agentrust-io.com,2026:trace-v0.2",
|
|
139
139
|
"iat": 1748000000,
|
|
140
140
|
"subject": "did:mesh:spiffe://example.org/agent/test",
|
|
141
141
|
"runtime": {"platform": "software-only", "measurement": "sha256:" + "a" * 64},
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
## Unreleased
|
|
4
|
-
|
|
5
|
-
## v0.3.0 — 2026-07-21
|
|
6
|
-
|
|
7
|
-
- `azure-cvm-sev-snp` platform accepted (`runtime.platform`): Azure confidential VMs run SEV-SNP behind a Hyper-V paravisor (vTPM-rooted). Added to the bundled schema enum and the TR-RTE valid-platform set so Azure TRACE records pass conformance. Matches `agentrust-trace>=0.4`.
|
|
8
|
-
|
|
9
|
-
## v0.2.0 — 2026-06-19
|
|
10
|
-
|
|
11
|
-
- DID subject support: `subject` now accepts `did:` URIs in addition to `spiffe://`.
|
|
12
|
-
- Embedded signature verification: plain TRACE records signed with `agentrust-trace sign_record()` are now cryptographically verified at all levels.
|
|
13
|
-
- SLSA Level 0: `build_provenance.slsa_level: 0` is now valid for software-only / development records.
|
|
14
|
-
- Software-only platform: `runtime.platform: "software-only"` accepted at Level 0.
|
|
15
|
-
- Private key leak detection: TR-SIG now fails records that embed a private key (`d` member) in `cnf.jwk`.
|
|
16
|
-
|
|
17
|
-
## v0.1.0 — 2026-05-01
|
|
18
|
-
|
|
19
|
-
- Initial release with 7 test modules: TR-ENV, TR-SIG, TR-RTE, TR-POL, TR-TXN, TR-ANC, TR-SCA.
|
|
20
|
-
- Conformance levels 0, 1, 2.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/docs/tutorials/ci-integration.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/src/trace_tests/modules/__init__.py
RENAMED
|
File without changes
|
{agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/src/trace_tests/modules/tr_anc.py
RENAMED
|
File without changes
|
{agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/src/trace_tests/modules/tr_pol.py
RENAMED
|
File without changes
|
{agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/src/trace_tests/modules/tr_rte.py
RENAMED
|
File without changes
|
{agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/src/trace_tests/modules/tr_sca.py
RENAMED
|
File without changes
|
{agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/src/trace_tests/modules/tr_sig.py
RENAMED
|
File without changes
|
{agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/src/trace_tests/modules/tr_txn.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/tests/test_software_only_platform.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agentrust_trace_tests-0.3.0 → agentrust_trace_tests-0.4.1}/tests/vectors/invalid_wrong_profile.json
RENAMED
|
File without changes
|