Agent skill
confirm-approvals is a small set of instructions that teach an agent when to pause for a human. It is the coverage layer: it does not enforce anything on its own, it makes the model reliably reach for approval on the actions that warrant it. The instructions are model-agnostic. Use them as a Claude skill, as Gemini system instructions, or in any system prompt.
WHERE IT FITS
guard()). The model is the thing you are guarding, so a skill is never the boundary; it is coverage on top of one. Use both.What it teaches
- Request approval before money movement, destruction (deletes, drops, revokes), deploys and config changes, outbound messages, and access changes, or anything above a threshold. When unsure, ask.
- Skip approval for read-only or easily reversible work.
- Write a decidable summary with the real stakes, and pass context (why, and what it did first).
- Honor the verdict exactly: on approval, use the returned
effectivePayload(the human may have edited it); on rejection or expiry, do not act and do not route around the step.
Install it
The instructions live at one stable URL: https://confirm.dev/confirm-approvals.md. Point your agent at it however your stack loads instructions.
Claude (Claude Code, Agent SDK)
Drop it in the skills directory and it loads automatically.
mkdir -p .claude/skills/confirm-approvals
curl -o .claude/skills/confirm-approvals/SKILL.md \
https://confirm.dev/confirm-approvals.mdGemini
Pass the file's contents as the system instruction.
import requests
from google import genai
from google.genai import types
skill = requests.get("https://confirm.dev/confirm-approvals.md").text
client = genai.Client()
response = client.models.generate_content(
model="gemini-2.5-pro",
contents="Refund customer #4821 for the duplicate charge.",
config=types.GenerateContentConfig(
system_instruction=skill,
# tools=[request_approval] # your function that calls the Confirm.dev API
),
)Any other agent
Fetch https://confirm.dev/confirm-approvals.md and prepend its contents to your system prompt. The YAML header is Claude skill metadata and is harmless elsewhere; the body is plain instructions.
Pair it with a tool
The skill tells the agent to request approval and wait. Give it a real way to do that:
- MCP server — the instructions line up with the
request_approvaltool fromconfirm-mcp. Add both and an MCP agent both knows when to ask and has the tool to do it. - SDK — in TypeScript, the deterministic path is
guard()policies. Use the skill for the long tail your policies didn't enumerate; keep policies as the floor. - API — any language: the agent's tool just calls
POST /v1/requestsand waits for the verdict.