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

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions claude-code/engine/capture.py
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,7 @@ def build_manifest(cur: dict) -> dict:
for t in cur["tools"]
]
return {
"@context": "https://agentmanifest.agentrust.io/v0.1/context.json",
"@context": "https://agentmanifest.agentrust-io.com/v0.1/context.json",
"@type": "AgentManifest",
"manifest_id": _uuid7(),
"agent_id": cur["agent_id"],
Expand Down Expand Up @@ -337,7 +337,7 @@ def build_manifest(cur: dict) -> dict:

def build_trace(cur: dict) -> dict:
return {
"eat_profile": "tag:agentrust.io,2026:trace-v0.1",
"eat_profile": "tag:agentrust-io.com,2026:trace-v0.2",
"iat": int(time.time()),
"subject": cur["agent_id"],
"model": {k: cur["model"][k] for k in ("provider", "model_id", "version")},
Expand All @@ -346,7 +346,7 @@ def build_trace(cur: dict) -> dict:
"data_class": cur["data_class"],
"build_provenance": {"slsa_level": 0, "digest": cur["hashes"]["tool_catalog"]},
"appraisal": {"status": "none", "verifier": "https://claude-code.local"},
"transparency": "https://registry.agentrust.io/claim/placeholder",
"transparency": "https://registry.agentrust-io.com/claim/placeholder",
}


Expand Down
4 changes: 2 additions & 2 deletions claude-code/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@
# --sign): the Agent Manifest and the TRACE Trust Record. Verified against the
# PyPI releases below in a clean virtualenv.
agent-manifest>=0.3
agentrust-trace>=0.3
agentrust-trace-tests>=0.2
agentrust-trace>=0.5
agentrust-trace-tests>=0.4,<0.5
4 changes: 2 additions & 2 deletions decisionassure/da_to_trace.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
"""
DecisionAssure -> TRACE v0.1 Adapter
DecisionAssure -> TRACE v0.2 Adapter
Outputs a signed JWT (Ed25519) that conforms to TRACE spec at Level 0.

Usage:
Expand Down Expand Up @@ -44,7 +44,7 @@ def map_decisionassure_to_trace(da_trace: dict) -> dict:
bundle_hash = f"sha256:{hashlib.sha256(bundle_input).hexdigest()}"

return {
"eat_profile": "tag:agentrust.io,2026:trace-v0.1",
"eat_profile": "tag:agentrust-io.com,2026:trace-v0.2",
"iat": iat,
"subject": f"spiffe://decisionassure.io/agent/{trace_id}",
"model": {
Expand Down
6 changes: 3 additions & 3 deletions integrations/comply54/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# comply54 → TRACE Adapter

Converts a [comply54](https://github.com/comply54/comply54) `ComplianceResult` JSON into a **signed TRACE v0.1 JWT** (Ed25519).
Converts a [comply54](https://github.com/comply54/comply54) `ComplianceResult` JSON into a **signed TRACE v0.2 JWT** (Ed25519).

comply54 evaluates AI agent actions against African regulatory frameworks (NDPA 2023, CBN Transaction Controls, KDPA 2019, POPIA, and 9 other jurisdictions). This adapter maps the compliance decision into the TRACE attestation format so the policy outcome becomes a cryptographically verifiable evidence record.

Expand All @@ -10,7 +10,7 @@ comply54 evaluates AI agent actions against African regulatory frameworks (NDPA

| Check | Status |
|-------|--------|
| `eat_profile` = `tag:agentrust.io,2026:trace-v0.1` | ✅ |
| `eat_profile` = `tag:agentrust-io.com,2026:trace-v0.2` | ✅ |
| `iat` (integer Unix timestamp) | ✅ |
| `subject` (SPIFFE URI) | ✅ |
| `cnf.jwk` with Ed25519 public key | ✅ |
Expand Down Expand Up @@ -106,7 +106,7 @@ python src/comply54_to_trace.py result.json

## What is verified

- `eat_profile` is exactly `tag:agentrust.io,2026:trace-v0.1`
- `eat_profile` is exactly `tag:agentrust-io.com,2026:trace-v0.2`
- `policy.bundle_hash` is `sha256:` + hex(SHA-256(JSON-sorted pack IDs)) — reproducible from the same comply54 result
- `appraisal.status` matches the comply54 decision using the mapping table above
- `comply54.audit_id` matches the `audit_id` from the source ComplianceResult
Expand Down
2 changes: 1 addition & 1 deletion integrations/comply54/requirements.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
PyJWT>=2.8.0
cryptography>=42.0.0
agentrust-trace-tests>=0.1.0
agentrust-trace-tests>=0.4,<0.5
8 changes: 4 additions & 4 deletions integrations/comply54/src/comply54_to_trace.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/usr/bin/env python3
"""
comply54 -> TRACE v0.1 Adapter
Reads a comply54 ComplianceResult JSON and emits a signed TRACE v0.1 JWT (Ed25519).
comply54 -> TRACE v0.2 Adapter
Reads a comply54 ComplianceResult JSON and emits a signed TRACE v0.2 JWT (Ed25519).
Conforms to TRACE spec at Level 0 (software-only; no hardware TEE attestation).

Usage:
Expand Down Expand Up @@ -94,7 +94,7 @@ def comply54_to_trace_payload(result: dict, agent_id: str, model: str, key=None)

return {
# ── Required TRACE EAT envelope ──────────────────────────────────────
"eat_profile": "tag:agentrust.io,2026:trace-v0.1",
"eat_profile": "tag:agentrust-io.com,2026:trace-v0.2",
"iat": int(time.time()),
"subject": f"spiffe://comply54.io/agent/{agent_id}",

Expand Down Expand Up @@ -159,7 +159,7 @@ def comply54_to_trace_payload(result: dict, agent_id: str, model: str, key=None)
# ── CLI ───────────────────────────────────────────────────────────────────────

def main() -> None:
parser = argparse.ArgumentParser(description="Convert comply54 ComplianceResult to TRACE v0.1 JWT")
parser = argparse.ArgumentParser(description="Convert comply54 ComplianceResult to TRACE v0.2 JWT")
parser.add_argument("result_json", help="Path to comply54 ComplianceResult JSON file")
parser.add_argument("--agent-id", default="fintech-agent", help="Agent SPIFFE identity suffix")
parser.add_argument("--model", default="unknown/unknown", help="Model in provider/model-id format")
Expand Down
6 changes: 3 additions & 3 deletions integrations/comply54/tests/fixtures/trace-claim.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "tag:agentrust.io,2026:trace-claim-v0.1-schema",
"description": "TRACE v0.1 JWT payload — core envelope. Private/extension claims (e.g. comply54.*) are carried outside this schema per RFC 7519 §4.3.",
"$id": "tag:agentrust-io.com,2026:trace-claim-v0.2-schema",
"description": "TRACE v0.2 JWT payload — core envelope. Private/extension claims (e.g. comply54.*) are carried outside this schema per RFC 7519 §4.3.",
"type": "object",
"additionalProperties": false,
"required": [
Expand All @@ -20,7 +20,7 @@
"properties": {
"eat_profile": {
"type": "string",
"const": "tag:agentrust.io,2026:trace-v0.1"
"const": "tag:agentrust-io.com,2026:trace-v0.2"
},
"iat": {
"type": "integer",
Expand Down
8 changes: 4 additions & 4 deletions integrations/comply54/tests/test_comply54_to_trace.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
"""
Tests for comply54 -> TRACE v0.1 adapter.
Tests for comply54 -> TRACE v0.2 adapter.
Run: pip install -r requirements.txt && python -m pytest tests/ -v
"""

Expand Down Expand Up @@ -105,7 +105,7 @@ def test_audit_maps_to_warning(self):
class TestTraceEnvelope:
def test_eat_profile_present(self):
payload = comply54_to_trace_payload(ALLOW_RESULT, "agent-1", "anthropic/claude-sonnet-4-6")
assert payload["eat_profile"] == "tag:agentrust.io,2026:trace-v0.1"
assert payload["eat_profile"] == "tag:agentrust-io.com,2026:trace-v0.2"

def test_iat_is_integer(self):
payload = comply54_to_trace_payload(ALLOW_RESULT, "agent-1", "anthropic/claude-sonnet-4-6")
Expand Down Expand Up @@ -188,7 +188,7 @@ def test_signed_jwt_is_decodable(self):
payload = comply54_to_trace_payload(DENY_RESULT, "agent-1", "anthropic/claude-sonnet-4-6", key=key)
token = pyjwt.encode(payload, key, algorithm="EdDSA", headers={"alg": "EdDSA", "typ": "JWT"})
decoded = pyjwt.decode(token, options={"verify_signature": False})
assert decoded["eat_profile"] == "tag:agentrust.io,2026:trace-v0.1"
assert decoded["eat_profile"] == "tag:agentrust-io.com,2026:trace-v0.2"
assert decoded["appraisal"]["status"] == "contraindicated"

def test_signed_jwt_has_three_parts(self):
Expand All @@ -203,7 +203,7 @@ def test_signature_is_cryptographically_verified(self):
token = pyjwt.encode(payload, key, algorithm="EdDSA", headers={"alg": "EdDSA", "typ": "JWT"})
public_key = key.public_key()
decoded = pyjwt.decode(token, public_key, algorithms=["EdDSA"])
assert decoded["eat_profile"] == "tag:agentrust.io,2026:trace-v0.1"
assert decoded["eat_profile"] == "tag:agentrust-io.com,2026:trace-v0.2"
assert decoded["cnf"]["jwk"]["kty"] == "OKP"


Expand Down
2 changes: 1 addition & 1 deletion integrations/sentinel/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

Runtime behavioral anomaly detection, collusion detection, and quarantine for
agent fleets. Sentinel scores incoming agent traces, decides whether to admit,
review, or deny an action, and emits an Ed25519-signed TRACE v0.1 record for
review, or deny an action, and emits an Ed25519-signed TRACE v0.2 record for
every enforcement.

## Features
Expand Down
10 changes: 5 additions & 5 deletions integrations/sentinel/sentinel/trace_claim_generator.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"""
Agent Sentinel -> TRACE v0.1 claim generator.
Agent Sentinel -> TRACE v0.2 claim generator.

Every enforcement event is emitted as an Ed25519-signed TRACE v0.1 JWT,
Every enforcement event is emitted as an Ed25519-signed TRACE v0.2 JWT,
conformant at Level 0 (software-only; no hardware TEE attestation).

Signing is mandatory. Sentinel will not emit an unsigned governance claim.
Expand Down Expand Up @@ -77,7 +77,7 @@ def _isoified(value: Any) -> Any:

@dataclass
class SignedTraceClaim:
payload: Dict[str, Any] # canonical TRACE v0.1 EAT payload (includes cnf.jwk)
payload: Dict[str, Any] # canonical TRACE v0.2 EAT payload (includes cnf.jwk)
token: str # EdDSA-signed JWT, offline-verifiable against cnf.jwk

def to_json(self) -> str:
Expand Down Expand Up @@ -114,9 +114,9 @@ def build_payload(
provider, _, model_id = model.partition("/")
return {
# Required TRACE EAT envelope
"eat_profile": "tag:agentrust.io,2026:trace-v0.1",
"eat_profile": "tag:agentrust-io.com,2026:trace-v0.2",
"iat": int(time.time()),
"subject": f"spiffe://agentrust.io/agent/{agent_id}",
"subject": f"spiffe://agentrust-io.com/agent/{agent_id}",
# Confirmation key: the Ed25519 public key that signs this claim
"cnf": {"jwk": private_key_to_jwk(key)},
"model": {
Expand Down
4 changes: 2 additions & 2 deletions integrations/sentinel/tests/test_trace_conformance.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"""TRACE v0.1 Level 0 conformance for Agent Sentinel's emitted records.
"""TRACE v0.2 Level 0 conformance for Agent Sentinel's emitted records.

Runs the agentrust-trace-tests Level 0 suite (TR-ENV, TR-SIG, TR-POL) against
records produced by the signed claim generator, plus a signature round-trip.
Expand Down Expand Up @@ -71,6 +71,6 @@ def test_signature_verifies_against_cnf_jwk(self, generator):
claim = generator.generate_claim(ENFORCE_EVENT, agent_id="alice", decision="DENY")
public_key = generator._key().public_key()
decoded = pyjwt.decode(claim.token, public_key, algorithms=["EdDSA"])
assert decoded["eat_profile"] == "tag:agentrust.io,2026:trace-v0.1"
assert decoded["eat_profile"] == "tag:agentrust-io.com,2026:trace-v0.2"
assert decoded["appraisal"]["status"] == "contraindicated"
assert decoded["cnf"]["jwk"] == private_key_to_jwk(generator._key())
2 changes: 1 addition & 1 deletion integrations/spendguard/spendguard_trace.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
from pathlib import Path
from typing import Any

EAT_PROFILE = "tag:agentrust.io,2026:trace-v0.1"
EAT_PROFILE = "tag:agentrust-io.com,2026:trace-v0.2"
VERIFIER = "agentic-spendguard-agentrust-exporter"
# SpendGuard's exporter asserts SLSA level 1 for its fixture builder; carried
# through unchanged so this record matches the upstream golden outputs.
Expand Down
6 changes: 3 additions & 3 deletions plugins/agentrust-codex/engine/capture.py
Original file line number Diff line number Diff line change
Expand Up @@ -662,7 +662,7 @@ def build_manifest(current: Mapping[str, Any]) -> Dict[str, Any]:
for key, value in sorted(current.get("policy_scope", {}).items())
] or ["codex:configuration"]
return {
"@context": "https://agentmanifest.agentrust.io/v0.1/context.json",
"@context": "https://agentmanifest.agentrust-io.com/v0.1/context.json",
"@type": "AgentManifest",
"manifest_id": _uuid7(),
"agent_id": current["agent_id"],
Expand Down Expand Up @@ -712,7 +712,7 @@ def build_manifest(current: Mapping[str, Any]) -> Dict[str, Any]:

def build_trace(current: Mapping[str, Any]) -> Dict[str, Any]:
return {
"eat_profile": "tag:agentrust.io,2026:trace-v0.1",
"eat_profile": "tag:agentrust-io.com,2026:trace-v0.2",
"iat": int(time.time()),
"subject": current["agent_id"],
"model": {
Expand All @@ -734,7 +734,7 @@ def build_trace(current: Mapping[str, Any]) -> Dict[str, Any]:
"digest": current["hashes"]["plugin_set"],
},
"appraisal": {"status": "none", "verifier": "https://codex.local"},
"transparency": "https://registry.agentrust.io/claim/placeholder",
"transparency": "https://registry.agentrust-io.com/claim/placeholder",
}


Expand Down
4 changes: 2 additions & 2 deletions scheduled-agents/engine/capture.py
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ def build_trace(cur: dict) -> dict:
only: Level 0, no hardware attestation on a normal dev box. enforcement_mode
is 'advisory' because this warns, it does not block a routine from running."""
return {
"eat_profile": "tag:agentrust.io,2026:trace-v0.1",
"eat_profile": "tag:agentrust-io.com,2026:trace-v0.2",
"iat": int(time.time()),
"subject": cur["agent_id"],
"model": {"provider": "anthropic", "model_id": "unknown", "version": "unknown"},
Expand All @@ -293,7 +293,7 @@ def build_trace(cur: dict) -> dict:
"data_class": "internal",
"build_provenance": {"slsa_level": 0, "digest": cur["hashes"]["routines_set"]},
"appraisal": {"status": "none", "verifier": "https://claude-code.local"},
"transparency": "https://registry.agentrust.io/claim/placeholder",
"transparency": "https://registry.agentrust-io.com/claim/placeholder",
}


Expand Down
2 changes: 1 addition & 1 deletion schema/integration.schema.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://agentrust.io/schema/integration.schema.json",
"$id": "https://agentrust-io.com/schema/integration.schema.json",
"title": "agentrust-io integration manifest",
"type": "object",
"additionalProperties": false,
Expand Down
Loading