Define action classes
Examples: read.context, draft.compose, tool.call.local, email.send.external, repo.push, payment.initiate.
Bind approval to the exact provider input, reject changed or reused grants, and record a result-linked receipt.
Start with the experimental @trust-graduation/core package. Run the synthetic checks locally without an API key or live provider.
Use Node.js 20+ in a new directory. These commands install the verified beta, create an adapter, and check it against a synthetic provider. No signup or credentials required.
Expected: CONFORMANCE_RESULT with "ok":true, nine passing checks, and two result-linked receipts. This proves the local adapter contract; it does not send a real message.
mkdir mission-gate-trial
cd mission-gate-trial
npm init -y
npm install @trust-graduation/core@0.2.0-beta.4
npx trust-graduation init-adapter
npx trust-graduation conformance ./mission-gate-adapter.mjs --json
Keep the generated adapter. Your application supplies the trusted approval issuer, shared atomic grant store, provider function, and durable receipt sink.
The source candidate kills real workers and restarts them against persisted state. It keeps the host journal, synthetic provider records, and receipts for inspection.
Run the recovery walkthrough · Review the draft implementation
Node.js 18+ on macOS or Linux; Windows via WSL. This source candidate is separate from the published beta. It uses a test approval authority and sends no messages.
failed[] and never reaches the provider.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.
Use gate.prepare(action) to bind the target, canonical provider input, constraints, and expiry before review.
Your trusted approval host issues a grant for that binding. A chat reply or plain approval flag does not authorize execution.
gate.execute() validates and consumes the grant before calling the provider. Persist the result-linked receipt and reconcile unknown outcomes.
Compose the adapter around your existing provider function. The four dependencies below belong to your application; the quickstart checks the same interface with synthetic dependencies.
import { createProviderGate } from "@trust-graduation/core";
const gate = createProviderGate({
provider: yourExistingProvider,
store: sharedAtomicGrantStore,
authenticateGrant: verifyTrustedIssuer,
writeReceipt: persistReceipt
});
const binding = gate.prepare(exactAction);
// Present this binding through your trusted approval host.
// Later, execute with its authenticated grant:
const result = await gate.execute({
binding, approval, action: exactAction
});
// Inspect result.ok and result.reason before reporting success.
The helper's receipt is unsigned. Add your own signing and durable storage. Atomic grant consumption does not guarantee exactly-once external effects; crashes require provider reconciliation.
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.