Skip to content

feat(industrial-embodied-ai): bind controller execution receipts#29

Closed
carloshvp wants to merge 4 commits into
agentrust-io:mainfrom
carloshvp:feat/embodied-evidence-followup
Closed

feat(industrial-embodied-ai): bind controller execution receipts#29
carloshvp wants to merge 4 commits into
agentrust-io:mainfrom
carloshvp:feat/embodied-evidence-followup

Conversation

@carloshvp

@carloshvp carloshvp commented Jun 17, 2026

Copy link
Copy Markdown
Member

Summary

  • attach mock controller external_execution_evidence receipts to accepted and rejected motion decisions
  • verify receipts with cMCP's external_evidence_keys map in the live agent and offline validator
  • document the receipt boundary and add a development-only controller public key artifact
  • add CI coverage for the industrial embodied-AI unit tests and committed artifact validator

Dependency

Validation

  • python3 -m unittest discover -s industrial-embodied-ai/tests -v
  • PYTHONPATH=/path/to/cmcp/src industrial-embodied-ai/.venv/bin/python industrial-embodied-ai/validate_artifacts.py
  • workflow YAML parse for .github/workflows/*.yml
  • live local run with cMCP #314 source: controller receipts: verified (2)

…rep for #301 example)

Add the example-side half of the #301 follow-up: the independent controller can
now sign an execution receipt for its decision in the cMCP
external_execution_evidence format (issuer, issuer_key_id, signature,
evidence_hash, evidence_type, linked_call_id), using a deterministic
development-only Ed25519 key so committed evidence stays reproducible.

- controller.py: receipt-signing key plus sign_execution_receipt(),
  receipt_key_id, receipt_public_key_b64.
- tests: verify the receipt against cMCP's checks (linked_call_id binding and
  Ed25519 over the canonical receipt), tampered-fails, deterministic key.

This is the standalone part that does not depend on the merged runtime. Held on
this branch until cmcp#301 and cmcp#302 merge.

Post-merge TODO (do not run until the cmcp PRs are merged):
1. Re-pin requirements.txt to the merged cmcp #301/#302 commits (and trace-spec).
2. #301: wire the controller receipt into the safety-reject path per the agreed
   proxy transport, then run the live stack and regenerate trace-output/example-*
   so the safety-reject audit entry carries external_execution_evidence; verify
   with cmcp_verify external_evidence_keys = {receipt_key_id: controller pubkey}.
3. #302: add the agent_manifest section (path, trust_anchor_path,
   authenticated_subject) to cmcp-config.yaml, regenerate evidence so the TRACE
   record carries gateway.agent_identity; verify with cmcp verify --agent-manifest.
4. Update the README evidence-boundaries table for both bindings.

@imran-siddique imran-siddique left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Receipt binding is solid: deterministic dev key clearly marked dev-only, canonical signing matches the cMCP verifier protocol, tests cover tamper/linked_call_id/key-determinism cases. Updating requirements.txt to upstream agentrust-io/cmcp (the feature landed at e7b45e38) before merging.

imran-siddique added a commit that referenced this pull request Jun 22, 2026
#32)

* feat(industrial-embodied-ai): controller-signed execution receipts (prep for #301 example)

Add the example-side half of the #301 follow-up: the independent controller can
now sign an execution receipt for its decision in the cMCP
external_execution_evidence format (issuer, issuer_key_id, signature,
evidence_hash, evidence_type, linked_call_id), using a deterministic
development-only Ed25519 key so committed evidence stays reproducible.

- controller.py: receipt-signing key plus sign_execution_receipt(),
  receipt_key_id, receipt_public_key_b64.
- tests: verify the receipt against cMCP's checks (linked_call_id binding and
  Ed25519 over the canonical receipt), tampered-fails, deterministic key.

This is the standalone part that does not depend on the merged runtime. Held on
this branch until cmcp#301 and cmcp#302 merge.

Post-merge TODO (do not run until the cmcp PRs are merged):
1. Re-pin requirements.txt to the merged cmcp #301/#302 commits (and trace-spec).
2. #301: wire the controller receipt into the safety-reject path per the agreed
   proxy transport, then run the live stack and regenerate trace-output/example-*
   so the safety-reject audit entry carries external_execution_evidence; verify
   with cmcp_verify external_evidence_keys = {receipt_key_id: controller pubkey}.
3. #302: add the agent_manifest section (path, trust_anchor_path,
   authenticated_subject) to cmcp-config.yaml, regenerate evidence so the TRACE
   record carries gateway.agent_identity; verify with cmcp verify --agent-manifest.
4. Update the README evidence-boundaries table for both bindings.

* feat(industrial-embodied-ai): verify controller execution receipts

* ci: validate industrial embodied ai example

* ci: make industrial example checks fork-safe

---------

Co-authored-by: Carlos Hernandez <carloshvp@gmail.com>
Co-authored-by: Carlos Hernandez <carloshvp@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
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.

2 participants