Helixar Labs
Specificationv0.1Apache 2.0IETF draft-01

HDP v0.1

Human Delegation Provenance Protocol

The normative specification for HDP, an open standard for recording, signing, and verifying human authorization in agentic AI. It defines the token structure, the Ed25519 signing procedures, the seven-step offline verification pipeline, and the HTTP transport bindings.

Status
Draft · open for comment
Version
0.1
Signing
Ed25519 · RFC 8032
Canonicalization
RFC 8785
License
Apache 2.0
arXiv
2604.04522
Contents

Status of this document

This document is the v0.1 specification of the Human Delegation Provenance Protocol, and is the reference cited as [HDP-SPEC] by the IETF Internet-Draft draft-helixar-hdp-agentic-delegation-01. The two are intended to stay in step; where they differ, the Internet-Draft is the authoritative record of the revision it names.

HDP v0.1 is published for comment and interoperability testing. It is not an IETF standard, and publication of the Internet-Draft does not imply IETF endorsement. The field names, signing procedures, and verification pipeline described here are stable for v0.1 and are implemented by the reference libraries.

1Overview#

Autonomous AI agents increasingly execute consequential actions: sending email, modifying files, running code, calling APIs, and transacting on behalf of people. When a human authorizes an orchestrator agent, which delegates to sub-agents, which delegate again to tool-execution agents, the originating human authorization becomes disconnected from the terminal action. There is no standard record of the authorization chain.

That gap creates three concrete problems:

  • Downstream agents cannot verify that the action they are being asked to perform was actually authorized by a human.
  • Post-hoc audits cannot reconstruct who approved what, and when.
  • Prompt injection, where malicious content in the environment instructs an agent to act, cannot be distinguished from legitimate human delegation.

HDP addresses this by defining a token that:

  • Records the human principal, their declared scope, and the session binding at issuance.
  • Accumulates a cryptographically signed hop record for each agent that handles the token.
  • Allows any recipient to verify the entire chain, root signature plus all hop signatures, using only the issuer’s Ed25519 public key and the session identifier.

HDP is designed against five goals, in priority order: offline verifiability, self-sovereignty with no central authority or registration, tamper evidence, minimal footprint so it is implementable in any language with Ed25519 and JSON, and privacy by design, keeping identity fields separable from the audit-relevant parts of the token.

The core mechanism, an append-only cryptographically chained record that any party can verify offline, is independent of what the chain carries. This document profiles it for one application: human-authorized agentic delegation. The same mechanism could carry data provenance, consent delegation, or physical-world command chains as distinct profiles. HDP v0.1 defines only the agentic-delegation profile. The physical-AI profile is published separately as HDP-P.

2Terminology#

The key words MUST, MUST NOT, REQUIRED, SHALL, SHALL NOT, SHOULD, SHOULD NOT, RECOMMENDED, NOT RECOMMENDED, MAY, and OPTIONAL in this document are to be interpreted as described in RFC 2119 and RFC 8174 when, and only when, they appear in all capitals.

Issuer
The system or person that creates and signs an HDP token on behalf of a human principal.
Principal
The human who authorized the agentic task. Represented in the token’s principal object.
Agent
Any AI system, model, or automated process that receives and acts upon an HDP token.
Hop
A single delegation event, recorded as a signed entry in the token’s chain array.
Root signature
The Ed25519 signature over the header, principal, and scope, computed by the issuer at token creation time.
Hop signature
The Ed25519 signature over the cumulative chain state at the time of extension. In v0.1 it is produced by the issuer using the same key as the root signature.
Session
A logical unit of work identified by a session_id string, established between the issuer and the agent framework before the token is issued.

3Token structure#

An HDP token is a JSON object with six top-level fields. The token MUST conform to the structure below. All integer timestamps are Unix milliseconds, that is, milliseconds since 1970-01-01T00:00:00Z.

