agentrust-trace 0.1.0__py3-none-any.whl
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/__init__.py +36 -0
- agentrust_trace/models.py +109 -0
- agentrust_trace/py.typed +0 -0
- agentrust_trace/schema/trace-v0.1.json +243 -0
- agentrust_trace/validate.py +37 -0
- agentrust_trace-0.1.0.dist-info/METADATA +121 -0
- agentrust_trace-0.1.0.dist-info/RECORD +9 -0
- agentrust_trace-0.1.0.dist-info/WHEEL +4 -0
- agentrust_trace-0.1.0.dist-info/licenses/LICENSE +37 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"""agentrust-trace — TRACE v0.1 Trust Record models and validation."""
|
|
2
|
+
|
|
3
|
+
from agentrust_trace.models import (
|
|
4
|
+
Appraisal,
|
|
5
|
+
BuildProvenance,
|
|
6
|
+
ConfirmationKey,
|
|
7
|
+
JWK,
|
|
8
|
+
ModelInfo,
|
|
9
|
+
PolicyInfo,
|
|
10
|
+
RuntimeInfo,
|
|
11
|
+
ToolTranscript,
|
|
12
|
+
TrustRecord,
|
|
13
|
+
)
|
|
14
|
+
from agentrust_trace.validate import (
|
|
15
|
+
iter_errors,
|
|
16
|
+
SCHEMA,
|
|
17
|
+
validate_json,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
__version__ = "0.1.0"
|
|
21
|
+
|
|
22
|
+
__all__ = [
|
|
23
|
+
"__version__",
|
|
24
|
+
"Appraisal",
|
|
25
|
+
"BuildProvenance",
|
|
26
|
+
"ConfirmationKey",
|
|
27
|
+
"JWK",
|
|
28
|
+
"ModelInfo",
|
|
29
|
+
"PolicyInfo",
|
|
30
|
+
"RuntimeInfo",
|
|
31
|
+
"ToolTranscript",
|
|
32
|
+
"TrustRecord",
|
|
33
|
+
"SCHEMA",
|
|
34
|
+
"iter_errors",
|
|
35
|
+
"validate_json",
|
|
36
|
+
]
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Annotated, Literal
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
6
|
+
|
|
7
|
+
_DIGEST_RE = r"^sha(256|384):[0-9a-f]+"
|
|
8
|
+
|
|
9
|
+
DigestStr = Annotated[str, Field(pattern=_DIGEST_RE)]
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ModelInfo(BaseModel):
|
|
13
|
+
model_config = ConfigDict(extra="forbid")
|
|
14
|
+
|
|
15
|
+
provider: str
|
|
16
|
+
model_id: str
|
|
17
|
+
version: str | None = None
|
|
18
|
+
weights_digest: DigestStr | None = None
|
|
19
|
+
aibom_uri: str | None = None
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class RuntimeInfo(BaseModel):
|
|
23
|
+
model_config = ConfigDict(extra="forbid")
|
|
24
|
+
|
|
25
|
+
platform: Literal[
|
|
26
|
+
"intel-tdx",
|
|
27
|
+
"amd-sev-snp",
|
|
28
|
+
"nvidia-h100",
|
|
29
|
+
"nvidia-blackwell",
|
|
30
|
+
"aws-nitro",
|
|
31
|
+
"arm-cca",
|
|
32
|
+
"google-confidential-space",
|
|
33
|
+
"tpm2",
|
|
34
|
+
]
|
|
35
|
+
measurement: DigestStr
|
|
36
|
+
rim_uri: str | None = None
|
|
37
|
+
nonce: str | None = None
|
|
38
|
+
firmware_version: str | None = None
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class PolicyInfo(BaseModel):
|
|
42
|
+
model_config = ConfigDict(extra="forbid")
|
|
43
|
+
|
|
44
|
+
bundle_hash: DigestStr
|
|
45
|
+
enforcement_mode: Literal["enforce", "advisory", "silent"]
|
|
46
|
+
version: str | None = None
|
|
47
|
+
policy_uri: str | None = None
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class ToolTranscript(BaseModel):
|
|
51
|
+
model_config = ConfigDict(extra="forbid")
|
|
52
|
+
|
|
53
|
+
hash: DigestStr
|
|
54
|
+
call_count: Annotated[int, Field(ge=0)] | None = None
|
|
55
|
+
transcript_uri: str | None = None
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class BuildProvenance(BaseModel):
|
|
59
|
+
model_config = ConfigDict(extra="forbid")
|
|
60
|
+
|
|
61
|
+
slsa_level: Annotated[int, Field(ge=1, le=3)]
|
|
62
|
+
builder: str | None = None
|
|
63
|
+
digest: DigestStr
|
|
64
|
+
provenance_uri: str | None = None
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class Appraisal(BaseModel):
|
|
68
|
+
model_config = ConfigDict(extra="forbid")
|
|
69
|
+
|
|
70
|
+
status: Literal["affirming", "warning", "contraindicated", "none"]
|
|
71
|
+
verifier: str
|
|
72
|
+
policy_ref: str | None = None
|
|
73
|
+
timestamp: int | None = None
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class JWK(BaseModel):
|
|
77
|
+
# JWK params vary by key type (EC, OKP, RSA) — allow unknown members per RFC 7517
|
|
78
|
+
model_config = ConfigDict(extra="allow")
|
|
79
|
+
|
|
80
|
+
kty: str
|
|
81
|
+
crv: str | None = None
|
|
82
|
+
x: str | None = None
|
|
83
|
+
y: str | None = None
|
|
84
|
+
kid: str | None = None
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class ConfirmationKey(BaseModel):
|
|
88
|
+
model_config = ConfigDict(extra="forbid")
|
|
89
|
+
|
|
90
|
+
jwk: JWK
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class TrustRecord(BaseModel):
|
|
94
|
+
"""TRACE v0.1 Trust Record — hardware-attested governance evidence for an AI agent execution."""
|
|
95
|
+
|
|
96
|
+
model_config = ConfigDict(extra="forbid")
|
|
97
|
+
|
|
98
|
+
eat_profile: Literal["tag:agentrust.io,2026:trace-v0.1"]
|
|
99
|
+
iat: Annotated[int, Field(ge=1700000000)]
|
|
100
|
+
subject: Annotated[str, Field(pattern=r"^spiffe://")]
|
|
101
|
+
model: ModelInfo
|
|
102
|
+
runtime: RuntimeInfo
|
|
103
|
+
policy: PolicyInfo
|
|
104
|
+
data_class: str
|
|
105
|
+
tool_transcript: ToolTranscript | None = None
|
|
106
|
+
build_provenance: BuildProvenance
|
|
107
|
+
appraisal: Appraisal
|
|
108
|
+
transparency: str
|
|
109
|
+
cnf: ConfirmationKey
|
agentrust_trace/py.typed
ADDED
|
File without changes
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://agentrust.io/schema/trace-v0.1.json",
|
|
4
|
+
"title": "TRACE Trust Record",
|
|
5
|
+
"description": "A TRACE v0.1 Trust Record — hardware-attested governance evidence for an AI agent execution.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": [
|
|
8
|
+
"eat_profile",
|
|
9
|
+
"iat",
|
|
10
|
+
"subject",
|
|
11
|
+
"model",
|
|
12
|
+
"runtime",
|
|
13
|
+
"policy",
|
|
14
|
+
"data_class",
|
|
15
|
+
"build_provenance",
|
|
16
|
+
"appraisal",
|
|
17
|
+
"transparency",
|
|
18
|
+
"cnf"
|
|
19
|
+
],
|
|
20
|
+
"properties": {
|
|
21
|
+
"eat_profile": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"const": "tag:agentrust.io,2026:trace-v0.1",
|
|
24
|
+
"description": "EAT profile URI identifying this as a TRACE v0.1 Trust Record."
|
|
25
|
+
},
|
|
26
|
+
"iat": {
|
|
27
|
+
"type": "integer",
|
|
28
|
+
"description": "Issued-at time as Unix epoch seconds.",
|
|
29
|
+
"minimum": 1700000000
|
|
30
|
+
},
|
|
31
|
+
"subject": {
|
|
32
|
+
"type": "string",
|
|
33
|
+
"description": "Workload identity as a SPIFFE SVID URI.",
|
|
34
|
+
"pattern": "^spiffe://"
|
|
35
|
+
},
|
|
36
|
+
"model": {
|
|
37
|
+
"type": "object",
|
|
38
|
+
"description": "Model identity and provenance.",
|
|
39
|
+
"required": ["provider", "model_id"],
|
|
40
|
+
"properties": {
|
|
41
|
+
"provider": {
|
|
42
|
+
"type": "string",
|
|
43
|
+
"description": "Model provider (e.g. 'anthropic', 'openai', 'meta')."
|
|
44
|
+
},
|
|
45
|
+
"model_id": {
|
|
46
|
+
"type": "string",
|
|
47
|
+
"description": "Model identifier as used by the provider."
|
|
48
|
+
},
|
|
49
|
+
"version": {
|
|
50
|
+
"type": "string",
|
|
51
|
+
"description": "Model version or snapshot identifier."
|
|
52
|
+
},
|
|
53
|
+
"weights_digest": {
|
|
54
|
+
"type": "string",
|
|
55
|
+
"description": "SHA-256 or SHA-384 digest of the model weights. Required for local/confidential-inference deployments.",
|
|
56
|
+
"pattern": "^sha(256|384):[0-9a-f]+"
|
|
57
|
+
},
|
|
58
|
+
"aibom_uri": {
|
|
59
|
+
"type": "string",
|
|
60
|
+
"format": "uri",
|
|
61
|
+
"description": "URI to SPDX 3.0 AI Profile or CycloneDX 1.7 ML-BOM for this model."
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
"additionalProperties": false
|
|
65
|
+
},
|
|
66
|
+
"runtime": {
|
|
67
|
+
"type": "object",
|
|
68
|
+
"description": "TEE measurement chain binding the workload to hardware.",
|
|
69
|
+
"required": ["platform", "measurement"],
|
|
70
|
+
"properties": {
|
|
71
|
+
"platform": {
|
|
72
|
+
"type": "string",
|
|
73
|
+
"enum": [
|
|
74
|
+
"intel-tdx",
|
|
75
|
+
"amd-sev-snp",
|
|
76
|
+
"nvidia-h100",
|
|
77
|
+
"nvidia-blackwell",
|
|
78
|
+
"aws-nitro",
|
|
79
|
+
"arm-cca",
|
|
80
|
+
"google-confidential-space",
|
|
81
|
+
"tpm2"
|
|
82
|
+
],
|
|
83
|
+
"description": "Hardware platform providing the root of trust."
|
|
84
|
+
},
|
|
85
|
+
"measurement": {
|
|
86
|
+
"type": "string",
|
|
87
|
+
"description": "Hardware measurement of the workload (e.g. TDX MRTD, SEV measurement, TPM PCR composite).",
|
|
88
|
+
"pattern": "^sha(256|384):[0-9a-f]+"
|
|
89
|
+
},
|
|
90
|
+
"rim_uri": {
|
|
91
|
+
"type": "string",
|
|
92
|
+
"format": "uri",
|
|
93
|
+
"description": "URI to the vendor-published Reference Integrity Manifest for this measurement."
|
|
94
|
+
},
|
|
95
|
+
"nonce": {
|
|
96
|
+
"type": "string",
|
|
97
|
+
"description": "Freshness nonce binding the attestation report to this record (base64url, no padding)."
|
|
98
|
+
},
|
|
99
|
+
"firmware_version": {
|
|
100
|
+
"type": "string",
|
|
101
|
+
"description": "Firmware or microcode version included in the measurement."
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
"additionalProperties": false
|
|
105
|
+
},
|
|
106
|
+
"policy": {
|
|
107
|
+
"type": "object",
|
|
108
|
+
"description": "Policy bundle sealed to the TEE measurement.",
|
|
109
|
+
"required": ["bundle_hash", "enforcement_mode"],
|
|
110
|
+
"properties": {
|
|
111
|
+
"bundle_hash": {
|
|
112
|
+
"type": "string",
|
|
113
|
+
"description": "SHA-256 or SHA-384 digest of the policy bundle in force at execution time.",
|
|
114
|
+
"pattern": "^sha(256|384):[0-9a-f]+"
|
|
115
|
+
},
|
|
116
|
+
"enforcement_mode": {
|
|
117
|
+
"type": "string",
|
|
118
|
+
"enum": ["enforce", "advisory", "silent"],
|
|
119
|
+
"description": "How policy decisions were applied: enforce (block on deny), advisory (log only), silent (no logging)."
|
|
120
|
+
},
|
|
121
|
+
"version": {
|
|
122
|
+
"type": "string",
|
|
123
|
+
"description": "Policy bundle version (semantic versioning recommended)."
|
|
124
|
+
},
|
|
125
|
+
"policy_uri": {
|
|
126
|
+
"type": "string",
|
|
127
|
+
"format": "uri",
|
|
128
|
+
"description": "URI to the policy bundle for verification."
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
"additionalProperties": false
|
|
132
|
+
},
|
|
133
|
+
"data_class": {
|
|
134
|
+
"type": "string",
|
|
135
|
+
"description": "Highest-sensitivity data classification of inputs and outputs processed during this execution.",
|
|
136
|
+
"examples": ["public", "internal", "confidential", "restricted", "top-secret"]
|
|
137
|
+
},
|
|
138
|
+
"tool_transcript": {
|
|
139
|
+
"type": "object",
|
|
140
|
+
"description": "Bound hash of the MCP/A2A tool-call transcript. OPTIONAL for Phase 1 records; REQUIRED for Phase 2+.",
|
|
141
|
+
"required": ["hash"],
|
|
142
|
+
"properties": {
|
|
143
|
+
"hash": {
|
|
144
|
+
"type": "string",
|
|
145
|
+
"description": "SHA-256 or SHA-384 digest of the full tool-call transcript, bound into the EAT envelope.",
|
|
146
|
+
"pattern": "^sha(256|384):[0-9a-f]+"
|
|
147
|
+
},
|
|
148
|
+
"call_count": {
|
|
149
|
+
"type": "integer",
|
|
150
|
+
"minimum": 0,
|
|
151
|
+
"description": "Total number of tool calls in this session."
|
|
152
|
+
},
|
|
153
|
+
"transcript_uri": {
|
|
154
|
+
"type": "string",
|
|
155
|
+
"format": "uri",
|
|
156
|
+
"description": "URI to the full transcript on the transparency log."
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
"additionalProperties": false
|
|
160
|
+
},
|
|
161
|
+
"build_provenance": {
|
|
162
|
+
"type": "object",
|
|
163
|
+
"description": "SLSA provenance for the workload (agent code + container image).",
|
|
164
|
+
"required": ["slsa_level", "digest"],
|
|
165
|
+
"properties": {
|
|
166
|
+
"slsa_level": {
|
|
167
|
+
"type": "integer",
|
|
168
|
+
"minimum": 1,
|
|
169
|
+
"maximum": 3,
|
|
170
|
+
"description": "SLSA Build Level achieved. Level 2 minimum for TRACE conformance; Level 3 for production mark."
|
|
171
|
+
},
|
|
172
|
+
"builder": {
|
|
173
|
+
"type": "string",
|
|
174
|
+
"description": "SLSA builder URI."
|
|
175
|
+
},
|
|
176
|
+
"digest": {
|
|
177
|
+
"type": "string",
|
|
178
|
+
"description": "SHA-256 or SHA-384 digest of the container image or workload binary.",
|
|
179
|
+
"pattern": "^sha(256|384):[0-9a-f]+"
|
|
180
|
+
},
|
|
181
|
+
"provenance_uri": {
|
|
182
|
+
"type": "string",
|
|
183
|
+
"format": "uri",
|
|
184
|
+
"description": "URI to the SLSA provenance attestation on a Sigstore/Rekor or compatible log."
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
"additionalProperties": false
|
|
188
|
+
},
|
|
189
|
+
"appraisal": {
|
|
190
|
+
"type": "object",
|
|
191
|
+
"description": "Verifier's EAR appraisal of the evidence (draft-ietf-rats-ar4si).",
|
|
192
|
+
"required": ["status", "verifier"],
|
|
193
|
+
"properties": {
|
|
194
|
+
"status": {
|
|
195
|
+
"type": "string",
|
|
196
|
+
"enum": ["affirming", "warning", "contraindicated", "none"],
|
|
197
|
+
"description": "EAR appraisal status."
|
|
198
|
+
},
|
|
199
|
+
"verifier": {
|
|
200
|
+
"type": "string",
|
|
201
|
+
"format": "uri",
|
|
202
|
+
"description": "URI identifying the verifier that produced this appraisal."
|
|
203
|
+
},
|
|
204
|
+
"policy_ref": {
|
|
205
|
+
"type": "string",
|
|
206
|
+
"format": "uri",
|
|
207
|
+
"description": "URI to the appraisal policy used."
|
|
208
|
+
},
|
|
209
|
+
"timestamp": {
|
|
210
|
+
"type": "integer",
|
|
211
|
+
"description": "Unix epoch seconds when the appraisal was produced."
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
"additionalProperties": false
|
|
215
|
+
},
|
|
216
|
+
"transparency": {
|
|
217
|
+
"type": "string",
|
|
218
|
+
"format": "uri",
|
|
219
|
+
"description": "SCITT receipt URI. The Trust Record is the Signed Statement; this URI resolves to the inclusion proof (Receipt) on the transparency log."
|
|
220
|
+
},
|
|
221
|
+
"cnf": {
|
|
222
|
+
"type": "object",
|
|
223
|
+
"description": "Confirmation key (RFC 8747) — binds the Trust Record to the TEE-held signing key.",
|
|
224
|
+
"required": ["jwk"],
|
|
225
|
+
"properties": {
|
|
226
|
+
"jwk": {
|
|
227
|
+
"type": "object",
|
|
228
|
+
"description": "JWK (RFC 7517) representing the TEE-sealed public key.",
|
|
229
|
+
"required": ["kty"],
|
|
230
|
+
"properties": {
|
|
231
|
+
"kty": {"type": "string"},
|
|
232
|
+
"crv": {"type": "string"},
|
|
233
|
+
"x": {"type": "string"},
|
|
234
|
+
"y": {"type": "string"},
|
|
235
|
+
"kid": {"type": "string"}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
},
|
|
239
|
+
"additionalProperties": false
|
|
240
|
+
}
|
|
241
|
+
},
|
|
242
|
+
"additionalProperties": false
|
|
243
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import importlib.resources
|
|
4
|
+
import json
|
|
5
|
+
from functools import lru_cache
|
|
6
|
+
from typing import Any, cast
|
|
7
|
+
|
|
8
|
+
import jsonschema
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@lru_cache(maxsize=1)
|
|
12
|
+
def _schema() -> dict[str, Any]:
|
|
13
|
+
ref = importlib.resources.files("agentrust_trace") / "schema" / "trace-v0.1.json"
|
|
14
|
+
return cast(dict[str, Any], json.loads(ref.read_text(encoding="utf-8")))
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@lru_cache(maxsize=1)
|
|
18
|
+
def _validator() -> jsonschema.Draft202012Validator:
|
|
19
|
+
return jsonschema.Draft202012Validator(_schema())
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# Canonical schema exposed for downstream tooling that needs the raw dict.
|
|
23
|
+
SCHEMA: dict[str, Any] = _schema()
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def validate_json(record: dict[str, Any]) -> None:
|
|
27
|
+
"""Validate *record* against the canonical TRACE v0.1 JSON Schema.
|
|
28
|
+
|
|
29
|
+
Raises :class:`jsonschema.ValidationError` on the first violation found.
|
|
30
|
+
Use :func:`iter_errors` for all violations.
|
|
31
|
+
"""
|
|
32
|
+
_validator().validate(record)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def iter_errors(record: dict[str, Any]) -> list[jsonschema.exceptions.ValidationError]:
|
|
36
|
+
"""Return all JSON Schema violations for *record* (empty list if valid)."""
|
|
37
|
+
return list(_validator().iter_errors(record))
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: agentrust-trace
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: TRACE v0.1 — hardware-attested governance records for AI agents
|
|
5
|
+
Project-URL: Homepage, https://github.com/agentrust-io/trace-spec
|
|
6
|
+
Project-URL: Repository, https://github.com/agentrust-io/trace-spec
|
|
7
|
+
Project-URL: Issues, https://github.com/agentrust-io/trace-spec/issues
|
|
8
|
+
Project-URL: Changelog, https://github.com/agentrust-io/trace-spec/blob/main/CHANGELOG.md
|
|
9
|
+
License: Apache-2.0
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: ai-governance,attestation,confidential-computing,eat,rats,tee,trace
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
19
|
+
Classifier: Topic :: Security
|
|
20
|
+
Classifier: Typing :: Typed
|
|
21
|
+
Requires-Python: >=3.11
|
|
22
|
+
Requires-Dist: jsonschema>=4.20
|
|
23
|
+
Requires-Dist: pydantic>=2.0
|
|
24
|
+
Provides-Extra: dev
|
|
25
|
+
Requires-Dist: mypy>=1.10; extra == 'dev'
|
|
26
|
+
Requires-Dist: pytest-cov>=5.0; extra == 'dev'
|
|
27
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
28
|
+
Requires-Dist: ruff>=0.4; extra == 'dev'
|
|
29
|
+
Requires-Dist: types-jsonschema; extra == 'dev'
|
|
30
|
+
Description-Content-Type: text/markdown
|
|
31
|
+
|
|
32
|
+
<p align="center">
|
|
33
|
+
<img src="docs/assets/icon.svg" width="96" height="96" alt="TRACE"/>
|
|
34
|
+
</p>
|
|
35
|
+
|
|
36
|
+
# TRACE — Trust Runtime Attestation and Compliance Evidence
|
|
37
|
+
|
|
38
|
+
An open specification for hardware-attested AI agent governance records. TRACE defines the format, anchoring protocol, and verification rules for cryptographically provable evidence that an AI agent ran under a specific policy, in a verified hardware environment, on classified data, invoking identified tools — bound into a single signed artifact rooted in silicon attestation.
|
|
39
|
+
|
|
40
|
+
## What a TRACE Trust Record Is
|
|
41
|
+
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"eat_profile": "tag:agentrust.io,2026:trace-v0.1",
|
|
45
|
+
"iat": 1750676142,
|
|
46
|
+
"subject": "spiffe://trust.example.org/agent/payments-processor/prod",
|
|
47
|
+
"model": {
|
|
48
|
+
"provider": "anthropic",
|
|
49
|
+
"model_id": "claude-sonnet-4-6",
|
|
50
|
+
"version": "20251001",
|
|
51
|
+
"weights_digest": "sha256:a3f8d2c1..."
|
|
52
|
+
},
|
|
53
|
+
"runtime": {
|
|
54
|
+
"platform": "amd-sev-snp",
|
|
55
|
+
"measurement": "sha384:c9e4b1d2e3f4...",
|
|
56
|
+
"rim_uri": "https://kdsintf.amd.com/vcek/v1/..."
|
|
57
|
+
},
|
|
58
|
+
"policy": {
|
|
59
|
+
"bundle_hash": "sha256:b2c3d4e5...",
|
|
60
|
+
"enforcement_mode": "enforce",
|
|
61
|
+
"version": "1.2.0"
|
|
62
|
+
},
|
|
63
|
+
"data_class": "confidential",
|
|
64
|
+
"tool_transcript": {
|
|
65
|
+
"hash": "sha256:d4e5f6a7...",
|
|
66
|
+
"call_count": 3
|
|
67
|
+
},
|
|
68
|
+
"build_provenance": {
|
|
69
|
+
"slsa_level": 2,
|
|
70
|
+
"builder": "https://github.com/slsa-framework/slsa-github-generator",
|
|
71
|
+
"digest": "sha256:e5f6a7b8..."
|
|
72
|
+
},
|
|
73
|
+
"appraisal": {
|
|
74
|
+
"status": "affirming",
|
|
75
|
+
"verifier": "https://trust-authority.example.org",
|
|
76
|
+
"policy_ref": "https://trust-authority.example.org/policy/agent-v1"
|
|
77
|
+
},
|
|
78
|
+
"transparency": "https://registry.agentrust.io/claim/trace-2026-06-23T09:15:42Z-f2a8d1",
|
|
79
|
+
"cnf": {
|
|
80
|
+
"jwk": {"kty": "EC", "crv": "P-256", "x": "MEkwEw...", "y": "..."}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
The record is a single EAT envelope (RFC 9711). Each field is independently verifiable. No callback to the issuer is required.
|
|
86
|
+
|
|
87
|
+
## Specification
|
|
88
|
+
|
|
89
|
+
- [`spec/trace-v0.1.md`](spec/trace-v0.1.md) — full specification
|
|
90
|
+
- [`schema/trace-claim.json`](schema/trace-claim.json) — JSON Schema
|
|
91
|
+
- [`examples/`](examples/) — example Trust Records for Intel TDX, AMD SEV-SNP, and NVIDIA H100
|
|
92
|
+
|
|
93
|
+
## Standards composition
|
|
94
|
+
|
|
95
|
+
TRACE profiles existing standards rather than replacing them:
|
|
96
|
+
|
|
97
|
+
| Primitive | Role in TRACE |
|
|
98
|
+
|---|---|
|
|
99
|
+
| RATS / EAT (RFC 9711) | Wire envelope and claim model |
|
|
100
|
+
| SLSA Provenance v1.0 | Build-time provenance (`build_provenance`) |
|
|
101
|
+
| SPIFFE SVID | Workload identity (`subject`) |
|
|
102
|
+
| SCITT | Append-only transparency anchoring (`transparency`) |
|
|
103
|
+
| EAR (draft-ietf-rats-ar4si) | Verifier appraisal output (`appraisal`) |
|
|
104
|
+
| MCP / A2A | Agent tool-call transcript surface (`tool_transcript`) |
|
|
105
|
+
| AIBOM (SPDX 3.0 / CycloneDX 1.7) | Model component inventory (`model`) |
|
|
106
|
+
|
|
107
|
+
## Reference implementation
|
|
108
|
+
|
|
109
|
+
[agentrust-io/cmcp](https://github.com/agentrust-io/cmcp) — Confidential MCP Gateway. Hardware-attested policy enforcement at the MCP tool-call boundary on Intel TDX, AMD SEV-SNP, and NVIDIA H100/Blackwell.
|
|
110
|
+
|
|
111
|
+
## Registry
|
|
112
|
+
|
|
113
|
+
A public append-only Merkle registry of TRACE Trust Record anchors: [agentrust-io/trace-registry](https://github.com/agentrust-io/trace-registry).
|
|
114
|
+
|
|
115
|
+
## Status
|
|
116
|
+
|
|
117
|
+
Draft v0.1 — publishing at Confidential Computing Summit, San Francisco, June 23 2026. Targeting submission to the [Agentic AI Foundation (AAIF)](https://agenticai.foundation) under the Linux Foundation.
|
|
118
|
+
|
|
119
|
+
## License
|
|
120
|
+
|
|
121
|
+
Creative Commons Attribution 4.0 International (CC BY 4.0)
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
agentrust_trace/__init__.py,sha256=4gC8kls9mXPfas2o_5fGdcGCY1vYyrT3TjyqII04p3o,633
|
|
2
|
+
agentrust_trace/models.py,sha256=aqOey_GnF75vERCHANSGDOq4fvFrXCqcwLodwGOxSVk,2721
|
|
3
|
+
agentrust_trace/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
+
agentrust_trace/validate.py,sha256=e8HkiiQ0MY8rJ6k8TfJvkjLLELFNd0kFx7xmq6WyekU,1130
|
|
5
|
+
agentrust_trace/schema/trace-v0.1.json,sha256=csfXAh_K-3dCjZwpxAXyiydvfxui2nT8XIgVY2msYhE,8281
|
|
6
|
+
agentrust_trace-0.1.0.dist-info/METADATA,sha256=p3WWLeMVWzbDF5vLuaQxQRxUM_bnqt_uVT-L98mRqa0,4793
|
|
7
|
+
agentrust_trace-0.1.0.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
|
|
8
|
+
agentrust_trace-0.1.0.dist-info/licenses/LICENSE,sha256=PjaoS-amJGME7ximD1Llf74eQ7IlQ8a-CERUAl0IKxc,1614
|
|
9
|
+
agentrust_trace-0.1.0.dist-info/RECORD,,
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
The TRACE specification and this repository use a dual license:
|
|
2
|
+
|
|
3
|
+
SPECIFICATION TEXT (spec/*.md, README.md, CHANGELOG.md)
|
|
4
|
+
=========================================================
|
|
5
|
+
Creative Commons Attribution 4.0 International (CC BY 4.0)
|
|
6
|
+
https://creativecommons.org/licenses/by/4.0/
|
|
7
|
+
|
|
8
|
+
You are free to share and adapt the specification text for any purpose,
|
|
9
|
+
including commercial, provided you give appropriate credit, link to the
|
|
10
|
+
license, and indicate if changes were made.
|
|
11
|
+
|
|
12
|
+
SCHEMA, EXAMPLES, AND CODE (schema/, examples/, .github/)
|
|
13
|
+
==========================================================
|
|
14
|
+
Apache License, Version 2.0
|
|
15
|
+
https://www.apache.org/licenses/LICENSE-2.0
|
|
16
|
+
|
|
17
|
+
Copyright 2026 OPAQUE Systems, Inc.
|
|
18
|
+
|
|
19
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
20
|
+
you may not use these files except in compliance with the License.
|
|
21
|
+
You may obtain a copy of the License at
|
|
22
|
+
|
|
23
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
24
|
+
|
|
25
|
+
Unless required by applicable law or agreed to in writing, software
|
|
26
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
27
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
28
|
+
See the License for the specific language governing permissions and
|
|
29
|
+
limitations under the License.
|
|
30
|
+
|
|
31
|
+
PATENT PROMISE
|
|
32
|
+
==============
|
|
33
|
+
OPAQUE Systems, Inc. grants a royalty-free, worldwide, non-exclusive
|
|
34
|
+
license under any patent claims it controls that are necessarily infringed
|
|
35
|
+
by a conforming implementation of this specification, for the purpose of
|
|
36
|
+
implementing or operating a product that conforms to this specification.
|
|
37
|
+
This promise applies to v0.1 and all subsequent versions of TRACE.
|