Skip to content

Commit 2f4d588

Browse files
feat(conformance): cA2A-compatible conformance suite
Add tests/conformance/: a normative README defining the cA2A-compatible bar as stable MUST/SHOULD test IDs across six groups (delegation, scope-policy, attestation, sealed channel, provenance, inbound pipeline), each referencing the spec section it validates, plus runnable checks exercising every MUST-level requirement against the reference implementation. Wired into CI (the test job now runs tests/unit and tests/conformance) and documented at docs/spec/conformance.md, tied to the CHARTER trademark language. Attestation requirements validate against synthetic vectors plus the genuine AMD and Intel roots; a production run on hardware is the remaining step for a hardware-attested claim. Suite: 136 passed (113 unit + 23 conformance), 98%. Closes #20 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 2710a8c commit 2f4d588

9 files changed

Lines changed: 520 additions & 151 deletions

File tree

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ jobs:
4040
run: mypy src/ca2a_runtime/ src/ca2a_verify/
4141

4242
- name: Test
43-
run: pytest tests/unit/ -v --tb=short --cov=src --cov-report=xml
43+
run: pytest tests/unit/ tests/conformance/ -v --tb=short --cov=src --cov-report=xml
4444

4545
- name: Upload coverage report
4646
uses: codecov/codecov-action@v7

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1818
- Peer-call enforcement decision core (Tier 2): `ca2a_runtime.policy.LocalPolicy` and `ca2a_runtime.peer` (`effective_scope`, `enforce_peer_call`). Effective permission is the delegated leaf scope intersected with the callee's local policy; a granted call emits a linked provenance record. New error `SCOPE_NOT_PERMITTED`. Claim C3 (scope-policy intersection) is now a validated experiment. Cedar-engine binding of the local policy and live A2A transport wiring remain open.
1919
- Sealed peer channel (Tier 2): `ca2a_runtime.channel` (`SealedChannel`, `generate_channel_keypair`, `open_sealed`). HPKE-style X25519 -> HKDF-SHA256 -> ChaCha20-Poly1305 sealing a payload to the peer's attested key; only the peer's private key opens it, and a wrong key or tampered ciphertext fails closed. Claim C4 (sealed-payload confidentiality) is now a validated experiment at the cryptographic layer. The enclave-binding of the private key (a hardware property) and live-path wiring remain open.
2020
- Cross-operator attestation (Claim C6) validated in software: a two-operator harness composing the SEV-SNP verifier, measurement pinning, and the sealed channel demonstrates independent keys, mutual attestation, confidential cross-operator delegation, and binary-swap detection. Synthetic report vectors (a genuine report needs SEV-SNP hardware); real hardware end to end remains open. **All six claims (C1-C6) are now validated experiments.**
21+
- cA2A-compatible conformance suite: `tests/conformance/` with a normative README (stable MUST/SHOULD test IDs across delegation, scope-policy, attestation, sealed channel, provenance, and the inbound pipeline) and runnable checks that exercise every MUST-level requirement. Wired into CI and documented at `docs/spec/conformance.md`; ties to the CHARTER trademark language.
2122
- Intel TDX attestation backend: `ca2a_runtime.tee.tdx` (DCAP Quote v4 parsing, `TdxProvider`) and `ca2a_verify.tdx.verify_tdx_quote` (PCK chain to a trusted Intel root, QE report signature, attestation-key binding, quote signature, and MRTD/report-data binding), all fail-closed. Chain path validated against the genuine Intel SGX Root CA; multi-level signature path validated with a synthetic self-consistent quote. Quote generation requires a real TDX guest.
2223
- Transport-agnostic inbound peer request handler: `ca2a_runtime.peer.handle_peer_request` with `PeerRequest` / `PeerResult`. Composes the full pipeline (verify chain, intersect scope and enforce, open a sealed payload with the enclave key, emit a linked provenance record) fail-closed. A transport parses its wire format into a `PeerRequest`; cA2A does not define the transport (profile, not protocol).
2324
- RFC 8785 (JSON Canonicalization Scheme) canonicalization: `ca2a_runtime.canonical.canonicalize`. Credential and provenance bodies are now signed over the JCS encoding (UTF-16 key ordering, JCS string escaping, literal non-ASCII, shortest-decimal integers), so cA2A signatures are cross-verifiable with agent-manifest. ASCII credentials are byte-identical to the previous encoding, so existing signatures still verify.