hdp-token.json
{
  "hdp"       : "0.1",          // protocol version
  "header"    : { ... },        // session binding + lifecycle
  "principal" : { ... },        // authorizing human
  "scope"     : { ... },        // authorized intent + constraints
  "chain"     : [ ... ],        // delegation hops (append-only)
  "signature" : { ... }         // root Ed25519 signature
}
Top-level token structure.

The header object carries token lifecycle and session binding fields.

header
{
  "token_id"        : "550e8400-e29b-41d4-a716-446655440000",
  "issued_at"       : 1711483200000,
  "expires_at"      : 1711569600000,
  "session_id"      : "sess-20260326-abc123",
  "version"         : "0.1",
  "parent_token_id" : "..."
}
token_idREQUIRED
A version 4 UUID (RFC 9562). Unique identifier for this token.
issued_atREQUIRED
Unix milliseconds. Time of issuance.
expires_atREQUIRED
Unix milliseconds. The token MUST NOT be accepted after this time. Default lifetime is 24 hours.
session_idREQUIRED
Opaque string, established out of band between issuer and agent framework before token issuance. Provides replay defense: a token is only valid within the session for which it was issued.
versionREQUIRED
MUST equal the value of the top-level hdp field.
parent_token_idOPTIONAL
If present, identifies the token this token supersedes in a re-authorization chain, or the token it jointly extends. See §6 and §7.

3.2Principal#

The principal object identifies the authorizing human. It MUST contain id and id_type. All other fields are OPTIONAL.

principal
{
  "id"             : "usr_alice_opaque",
  "id_type"        : "opaque",
  "display_name"   : "Alice Chen",
  "poh_credential" : "...",
  "metadata"       : {}
}
idREQUIRED
Identifier for the principal, interpreted according to id_type.
id_typeREQUIRED
One of the defined values below, or a custom string prefixed with x-.
display_nameOPTIONAL
Human-readable name. Omit where the receiving agent does not require a human-readable identity.
poh_credentialOPTIONAL
A Proof-of-Humanity credential. Verification semantics are application-defined. See §9.
metadataOPTIONAL
Application-defined object. Not interpreted by the protocol.

Defined id_type values:

opaque
Application-defined identifier. No resolution semantics are implied.
email
An email address as defined in RFC 5321.
uuid
A UUID as defined in RFC 9562.
did
W3C Decentralized Identifier. DID resolution is application-defined and not required by this protocol.
poh
A Proof-of-Humanity credential identifier.

3.3Scope#

The scope object records what the human authorized. It is signed as part of the root signature and MUST NOT be modified after issuance.

scope
{
  "intent"               : "Analyze Q1 sales data and report.",
  "authorized_tools"     : ["database_read", "file_write"],
  "authorized_resources" : ["db://sales/q1-2026"],
  "data_classification"  : "confidential",
  "network_egress"       : false,
  "persistence"          : true,
  "max_hops"             : 3
}
intentREQUIRED
Free-form natural language description of the authorized task. This is the human-readable authorization statement.
data_classificationREQUIRED
One of public, internal, confidential, or restricted. The sensitivity level of data the agent is authorized to access.
network_egressREQUIRED
Boolean. Whether the agent is authorized to make outbound network requests.
persistenceREQUIRED
Boolean. Whether the agent is authorized to write persistent state.
authorized_toolsOPTIONAL
Array of tool identifiers the principal has explicitly authorized. Enforcement is application-defined.
authorized_resourcesOPTIONAL
Array of resource identifiers, such as URIs or paths, the principal has authorized access to.
max_hopsOPTIONAL
Positive integer. Maximum number of delegation hops permitted. Verification MUST reject tokens whose chain length exceeds this value. Omitting it leaves chain length unbounded.

3.4Chain#

The chain array is append-only. Each element records a single delegation event, called a hop. The array is empty at issuance and grows as the token passes between agents. Agents MUST NOT remove or modify existing entries.

