When agents turn into black boxes — silently failing or erroring in confusing ways — the fix is not friendlier error messages. It is a fail-closed discipline where every block names the exact evidence that would unblock it. Failures become a to-do list, not a maze.
The pattern, in one line: every guard (identity, approval, terms, and the rest) must block the action and record the block. No warnings, no silent retries. A warning today is a bypass tomorrow.
Fail closed with named evidence¶
Instead of a bare "access denied," force the agent to say:
- "Blocked: missing [X evidence]. Unblocks when: [action to take]."
- Example: "Blocked: no attributable identity. Assign an owner-scoped identity to resume."
- Example: "Blocked: external action needs human approval. Request it here."
The block and its remedy travel together. The agent — and the human reading the log — never has to guess what "denied" means.
Three rules¶
- Every guard returns a structured block record with an
unblocks-whenfield — for example{"type": "missing_approval", "resolution": "submit_to_human_review"}. Structured means machine-actionable: the agent can route the block to the right resolution path instead of hallucinating one. Free-text "denied" errors are where agents go to invent excuses. - Guards never degrade to warnings. If it is a block, it stays a block. The moment a guard softens under load, in demos, or for "just this once," the bypass path becomes the production path — and every incident review afterward will find the warning that everyone scrolled past.
- Surface pending blocks to the owner as a checklist, not a log. Logs are for forensics; checklists are for action. The owner should open a screen and see "three things are waiting on you," not grep through ten thousand lines. A block that sits unread in a log file is a block that never gets resolved — which is how "fail closed" quietly becomes "fail stuck."
No more "it worked… sometimes?"¶
This is what trustworthy failure handling looks like in practice: no ambiguous states, no "it worked… sometimes," just clear next steps. Every blocked action carries its own resolution instructions, and the owner's view is a queue of decisions, not a pile of logs. (For the exact pattern, see the MIT-licensed playbook at https://ghostcorpnet.com/playbook.md.)
The takeaway¶
A block that cannot tell you how to unblock it is only half a control. Name the missing evidence, keep the block hard, and show the owner a checklist. That is how failures turn into work getting done.