ROADMAP.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,5 @@ Real hardware attestation verification (SEV-SNP VCEK chain, Intel TDX quote via
3939

4040
- Stable delegation credential and TRACE link schema with documented versioning guarantees
4141
- Full RATS/EAT conformance for peer attestation evidence
42-
- Conformance suite for "cA2A-compatible" claims
42+
- Conformance suite for "cA2A-compatible" claims: **landed** (`tests/conformance/`, normative README + runnable MUST-level checks, in CI). A production run on confidential-computing hardware is the remaining step for a hardware-attested claim.
4343
- OWASP liaison on the multi-agent threat mapping; ITI conversation on conformance

docs/SPEC.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ cA2A is a profile, not a transport. It does not define how tasks are moved betwe
2727

2828
## Conformance
2929

30-
An implementation may claim "cA2A-compatible" for a given version when it enforces, on an inbound peer call: delegation chain verification (signature, continuity, attenuation, anti-replay), peer attestation against an expected measurement, payload sealing to that measurement, and emission of a linked TRACE record. Conformance tests are on the roadmap for v1.0.
30+
An implementation may claim "cA2A-compatible" for a given version when it enforces, on an inbound peer call: delegation chain verification (signature, continuity, attenuation, anti-replay), peer attestation against an expected measurement, payload sealing to that measurement, and emission of a linked TRACE record. These requirements are defined as a numbered, runnable conformance suite; see [conformance](spec/conformance.md).
3131

3232
## Relationship to sibling specs
3333

docs/spec/conformance.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Conformance
2+
3+
An implementation may claim **cA2A-compatible** for a given version when it passes all MUST-level tests in the cA2A conformance suite for that version. This ties directly to the trademark language in [CHARTER.md](../../CHARTER.md): the mark asserts that a deployment satisfies the attestation, attenuation, sealing, and provenance requirements defined here.
4+
5+
## The normative suite
6+
7+
The suite is defined in [`tests/conformance/README.md`](https://github.com/agentrust-io/ca2a/blob/main/tests/conformance/README.md). It is a spec document expressed as stable, numbered test IDs grouped by area, each referencing the section it validates. The runnable checks in `tests/conformance/test_profile_conformance.py` exercise every MUST-level requirement against the reference implementation; a third-party implementation is expected to satisfy the same behaviors.
8+
9+
```bash
10+
pip install -e ".[dev]"
11+
pytest tests/conformance/ -v
12+
```
13+
14+
## Requirement groups
15+
16+
| Group | Covers | Spec |
17+
|---|---|---|
18+
| Delegation (`DELEG-*`) | Signature, attenuation, continuity, depth, anti-replay | [delegation-chain.md](delegation-chain.md) |
19+
| Scope-policy (`POLICY-*`) | Effective scope = delegated ∩ local policy | [cedar-policy.md](cedar-policy.md) |
20+
| Attestation (`ATTEST-*`) | Fail-closed providers, measurement, chain, tamper, MRTD | [attestation.md](attestation.md) |
21+
| Sealed channel (`SEAL-*`) | Seal to attested key, no plaintext, tamper fails closed | [sealed-channel.md](sealed-channel.md) |
22+
| Provenance (`PROV-*`) | DAG integrity, tamper detection, bound to authority | [provenance-dag.md](provenance-dag.md) |
23+
| Inbound pipeline (`PIPE-*`) | The handler grants, records, and fails closed correctly | [call-graph.md](call-graph.md) |
24+
25+
## Levels
26+
27+
- **MUST**: required for a cA2A-compatible claim. Partial conformance (MUST only) is sufficient.
28+
- **SHOULD**: recommended; indicates a higher-quality implementation.
29+
30+
Test IDs are stable: once assigned, an ID is never reused even if the test is removed. This lets a conformance report for one version be compared against another.
31+
32+
## Scope note
33+
34+
The attestation requirements are validated against synthetic report and quote vectors plus the genuine AMD and Intel roots, since producing a real report requires confidential-computing hardware. A production conformance run on hardware, and end-to-end validation against a real quote, are the remaining step before a hardware-attested cA2A-compatible claim; see [LIMITATIONS.md](../../LIMITATIONS.md).

mkdocs.yml

Lines changed: 149 additions & 148 deletions
Original file line numberDiff line numberDiff line change
@@ -1,148 +1,149 @@
1-
site_name: cA2A
2-
site_description: Confidential agent-to-agent delegation, attested and attenuated, as a profile on A2A
3-
site_url: https://ca2a.agentrust-io.com
4-
repo_url: https://github.com/agentrust-io/ca2a
5-
repo_name: agentrust-io/ca2a
6-
edit_uri: edit/main/
7-
docs_dir: .
8-
exclude_docs: |
9-
.github/
10-
node_modules/
11-
benchmarks/
12-
src/
13-
tests/
14-
schemas/
15-
examples/
16-
LICENSE
17-
NOTICE
18-
ADOPTERS.md
19-
MAINTAINERS.md
20-
SECURITY.md
21-
CHARTER.md
22-
CODE_OF_CONDUCT.md
23-
pyproject.toml
24-
.gitignore
25-
26-
theme:
27-
name: material
28-
logo: docs/assets/icon.svg
29-
favicon: docs/assets/icon.svg
30-
palette:
31-
- scheme: slate
32-
primary: custom
33-
accent: custom
34-
toggle:
35-
icon: material/brightness-7
36-
name: Switch to light mode
37-
- scheme: default
38-
primary: custom
39-
accent: custom
40-
toggle:
41-
icon: material/brightness-4
42-
name: Switch to dark mode
43-
features:
44-
- navigation.instant
45-
- navigation.tracking
46-
- navigation.tabs
47-
- navigation.tabs.sticky
48-
- navigation.sections
49-
- navigation.top
50-
- navigation.path
51-
- search.suggest
52-
- search.highlight
53-
- content.code.copy
54-
- content.tabs.link
55-
- toc.follow
56-
- header.autohide
57-
icon:
58-
repo: fontawesome/brands/github
59-
font:
60-
text: Inter, system-ui, -apple-system, sans-serif
61-
code: JetBrains Mono, Cascadia Code, monospace
62-
63-
plugins:
64-
- search
65-
- minify:
66-
minify_html: true
67-
- mkdocstrings:
68-
default_handler: python
69-
handlers:
70-
python:
71-
paths: [src]
72-
options:
73-
docstring_style: google
74-
show_source: false
75-
show_root_heading: true
76-
show_root_full_path: false
77-
show_symbol_type_heading: true
78-
show_symbol_type_toc: true
79-
members_order: source
80-
separate_signature: true
81-
show_signature_annotations: true
82-
unwrap_annotated: true
83-
84-
markdown_extensions:
85-
- admonition
86-
- pymdownx.details
87-
- pymdownx.superfences:
88-
custom_fences:
89-
- name: mermaid
90-
class: mermaid
91-
format: !!python/name:pymdownx.superfences.fence_code_format
92-
- pymdownx.tabbed:
93-
alternate_style: true
94-
- pymdownx.highlight:
95-
anchor_linenums: true
96-
- pymdownx.inlinehilite
97-
- pymdownx.snippets
98-
- pymdownx.emoji:
99-
emoji_index: !!python/name:material.extensions.emoji.twemoji
100-
emoji_generator: !!python/name:material.extensions.emoji.to_svg
101-
- attr_list
102-
- md_in_html
103-
- tables
104-
- toc:
105-
permalink: true
106-
107-
extra:
108-
social:
109-
- icon: fontawesome/brands/github
110-
link: https://github.com/agentrust-io/ca2a
111-
generator: false
112-
113-
extra_css:
114-
- docs/stylesheets/extra.css
115-
116-
nav:
117-
- Home: README.md
118-
- Quick Start: docs/quickstart.md
119-
- How It Works: docs/concepts.md
120-
- Configuration: docs/configuration.md
121-
- Tutorials:
122-
- Verify a delegation chain: docs/tutorials/verify-a-delegation-chain.md
123-
- Authoring a delegation credential: docs/tutorials/authoring-a-delegation-credential.md
124-
- Emit and verify provenance: docs/tutorials/emit-and-verify-provenance.md
125-
- Reproducing the claims: docs/tutorials/reproducing-the-claims.md
126-
- Integrating with A2A: docs/tutorials/integrating-with-a2a.md
127-
- Specification:
128-
- Overview: docs/SPEC.md
129-
- A2A Profile: docs/spec/profile.md
130-
- Transport Binding: docs/spec/transport.md
131-
- Component Model: docs/spec/component-model.md
132-
- Inbound Peer-Call Decision: docs/spec/call-graph.md
133-
- Delegation Chain: docs/spec/delegation-chain.md
134-
- Provenance DAG: docs/spec/provenance-dag.md
135-
- Sealed Peer Channel: docs/spec/sealed-channel.md
136-
- Attestation: docs/spec/attestation.md
137-
- Scope-Policy Intersection: docs/spec/cedar-policy.md
138-
- TRACE A2A Profile: docs/spec/trace-a2a-profile.md
139-
- Verification Library: docs/spec/verification-library.md
140-
- Error Codes: docs/spec/error-codes.md
141-
- Failure Modes: docs/spec/failure-modes.md
142-
- Threat Model: docs/spec/threat-model.md
143-
- Project:
144-
- Limitations: LIMITATIONS.md
145-
- Changelog: CHANGELOG.md
146-
- Contributing: CONTRIBUTING.md
147-
- Governance: GOVERNANCE.md
148-
- Roadmap: ROADMAP.md
1+
site_name: cA2A
2+
site_description: Confidential agent-to-agent delegation, attested and attenuated, as a profile on A2A
3+
site_url: https://ca2a.agentrust-io.com
4+
repo_url: https://github.com/agentrust-io/ca2a
5+
repo_name: agentrust-io/ca2a
6+
edit_uri: edit/main/
7+
docs_dir: .
8+
exclude_docs: |
9+
.github/
10+
node_modules/
11+
benchmarks/
12+
src/
13+
tests/
14+
schemas/
15+
examples/
16+
LICENSE
17+
NOTICE
18+
ADOPTERS.md
19+
MAINTAINERS.md
20+
SECURITY.md
21+
CHARTER.md
22+
CODE_OF_CONDUCT.md
23+
pyproject.toml
24+
.gitignore
25+
26+
theme:
27+
name: material
28+
logo: docs/assets/icon.svg
29+
favicon: docs/assets/icon.svg
30+
palette:
31+
- scheme: slate
32+
primary: custom
33+
accent: custom
34+
toggle:
35+
icon: material/brightness-7
36+
name: Switch to light mode
37+
- scheme: default
38+
primary: custom
39+
accent: custom
40+
toggle:
41+
icon: material/brightness-4
42+
name: Switch to dark mode
43+
features:
44+
- navigation.instant
45+
- navigation.tracking
46+
- navigation.tabs
47+
- navigation.tabs.sticky
48+
- navigation.sections
49+
- navigation.top
50+
- navigation.path
51+
- search.suggest
52+
- search.highlight
53+
- content.code.copy
54+
- content.tabs.link
55+
- toc.follow
56+
- header.autohide
57+
icon:
58+
repo: fontawesome/brands/github
59+
font:
60+
text: Inter, system-ui, -apple-system, sans-serif
61+
code: JetBrains Mono, Cascadia Code, monospace
62+
63+
plugins:
64+
- search
65+
- minify:
66+
minify_html: true
67+
- mkdocstrings:
68+
default_handler: python
69+
handlers:
70+
python:
71+
paths: [src]
72+
options:
73+
docstring_style: google
74+
show_source: false
75+
show_root_heading: true
76+
show_root_full_path: false
77+
show_symbol_type_heading: true
78+
show_symbol_type_toc: true
79+
members_order: source
80+
separate_signature: true
81+
show_signature_annotations: true
82+
unwrap_annotated: true
83+
84+
markdown_extensions:
85+
- admonition
86+
- pymdownx.details
87+
- pymdownx.superfences:
88+
custom_fences:
89+
- name: mermaid
90+
class: mermaid
91+
format: !!python/name:pymdownx.superfences.fence_code_format
92+
- pymdownx.tabbed:
93+
alternate_style: true
94+
- pymdownx.highlight:
95+
anchor_linenums: true
96+
- pymdownx.inlinehilite
97+
- pymdownx.snippets
98+
- pymdownx.emoji:
99+
emoji_index: !!python/name:material.extensions.emoji.twemoji
100+
emoji_generator: !!python/name:material.extensions.emoji.to_svg
101+
- attr_list
102+
- md_in_html
103+
- tables
104+
- toc:
105+
permalink: true
106+
107+
extra:
108+
social:
109+
- icon: fontawesome/brands/github
110+
link: https://github.com/agentrust-io/ca2a
111+
generator: false
112+
113+
extra_css:
114+
- docs/stylesheets/extra.css
115+
116+
nav:
117+
- Home: README.md
118+
- Quick Start: docs/quickstart.md
119+
- How It Works: docs/concepts.md
120+
- Configuration: docs/configuration.md
121+
- Tutorials:
122+
- Verify a delegation chain: docs/tutorials/verify-a-delegation-chain.md
123+
- Authoring a delegation credential: docs/tutorials/authoring-a-delegation-credential.md
124+
- Emit and verify provenance: docs/tutorials/emit-and-verify-provenance.md
125+
- Reproducing the claims: docs/tutorials/reproducing-the-claims.md
126+
- Integrating with A2A: docs/tutorials/integrating-with-a2a.md
127+
- Specification:
128+
- Overview: docs/SPEC.md
129+
- A2A Profile: docs/spec/profile.md
130+
- Transport Binding: docs/spec/transport.md
131+
- Component Model: docs/spec/component-model.md
132+
- Inbound Peer-Call Decision: docs/spec/call-graph.md
133+
- Delegation Chain: docs/spec/delegation-chain.md
134+
- Provenance DAG: docs/spec/provenance-dag.md
135+
- Sealed Peer Channel: docs/spec/sealed-channel.md
136+
- Attestation: docs/spec/attestation.md
137+
- Scope-Policy Intersection: docs/spec/cedar-policy.md
138+
- TRACE A2A Profile: docs/spec/trace-a2a-profile.md
139+
- Verification Library: docs/spec/verification-library.md
140+
- Conformance: docs/spec/conformance.md
141+
- Error Codes: docs/spec/error-codes.md
142+
- Failure Modes: docs/spec/failure-modes.md
143+
- Threat Model: docs/spec/threat-model.md
144+
- Project:
145+
- Limitations: LIMITATIONS.md
146+
- Changelog: CHANGELOG.md
147+
- Contributing: CONTRIBUTING.md
148+
- Governance: GOVERNANCE.md
149+
- Roadmap: ROADMAP.md

0 commit comments

Comments
 (0)