chain[n]
{
  "seq"               : 1,
  "agent_id"          : "orchestrator-v2",
  "agent_type"        : "orchestrator",
  "agent_fingerprint" : "sha256:abc123...",
  "timestamp"         : 1711483260000,
  "action_summary"    : "Decompose task; delegate to sub-agents.",
  "parent_hop"        : 0,
  "hop_signature"     : "<base64url-encoded Ed25519 signature>"
}
seqREQUIRED
Positive integer, starting at 1. MUST be exactly one greater than the previous hop’s seq. Gaps are a protocol violation.
agent_idREQUIRED
Identifier of the agent adding this hop. MAY be an opaque, per-delegation identifier.
agent_typeREQUIRED
One of orchestrator, sub-agent, tool-executor, or custom.
timestampREQUIRED
Unix milliseconds. Time of hop extension.
action_summaryREQUIRED
Human-readable description of the action this agent intends to take.
parent_hopREQUIRED
Non-negative integer. Index of the hop that triggered this delegation, where 0 indicates the root human authorization.
hop_signatureREQUIRED
Base64url-encoded, no padding, Ed25519 signature. See §4.2. Absence is a protocol violation.
agent_fingerprintOPTIONAL
Model or binary fingerprint for the acting agent.

3.5Signature#

The signature object carries the root signature computed by the issuer.

signature
{
  "kid"   : "alice-signing-key-v1",
  "alg"   : "Ed25519",
  "value" : "<base64url Ed25519 signature over canonical JSON>"
}
algREQUIRED
MUST be Ed25519 for HDP v0.1. Verifiers MUST reject any other value.
kidREQUIRED
Key identifier. SHOULD be used by verifiers to select the correct public key when multiple keys are in circulation.
valueREQUIRED
Base64url-encoded, no padding, Ed25519 signature over the canonical JSON payload. See §4.1.

4Cryptographic signing#

HDP uses Ed25519 (RFC 8032) over payloads serialized with the JSON Canonicalization Scheme (RFC 8785), with signatures encoded as base64url without padding (RFC 4648). Canonicalization is what makes the signed bytes deterministic across implementations and platforms.

4.1Root signature#

The root signature is computed by the issuer at token creation time. It covers the fields that constitute the human authorization event: the header, principal, and scope.

  1. 1.Construct the unsigned token object containing the hdp, header, principal, scope, and chain fields, where chain is an empty array at issuance.
  2. 2.Serialize the object to canonical JSON per RFC 8785.
  3. 3.Compute the Ed25519 signature over the canonical JSON bytes using the issuer’s private key.
  4. 4.Encode the signature bytes as base64url with no padding.
  5. 5.Attach the signature object, carrying kid, alg, and value, to the token.

4.2Hop signature#

Each hop MUST carry a hop_signature. It binds the new hop record to the entire accumulated delegation history and to the root signature, which makes retroactive chain modification detectable.

  1. 1.Construct the new hop record, with all fields except hop_signature.
  2. 2.Build the signing payload as a JSON array of the previously signed hops, each WITH its hop_signature, followed by the new hop WITHOUT its hop_signature.
  3. 3.Prepend the root signature value, a base64url string, as the array’s first element. This chains the hop signature to the root.
  4. 4.Serialize the array to canonical JSON per RFC 8785.
  5. 5.Compute the Ed25519 signature over the canonical JSON bytes using the issuer’s private key.
  6. 6.Encode as base64url and attach as the hop_signature field on the new hop record.
  7. 7.Append the signed hop to the token’s chain array.
hop signing payload
[
  root_signature_value,   // base64url string, chains this hop to the root
  hop_1,                  // WITH its hop_signature
  hop_2,                  // WITH its hop_signature
  ...
  new_hop_unsigned        // WITHOUT its hop_signature
]
The array serialized in step 4, before canonicalization.

In HDP v0.1 all signatures, the root signature and every hop signature, are produced by the issuer using a single key. An extending agent that is not the issuer has its hop signed by the issuer, within the same trust domain. This keeps verification dependent on a single public key. Per-agent hop signing, where each agent signs its own hop with its own key, is a planned extension for a future version and is not part of v0.1.

