Kanshō

Docs / Permissions and trust /

ScopeEscalationRequest

Request card for an agent to escalate its permission scope — shows current vs requested scopes.

Preview

Scope escalationESC-0041High riskJust now
DataOps Agentclaude-opus-4· MSN-112

Needs delete access to remove stale audit log rows before the migration run.

The current read + write grant does not cover DELETE. Removing rows older than 90 days is required to stay within the 500 GB storage cap.

  • postgres/prod/audit_logs
    readwrite+ delete
TTL 1h

Variants

Medium risk — email send

Scope escalationESC-0039Medium risk1m ago
Campaign Agentclaude-sonnet-4

Needs send access to dispatch the re-engagement sequence to the lapsed segment.

  • email/sendgrid
    read+ send
TTL 30m
Static preview — actions disabled

Low risk — analytics read

Scope escalationESC-0037Low risk4m ago
Reporting Agent

Requires read access to the revenue dashboard to complete the weekly summary.

  • analytics/revenue
    + read
TTL 2h· remembers decision
Static preview — actions disabled

Props

PropTypeDescription
id*stringUnique escalation identifier shown in the card header.
agent*{ name: string; model?: string }The agent requesting escalated scope.
rationale*stringOne-sentence justification.
detailstringLonger-form explanation of what the new permission unlocks.
risk*"low" | "medium" | "high"Risk tier — drives badge colour and card border.
scopeDelta*EscalationScopeDelta[]Scope changes being requested. Each entry shows current verbs and what is being added or removed.
ttlstringHow long the approval will hold if granted — e.g. "1h".
rememberbooleanWhen true, shows a note that the decision will be remembered for future runs.
mission{ id: string; label: string }The mission this escalation belongs to.
requestedAtstringHuman-readable time the escalation was raised.
staticPreviewbooleanDisables action buttons.
onApprove() => voidCalled on "Approve once".
onDeny() => voidCalled on Deny.
onAlwaysAllow() => voidCalled on "Always allow".
classNamestringAdditional CSS classes for the card root.

* required.

Usage

import { ScopeEscalationRequest } from "@/components/control-plane/scope-escalation-request";

<ScopeEscalationRequest
  id="ESC-0041"
  agent={{ name: "DataOps Agent", model: "claude-opus-4" }}
  rationale="Needs delete access to remove stale audit log rows before the migration run."
  risk="high"
  scopeDelta={[
    {
      scope: "postgres/prod/audit_logs",
      current: ["read", "write"],
      add: ["delete"],
    },
  ]}
  ttl="1h"
  onApprove={() => {}}
  onDeny={() => {}}
  onAlwaysAllow={() => {}}
/>