Short name: VAAL
Status: Draft v0.1
Scope: H2A2H Core
Nature: Domain-independent authorization layer
1. Abstract
The H2A2H Verifiable Action Authorization Layer defines how an Entity can cryptographically authorize an Agent to execute a consequential Action on its behalf.
VAAL generalizes the authorization concepts used by AP2 beyond payments by replacing the payment-specific transaction with a generic, semantically identified Action and its corresponding StateTransition.
The core security principle is:
No externally consequential Action may mutate authoritative state unless the executor can verify a cryptographic chain proving who authorized it, what was authorized, under which constraints, against which state or request, and whether that authorization is still valid.
VAAL does not replace identity, authentication, transport, domain protocols or business rules.
It binds them together at the moment where an Action is allowed to become a real-world effect.
2. Position inside H2A2H
Human / Organization / Entity
│
▼
OpenIntent Protocol
"what is wanted"
│
▼
OpenDelegation Protocol
"who may act for whom"
│
▼
┌───────────┐
│ VAAL │
│ │
│ may this │
│ exact │
│ Action │
│ happen? │
└─────┬─────┘
│
▼
OpenEntityChannels
│
MCP / A2A / REST
QUIC / NATS / gRPC
Kafka / RabbitMQ
...
│
▼
Actor
│
▼
Action
│
▼
State Transition
│
▼
Verifiable Receipt
Responsibilities are deliberately separated:
| Layer | Question |
|---|---|
| OpenIntent | What outcome is desired? |
| OpenDelegation | Who may act for whom? |
| VAAL | Is this exact Action authorized now? |
| OpenEntityChannels | How are participants communicating? |
| Actor | Who coordinates execution? |
| Action | What atomic behavior is executed? |
| Receipt | What actually happened? |
| Proof-of-Human-Return | Must control return to the human? |
3. Authorization unit
VAAL MUST NOT authorize generic application access whenever a more precise Action can be identified.
The fundamental authorization unit is:
canonical_label(Entity.Action)
Examples:
government.license.renew
government.address.update
health.records.read
health.records.share
health.appointment.schedule
education.content.consume
education.course.enroll
education.assignment.submit
company.contract.negotiate
company.contract.sign
infrastructure.production.deploy
communication.email.send
home.front_door.unlock
Therefore:
Authorization
≠ Agent has access to Service X
Instead:
Authorization
=
Agent A
may execute
Action X
on Entity/Resource Y
under Constraints C
in Context K
before Time T
against Commitment H
4. Core authorization tuple
The logical authorization tuple is:
A = (
principal,
agent,
canonical_action,
target,
constraints,
purpose,
context,
validity,
delegation,
commitment
)
An authorization MUST be invalid if any mandatory component differs at execution time.
5. Roles
VAAL defines roles rather than fixed infrastructure components.
Principal
Entity possessing the original authority.
Examples:
Human
Company
Government
Hospital
School
Service
another Agent with delegated authority
Agent
Entity receiving delegated authority.
Trusted Surface
Environment where meaningful authorization or consent is obtained.
Examples:
PersonalAgent UI
wallet
passkey device
mobile application
hardware authenticator
government portal
Mandate Issuer
Entity cryptographically attesting the authorization.
Provider
Entity exposing the Action.
Verifier
Component responsible for deciding whether authorization is valid.
Executor
Component actually capable of producing the side effect.
Verifier and Executor MAY belong to the same service, but VAAL SHOULD permit them to be separated for high-risk operations.
Auditor
Optional entity capable of independently validating authorization and execution evidence.
6. Core artifacts
VAAL v0.1 defines four main artifacts.
DelegationMandate
ActionCommitment
ActionMandate
ActionReceipt
An optional fifth artifact is:
ExecutionChallenge
7. DelegationMandate
A DelegationMandate corresponds conceptually to an open authorization.
It establishes a bounded region of actions in which an Agent can operate autonomously.
Example:
type: org.h2a2h.mandate.delegation.v1
principal:
id: did:example:human123
delegate:
id: did:example:personal-agent456
allowed_actions:
- education.course.search
- education.course.compare
- education.course.enroll
constraints:
institution:
allowed:
- university.example
workload:
max_hours_per_week: 8
credits:
max: 6
schedule:
forbidden:
- monday_morning
validity:
not_before: 2026-09-01T00:00:00Z
expires_at: 2027-02-01T00:00:00Z
delegation:
further_delegation: false
max_depth: 0
proof:
...
This mandate does NOT authorize arbitrary operations.
It defines the authorization envelope.
8. ActionCommitment
Before a consequential Action is executed, VAAL creates a canonical representation of what is about to happen.
type: org.h2a2h.action_commitment.v1
canonical_action: health.records.share
actor:
id: did:example:personal-agent456
target:
entity: did:example:hospital789
resources:
- MRI:2026-08-10
- BloodTest:2026-08-22
parameters:
recipient: did:example:doctor999
purpose: treatment
context:
intent_id: intent:8f92...
session_id: session:91aa...
state:
before_hash: sha256:...
version: "283"
commitment:
canonicalization: jcs
hash_algorithm: sha-256
request_hash: sha256:...
request_hash binds the authorization to the canonical semantics of the Action.
For state-mutating Actions, before_hash SHOULD additionally bind execution to the state against which the decision was made.
If the resulting state is deterministically knowable beforehand:
state:
before_hash: sha256:AAA
proposed_after_hash: sha256:BBB
MAY be used.
This distinction is important.
Not every Action permits the future state to be known before execution.
Therefore VAAL binds every execution to an exact ActionCommitment, but only requires proposed_after_hash when meaningful.
9. ActionMandate
An ActionMandate is the closed authorization for one concrete Action.
type: org.h2a2h.mandate.action.v1
principal:
id: did:example:human123
agent:
id: did:example:personal-agent456
canonical_action: health.records.share
delegation_mandate:
hash: sha256:DELEGATION...
intent:
id: intent:8f92...
hash: sha256:INTENT...
action_commitment:
hash: sha256:ACTION...
audience:
- did:example:hospital789
nonce: 80bcd...
validity:
expires_at: 2026-09-03T15:00:00Z
execution:
max_uses: 1
proof_of_possession:
key: ...
proof:
...
The ActionMandate MUST NOT grant more authority than its parent DelegationMandate.
Formally:
Authority(ActionMandate)
⊆
Authority(DelegationMandate)
This property is called:
Delegation Attenuation
Every child delegation follows the same invariant:
Authority(child)
⊆
Authority(parent)
Authority can only remain equal or decrease.
Never increase.
10. Human-present authorization
When a human is present, the human can directly approve the final ActionCommitment.
Provider
↓
ActionCommitment
↓
Trusted Surface
↓
Human
↓ approve
ActionMandate
↓
Verifier
↓
Executor
No autonomous DelegationMandate is required.
11. Human-not-present authorization
For autonomous execution:
Human
↓
DelegationMandate
↓
PersonalAgent
... time passes ...
PersonalAgent
↓
Discovery
↓
Negotiation
↓
ActionCommitment
↓
derive ActionMandate
↓
Verifier
↓
Executor
The Agent MUST prove possession of the key authorized by the DelegationMandate.
The verifier MUST verify that the concrete Action remains inside every parent constraint.
12. Constraint Model
Constraints are typed semantic objects.
Example:
constraints:
- type: org.h2a2h.constraint.action
allowed:
- health.records.share
- type: org.h2a2h.constraint.recipient
organization: hospital-x
specialty: cardiology
- type: org.h2a2h.constraint.purpose
allowed:
- treatment
- type: org.h2a2h.constraint.resource
categories:
- cardiac
- type: org.h2a2h.constraint.temporal
expires_at: 2026-09-05T00:00:00Z
- type: org.h2a2h.constraint.execution_count
max: 1
Core constraint families SHOULD include:
ActionConstraint
EntityConstraint
ResourceConstraint
ParameterConstraint
PurposeConstraint
TemporalConstraint
GeographicConstraint
ExecutionCountConstraint
DataClassificationConstraint
RecipientConstraint
ChannelConstraint
RiskConstraint
DelegationDepthConstraint
StateConstraint
CredentialConstraint
PolicyConstraint
Domain profiles MAY define additional constraints.
Unknown mandatory constraints MUST fail closed.
unknown constraint
→ deny / challenge
Never:
unknown constraint
→ ignore
13. Authorization decisions
VAAL defines three outcomes:
ALLOW
DENY
CHALLENGE
CHALLENGE means execution cannot continue with the currently available evidence.
Possible challenges:
human authorization
additional credential
stronger authentication
new ActionCommitment
new state snapshot
additional proof
legal acknowledgement
second approver
14. Proof-of-Human-Return integration
Proof-of-Human-Return becomes a first-class escalation mechanism.
Example:
Agent
↓
company.contract.negotiate
↓
ALLOW
Agent
↓
company.contract.sign
↓
CHALLENGE
↓
Proof-of-Human-Return
↓
Human
↓
new ActionMandate
↓
ALLOW
Therefore:
autonomy boundary
=
authorization boundary
The Agent itself does not decide when human authorization is necessary.
The policy and Mandate constraints determine it.
15. Risk classes
VAAL SHOULD support semantic risk classification.
R0 — Public / non-consequential
public information retrieval
catalog discovery
public search
Mandate MAY be unnecessary.
R1 — Private read
personal records
private documents
internal company data
Requires authenticated authority.
R2 — Reversible mutation
schedule appointment
modify preference
create draft
Delegated Mandate normally sufficient.
R3 — Consequential mutation
submit government document
share medical record
deploy production service
enroll student
send binding communication
Requires state/request-bound ActionMandate.
R4 — Critical / irreversible / legally sensitive
contract signature
medical consent
dangerous device control
high-impact legal declaration
Policy SHOULD normally require Proof-of-Human-Return or multiple independent authorities.
Risk class is a policy input.
It MUST NOT by itself confer authority.
16. Discovery
An Entity SHOULD advertise authorization capabilities through its H2A2H profile.
Example:
entity:
canonical_label: hospital.example
services:
health.records:
version: "1.0"
capabilities:
health.records.read:
schema: https://hospital.example/schemas/records-read.yml
health.records.share:
schema: https://hospital.example/schemas/records-share.yml
authorization:
required: true
protocols:
- org.h2a2h.vaal.v1
mandate_formats:
- vc+sd-jwt
supported_constraints:
- org.h2a2h.constraint.recipient
- org.h2a2h.constraint.purpose
- org.h2a2h.constraint.temporal
challenge_modes:
- openid4vp
- proof-of-human-return
Discovery declares support.
It does NOT confer trust.
capability_supported
≠
action_authorized
17. Negotiation
Before execution:
Agent Requirements
∩
Provider Capabilities
∩
Mandate Capabilities
∩
Policy
=
Executable Authorization Profile
If the intersection is empty:
CHALLENGE
or
DENY
No transport-specific behavior should alter authorization semantics.
18. Credential layer
VAAL SHOULD reuse existing credential standards.
Default interoperability profile:
W3C Verifiable Credentials
+
SD-JWT VC
+
OpenID4VP
Other formats MAY be supported:
ISO mdoc
COSE
JWT
hardware-attested credentials
passkey-bound credentials
VAAL defines authorization semantics.
It does not define a new identity wallet format.
19. Deterministic verification algorithm
Before any consequential Action, the verifier MUST perform the equivalent of:
1. Parse Mandate
2. Validate schema
3. Canonicalize authorization data
4. Verify signatures
5. Verify credential status
6. Verify issuer trust policy
7. Verify agent proof-of-possession
8. Verify delegation lineage
9. Verify attenuation
10. Verify expiration
11. Verify audience
12. Verify nonce
13. Verify replay state
14. Verify canonical_action
15. Verify target
16. Verify parameters
17. Verify purpose
18. Verify every constraint
19. Verify Intent binding
20. Verify ActionCommitment hash
21. Verify resource/state version when applicable
22. Verify local policy
23. Determine ALLOW / DENY / CHALLENGE
Only ALLOW reaches the Executor.
Verifier.ALLOW
↓
Execution Boundary
↓
Executor
The Executor MUST NOT accept an Agent's assertion that authorization was already verified elsewhere unless the deployment explicitly establishes a trusted authorization boundary.
20. Execution Boundary
The security-critical architectural rule is:
Agent
│
│ request
▼
Verifier
│
│ signed authorization decision
▼
──────────── EXECUTION BOUNDARY ────────────
│
▼
Executor
The Agent MUST NOT have another path around this boundary.
Otherwise VAAL becomes audit metadata instead of authorization.
21. ActionReceipt
Every consequential execution SHOULD create a signed receipt.
Example:
type: org.h2a2h.receipt.action.v1
receipt_id: receipt:019...
verifier:
id: did:example:hospital789
executor:
id: service:medical-record-service
principal:
id: did:example:human123
agent:
id: did:example:personal-agent456
canonical_action: health.records.share
authorization:
mandate_hash: sha256:...
action_commitment_hash: sha256:...
execution:
result: success
executed_at: 2026-09-03T12:04:19Z
state:
before_hash: sha256:AAA
after_hash: sha256:BBB
result:
hash: sha256:RESULT...
proof:
...
The minimum auditable chain becomes:
Intent
↓ hash
DelegationMandate
↓
ActionCommitment
↓ hash
ActionMandate
↓
Authorization Decision
↓
Execution
↓
ActionReceipt
22. Receipt effects on authority
Receipts are not passive logs.
They MAY modify remaining delegated authority.
Examples:
max_uses = 1
After a successful receipt:
remaining_uses = 0
Or:
budget = 10 actions
executed = 3
remaining = 7
Thus the verifier maintains:
AuthorizationState
in addition to application state.
23. Anti-replay
ActionMandates SHOULD support:
nonce
audience
expiration
proof-of-possession
action_commitment_hash
single-use identifiers
state version
receipt consumption
A captured Mandate MUST NOT automatically be reusable against:
another Entity
another Action
another state
another Agent
another request
another time window
24. Transport independence
VAAL is transport-independent.
The same authorization semantics can travel through:
REST
MCP
A2A
gRPC
QUIC
NATS
Kafka
RabbitMQ
RedPanda
BullMQ
WebSocket
embedded execution
OpenEntityChannels decides transport.
VAAL decides authority.
Therefore:
Authorization semantics
MUST NOT depend on transport.
25. Agent chains
VAAL MUST support:
Human
↓
PersonalAgent
↓
SpecialistAgent
↓
ExecutionAgent
↓
Service
Every delegation edge must preserve attenuation:
A₀ ⊇ A₁ ⊇ A₂ ⊇ A₃
No downstream Agent may create authority unavailable to its parent.
The complete chain MUST be independently verifiable.
26. H2A2H Entity integration
Every protected Action SHOULD declare:
action:
canonical_label: health.records.share
authorization:
consequential: true
vaal_required: true
risk: R3
accepted_mandates:
- org.h2a2h.mandate.action.v1
constraints:
required:
- recipient
- purpose
human_return:
required_when:
- recipient.outside_care_team
- purpose != treatment
This information belongs to the Action definition rather than Agent code.
The Agent therefore contains no hidden authorization rules.
27. Everything as Code
VAAL follows AllasCode principles.
A runtime SHOULD be generated from declarations such as:
schema.yml
manifest.yml
config.yml
policies/
constraints/
authorization.yml
Not:
if user.isDoctor &&
hospital == "X" &&
action == "share" ...
hidden inside application code.
Authorization behavior must be inspectable, diffable, testable and reproducible.
28. Example — Education
canonical_action: education.content.consume
constraints:
course:
equals: CS101
allowed_transformations:
- summarize
- translate
- simplify
- create_examples
- create_flashcards
- create_diagram
- create_audio
forbidden_actions:
- education.assignment.submit
- education.exam.answer
- education.grade.modify
The PersonalAgent can adapt learning material extensively.
It cannot impersonate the student academically.
29. Example — Government
canonical_action: government.license.renew
constraints:
changes_allowed: false
holder:
equals: principal
human_return_if:
- new_legal_declaration
- penalty_detected
- changed_terms
30. Example — Healthcare
canonical_action: health.records.share
constraints:
records:
categories:
- cardiology
recipient:
organization: hospital-x
specialty: cardiology
purpose:
equals: treatment
validity:
max: PT48H
redistribution:
allowed: false
31. Example — Infrastructure
canonical_action: infrastructure.production.deploy
constraints:
repository:
equals: billing-api
commit:
equals: 7a872...
tests:
required: passed
security_scan:
required: passed
destructive_migration:
allowed: false
replicas:
max_delta: 2
validity:
max: PT10M
An Agent having Kubernetes credentials is not sufficient.
It must also possess authorization for this deployment.
32. Domain profiles
The core remains generic.
Domains extend it.
VAAL Core
│
├── Commerce Profile
│ AP2
│
├── Health Profile
│ FHIR Consent
│
├── Education Profile
│ VC / Open Badges / CLR
│
├── Government Profile
│
├── Legal Profile
│
├── Enterprise Profile
│
├── DevOps Profile
│
├── IoT Profile
│
└── Data Privacy Profile
Domain standards SHOULD be referenced rather than recreated.
33. AP2 compatibility
Commerce remains a specialization.
Conceptual mapping:
VAAL AP2
DelegationMandate → Open Mandate
ActionMandate → Closed Mandate
ActionCommitment → checkout-bound commitment
canonical_action → payment/checkout action
ActionReceipt → Mandate Receipt
Constraint → AP2 Constraint
Principal → User
Agent → Shopping Agent
Verifier → Business /
Payment Processor
VAAL does not replace AP2 for payments.
Instead:
AP2
=
Commerce Authorization Profile
compatible with the broader model
34. UCP compatibility
The reusable UCP concepts are:
Discovery
Services
Capabilities
Extensions
Schema composition
Negotiation
Transport bindings
Action contracts
Versioning
VAAL adopts the architectural principles without claiming that non-commerce capabilities are UCP capabilities.
Possible integration:
extensions:
org.h2a2h.vaal:
version: "1.0"
schema: https://h2a2h.space/schemas/vaal/v1
35. Relationship to OAuth authorization
OAuth remains useful for obtaining API access.
VAAL solves a more semantic problem.
OAuth token:
"this client can access this API"
VAAL Mandate:
"this Agent is authorized by this Principal
to execute this precise semantic Action,
against this request/state,
under these constraints"
They SHOULD coexist.
VAAL does not replace OAuth.
36. Core invariants
INV-001 — No authority expansion
Authority(child) ⊆ Authority(parent)
INV-002 — Action identity
Every protected Action has exactly one stable canonical_label.
INV-003 — Binding
Execution MUST match the authorized ActionCommitment.
INV-004 — State freshness
When authorization depends on authoritative state, stale state invalidates the authorization.
INV-005 — Fail closed
Unknown mandatory constraint → not ALLOW.
INV-006 — Proof of possession
Autonomous delegated authority MUST be cryptographically bound to the authorized Agent.
INV-007 — Replay resistance
Authorization MUST include sufficient context to prevent unintended reuse.
INV-008 — Execution boundary
No consequential execution path may bypass authorization enforcement.
INV-009 — Receipt
Every successfully executed consequential Action produces verifiable execution evidence.
INV-010 — Human escalation
An Agent cannot autonomously expand its Mandate when authorization is insufficient.
It must:
CHALLENGE
→ Proof-of-Human-Return
37. Minimal runtime
The runtime can be reduced to five operations:
discover()
delegate()
commit()
authorize()
execute()
receipt()
More formally:
Discovery
↓
Delegation
↓
Commitment
↓
Verification
↓
Execution
↓
Receipt
38. Integration with the H2A2H runtime
Current H2A2H runtime:
Intake
→ Resolver
→ Binding
→ Healing
→ Proof
→ Governor
→ Orchestration
→ Acceptance
→ Persistence
VAAL should integrate as:
Intake
→ Resolver
→ Binding
→ Healing
→ Proof
→ Authorization
→ Governor
→ Orchestration
→ Execution Boundary
→ Acceptance
→ Receipt
→ Persistence
Authorization validates authority.
Governor evaluates system/domain policies.
They must remain different concerns.
39. Proposed repository structure
authorization/
│
├── README.md
├── manifest.yml
├── config.yml
├── schema.yml
│
├── mandates/
│ ├── delegation/
│ └── action/
│
├── commitments/
│ └── action/
│
├── receipts/
│ └── action/
│
├── constraints/
│ ├── action/
│ ├── entity/
│ ├── resource/
│ ├── purpose/
│ ├── temporal/
│ ├── delegation/
│ ├── state/
│ └── execution-count/
│
├── verifier/
│
├── execution-boundary/
│
├── challenges/
│ └── proof-of-human-return/
│
├── profiles/
│ ├── commerce/
│ ├── government/
│ ├── health/
│ ├── education/
│ ├── enterprise/
│ ├── legal/
│ ├── devops/
│ └── iot/
│
├── bridges/
│ ├── ap2/
│ ├── ucp/
│ ├── openid4vp/
│ ├── oauth/
│ └── vc/
│
└── tests/
├── authorization/
├── attenuation/
├── replay/
├── state-binding/
├── expiration/
├── constraints/
└── human-return/
40. Protocol lifecycle
The complete generic flow is:
Principal
│
│ creates Intent
▼
OpenIntent
│
▼
PersonalAgent
│
│ obtains bounded authority
▼
DelegationMandate
│
▼
Entity Discovery
│
▼
Capability Negotiation
│
▼
Action proposal
│
▼
ActionCommitment
│
│ derive exact authorization
▼
ActionMandate
│
▼
Verifier
│
├── DENY ────────────────X
│
├── CHALLENGE
│ │
│ ▼
│ Proof-of-Human-Return
│ │
│ └───────────────┐
│ │
└── ALLOW ◄─────────────┘
│
▼
Execution Boundary
│
▼
Executor
│
▼
New State
│
▼
ActionReceipt
│
▼
Authorization State Update
41. Core semantic statement
The H2A2H authorization model can be summarized as:
Authentication proves who an Entity is.
Delegation proves who may act for whom.
Intent expresses what outcome is desired.
Authorization proves whether an exact Action may occur.
Commitment proves what was actually authorized.
Execution changes reality.
Receipt proves what actually happened.
This separation is fundamental.
42. Contribution boundary
VAAL MUST NOT claim invention of:
Verifiable Credentials
delegated authorization
agent authorization
Mandates
selective disclosure
proof-of-possession
authorization receipts
pre-execution permits
capability negotiation
Those mechanisms have substantial prior art.
The prospective H2A2H contribution is their unification around a semantic action model:
Entity
+
canonical Action identity
+
OpenIntent
+
OpenDelegation
+
UCP-like capability discovery
+
cryptographically attenuated authority
+
ActionCommitment
+
state/request-bound authorization
+
transport-independent execution
+
Proof-of-Human-Return
+
verifiable ActionReceipt
The particularly important H2A2H hypothesis is:
A stable semantic
canonical_labelfor an atomic Action can serve simultaneously as the vocabulary for discovery, delegation, authorization, policy, orchestration, proofs, observability and execution receipts.
That hypothesis is broader than payment authorization and should be evaluated independently as part of the H2A2H research program.
43. Canonical rule
The foundational VAAL invariant is therefore:
No externally consequential Intent Action SHALL cross an execution boundary without a verifiable, attenuated and context-bound authorization chain whose semantic target is the Action's canonical identity.
Or formally:
Execute(A)
⇒
ValidIdentity(A)
∧ ValidDelegation(A)
∧ ValidAction(A)
∧ ValidConstraints(A)
∧ ValidCommitment(A)
∧ ValidContext(A)
∧ ValidState(A)
∧ ValidPolicy(A)
And after execution:
Execute(A)
⇒
∃ Receipt(A)
This becomes the authorization foundation for autonomous H2A2H systems.
Top comments (0)