4.3Chain integrity rules#

These rules govern chain construction and MUST be enforced by both extenders and verifiers.

  1. 1.Hop seq values MUST start at 1 and increment by exactly 1. No gaps are permitted.
  2. 2.Existing hop records MUST NOT be modified or removed.
  3. 3.A hop’s parent_hop MUST reference a valid prior hop index: 0 for the root human authorization, or the seq value of a prior hop.
  4. 4.If scope.max_hops is set, the chain length MUST NOT exceed it. A token with a full chain MUST NOT be extended.
  5. 5.Each hop’s timestamp SHOULD be monotonically non-decreasing.
  6. 6.The hop_signature field MUST be present on every hop. A hop without one is a protocol violation and MUST cause verification to fail.

5Verification pipeline#

A verifier MUST execute the following seven steps in order. A failure at any step MUST cause immediate rejection with an appropriate error, and the verifier MUST NOT proceed to subsequent steps after a failure.

  1. 1.Version check. The hdp field MUST contain a recognized protocol version string. For this specification the only recognized value is 0.1. The header.version field MUST equal the hdp field; a mismatch MUST cause rejection.
  2. 2.Expiry check. header.expires_at MUST be strictly greater than the current time. Expired tokens MUST be rejected.
  3. 3.Root signature verification. Reconstruct the canonical JSON payload by removing the signature field and resetting chain to an empty array, then serializing per RFC 8785. Verify that signature.alg is Ed25519, then verify signature.value against this payload using the issuer’s public key. Failure indicates tampering with the header, principal, or scope.
  4. 4.Hop sequence and structure integrity. For each hop, verify that seq equals its index plus one; any gap or duplication MUST cause rejection. Verify that each parent_hop references either 0 or the seq of a prior hop; an out-of-range value MUST cause rejection.
  5. 5.Hop signature verification. For each hop at index i: confirm hop_signature is present, where absence MUST cause rejection; reconstruct the signing payload described in §4.2 using hops 0 through i-1 with their signatures, plus the hop at i without its own, prepended by the root signature value; then serialize per RFC 8785 and verify against the issuer’s public key.
  6. 6.max_hops check. If scope.max_hops is defined, the length of chain MUST NOT exceed it.
  7. 7.Session binding check. header.session_id MUST exactly match the session identifier supplied by the verifying application. This prevents token replay across sessions.

An optional eighth step MAY be performed where the application has registered a Proof-of-Humanity verifier: if principal.poh_credential is present and a verifier callback is configured, the credential MUST be validated by that callback, and the token MUST be rejected if validation fails.

6Re-authorization#

Long-running or streaming sessions may exhaust the max_hops limit, require scope expansion, or reach a high-risk action that warrants fresh human confirmation. In these cases the issuer, acting on behalf of the human principal, issues a new token that supersedes the original.

Re-authorization is indicated by setting header.parent_token_id to the token_id of the token being superseded. This field MUST be set before computing the root signature, so the parentage link is cryptographically covered by the new token’s root signature.

A re-authorized token:

  • Has a new token_id, issued_at, and expires_at.
  • Inherits session_id, principal, and scope from the original unless explicitly overridden.
  • Starts with an empty chain, so the delegation count resets.
  • Records parent_token_id pointing at the original, creating an auditable lineage of scope evolution.

Verifiers that require re-authorization chain traversal SHOULD retain all tokens in a session and verify the full parent_token_id linkage.

7Multi-principal delegation#

HDP v0.1 supports one principal per token. Joint authorization by multiple humans is achieved by sequential chaining: Human A issues token T1, then Human B issues token T2 with parent_token_id equal to T1’s token_id. Each token is independently signed with its issuer’s key. To verify a multi-principal chain, a verifier MUST:

  1. 1.Verify each token individually against its issuer’s public key using the standard seven-step pipeline.
  2. 2.Verify that T[i].header.parent_token_id equals T[i-1].header.token_id for all i greater than 0.
  3. 3.Verify that all tokens in the chain share the same session_id.

