db \`7MM"""Mq. .g8"""bgd db \`7MN. \`7MF'\`7MM"""YMM
;MM: MM \`MM..dP' \`M ;MM: MMN. M MM \`7
,V^MM. MM ,M9 dM' \` ,V^MM. M YMb M MM d
,M \`MM MMmmdM9 MM ,M \`MM M \`MN. M MMmmMM
AbmmmqMA MM YM. MM. AbmmmqMA M \`MM.M MM Y ,
A' VML MM \`Mb.\`Mb. ,' A' VML M YMM MM ,M
.AMA. .AMMA..JMML. .JMM. \`"bmmmd'.AMA. .AMMA..JML. YM .JMMmmmmMMMIssue short-lived credentials. Enforce every tool call. Sign every decision.
Agents aren't users. They aren't service accounts either.
They act on a person's behalf, choose their tools at runtime, and run for minutes — not days. Existing IAM was designed for neither shape.
A control plane for agent identity and permissions.
Every agent gets short-lived, task-bound credentials. Every tool call is evaluated against policy. Every decision is signed evidence — ready for audit.
- Federates with your IdP — not a replacement
- SDK or transparent proxy — your choice
- Evidence exports built for audit, in the formats your reviewer accepts
Three calls. Identity to enforcement.
Bind once at boot. Mint per task. Enforce on every call. The whole control plane fits behind three SDK methods.
Bind identity
Arcane composes the user from your IdP, the agent from your registry, and the workload from runtime attestation into a single signed principal.
// At agent boot
const principal = await arcane.bind({
user: req.identity, // verified IdP token
agent: { id: "release-bot", version: "1.2" },
workload: await runtime.attest(),
});
// → { principalId, boundAt, expiresAt }Issue a task-bound grant
Each grant names the task, the resources it covers, and the actions allowed. Short TTLs replace standing access; nothing else carries.
// Per-task grant
const grant = await arcane.issue({
principal,
task: "rotate-staging-keys",
resources: ["aws:iam:role/staging-*", "vault:kv/staging/*"],
actions: ["iam:UpdateAccessKey", "kv:read"],
ttl: "5m",
});
// → { token, exp, jti }Enforce on every call
SDK at the call site, or transparent proxy in front of any service. Same policy, same signed evidence — evaluation happens inline, not out of band.
// Guarded call — policy evaluates before the SDK forwards
await arcane.guard(grant, () =>
aws.iam.updateAccessKey({
UserName: "ci-deploy",
Status: "Inactive",
}),
);
// decision: allow · signed · evidenceId=ev_3f9c…Every decision, in plain view.
The same record that flows to your audit log shows up live — who, what, why, and which rule matched. Filter by agent, task, or outcome.
Policy that tightens as the agent runs.
A posture agent watches traffic, drafts changes, and queues them for operator review. Nothing promotes without a human in the loop.
allow research-agent to read drive.files when delegated by an engineering-org user
research-agent attempted drive.files.read 47 times in the last 30 days — all from engineering users. No matching rule. Promoting shadow → active would convert 47 reviews to allows.
permit (
principal in Group::"research-agent",
action == Action::"read",
resource in ResourceType::"drive.files"
) when {
principal.delegated_by.org == "engineering"
};