Define action classes
Examples: read.context, draft.compose, tool.call.local, email.send.external, repo.push, payment.initiate.
Mission intercepts consequential tool calls before execution, binds approval to the exact target and input, resumes once under a narrow grant, and emits a signed receipt.
Reference integrations now cover OpenAI Agents SDK and MCP 2025-11-25, with canonical schemas and OpenTelemetry-compatible trace correlation.
The proof is one real consequential action plus the failure cases: replay, changed target or input, expiry, revocation, and tenant mismatch.
wrapTool intercepts before the OpenAI or MCP provider call.needs_approval with exact target, payload digest, tenant, scope, and expiry.Do not start with the tool name. Start with the consequence. The same tool can be safe for one action class and unsafe for another.
Agents should not need to read marketing pages to find the trust boundary. Publish a small manifest, return structured decisions, and make every denial point to a safe next action.
/.well-known/trust-graduationDeclare supported protocol version, schemas, action classes, decision states, and runtime guidance.graduationPathTell the agent whether to prepare approval, request principal approval, collect receipts, reduce scope, run a dry run, or stop.Examples: read.context, draft.compose, tool.call.local, email.send.external, repo.push, payment.initiate.
canExecuteReturn allowed, allowed_with_constraints, review_required, deferred, blocked, or human_only from evidence, user approval, reversibility, and prior receipts.
If review is required, create a local approval packet with external_actions: 0. The agent can prepare; the human decides.
Log what was approved, refused, revised, or executed. Use that receipt as future permission evidence.
Mission Gate wraps the execution boundary. It does not replace the model, runtime, IAM, policy engine, provider, or tracing stack.
const governedSend = wrapTool(sendGmail, {
capability: "email.send.external",
workspaceId,
gate,
tracer
})
try {
await governedSend.execute(input)
} catch (interruption) {
// show exact effect to the human
const result = await resumeUnderGrant({
interruption,
tool: sendGmail,
options: { gate, tracer }
})
verifyReceipt(result.receipt)
}
A useful packet makes the proposed external consequence reviewable before the agent creates it.
email.send.external, repo.push, calendar.create, payment.initiate, etc.We are asking builders a narrow question: should action-class permission live in each app, in MCP, in evals/observability, or as a small receipt-based layer across them?
If you build agents, MCP servers, evals, coding tools, workflow automation, or enterprise AI controls, tell us where this pattern is wrong, redundant, or useful.