Open this lesson in your favourite AI. It'll walk you through the why, explain the demo, and quiz you on the try-it list.
Not every bot action is the same. Some should just happen (auto-deleting known spam), some should happen but with you cc'd (draft-and-notify), some need explicit approval before happening (send this reply), and some should be refused outright by the bot with a nudge to you (respond to a lawsuit threat). The escalation ladder is a four-rung classification you apply to every action type: AUTO (bot acts silently), NOTIFY (bot acts, sends you a receipt), ASK (bot proposes, waits for approval), REFUSE (bot never handles; forwards to you with context). The rung is a function of stakes, reversibility, and how much personal context the response needs. Every module in this course picks a rung for its actions and defends the choice — and the delegation audit you did earlier is where you first practice.
A policy engine that maps action types to escalation rungs based on stakes/reversibility/context signals. Every rung has a matching UI (silent, Telegram message, approval prompt, forwarded email).
Use these three in order. Each builds on the one before.
In one paragraph, explain the four-rung escalation ladder for a bot acting on my behalf.
Walk me through how reversibility and personal-context signals should shape rung selection — with examples where they conflict.
I want the bot to reply to LinkedIn DMs. Given the mix of stakes (some VIPs, mostly recruiters) and reversibility (a bad reply is embarrassing but recoverable), what's the rung and what's the exception rule?
type Rung = "AUTO" | "NOTIFY" | "ASK" | "REFUSE";
type ActionType =
| "delete_newsletter_spam"
| "archive_low_priority"
| "draft_reply"
| "auto_send_reply_to_vip"
| "answer_dm_on_my_behalf"
| "respond_to_legal_threat"
| "respond_to_investor";
interface Signals {
reversible: boolean;
stakes: "low" | "medium" | "high" | "catastrophic";
needsPersonalContext: boolean;
}
const POLICIES: Record<ActionType, Signals> = {
delete_newsletter_spam: { reversible: true, stakes: "low", needsPersonalContext: false },
archive_low_priority: { reversible: true, stakes: "low", needsPersonalContext: false },
draft_reply: { reversible: true, stakes: "medium", needsPersonalContext: true },
auto_send_reply_to_vip: { reversible: false, stakes: "high", needsPersonalContext: true },
answer_dm_on_my_behalf: { reversible: false, stakes: "high", needsPersonalContext: true },
respond_to_legal_threat: { reversible: false, stakes: "catastrophic", needsPersonalContext: true },
respond_to_investor: { reversible: false, stakes: "high", needsPersonalContext: true },
};
function pickRung(action: ActionType): Rung {
const s = POLICIES[action];
if (s.stakes === "catastrophic") return "REFUSE";
if (!s.reversible && s.stakes === "high") return "ASK";
if (s.needsPersonalContext && s.stakes === "medium") return "NOTIFY";
if (s.stakes === "low" && s.reversible) return "AUTO";
return "ASK";
}
// Pretty-print the policy
for (const [action, _] of Object.entries(POLICIES)) {
console.log(action.padEnd(30), "->", pickRung(action as ActionType));
}node main.js