Arcana ARCANA/GOVERNANCE index 06 · DELEGATION ¬Authorized(q) ¬Executed(q)
~/arcana/governance/delegation.md
06

DELEGATION & ATTENUATION

Authority can only get narrower

parent grants Authority(p) ──┤ Actions(c) ⊆ Actions(p)Expiry(c) ≤ Expiry(p) · Uses(c) ≤ Uses(p) └──child session Depth+1 ≤ MaxDepth └──grandchild? only if depth allows
Authority(child) Authority(parent)
Zero ambient authority. A child receives nothing by default. Parent grant identifiers are not directly usable by the child. Revoked, expired, exhausted, missing, or cyclic ancestors invalidate the descendant at execution time.
Parent requests bounded child work
Select explicit parent grants to attenuate
Validate parent & ancestor state
Validate attenuation holds
Transactionally insert PENDING child grants
Create child session / principal
Activate grants only after identity confirmation
Child executes through the normal PDP/PEP
Parent or ancestor revocation invalidates child
/governance/delegation.md
# 06 · Delegation & Attenuation

> Authority can only get narrower.

## Overview

Subagents and child sessions need authority to work. Delegation is how a
parent lends its own grants downward — and attenuation is the rule that makes
this safe: **a child can never hold more authority than the parent that
delegated it**.

## The attenuation laws

```text
Authority(child) ⪯ Authority(parent)
Actions(child)  ⊆ Actions(parent)
Resources(child) ⊆ Resources(parent)
Expiry(child)   ≤ Expiry(parent)
Uses(child)     ≤ Uses(parent)
DelegationDepth(child) = DelegationDepth(parent) + 1 ≤ MaxDepth(parent)
```

Every dimension can only shrink or stay equal. There is no operation anywhere
in the system that widens a grant downward.

## Zero ambient authority

- A child starts with **nothing**. Not "fewer permissions" — none.
- Parent grant identifiers are not directly usable by the child; the child
  receives newly minted, attenuated grants.
- Revoked, expired, exhausted, missing, or cyclic ancestors invalidate the
  descendant **at execution time** — checked fresh at the PEP, not cached.

## Lifecycle (nine steps)

1. Parent requests bounded child work.
2. Select explicit parent grants to attenuate.
3. Validate parent & ancestor state (alive, unexpired, unexhausted).
4. Validate attenuation holds on every dimension.
5. Transactionally insert PENDING child grants.
6. Create child session / principal.
7. Activate grants only after identity confirmation.
8. Child executes through the normal PDP/PEP — same gate as everyone else.
9. Parent or ancestor revocation invalidates the child's grants.

## Worked example

Parent holds: run-tests (bash, tests/**, 1h, 50 uses).

- Child delegated "run the test suite": receives run-tests attenuated to
  exactly that command pattern, expiry ≤ parent's, uses ≤ parent's remaining.
- Child asks for `npm install`: denied — no grant covers install, and the
  parent's other capabilities were never selected for delegation.
- Parent's grant is revoked mid-run: child's very next tool call fails closed.

## Related

- Previous: [Exact Durable Capabilities](/governance/capabilities.md)
- Next: [Provenance & Sensitivity](/governance/provenance.md)