diff --git a/claude-code/engine/capture.py b/claude-code/engine/capture.py index 44372e1..dbfa6d2 100644 --- a/claude-code/engine/capture.py +++ b/claude-code/engine/capture.py @@ -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"], @@ -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")}, @@ -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", } diff --git a/claude-code/requirements.txt b/claude-code/requirements.txt index 55d7c3e..815c180 100644 --- a/claude-code/requirements.txt +++ b/claude-code/requirements.txt @@ -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 diff --git a/decisionassure/da_to_trace.py b/decisionassure/da_to_trace.py index 8287d30..a8d165f 100644 --- a/decisionassure/da_to_trace.py +++ b/decisionassure/da_to_trace.py @@ -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: @@ -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": { diff --git a/integrations/comply54/README.md b/integrations/comply54/README.md index 0614981..5c01704 100644 --- a/integrations/comply54/README.md +++ b/integrations/comply54/README.md @@ -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. @@ -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 | ✅ | @@ -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 diff --git a/integrations/comply54/requirements.txt b/integrations/comply54/requirements.txt index e994b21..8560167 100644 --- a/integrations/comply54/requirements.txt +++ b/integrations/comply54/requirements.txt @@ -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 diff --git a/integrations/comply54/src/comply54_to_trace.py b/integrations/comply54/src/comply54_to_trace.py index 2e7eaaf..7fda3ab 100644 --- a/integrations/comply54/src/comply54_to_trace.py +++ b/integrations/comply54/src/comply54_to_trace.py @@ -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: @@ -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}", @@ -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") diff --git a/integrations/comply54/tests/fixtures/trace-claim.json b/integrations/comply54/tests/fixtures/trace-claim.json index 34422d7..ec046be 100644 --- a/integrations/comply54/tests/fixtures/trace-claim.json +++ b/integrations/comply54/tests/fixtures/trace-claim.json @@ -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": [ @@ -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", diff --git a/integrations/comply54/tests/test_comply54_to_trace.py b/integrations/comply54/tests/test_comply54_to_trace.py index b7d9eb5..e0d2735 100644 --- a/integrations/comply54/tests/test_comply54_to_trace.py +++ b/integrations/comply54/tests/test_comply54_to_trace.py @@ -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 """ @@ -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") @@ -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): @@ -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" diff --git a/integrations/sentinel/README.md b/integrations/sentinel/README.md index c8173ea..88e9bb5 100644 --- a/integrations/sentinel/README.md +++ b/integrations/sentinel/README.md @@ -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 diff --git a/integrations/sentinel/sentinel/trace_claim_generator.py b/integrations/sentinel/sentinel/trace_claim_generator.py index e9015bf..055b57e 100644 --- a/integrations/sentinel/sentinel/trace_claim_generator.py +++ b/integrations/sentinel/sentinel/trace_claim_generator.py @@ -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. @@ -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: @@ -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": { diff --git a/integrations/sentinel/tests/test_trace_conformance.py b/integrations/sentinel/tests/test_trace_conformance.py index 9d66b64..972f211 100644 --- a/integrations/sentinel/tests/test_trace_conformance.py +++ b/integrations/sentinel/tests/test_trace_conformance.py @@ -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. @@ -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()) diff --git a/integrations/spendguard/spendguard_trace.py b/integrations/spendguard/spendguard_trace.py index 7330405..03407ab 100644 --- a/integrations/spendguard/spendguard_trace.py +++ b/integrations/spendguard/spendguard_trace.py @@ -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. diff --git a/plugins/agentrust-codex/engine/capture.py b/plugins/agentrust-codex/engine/capture.py index 2c7d5f0..7463884 100644 --- a/plugins/agentrust-codex/engine/capture.py +++ b/plugins/agentrust-codex/engine/capture.py @@ -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"], @@ -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": { @@ -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", } diff --git a/scheduled-agents/engine/capture.py b/scheduled-agents/engine/capture.py index 5360dc7..0a55845 100644 --- a/scheduled-agents/engine/capture.py +++ b/scheduled-agents/engine/capture.py @@ -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"}, @@ -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", } diff --git a/schema/integration.schema.json b/schema/integration.schema.json index 8ea2a17..1ddb5c2 100644 --- a/schema/integration.schema.json +++ b/schema/integration.schema.json @@ -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,