~/arcana/governance/request.md
01
The Authorization Request
Every consequential action becomes one hashable object.
OBJ q · CANONICAL
4 SEMANTIC LAYERS
H(q)-BOUND
q.01 Identity
requestId, requestHash, nonce,
policyVersion, principalId,
sessionId, workspaceId,q.02 Intent
contractId, contractRevision,
criterionIds[], riskClass, requestedAt,q.03 Action
action, tool, resource,
executable, arguments[], cwd, destination,q.04 Data Lineage
provenanceLabels[], sensitivity, fieldLineage[]change one byte → different identity
# 01 · The Authorization Request
> Every consequential action becomes one hashable object.
## Overview
Before any tool runs — before a shell command spawns, before a file is
touched, before a network call leaves the machine — Arcana constructs a
canonical **AuthorizationRequest**. This object is the atom of the entire
security kernel: everything downstream (policy decisions, approvals,
capabilities, proofs) keys off it.
The defining property: the **requestHash covers every consequential field**.
Change the principal, any argument, the working directory, the destination,
a secret, the contract revision, the policy version, or the nonce — and you
get a *different authorization identity*. There is no such thing as "mostly
the same request".
## Canonical schema
```text
AuthorizationRequest {
// identity
requestId, requestHash, nonce,
policyVersion, principalId,
sessionId, workspaceId,
// intent
contractId, contractRevision,
criterionIds[], riskClass, requestedAt,
// action
action, tool, resource,
executable, arguments[], cwd, destination,
// data lineage
provenanceLabels[], sensitivity, fieldLineage[]
}
```
## Field reference
| Field group | Fields | Purpose |
|---|---|---|
| Identity | requestId, requestHash, nonce | Unique handle; H(q) binds every field; nonce blocks replay |
| Identity | policyVersion | Pins which policy snapshot the verdict must be evaluated against |
| Identity | principalId, sessionId, workspaceId | Who asks, inside which session and workspace boundary |
| Intent | contractId, contractRevision | Which objective justifies this request, at which revision |
| Intent | criterionIds[] | Active criteria that demand this exact action |
| Intent | riskClass, requestedAt | Control floor (LOW→CRITICAL) and wall-clock pin |
| Action | action, tool, resource | What kind of operation, through which tool, against what |
| Action | executable, arguments[], cwd, destination | The exact bytes that would run and where effects land |
| Lineage | provenanceLabels[], sensitivity | Origin classification of inputs feeding this request |
| Lineage | fieldLineage[] | Per-field origin history for consequential fields |
## Worked example
Agent proposes: `rm -rf ./build` in workspace W during session S.
- executable = `rm`, arguments = ["-rf", "./build"], cwd = /home/user/proj
- riskClass = HIGH (deletion)
- provenanceLabels include MODEL_OUTPUT (the idea originated from the model)
- requestHash = H(everything above, canonically serialized)
If the model next proposes `rm -rf ./build/` (trailing slash), that is a
**different hash**, a different request, and requires its own authorization.
No fuzzy matching. No "close enough".
## Edge cases and failure behavior
- **Argument reordering**: canonical serialization defines a deterministic
ordering, so semantically identical requests hash identically — but any
value change still changes the hash.
- **Missing lineage**: if a consequential field's origin cannot be established
(UNKNOWN) on a HIGH or CRITICAL request, the request fails closed. See
[Provenance](/governance/provenance.md).
- **Policy version skew**: a decision made against policyVersion P is stale
the moment the active policy moves past P; the PEP rejects it. See
[PDP ⇄ PEP](/governance/pdp-pep.md).
## Related
- Next: [PDP ⇄ PEP Split](/governance/pdp-pep.md)
- Consumed by: [Intent Binding](/governance/intent.md), [Approvals](/governance/approvals.md)