This provides auditable joint authorization without a threshold signature scheme. Each principal’s authorization is a distinct signed artifact. Simultaneous multi-signature primitives using threshold schemes are planned for a future version.

8Transport#

The HTTP header field names defined here do not use the X- prefix, in accordance with RFC 6648.

8.1HTTP header: HDP-Token#

Tokens MAY be transmitted in HTTP requests and responses using the HDP-Token header. The value is the base64url encoding, no padding, of the UTF-8 JSON serialization of the complete token object.

HTTP request
POST /api/task HTTP/1.1
Host: agent.example.com
HDP-Token: eyJoZHAiOiIwLjEiLCJoZWFkZXIiOnsi...
Content-Type: application/json

8.2Token by reference: HDP-Token-Ref#

Where token size is a concern, for example with large chains, the token MAY be stored server-side and referenced by its token_id using the HDP-Token-Ref header.

HTTP request
POST /api/task HTTP/1.1
Host: agent.example.com
HDP-Token-Ref: 550e8400-e29b-41d4-a716-446655440000

Implementations using token-by-reference MUST secure the token store and use TLS for all reference resolution.

8.3Key distribution#

Issuers that wish to publish their Ed25519 public keys for automated discovery SHOULD serve a JSON document at /.well-known/hdp-keys.json with the following structure.

/.well-known/hdp-keys.json
{
  "keys": [
    {
      "kid" : "alice-signing-key-v1",
      "alg" : "Ed25519",
      "pub" : "<base64url-encoded 32-byte Ed25519 public key>"
    }
  ]
}

The format is intentionally minimal and implementations MAY extend it with additional metadata. The alg field MUST be Ed25519 for v0.1 keys. Consumers MUST reject entries with unrecognized alg values, and MUST validate that the decoded public key is exactly 32 bytes.

9Privacy considerations#

The principal object may contain personal data. Issuers SHOULD apply minimum disclosure when constructing tokens that will traverse multiple agents: use an application-internal identifier with id_type: opaque rather than embedding an email address in tokens sent to third-party agents, and omit display_name where the receiving agent does not need it.

The same principle applies to agent_id. An issuer or extending agent MAY use opaque, per-delegation identifiers. Each delegate can still be held accountable by the delegator that assigned its identifier, step by step along the chain, because the opaque agent_id and its action_summary are bound into the signed, tamper-evident chain, without exposing a stable real-world identity to downstream verifiers.

HDP tokens may constitute personal data under applicable privacy regulation, for example GDPR Article 4(1), where principal.id or principal.display_name contain directly or indirectly identifying information. Implementations SHOULD:

  • Store tokens with explicit retention periods derived from header.expires_at.
  • Provide deletion mechanisms that remove stored tokens upon erasure requests.
  • Use opaque identifiers in principal.id where possible, maintaining a separate mapping that can be destroyed independently of the token audit log.

The optional principal.poh_credential field MAY carry a credential attesting that the principal is human. HDP does not define the semantics of this field; verification is entirely application-defined. Where a verifier is configured, the pipeline MUST validate the credential as the final step, after session binding, and MUST reject the token if validation fails. The callback SHOULD be idempotent and SHOULD NOT have side effects.

10Security considerations#

