Skip to content

docs(spec): define execution action binding v1 - #627

Merged
imran-siddique merged 1 commit into
agentrust-io:mainfrom
altrudev:docs/execution-action-binding-588
Sep 11, 2026
Merged

docs(spec): define execution action binding v1#627
imran-siddique merged 1 commit into
agentrust-io:mainfrom
altrudev:docs/execution-action-binding-588

Conversation

@altrudev

Copy link
Copy Markdown
Contributor

Closes #588.

What

Records the five points Imran ruled on in #588 as one normative execution-action binding contract:

  1. RFC 8785/JCS canonicalization over UTF-8 bytes.
  2. Algorithm-prefixed lowercase-hex digest representation; sha256 and sha384 accepted, other algorithms refused.
  3. Action preimage fields agent_id, action_type, action_scope, and action_timestamp.
  4. Domain separation inside the hashed bytes using domain: "cmcp.execution-action-binding".
  5. Version discrimination inside the hashed bytes using version: 1.

The document keeps correlation, logical-operation identity, replay permission, and external outcome evidence distinct. Same binding may enter retry/correlation classification subject to terminal-state rules; a changed binding under the same (authenticated agent identity, execution_id) is refused before upstream invocation.

Vectors

Adds a companion machine-readable vector set covering:

  • ASCII JCS + SHA-256;
  • non-ASCII UTF-8 (工具) + SHA-256;
  • domain separation;
  • version separation;
  • SHA-384 rendering;
  • unsupported algorithm refusal;
  • the existing 1 versus 1.0 semantic-adjudication witness, explicitly retained as a governing-semantics question rather than automatic proof the binding must distinguish the two.

The expected JCS bytes and digests are fixed in the file so an independent implementation can reproduce them without using the implementation under test as its oracle.

Scope

Docs/spec and vectors only. No runtime activation, registry integration, admission-path change, terminal-state/audit transaction change, or exactly-once claim. #565 remains the owner of integration, durable terminal/audit consistency, crash/recovery, and replay evidence.

Base: 69355037325927f28045686d548d3ea78d80ab6e (the exact main revision Imran used for the ruling).

DCO: signed off. AI-assistance disclosure: ChatGPT assisted with ruling reconciliation, contract drafting, vector construction, and exact-revision preparation. altrudev reviewed the bounded claim and remains responsible for the contribution.

Signed-off-by: Altru.dev <altrudevelop@gmail.com>
@github-actions

github-actions Bot commented Sep 10, 2026

Copy link
Copy Markdown
Contributor

🔴 Contributor Check: HIGH

Check Result
Profile HIGH
Credential LOW
Overall HIGH

Automated check by AgenTrust Contributor Check.

@github-actions github-actions Bot added the needs-review:HIGH Contributor check flagged HIGH risk label Sep 10, 2026
@codecov-commenter

Copy link
Copy Markdown

⚠️ Please install the 'codecov app svg image' to ensure uploads and comments are reliably processed by Codecov.

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@imran-siddique imran-siddique left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Approving. All five points from #588 are here, and the two that were actually open, the domain tag and the version discriminator, are inside the hashed bytes rather than beside them, which was the whole ruling.

Verified the vectors independently rather than reading them. Used the rfc8785 package as an oracle with no cmcp code in the path, so the corpus is not checking itself:

  • All five computable vectors reproduce exactly: EAB-001, EAB-002, EAB-003, EAB-004, EAB-005.
  • The recorded jcs_utf8 bytes match a fresh canonicalization byte for byte in every case.
  • EAB-006 is the refusal case and sha512 is rejected as specified.
  • Domain separation and version separation both change the digest, so those two vectors demonstrate the property rather than asserting it.

Fixing the expected JCS bytes in the file, alongside the digests, is what makes this reproducible by someone who disagrees with our implementation. That is the right shape for a contract vector set.

One gap, recorded rather than blocking: the corpus cannot discriminate the ordering rule. There is no character above U+FFFF anywhere in the file, and for all six vectors RFC 8785's output is byte-identical to a naive json.dumps(sort_keys=True). 工具 in EAB-002 is BMP, so it exercises multibyte UTF-8 encoding but not the place where JCS and a code-point sort diverge, which is UTF-16 code-unit ordering across the surrogate boundary. A verifier implementing the wrong ordering passes all six of these.

That is an addition rather than a correction, and it is the same gap measured in trace-spec last week, where 23 of 24 delegation-link vectors were sub-BMP and therefore satisfied by a correct canonicalizer and an incorrect one alike. Filed separately so it does not hold this.

Scope discipline is right too: docs and vectors only, no runtime activation, no admission-path change, and the 1 versus 1.0 witness explicitly retained as a governing-semantics question rather than treated as proof the binding must distinguish them.

@imran-siddique
imran-siddique merged commit 14fef43 into agentrust-io:main Sep 11, 2026
14 of 15 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs-review:HIGH Contributor check flagged HIGH risk

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Define canonical bytes for execution action/intent bindings

3 participants