Rightshold™ Sign up

Beta

Agent guardrails and data compartments, no retraining

Define a policy once: spend caps, allowed and blocked actions, tool and domain allowlists, approval thresholds, rate limits, a kill switch, and need-to-know data grants. Any agent, yours or an outside one, checks it before acting. Denials reveal nothing; every decision is recorded on a verifiable ledger.

What it is

A guardrail gateway that sits in front of agents instead of inside them. You do not fine-tune, prompt-engineer or retrain anything: the agent (or the tool layer, proxy or MCP server it calls through) asks POST /v1/guard/check before an action and gets allow, deny or needs_approval. The same policy covers your internal agents and outside agents you let touch your systems.

Compartmentalization: need-to-know data

Each policy can carry data grants: a resource (or glob such as finance.*), the fields the agent may see, the purposes it may use them for, and an expiry. A request for a field, resource or purpose outside the grant is denied. An agent working support sees the customer's name and last order, not their card or salary, and the grant lapses on its own.

Denials reveal nothing

An agent that is refused gets only decision: deny, code: denied and a decision_id. It never learns which rule fired, what the caps are, or what other agents can see, so it cannot probe the policy. The owner sees the full reasons at GET /v1/guard/decisions. The public ledger stores only a hash of each decision, so the record is verifiable without exposing your data.

Kill switch and existing controls

POST /v1/guard/policies/{id}/kill stops every check under that policy at once. An account freeze (/kill-switch) and a revoked agent credential in the kill-switch registry also deny every check, so the controls you already set keep working.

Drop-in wrapper

Wrap the tool, not the model:

// Drop-in guard for any agent tool call (Node 18+). No retraining: wrap the tool, not the model.

const GUARD = { policy_id: process.env.RS_GUARD_POLICY, guard_token: process.env.RS_GUARD_TOKEN };

export function guarded(name, fn, describe = () => ({})) {

return async (...args) => {

const r = await fetch("https://rightshold.com/v1/guard/check", { method: "POST", headers: { "content-type": "application/json" },

body: JSON.stringify({ ...GUARD, agent: process.env.RS_AGENT_ID || "agent", action: name, tool: name, ...describe(...args) }) }).then((x) => x.json());

if (r.decision !== "allow") throw new Error(`blocked by guard (${r.decision}, ${r.decision_id})`);

return fn(...args);

};

}

Honest limits

Enforcement happens where the check is called. An agent that holds raw credentials and skips the wrapper is not stopped, so put the check in the proxy or tool layer the agent cannot bypass and keep the real keys there. Rightshold operates the ledger today; independent witness co-signing is the next step, so this is verifiable, not operator-free. Rightshold never sells or trains on your data: see /data-commitment.

Use it

Price

Free during the Beta. Any future price is announced at /transparency/changes with 7 days' notice before it applies.