RODEO

Copilot Approvals

Human-in-the-loop approval for agent decisions.

Copilot gates scene declarations behind human approval. Agents propose, humans approve or reject, then beats fire.

Flow

  1. Agent declares a scene via POST /scenes/:id/declare
  2. Rodeo creates an action card with scene details
  3. Scene enters declared status and waits
  4. Human approves, rejects, or modifies
  5. On approval, scene goes live

Action cards

{
  id: "uuid",
  type: "scene_proposal",
  sceneId: "uuid",
  summary: "Recruit mobile butcher for ranch processing network",
  intention: "recruit",
  audienceDesc: "Jordan, mobile butcher, TX Hill Country",
  channels: ["sms-main", "email-formal"],
  estimatedCost: 50,
  urgency: "medium",
  reasoning: "High-value target, surround arc recommended",
  alternatives: ["approach arc with 2 beats", "single_strike via phone"],
  status: "pending",
}

Types

TypeTrigger
scene_proposalNew scene declaration
beat_proposalBeat added to live scene
adaptation_proposalMembrane adapting a live scene

Urgency

LevelMeaning
lowNo time pressure
mediumReview within hours
highReview within minutes
time_sensitiveWindow closing, immediate

Approve

await rodeo.copilot.approve(cardId);
POST /cards/:id/approve
Authorization: Bearer your-api-key

Reject

await rodeo.copilot.reject(cardId, {
  reason: "Budget too high for this audience segment",
});

Scene moves to declined. Ledger records the outcome.

Modify

Apply changes before approving:

await rodeo.copilot.modify(cardId, {
  modifications: {
    constraints: { budget: 25 },
    beats: [/* remove or edit beats */],
  },
});

Pending cards

const pending = await rodeo.copilot.pending();

Dashboard

The Copilot page (port 3001) surfaces all pending and resolved action cards with full scene context.