Explanatory documentation only. This detailed walkthrough is non-normative and intentionally stops before Host Consumption and Execution.
An eligible policy decision must become scoped, expiring Authorization evidence bound to the exact request, identities, snapshots, Host authority, and replay and Consumption identities.
Issuance repeats the frozen checks rather than trusting the decision alone. Pure validation later compares the complete artifact against independently retained Host expectations before a separate atomic store may consume it.
This pseudo-code illustrates structural issuance and validation. It intentionally stops before consumption and execution.
let evaluationInput: EvaluationInput = /* controlled Phase 4 result */
let policyDecision: PolicyDecision = /* deterministic Phase 5 result */
let registrySnapshot: ToolRegistrySnapshot = /* exact bound snapshot */
let policySnapshot: PolicySnapshot = /* exact bound snapshot */
let hostCapabilityBoundary: HostCapabilityBoundary = retainedAuthenticatedHostBoundary
let authorization = try AuthorizationIssuer.issue(
hostCapabilityBoundary: hostCapabilityBoundary,
id: try AuthorizationID(validating: "authorization-1042"),
replayID: try AuthorizationReplayID(validating: "replay-1042"),
consumptionID: try AuthorizationConsumptionID(validating: "consume-1042"),
generation: try AuthorizationGeneration(1),
decision: policyDecision,
evaluationInput: evaluationInput,
registrySnapshot: registrySnapshot,
policySnapshot: policySnapshot,
issuedAt: explicitIssuanceTime,
lifetimeRequest: try AuthorizationLifetimeRequest(
expiresAt: explicitExpiry,
maximumLifetimeSeconds: 300
)
)
let expectedScope = try AuthorizationScopeClaim(
capabilities: [.financialTransfer],
resources: [ResourceID(rawValue: "invoice-1042")]
)
let validation = try AuthorizationValidator.validate(
authorization,
hostCapabilityBoundary: hostCapabilityBoundary,
context: AuthorizationValidationContext(
authorizationID: hostExpectedAuthorizationID,
version: .v1,
generation: try AuthorizationGeneration(1),
policyDecision: policyDecision,
evaluationInput: evaluationInput,
canonicalRequest: evaluationInput.canonicalRequest,
toolDefinition: evaluationInput.toolReference.definition,
registrySnapshot: registrySnapshot,
policySnapshot: policySnapshot,
subjectID: evaluationInput.securityContext.subjectID,
tenantID: evaluationInput.securityContext.tenantID,
sessionBinding: evaluationInput.securityContext.sessionBinding,
delegationID: evaluationInput.securityContext.delegationID,
scope: expectedScope,
lifetime: AuthorizationLifetimeExpectation(
issuedAt: explicitIssuanceTime,
expiresAt: explicitExpiry,
maximumLifetimeSeconds: 300
),
replayID: try AuthorizationReplayID(validating: "replay-1042"),
consumptionID: try AuthorizationConsumptionID(validating: "consume-1042")
),
evaluationTime: explicitValidationTime
)
// Stop. `validation.consumptionBinding` identifies the complete logical
// authorization for a future host store, and `validation.consumptionContract`
// says the host must atomically consume once before any side effect. Phase 6 has
// no consumption store and no execution path.EvaluationInput
↓
PolicyDecision
↓
AuthorizationIssuer
↓
Authorization
↓
Host validation
↓
Future host atomic consumption (not implemented)
↓
Future host execution (outside SecureToolKit; not shown)
- Canonical argument, Tool Definition, registry, or policy substitution.
- Subject, tenant, session, delegation, or Host-boundary mismatch.
- Capability or resource broadening.
- Authorization, replay, Consumption, generation, or lifetime substitution.
- Validation being confused with Consumption or Execution.
- Passing a confirmation-required decision to the Phase 6 issuer.
- Deriving validation expectations from the submitted Authorization.
- Replacing the retained
HostCapabilityBoundaryduring validation. - Treating successful validation as replay prevention.
- Calling an executor before durable atomic single-use Consumption succeeds.