Skip to content

feat(provenance): bind delegation DAG to signed TRACE records#54

Merged
imran-siddique merged 1 commit into
mainfrom
feat/dag-trace-binding
Jul 20, 2026
Merged

feat(provenance): bind delegation DAG to signed TRACE records#54
imran-siddique merged 1 commit into
mainfrom
feat/dag-trace-binding

Conversation

@imran-siddique

Copy link
Copy Markdown
Contributor

What

Binds cA2A's delegation DAG to the TRACE interchange format. Each delegation hop is lifted into a signed TRACE Trust Record carrying the A2A profile delegation block, so a chain of hops is verifiable with the standard TRACE tooling (agentrust-trace, trace-tests, the /trace report), not only cA2A's own verifier. Closes the "Linked runtime evidence" item on the v0.2 roadmap.

How

  • ca2a_runtime.trace_binding: build_trace_record, sign_trace_record, trace_record_hash, emit_dag, and HopContext (with a .software() constructor for the software-attestation path). Records are produced and signed with agentrust-trace (Ed25519 over RFC 8785 JCS), reused rather than reimplemented (ROADMAP Tier 0).
  • ca2a_verify.verify_trace_dag: offline DAG verification (structural validity, trusted-key signatures, unbroken parent links) and cross_check_trace_dag to tie the DAG to the delegation chain. New error TRACE_RECORD_INVALID.
  • delegation.parent_record_hash commits to the parent's full signed record, so a re-signed or tampered parent breaks the child link (tested).
  • examples/trace-dag/: runnable demo (emit, verify offline, Level 0 conformance) + README.

The delegation block already exists in the TRACE v0.1 schema, so no schema change was needed.

Honesty on assurance

Software-mode records are TRACE Level 0 (platform software-only; trace-tests fails software-only at Level 1 by design). Appraisal and transparency URIs use the reserved .invalid TLD so a software-mode record can never be mistaken for a hardware-attested one. An end-to-end run on confidential-computing hardware lifts records to Level 1.

Verification

  • 13 new tests; full suite green (165 on this branch; the 7 not present are test_live_call.py, which lives on the transport branch).
  • ruff + mypy clean on the new files.
  • The external trace-tests CLI independently confirms PASS at Level 0, 8 checks on a record carrying the delegation block.

Dependencies

Adds agentrust-trace>=0.3,<0.4 (runtime) and agentrust-trace-tests>=0.2,<0.3 (dev). Cross-repo version skew is a known risk noted in LIMITATIONS.md.

🤖 Generated with Claude Code

@imran-siddique
imran-siddique force-pushed the feat/dag-trace-binding branch from b7ed3bc to cfa88b6 Compare July 20, 2026 15:34
Lift each cA2A delegation hop into a signed TRACE Trust Record carrying the
A2A profile delegation block, so a chain of hops forms a delegation DAG that
is verifiable with the standard TRACE tooling, not only cA2A's own verifier.

- ca2a_runtime.trace_binding: build_trace_record, sign_trace_record,
  trace_record_hash, emit_dag, HopContext (with a .software() constructor for
  the software-attestation path). Records are produced and signed with
  agentrust-trace (Ed25519 over RFC 8785), reused rather than reimplemented.
- ca2a_verify.verify_trace_dag: offline DAG verification (structural validity,
  trusted-key signatures, unbroken parent links) and cross_check_trace_dag to
  tie the DAG to the delegation chain. New error TRACE_RECORD_INVALID.
- delegation.parent_record_hash commits to the parent's full signed record, so
  a re-signed or tampered parent breaks the child link.
- examples/trace-dag: runnable demo (emit, verify offline, Level 0 conformance).

Software-mode records are honestly TRACE Level 0 (platform software-only); an
end-to-end run on confidential-computing hardware lifts them to Level 1. Adds
the agentrust-trace runtime dependency (agentrust-trace-tests for dev).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@imran-siddique
imran-siddique force-pushed the feat/dag-trace-binding branch from cfa88b6 to 88046d9 Compare July 20, 2026 15:39
@imran-siddique
imran-siddique merged commit a83ae64 into main Jul 20, 2026
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant