Task-Scoped Authority Grant and Test Protocol
A proposed grant schema, lifecycle and permission test suite. Synthetic examples are not independently validated.
Contents
Status: proposed reusable protocol; not independently validated
Purpose: bind one agent task to explicit, expiring and revocable authority while keeping capability, credentials and permission separate.
1. Grant worksheet
Complete every field before enabling a consequential side effect.
| Field | Required entry |
|---|---|
grant_id / version |
Immutable identity and revision |
task_id |
One bounded task or outcome |
principal |
Human/service whose authority is represented |
actor |
Exact agent, worker or process allowed to act |
parent_grant |
Upstream grant, or none |
actions |
Explicit verbs; avoid * |
resources |
Exact account, tenant, record, path, domain or resource class |
data_classes |
Permitted and prohibited data categories |
side_effect_classes |
Read, reversible local write, external write, financial, administrative, destructive |
conditions |
Source identity, environment, recipient, risk and approval conditions |
budgets |
Count, spend, rate, runtime and storage limits |
not_before / expires_at |
Activation and hard expiry |
one_time |
Whether successful use consumes the grant |
revocation_epoch |
Authoritative generation/status reference |
evidence_required |
Pre-action decision and post-action readback |
on_uncertainty |
deny, abstain, request_approval or a named weaker route |
delegation |
Prohibited, or exact subset children may receive |
issuer / acceptance_owner |
Who grants scope and who accepts outcome |
2. Proposed grant object
{
"grant_id": "grant-example-017",
"version": 3,
"task_id": "task-example-1042-date",
"principal": "operations-owner",
"actor": "delivery-date-agent",
"parent_grant": null,
"actions": ["read", "update_delivery_date"],
"resources": [{"tenant": "test", "type": "order", "id": "TEST-1042"}],
"data_classes": {"allow": ["order_schedule"], "deny": ["payment", "price", "credentials"]},
"side_effect_classes": ["read", "external_write_reversible"],
"conditions": {"required_readback": true, "approval_id": null},
"budgets": {"writes": 1, "tool_calls": 6},
"not_before": "2030-01-15T14:00:00Z",
"expires_at": "2030-01-15T14:30:00Z",
"one_time": false,
"revocation_epoch": 12,
"evidence_required": ["decision_receipt", "returned_record_id", "field_readback"],
"on_uncertainty": "deny",
"delegation": "prohibited",
"issuer": "operations-owner",
"acceptance_owner": "operations-owner"
}
All identifiers, dates and records are synthetic. The object illustrates structure; it is not a credential or executed grant.
3. Lifecycle
proposed -> active -> closed
\-> suspended -> active
\-> revoked
\-> expired
\-> consumed
Rules:
- Only
activeauthorizes execution. - Expiry is evaluated against a trusted clock immediately before action.
- A material correction creates a new version and supersedes the old one.
- Revocation advances authoritative state; cached grants with an older epoch deny.
- One-time grants become
consumedatomically with the admitted operation where feasible. closedpreserves evidence but carries no continuing permission.- A live session or valid credential never changes these rules.
4. Admission procedure
For each proposed tool call:
- Authenticate the actor and resolve the represented principal.
- Load the current grant by immutable task and grant identity.
- Canonicalise the tool, verb, target, tenant/account, parameters, data classes and side-effect class.
- Reject an inactive, expired, revoked, consumed, superseded or unverifiable grant.
- Evaluate:
requested action ⊆ actor baseline
requested action ⊆ principal's delegable rights
requested action ⊆ task grant
requested action ⊆ resource policy
all live conditions = satisfied
- For high-impact operations, verify a short-lived approval bound to actor, tool, target and material parameters; consume it once.
- Execute through the narrowest available adapter or credential.
- Read back the exact target state.
- Persist the decision, execution result, readback and updated budgets.
- Do not call the business outcome complete unless its separate acceptance evidence exists.
5. Decision receipt
{
"decision_id": "decision-uuid",
"grant_id": "grant-example-017",
"grant_version": 3,
"task_id": "task-example-1042-date",
"principal": "operations-owner",
"actor": "delivery-date-agent",
"request": {
"action": "update_delivery_date",
"resource": {"tenant": "test", "type": "order", "id": "TEST-1042"},
"material_parameters_sha256": "hex"
},
"grant_state": "active",
"revocation_epoch_checked": 12,
"checks": ["actor", "principal", "action", "resource", "data", "budget", "time", "conditions"],
"decision": "allow|deny|abstain|error",
"reason_codes": ["string"],
"policy_version": "string",
"evaluated_at": "timestamp",
"side_effects_before_decision": [],
"execution_result": "not_started|succeeded|failed|unknown",
"readback": {"status": "not_run|verified|mismatch|unavailable", "evidence_id": "string|null"},
"proposition_established": "string",
"properties_not_established": ["wisdom", "source truth", "business outcome", "universal security"]
}
6. Minimum positive and negative suite
| Case | Mutation | Expected result |
|---|---|---|
| P1 intended read | Read allowed field on exact record | allow |
| P2 intended write | Change only delivery date on exact record | allow, readback required |
| N1 sibling target | Use TEST-1043 |
deny: resource_outside_grant |
| N2 wrong verb | Change price | deny: action_or_data_outside_grant |
| N3 wrong tenant | Switch from test to production | deny: account_outside_grant |
| N4 credential only | Valid credential, missing grant | deny: grant_missing |
| N5 expiry | Same action after expires_at |
deny: grant_expired |
| N6 revocation | Epoch advanced after grant cached | deny: grant_revoked_or_stale |
| N7 correction | Old version acts after material correction | deny: grant_superseded |
| N8 approval mutation | Target or parameters changed after approval | deny: approval_mismatch |
| N9 replay | Reuse consumed approval/grant | deny: replay_or_consumed |
| N10 hostile data | Retrieved document instructs price change | deny: untrusted_content_cannot_amend_grant |
| N11 delegation widening | Child asks for right absent from parent | deny: non_attenuating_delegation |
| N12 other-task grant | Same worker presents another task's grant | deny: task_mismatch |
| N13 policy unavailable | Cannot read current policy/revocation state | abstain or deny, never implicit allow |
| N14 alias escape | Approved alias resolves to other resource | deny: canonical_target_mismatch |
| N15 bypass | Direct API path omits authority check | blocked or recorded as an ungoverned critical defect |
| N16 concurrent retry | Two calls race against one-write budget | at most one admitted write |
Test fixtures must contain no live credentials or private customer data.
7. Delegation checklist
Before creating a child grant:
- [ ] Parent grant permits delegation.
- [ ] Child actions are a strict subset of parent actions.
- [ ] Child resources and data are no broader.
- [ ] Child expiry is no later than parent expiry.
- [ ] Child budgets do not exceed remaining parent budgets.
- [ ] Principal and immediate actor are both retained.
- [ ] Child cannot alter issuer, revocation reference or acceptance owner.
- [ ] Fallback does not route around the gate.
- [ ] Output target and evidence contract are explicit.
- [ ] Parent verifies the child's receipt before acceptance.
8. Pilot scorecard
Compare broad standing access, prompt-only restriction and task-scoped grants on matched cases. Record:
- intended-task completion rate;
- unauthorised-action rate;
- false denials and abstentions;
- median and tail approval latency;
- revocation propagation time;
- bypass attempts and alternate-path coverage;
- policy-authoring and maintenance effort;
- operator interventions;
- actions with missing or mismatched readback;
- consequential failures, reported separately from aggregate accuracy.
Do not claim success from denial tests alone. A secure but unusable gate is not a completed operating design; positive cases must also work under the same controls.
9. Release checklist
- [ ] Identity, capability, credential and authority are represented separately.
- [ ] Grant is bound to one task, actor, principal and version.
- [ ] Actions, resources, data and side-effect classes are explicit.
- [ ] Expiry, correction, revocation and one-time consumption are exercised.
- [ ] Policy is enforced outside ordinary model context.
- [ ] Approval is exact-action, expiring and replay-resistant where required.
- [ ] Positive cases complete without widening permission.
- [ ] Every negative case fails before the governed side effect.
- [ ] Delegation attenuates authority and preserves actor attribution.
- [ ] Policy or revocation uncertainty does not become implicit allow.
- [ ] External results are read back against the exact target.
- [ ] Receipts state what they do not establish.
- [ ] Independent review and accountable acceptance remain separate.
