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
7 changes: 4 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ TRACE only works as a standard if it is genuinely neutral. Integrations are list
|---|---|---|---|
| [claude-code](claude-code/) | agentrust-io | agent-manifest, trace | community |
| [Agent Passport System](integrations/aeoess-aps/) | aeoess | trace | community |
| [cA2A Cross-Operator Delegation](integrations/agentrust-ca2a-cross-operator/) | agentrust-io | ca2a | community |
| [comply54](integrations/comply54/) | comply54 | trace | community |
| [DecisionAssure](integrations/decisionassure/) | DecisionAssure (a1k7) | trace | community |
| [Google ADK](integrations/google-adk/) | agentrust-io | trace | community |
Expand Down Expand Up @@ -99,9 +100,9 @@ the record rather than from a README. None of the three is a parameter.
**Note on the Copilot, Cursor, Windsurf and Gemini CLI entries.** Each is a
pull-request status check rather than a session hook, because all four agents'
composition lives in the repository rather than a developer's home directory.
Each emits no TRACE record and no Agent Manifest, so each claims neither:
`integrates_with` offers only `cmcp`, `trace` and `agent-manifest`, and asserting
one today would be an unverifiable claim.
Each emits no TRACE record and no Agent Manifest, so each claims neither. None
currently produces or consumes one of the supported AgenTrust artifacts or
protocols, and asserting otherwise would be an unverifiable claim.

