The industry is converging on a deliberate sequence for remediation autonomy: propose → approve → execute → confirm, with the action set allowlisted and every step audit-logged.
Tier: Advanced · Hands-on time: ~75 minutes
PagerDuty's SRE Agent "recommends or executes containment actions with human oversight," and its fully-autonomous tier was deliberately held to EA in H2-2026 — the vendors furthest ahead are the ones most insistent on the approval gate. This playbook builds that architecture yourself: an LLM that maps an incident to one of a handful of pre-approved runbook actions, a human who approves in chat, a deterministic executor, and a confirmation step that checks the action actually helped.
Do not build this for actions that are irreversible (data deletion, DNS cutover, cert revocation) or that you would not delegate to a brand-new on-call hire with a runbook. The allowlist test is exactly that test.
Write the action contract first. For each allowlisted action define: name, params (with validation regexes/enums — namespace allowlist, replica bounds), preconditions (checks the executor runs before acting), success_signal (the metric/state that must improve), cooldown. This contract, not the prompt, is your real safety boundary.
Prompt the proposer for a structured recommendation. Feed the incident bundle (pb-14) plus the action contract:
From the incident evidence and the ACTION CONTRACT list, either:
(a) propose exactly ONE action as JSON:
{"action": "<name>", "params": {...}, "reason": "<one sentence>",
"evidence": ["<bundle citations>"], "expected_effect": "<metric, direction, within N min>",
"risk_if_wrong": "<one sentence>"}
or (b) output {"action": "none", "reason": ...} if no allowlisted action fits.
Never propose an action not in the contract. Never invent parameter values
not present in the evidence.
Gate on a human, with the evidence visible. Post the JSON to the approval surface showing action, params, cited evidence, and risk_if_wrong. The approver's job is pb-15's citation check in miniature: do the citations support the reason? Approve/reject with a reason string — the reason goes in the audit log either way.
Execute deterministically, never via the model. The approved JSON goes to your executor, which re-validates params against the contract, checks preconditions, runs, and captures output. The LLM never holds credentials and never composes shell commands — it only selects from the menu.
Confirm and close the loop. After the action, automatically evaluate success_signal (e.g. error rate below X within 10 min). Post CONFIRMED or NOT CONFIRMED to the channel; NOT CONFIRMED pages a human and freezes the proposer for that incident. Append the full chain — bundle hash, proposal, approver, executor output, confirmation — to an append-only audit log.
Drill the failure mode. Induce your sandbox failure, but also run one round where you feed the proposer misleading evidence and verify the approver catches it. This rehearses the "AI is wrong" path (pb-21) before production does.
Autonomy is earned per-action, not granted per-agent. An action graduates to auto-approve only after N consecutive human-approved successes AND a rollback story — and even vendors with the most data are shipping that tier last.
success_signal evaluation fired for every execution, and a NOT CONFIRMED result demonstrably froze further proposals.An audit log that lives where the agent can write is not an audit log. Append-only, separate credentials, client-owned in client environments.