Post 3 in the agent-controls series: authority that changes during operation
Where the series stands
- Part 1 — expressed agent
guardrails as machine-checkable OSCAL, and proved the gate ran.
- Part 2 — proved the
gate is correct for every input, with Dafny plus a Rego twin plus
differential testing.
Both posts assume something they never state: the policy is fixed.
The gate evaluates a tool call against a static allowlist and returns
allow or deny. That is the right simplification for parts 1 and 2, and
it is also the thing that breaks next.
The gap this post fills
Six active IETF drafts on agent authorization were read against a
working control-plane implementation. Two defects recur in all six:
- Authority is modeled as issued state, not current state. A token
still valid by expiry and call-count stays valid even after the
conditions that justified it have changed — the sandbox posture
shifted, a reviewer blocked, runtime behavior diverged from the
approved plan. Enforcement checks the signature, not the world.
- Demotion does not exist. Every draft models grant and revoke.
None models the middle. An agent that fails review is often still
useful at a lower authority level, and no specification says how to
put it there.
Public drafts, if the post wants to cite them (read the live body before
quoting any section number — these readings are second-hand and
unverified):
| Draft |
Rev |
draft-liu-agent-operation-authorization |
02 |
draft-chen-agent-decoupled-authorization-model |
00 |
draft-ni-a2a-ai-agent-security-requirements |
01 |
draft-song-oauth-ai-agent-collaborate-authz |
02 |
Bodies at https://www.ietf.org/archive/id/<draft-name>-<rev>.txt.
The specific technical hook
draft-liu-...-02 carries a policy_id claim referencing an OPA policy
by identifier. Without a content-addressed digest, the audit evidence
can later point at a different policy body under the same ID.
OSCAL has the identical defect. An implemented-requirement points
at a control by identifier; nothing content-addresses the control text
or the policy body actually in force at assessment time. Two
communities, two layers, same referential weakness. That observation
bridges this series back to Part 1 and is probably the strongest single
paragraph available.
A second hook: scope narrowing is not mode narrowing
Delegation models prevent an agent from widening scope. None of them
constrain mode. "Modify one file" at enforce authority and "recommend
a patch" at suggest authority target the same resource and the same
operation family with completely different blast radius.
Candidate thesis
A proved gate is only as good as the policy it enforces, and the
policy is the part that has to change while the agent is running.
Both OSCAL assessment and the current agent-authorization drafts
assume point-in-time evaluation against an identifier — and that
assumption breaks for an actor whose trustworthiness changes during
operation.
Falsifiable, contested, and it earns its place by attacking the
previous two posts rather than restating them. Part 2 already did this
to Part 1 successfully; the series has a working pattern.
What would make it concrete
The obvious extension to
oscal-agent-controls:
an authority mode carried alongside the policy tuple, a demotion path
that is not full revocation, and a Dafny lemma along the lines of
"an agent cannot act above its current authority mode, and a demotion
takes effect before the next decision." That is the same trick as Part
2 applied to a moving target, and it keeps the series' promise that
everything shown actually runs.
Constraints (unchanged from #413)
Describe the approach generically. No internal control counts, no
control IDs from the internal overlay, no internal repo or project
names, no employer specifics. nexus-agents is public and may be named
and linked. Synthetic namespaces and fake tool names throughout, as in
Parts 1 and 2 — that convention worked and the NDA audit on both posts
came back completely clean.
Run the pre-publish gate before pushing.
Post 3 in the agent-controls series: authority that changes during operation
Where the series stands
guardrails as machine-checkable OSCAL, and proved the gate ran.
gate is correct for every input, with Dafny plus a Rego twin plus
differential testing.
Both posts assume something they never state: the policy is fixed.
The gate evaluates a tool call against a static allowlist and returns
allow or deny. That is the right simplification for parts 1 and 2, and
it is also the thing that breaks next.
The gap this post fills
Six active IETF drafts on agent authorization were read against a
working control-plane implementation. Two defects recur in all six:
still valid by expiry and call-count stays valid even after the
conditions that justified it have changed — the sandbox posture
shifted, a reviewer blocked, runtime behavior diverged from the
approved plan. Enforcement checks the signature, not the world.
None models the middle. An agent that fails review is often still
useful at a lower authority level, and no specification says how to
put it there.
Public drafts, if the post wants to cite them (read the live body before
quoting any section number — these readings are second-hand and
unverified):
draft-liu-agent-operation-authorizationdraft-chen-agent-decoupled-authorization-modeldraft-ni-a2a-ai-agent-security-requirementsdraft-song-oauth-ai-agent-collaborate-authzBodies at
https://www.ietf.org/archive/id/<draft-name>-<rev>.txt.The specific technical hook
draft-liu-...-02carries apolicy_idclaim referencing an OPA policyby identifier. Without a content-addressed digest, the audit evidence
can later point at a different policy body under the same ID.
OSCAL has the identical defect. An
implemented-requirementpointsat a control by identifier; nothing content-addresses the control text
or the policy body actually in force at assessment time. Two
communities, two layers, same referential weakness. That observation
bridges this series back to Part 1 and is probably the strongest single
paragraph available.
A second hook: scope narrowing is not mode narrowing
Delegation models prevent an agent from widening scope. None of them
constrain mode. "Modify one file" at enforce authority and "recommend
a patch" at suggest authority target the same resource and the same
operation family with completely different blast radius.
Candidate thesis
Falsifiable, contested, and it earns its place by attacking the
previous two posts rather than restating them. Part 2 already did this
to Part 1 successfully; the series has a working pattern.
What would make it concrete
The obvious extension to
oscal-agent-controls:an authority mode carried alongside the policy tuple, a demotion path
that is not full revocation, and a Dafny lemma along the lines of
"an agent cannot act above its current authority mode, and a demotion
takes effect before the next decision." That is the same trick as Part
2 applied to a moving target, and it keeps the series' promise that
everything shown actually runs.
Constraints (unchanged from #413)
Describe the approach generically. No internal control counts, no
control IDs from the internal overlay, no internal repo or project
names, no employer specifics.
nexus-agentsis public and may be namedand linked. Synthetic namespaces and fake tool names throughout, as in
Parts 1 and 2 — that convention worked and the NDA audit on both posts
came back completely clean.
Run the pre-publish gate before pushing.