That is currently blocked on a spec question rather than on implementation, tracked
in [agent-manifest#256](https://github.com/agentrust-io/agent-manifest/issues/256).
Expand Down
2 changes: 1 addition & 1 deletion integrations/_template/integration.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
name: Example Product
vendor: Example Corp
integrates_with:
- cmcp # one or more of: cmcp, trace, agent-manifest, wcm
- cmcp # one or more of: cmcp, trace, agent-manifest, wcm, ca2a
description: >-
One technical sentence describing what this integration does.
maintainer:
Expand Down
67 changes: 67 additions & 0 deletions integrations/agentrust-ca2a-cross-operator/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# cA2A cross-operator delegation tutorial

This runnable example shows what happens when an agent at one operator gives a
limited task to an agent at another operator. The child agent gets only the
permissions both sides allow. The task is encrypted to the child's attested key,
and each hop leaves evidence that an auditor can check later without contacting
either operator.

Source: [cross-operator delegation example](https://github.com/agentrust-io/ca2a/tree/main/examples/cross-operator-delegation)

## Run it

```bash
git clone https://github.com/agentrust-io/ca2a.git
cd ca2a
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
python -m pip install -e ".[dev]"
python examples/cross-operator-delegation/demo.py
```

Expected final line:

```text
KEY RESULT: 12/12 checks passed
```

The checks cover independent operator keys, mutual channel-key binding,
permission narrowing, local Cedar policy, an allowed call, a denied call,
task sealing, changed-binary detection, and offline verification of the signed
delegation chain and hash-linked provenance DAG.

## Check the saved evidence

The demo writes `chain.json` and `dag.json`. It then verifies both with the cA2A
command line tool. You can repeat those checks later without running the agents:

```bash
cd examples/cross-operator-delegation
ca2a validate-config --config ca2a-config.yaml
ca2a verify-chain --chain chain.json --trusted-root-issuer <root-issuer-hex>
ca2a verify-dag --dag dag.json --chain chain.json \
--trusted-root-issuer <root-issuer-hex>
```

The demo prints the root issuer value needed by the last two commands.

## What is real

- The delegation signatures, chain continuity, permission narrowing, depth and
replay checks are real cryptographic checks.
- The child really intersects delegated permissions with its local Cedar policy.
- The task is really sealed to the child's bound key.
- The provenance records are really hash-linked and checked against the signed
delegation chain.
- Changing the saved chain or DAG makes the verifier exit with an error.

## What is simulated

The SEV-SNP attestation evidence is synthetic. It exercises the protocol and
measurement checks, but it does not prove that this run happened on genuine AMD
hardware or that keys stayed inside a trusted execution environment. The runtime
configuration is also advisory because this example runs offline, not over a live
agent transport.

Use this tutorial to understand the flow and inspect the evidence. Do not use its
synthetic attestation as proof of a production workload.
16 changes: 16 additions & 0 deletions integrations/agentrust-ca2a-cross-operator/integration.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
name: cA2A Cross-Operator Delegation
vendor: agentrust-io
integrates_with:
- ca2a
description: >-
Runnable 12-check tutorial for scoped delegation, local policy enforcement,
sealed tasks, tamper detection, and offline provenance verification.
maintainer:
github: imran-siddique
repository: https://github.com/agentrust-io/ca2a
license: Apache-2.0
tier: community
marketplace:
category: Developer tools
mark: A2A
keywords: [delegation, policy, provenance, tutorial, cross-operator]
26 changes: 25 additions & 1 deletion marketplace/catalog.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"catalog_version": 1,
"count": 32,
"count": 33,
"integrations": [
{
"name": "Claude Code",
Expand Down Expand Up @@ -225,6 +225,30 @@
"attestation"
]
},
{
"name": "cA2A Cross-Operator Delegation",
"package_name": "cA2A Cross-Operator Delegation",
"vendor": "agentrust-io",
"description": "Runnable 12-check tutorial for scoped delegation, local policy enforcement, sealed tasks, tamper detection, and offline provenance verification.",
"path": "integrations/agentrust-ca2a-cross-operator",
"url": "https://github.com/agentrust-io/integrations/tree/main/integrations/agentrust-ca2a-cross-operator",
"homepage": null,
"repository": "https://github.com/agentrust-io/ca2a",
"tier": "community",
"stack": [
"cA2A"
],
"category": "Developer tools",
"mark": "A2A",
"featured": null,
"keywords": [
"delegation",
"policy",
"provenance",
"tutorial",
"cross-operator"
]
},
{
"name": "comply54",
"package_name": "comply54",
Expand Down
2 changes: 1 addition & 1 deletion schema/integration.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
"uniqueItems": true,
"items": {
"type": "string",
"enum": ["cmcp", "trace", "agent-manifest", "wcm"]
"enum": ["cmcp", "trace", "agent-manifest", "wcm", "ca2a"]
},
"description": "Which parts of the stack this integrates with."
},
Expand Down
8 changes: 7 additions & 1 deletion scripts/generate_marketplace_catalog.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,13 @@


CATALOG_VERSION = 1
STACK_LABELS = {"trace": "TRACE", "cmcp": "cMCP", "agent-manifest": "Agent Manifest", "wcm": "WCM"}
STACK_LABELS = {
"trace": "TRACE",
"cmcp": "cMCP",
"agent-manifest": "Agent Manifest",
"wcm": "WCM",
"ca2a": "cA2A",
}
REPOSITORY_TREE = "https://github.com/agentrust-io/integrations/tree/main/"


Expand Down
10 changes: 10 additions & 0 deletions tests/test_generate_marketplace_catalog.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,16 @@ def test_wcm_manifests_carry_the_wcm_stack_label(tmp_path: Path) -> None:
assert catalog["integrations"][0]["category"] == "Model & weight custody"


def test_ca2a_manifests_carry_the_ca2a_stack_label(tmp_path: Path) -> None:
document = _manifest("Cross-operator")
document["integrates_with"] = ["ca2a"]
_write_repository(tmp_path, [("integrations/cross-operator", document)])

catalog = build_catalog(tmp_path)

assert catalog["integrations"][0]["stack"] == ["cA2A"]


def test_render_is_deterministic(tmp_path: Path) -> None:
_write_repository(tmp_path, [("integrations/alpha", _manifest("Alpha"))])
assert render(tmp_path) == render(tmp_path)
Expand Down
Loading