Threat model
HDP provides provenance and tamper evidence, not runtime enforcement. It creates an evidence trail, not a capability boundary. Applications requiring runtime enforcement MUST implement it at the application layer, using the token as audit input.
Token forgery
A forged token fails step 3, the root signature check. Security rests on the unforgeability of Ed25519 and the collision resistance of SHA-512, used internally by Ed25519. An attacker without the issuer’s private key cannot produce a valid root signature for a modified token.
Chain tampering
Modification, reordering, or removal of any non-trailing hop is detectable: it either breaks the sequence check at step 4 or invalidates the hop signatures of all subsequent hops at step 5, because each hop signature covers all previous hops and the root signature.
Chain truncation
Each hop signature covers only the hops preceding it. Deleting trailing hops, or presenting an earlier and shorter copy, yields a token that still passes every step. HDP provides tamper evidence for the hops that are present, and does not by itself prove the chain is complete.
Replay defense
Two orthogonal defenses: short lifetimes via expires_at, enforced at step 2, and session binding, so a token is valid only within its issuing session. Applications with high security requirements SHOULD use lifetimes measured in minutes, and SHOULD generate session_id values with at least 128 bits of entropy from a cryptographically secure source.
Revocation
HDP does not provide mid-chain revocation. A token becomes invalid when it expires or when its session ends. Proof that an action was authorized is not by itself proof that the authorization is still current. Deployments needing fine-grained revocation SHOULD keep lifetimes short and rely on re-authorization, or layer a capability system at the application layer.
Prompt injection
HDP mitigates but does not prevent prompt injection. An HDP-aware agent SHOULD refuse to extend a chain with an action_summary that contradicts scope.intent, though the protocol cannot enforce this semantically. The mitigation is evidentiary: each delegation action is recorded as a signed hop, supporting post-hoc detection.
Key management
All guarantees depend on confidentiality of the issuer’s Ed25519 private key. Implementations MUST store private keys in a secrets manager, HSM, or equivalent, never in source code, configuration files, or environment variables in production; MUST use distinct key pairs per environment; and MUST support rotation by issuing new tokens under a new kid while retaining the old key until every token signed with it has expired.

AAppendix A: complete token example#

A complete token with a two-hop delegation chain. Signature values are truncated for readability. This example validates against the published JSON Schema.

hdp-token.json
{
  "hdp": "0.1",
  "header": {
    "token_id"   : "550e8400-e29b-41d4-a716-446655440000",
    "issued_at"  : 1711483200000,
    "expires_at" : 1711569600000,
    "session_id" : "sess-20260326-abc123",
    "version"    : "0.1"
  },
  "principal": {
    "id"           : "usr_alice_opaque",
    "id_type"      : "opaque",
    "display_name" : "Alice Chen"
  },
  "scope": {
    "intent"              : "Analyze Q1 sales data and report.",
    "authorized_tools"    : ["database_read", "file_write"],
    "data_classification" : "confidential",
    "network_egress"      : false,
    "persistence"         : true,
    "max_hops"            : 3
  },
  "chain": [
    {
      "seq"            : 1,
      "agent_id"       : "orchestrator-v2",
      "agent_type"     : "orchestrator",
      "timestamp"      : 1711483260000,
      "action_summary" : "Decompose task; delegate to sub-agents.",
      "parent_hop"     : 0,
      "hop_signature"  : "base64url-sig-1..."
    },
    {
      "seq"            : 2,
      "agent_id"       : "sql-agent-v1",
      "agent_type"     : "sub-agent",
      "timestamp"      : 1711483320000,
      "action_summary" : "Execute read query on sales database.",
      "parent_hop"     : 1,
      "hop_signature"  : "base64url-sig-2..."
    }
  ],
  "signature": {
    "kid"   : "alice-signing-key-v1",
    "alg"   : "Ed25519",
    "value" : "base64url-root-sig..."
  }
}

References and related work

JSON Schema (token, v0.1)
Machine-readable token schema.
draft-helixar-hdp-agentic-delegation-01
IETF individual Internet-Draft, Informational.
arXiv:2604.04522
Design rationale and evaluation.
Helixar-AI/HDP
TypeScript and Python reference implementations.
Google Gemma cookbook
HDP applied to Gemma 4 function-call security.
HDP-P
Companion profile for physical AI systems.
Announcement
Background on why HDP was published.

HDP v0.1 is a draft open for comment. Corrections and implementation reports are welcome at [email protected], or as issues on the reference implementation repository.