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
- Agent declares a scene via
POST /scenes/:id/declare - Rodeo creates an action card with scene details
- Scene enters
declaredstatus and waits - Human approves, rejects, or modifies
- 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
| Type | Trigger |
|---|---|
scene_proposal | New scene declaration |
beat_proposal | Beat added to live scene |
adaptation_proposal | Membrane adapting a live scene |
Urgency
| Level | Meaning |
|---|---|
low | No time pressure |
medium | Review within hours |
high | Review within minutes |
time_sensitive | Window closing, immediate |
Approve
await rodeo.copilot.approve(cardId);POST /cards/:id/approve
Authorization: Bearer your-api-keyReject
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.