agentrust-trace-tests 0.2.0__tar.gz → 0.4.0__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.2.0 → agentrust_trace_tests-0.4.0}/.github/workflows/ci.yml +1 -1
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/.github/workflows/docs.yml +1 -1
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/.github/workflows/release.yml +2 -2
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/.gitignore +4 -0
- agentrust_trace_tests-0.4.0/CHANGELOG.md +30 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/PKG-INFO +2 -2
- agentrust_trace_tests-0.4.0/PRIVACY.md +9 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/docs/error-codes.md +2 -2
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/docs/levels.md +7 -7
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/docs/modules/tr-env.md +1 -1
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/docs/quickstart.md +2 -2
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/docs/tutorials/writing-conformance-tests.md +2 -2
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/pyproject.toml +2 -2
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/requirements-docs.txt +2 -2
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/schemas/trace-claim.json +4 -4
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/modules/tr_env.py +1 -1
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/modules/tr_rte.py +2 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/conftest.py +2 -2
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/test_level0.py +2 -2
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/test_level1.py +3 -3
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/unit/test_loader.py +2 -2
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/unit/test_tr_env.py +1 -1
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/unit/test_tr_rte.py +7 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/unit/test_tr_sig.py +3 -3
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/vectors/invalid_missing_runtime.json +1 -1
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/vectors/valid_cmcp_runtime.json +1 -1
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/vectors/valid_level0.json +1 -1
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/vectors/valid_level0_with_transcript.json +1 -1
- agentrust_trace_tests-0.2.0/CHANGELOG.md +0 -14
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/.github/CODEOWNERS +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/.github/dependabot.yml +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/.github/workflows/codeql.yml +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/.github/workflows/contributor-check.yml +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/.github/workflows/require-maintainer-approval.yml +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/.github/workflows/scorecard.yml +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/CNAME +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/CODE_OF_CONDUCT.md +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/CONTRIBUTING.md +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/LICENSE +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/README.md +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/SECURITY.md +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/docs/modules/tr-anc.md +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/docs/modules/tr-pol.md +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/docs/modules/tr-rte.md +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/docs/modules/tr-sca.md +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/docs/modules/tr-sig.md +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/docs/modules/tr-txn.md +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/docs/modules.md +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/docs/stylesheets/extra.css +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/docs/tutorials/ci-integration.md +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/mkdocs.yml +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/__init__.py +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/cli.py +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/loader.py +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/modules/__init__.py +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/modules/tr_anc.py +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/modules/tr_pol.py +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/modules/tr_sca.py +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/modules/tr_sig.py +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/modules/tr_txn.py +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/result.py +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/runner.py +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/__init__.py +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/test_level0_negative.py +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/test_level2.py +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/test_schema.py +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/test_software_only_platform.py +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/unit/__init__.py +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/unit/test_cli.py +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/unit/test_runner.py +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/unit/test_tr_anc.py +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/unit/test_tr_pol.py +0 -0
- {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/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
|
|
@@ -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@ba38be9e461d3875417946c167d0b5f3d385a247 # v1.14.1
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## Unreleased
|
|
4
|
+
|
|
5
|
+
## v0.4.0 — 2026-07-28
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- **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.
|
|
10
|
+
|
|
11
|
+
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.
|
|
12
|
+
|
|
13
|
+
- Registry, verifier, and documentation hosts moved from `agentrust.io` to `agentrust-io.com`.
|
|
14
|
+
|
|
15
|
+
## v0.3.0 — 2026-07-21
|
|
16
|
+
|
|
17
|
+
- `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`.
|
|
18
|
+
|
|
19
|
+
## v0.2.0 — 2026-06-19
|
|
20
|
+
|
|
21
|
+
- DID subject support: `subject` now accepts `did:` URIs in addition to `spiffe://`.
|
|
22
|
+
- Embedded signature verification: plain TRACE records signed with `agentrust-trace sign_record()` are now cryptographically verified at all levels.
|
|
23
|
+
- SLSA Level 0: `build_provenance.slsa_level: 0` is now valid for software-only / development records.
|
|
24
|
+
- Software-only platform: `runtime.platform: "software-only"` accepted at Level 0.
|
|
25
|
+
- Private key leak detection: TR-SIG now fails records that embed a private key (`d` member) in `cnf.jwk`.
|
|
26
|
+
|
|
27
|
+
## v0.1.0 — 2026-05-01
|
|
28
|
+
|
|
29
|
+
- Initial release with 7 test modules: TR-ENV, TR-SIG, TR-RTE, TR-POL, TR-TXN, TR-ANC, TR-SCA.
|
|
30
|
+
- 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.0
|
|
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
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Privacy
|
|
2
|
+
|
|
3
|
+
agentrust-trace-tests (the TRACE conformance suite) collects and transmits no personal data.
|
|
4
|
+
|
|
5
|
+
It runs locally as a command-line tool. It processes only the inputs you give it, entirely on your machine, and sends no telemetry, analytics, or usage data to agentrust-io, OPAQUE, or any third party. There is no account, login, or tracking, and no cookies or background network calls.
|
|
6
|
+
|
|
7
|
+
It reads only the record file you pass on the command line and makes no outbound calls.
|
|
8
|
+
|
|
9
|
+
Uninstalling removes it completely. Questions or corrections: https://github.com/agentrust-io/trace-tests/issues
|
|
@@ -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.0"
|
|
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": {
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"type": "object",
|
|
29
29
|
"required": ["platform", "measurement"],
|
|
30
30
|
"properties": {
|
|
31
|
-
"platform": {"type": "string", "enum": ["intel-tdx", "amd-sev-snp", "nvidia-h100", "nvidia-blackwell", "aws-nitro", "arm-cca", "google-confidential-space", "tpm2", "software-only"]},
|
|
31
|
+
"platform": {"type": "string", "enum": ["intel-tdx", "amd-sev-snp", "azure-cvm-sev-snp", "nvidia-h100", "nvidia-blackwell", "aws-nitro", "arm-cca", "google-confidential-space", "tpm2", "software-only"]},
|
|
32
32
|
"measurement": {"type": "string", "pattern": "^sha(256:[0-9a-f]{64}|384:[0-9a-f]{96})$"},
|
|
33
33
|
"rim_uri": {"type": "string", "format": "uri"},
|
|
34
34
|
"nonce": {"type": "string"},
|
{agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/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
|
|
{agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/modules/tr_rte.py
RENAMED
|
@@ -11,6 +11,8 @@ _DIGEST_RE = re.compile(r"^sha(256:[0-9a-f]{64}|384:[0-9a-f]{96})$")
|
|
|
11
11
|
_VALID_PLATFORMS = frozenset({
|
|
12
12
|
"intel-tdx",
|
|
13
13
|
"amd-sev-snp",
|
|
14
|
+
# Azure confidential VM: SEV-SNP behind a Hyper-V paravisor (vTPM-rooted).
|
|
15
|
+
"azure-cvm-sev-snp",
|
|
14
16
|
"nvidia-h100",
|
|
15
17
|
"nvidia-blackwell",
|
|
16
18
|
"aws-nitro",
|
|
@@ -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": {
|
|
@@ -5,7 +5,7 @@ import jsonschema
|
|
|
5
5
|
SUBJECT_RE = re.compile(r"^(spiffe://|did:)")
|
|
6
6
|
DIGEST_RE = re.compile(r"^sha(256:[0-9a-f]{64}|384:[0-9a-f]{96})$")
|
|
7
7
|
VALID_PLATFORMS = {
|
|
8
|
-
"intel-tdx", "amd-sev-snp", "nvidia-h100", "nvidia-blackwell",
|
|
8
|
+
"intel-tdx", "amd-sev-snp", "azure-cvm-sev-snp", "nvidia-h100", "nvidia-blackwell",
|
|
9
9
|
"aws-nitro", "arm-cca", "google-confidential-space", "tpm2",
|
|
10
10
|
}
|
|
11
11
|
VALID_ENFORCEMENT = {"enforce", "advisory", "silent"}
|
|
@@ -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):
|
|
@@ -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"}},
|
|
@@ -17,6 +17,13 @@ def test_valid_runtime_passes():
|
|
|
17
17
|
assert all(not f.failed() for f in findings), findings
|
|
18
18
|
|
|
19
19
|
|
|
20
|
+
def test_azure_cvm_platform_passes():
|
|
21
|
+
"""azure-cvm-sev-snp is a recognized hardware platform (vTPM-rooted SEV-SNP)."""
|
|
22
|
+
trace = {"runtime": {"platform": "azure-cvm-sev-snp", "measurement": "sha384:" + "a" * 96}}
|
|
23
|
+
findings = check(trace, level=2)
|
|
24
|
+
assert all(not f.failed() for f in findings), findings
|
|
25
|
+
|
|
26
|
+
|
|
20
27
|
def test_invalid_platform_fails():
|
|
21
28
|
trace = {"runtime": {**_VALID["runtime"], "platform": "unknown-tee"}}
|
|
22
29
|
codes = {f.code for f in check(trace) if f.failed()}
|
|
@@ -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,14 +0,0 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
## v0.2.0 — 2026-06-19
|
|
4
|
-
|
|
5
|
-
- DID subject support: `subject` now accepts `did:` URIs in addition to `spiffe://`.
|
|
6
|
-
- Embedded signature verification: plain TRACE records signed with `agentrust-trace sign_record()` are now cryptographically verified at all levels.
|
|
7
|
-
- SLSA Level 0: `build_provenance.slsa_level: 0` is now valid for software-only / development records.
|
|
8
|
-
- Software-only platform: `runtime.platform: "software-only"` accepted at Level 0.
|
|
9
|
-
- Private key leak detection: TR-SIG now fails records that embed a private key (`d` member) in `cnf.jwk`.
|
|
10
|
-
|
|
11
|
-
## v0.1.0 — 2026-05-01
|
|
12
|
-
|
|
13
|
-
- Initial release with 7 test modules: TR-ENV, TR-SIG, TR-RTE, TR-POL, TR-TXN, TR-ANC, TR-SCA.
|
|
14
|
-
- Conformance levels 0, 1, 2.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/.github/workflows/contributor-check.yml
RENAMED
|
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.2.0 → agentrust_trace_tests-0.4.0}/docs/tutorials/ci-integration.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/modules/__init__.py
RENAMED
|
File without changes
|
{agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/modules/tr_anc.py
RENAMED
|
File without changes
|
{agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/modules/tr_pol.py
RENAMED
|
File without changes
|
{agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/modules/tr_sca.py
RENAMED
|
File without changes
|
{agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/modules/tr_sig.py
RENAMED
|
File without changes
|
{agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/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.2.0 → agentrust_trace_tests-0.4.0}/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.2.0 → agentrust_trace_tests-0.4.0}/tests/vectors/invalid_wrong_profile.json
RENAMED
|
File without changes
|