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.
Files changed (73) hide show
  1. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/.github/workflows/ci.yml +1 -1
  2. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/.github/workflows/docs.yml +1 -1
  3. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/.github/workflows/release.yml +2 -2
  4. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/.gitignore +4 -0
  5. agentrust_trace_tests-0.4.0/CHANGELOG.md +30 -0
  6. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/PKG-INFO +2 -2
  7. agentrust_trace_tests-0.4.0/PRIVACY.md +9 -0
  8. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/docs/error-codes.md +2 -2
  9. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/docs/levels.md +7 -7
  10. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/docs/modules/tr-env.md +1 -1
  11. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/docs/quickstart.md +2 -2
  12. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/docs/tutorials/writing-conformance-tests.md +2 -2
  13. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/pyproject.toml +2 -2
  14. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/requirements-docs.txt +2 -2
  15. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/schemas/trace-claim.json +4 -4
  16. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/modules/tr_env.py +1 -1
  17. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/modules/tr_rte.py +2 -0
  18. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/conftest.py +2 -2
  19. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/test_level0.py +2 -2
  20. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/test_level1.py +3 -3
  21. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/unit/test_loader.py +2 -2
  22. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/unit/test_tr_env.py +1 -1
  23. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/unit/test_tr_rte.py +7 -0
  24. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/unit/test_tr_sig.py +3 -3
  25. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/vectors/invalid_missing_runtime.json +1 -1
  26. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/vectors/valid_cmcp_runtime.json +1 -1
  27. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/vectors/valid_level0.json +1 -1
  28. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/vectors/valid_level0_with_transcript.json +1 -1
  29. agentrust_trace_tests-0.2.0/CHANGELOG.md +0 -14
  30. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/.github/CODEOWNERS +0 -0
  31. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/.github/dependabot.yml +0 -0
  32. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/.github/workflows/codeql.yml +0 -0
  33. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/.github/workflows/contributor-check.yml +0 -0
  34. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/.github/workflows/require-maintainer-approval.yml +0 -0
  35. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/.github/workflows/scorecard.yml +0 -0
  36. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/CNAME +0 -0
  37. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/CODE_OF_CONDUCT.md +0 -0
  38. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/CONTRIBUTING.md +0 -0
  39. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/LICENSE +0 -0
  40. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/README.md +0 -0
  41. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/SECURITY.md +0 -0
  42. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/docs/modules/tr-anc.md +0 -0
  43. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/docs/modules/tr-pol.md +0 -0
  44. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/docs/modules/tr-rte.md +0 -0
  45. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/docs/modules/tr-sca.md +0 -0
  46. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/docs/modules/tr-sig.md +0 -0
  47. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/docs/modules/tr-txn.md +0 -0
  48. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/docs/modules.md +0 -0
  49. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/docs/stylesheets/extra.css +0 -0
  50. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/docs/tutorials/ci-integration.md +0 -0
  51. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/mkdocs.yml +0 -0
  52. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/__init__.py +0 -0
  53. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/cli.py +0 -0
  54. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/loader.py +0 -0
  55. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/modules/__init__.py +0 -0
  56. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/modules/tr_anc.py +0 -0
  57. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/modules/tr_pol.py +0 -0
  58. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/modules/tr_sca.py +0 -0
  59. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/modules/tr_sig.py +0 -0
  60. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/modules/tr_txn.py +0 -0
  61. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/result.py +0 -0
  62. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/src/trace_tests/runner.py +0 -0
  63. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/__init__.py +0 -0
  64. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/test_level0_negative.py +0 -0
  65. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/test_level2.py +0 -0
  66. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/test_schema.py +0 -0
  67. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/test_software_only_platform.py +0 -0
  68. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/unit/__init__.py +0 -0
  69. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/unit/test_cli.py +0 -0
  70. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/unit/test_runner.py +0 -0
  71. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/unit/test_tr_anc.py +0 -0
  72. {agentrust_trace_tests-0.2.0 → agentrust_trace_tests-0.4.0}/tests/unit/test_tr_pol.py +0 -0
  73. {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@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v5.3.0
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
@@ -30,7 +30,7 @@ jobs:
30
30
  with:
31
31
  fetch-depth: 0
32
32
 
33
- - uses: actions/setup-python@v6
33
+ - uses: actions/setup-python@v7
34
34
  with:
35
35
  python-version: "3.11"
36
36
  cache: pip
@@ -14,7 +14,7 @@ jobs:
14
14
  steps:
15
15
  - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
16
16
 
17
- - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
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@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1.14.0
44
+ - uses: pypa/gh-action-pypi-publish@ba38be9e461d3875417946c167d0b5f3d385a247 # v1.14.1
@@ -4,3 +4,7 @@ __pycache__/
4
4
  dist/
5
5
  *.egg-info/
6
6
  .coverage
7
+
8
+ # Local virtual environments
9
+ .venv/
10
+ venv/
@@ -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.2.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.io
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.io,2026:trace-v0.1"` |
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.io` |
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.io,2026:trace-v0.1",
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.io/claim/placeholder",
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.io,2026:trace-v0.1",
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.io"
99
+ "verifier": "https://verifier.agentrust-io.com"
100
100
  },
101
- "transparency": "https://registry.agentrust.io/claim/placeholder",
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.io/claim/01J3XKWP4NQZ8R5HT6YD7VMBCE",
136
+ "transparency": "https://registry.agentrust-io.com/claim/01J3XKWP4NQZ8R5HT6YD7VMBCE",
137
137
  "anchor": {
138
- "log_id": "https://registry.agentrust.io",
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.io,2026:trace-v0.1` | missing or wrong |
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.io,2026:trace-v0.1",
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.io/claim/placeholder",
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.io,2026:trace-v0.1",
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.io,2026:trace-v0.1` |
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.2.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.io" },
12
+ { name = "agentrust-io.com" },
13
13
  ]
14
14
  keywords = ["trace", "conformance", "attestation", "ai-agents", "provenance"]
15
15
  classifiers = [
@@ -1,6 +1,6 @@
1
1
  mkdocs>=1.6.1
2
- mkdocs-material>=9.7.6
2
+ mkdocs-material>=9.7.7
3
3
  mkdocs-minify-plugin>=0.8
4
4
  pymdown-extensions>=11.0.1
5
- mkdocstrings[python]>=1.0.4
5
+ mkdocstrings[python]>=1.0.6
6
6
  griffe>=2.1.0
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://agentrust.io/schema/trace-v0.1.json",
3
+ "$id": "https://agentrust-io.com/schema/trace-v0.1.json",
4
4
  "title": "TRACE Trust Record",
5
- "description": "A TRACE v0.1 Trust Record — hardware-attested governance evidence for an AI agent execution.",
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.io,2026:trace-v0.1"},
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"},
@@ -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.io,2026:trace-v0.1"
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
 
@@ -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.io,2026:trace-v0.1",
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.io,2026:trace-v0.1",
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.io,2026:trace-v0.1"
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.1 specification and prevents cross-profile replay.
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.io,2026:trace-v0.1", (
55
- "trace.eat_profile must be 'tag:agentrust.io,2026:trace-v0.1'"
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.io,2026:trace-v0.1"},
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.io,2026:trace-v0.1",
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.io,2026:trace-v0.1",
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.io,2026:trace-v0.1",
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.io,2026:trace-v0.1",
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.io,2026:trace-v0.1",
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,5 +1,5 @@
1
1
  {
2
- "eat_profile": "tag:agentrust.io,2026:trace-v0.1",
2
+ "eat_profile": "tag:agentrust-io.com,2026:trace-v0.2",
3
3
  "iat": 1748000000,
4
4
  "subject": "spiffe://example.org/agent/test/001",
5
5
  "model": {"provider": "anthropic", "model_id": "claude-sonnet-4-5"},
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "cmcp_version": "1.0",
3
3
  "trace": {
4
- "eat_profile": "tag:agentrust.io,2026:trace-v0.1",
4
+ "eat_profile": "tag:agentrust-io.com,2026:trace-v0.2",
5
5
  "iat": 1748000000,
6
6
  "subject": "spiffe://cmcp.gateway/session/test-session-001",
7
7
  "runtime": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "eat_profile": "tag:agentrust.io,2026:trace-v0.1",
2
+ "eat_profile": "tag:agentrust-io.com,2026:trace-v0.2",
3
3
  "iat": 1748000000,
4
4
  "subject": "spiffe://example.org/agent/credit-risk/01926b4c-1234-7abc-9def-000000000001",
5
5
  "model": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "eat_profile": "tag:agentrust.io,2026:trace-v0.1",
2
+ "eat_profile": "tag:agentrust-io.com,2026:trace-v0.2",
3
3
  "iat": 1748000001,
4
4
  "subject": "spiffe://example.org/agent/payments/01926b4c-1234-7abc-9def-000000000002",
5
5
  "model": {
@@ -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.