What Does Fail-Closed Mean? (REA Glossary)
Fail-closed (adjective): a system design property where, when a component fails or a precondition is missing, the system refuses to act instead of degrading to a best guess. The opposite of fail-open ("produce something anyway") and distinct from fail-safe (protect people from harm — [Source type: 通用安全工程术语口径,需公开标准文档核对后落版]). For an AI agent doing binary analysis, fail-closed means: if the tool cannot verify a result, it returns an error naming exactly what is missing — never a plausible-looking answer.
fail-closed vs. fail-open vs. fail-safe
The three terms get conflated. The working distinction:
- Fail-open — on failure, default to allowing / producing output. Convenient, dangerous: an unverifiable answer is still an answer, and agents will repeat it confidently.
- Fail-safe — on failure, fall back to a state that cannot cause harm. It is about the consequence of failure.
- Fail-closed — on failure, stop and report. It is about the truth of output: nothing leaves the system that the system cannot prove.
Why does this matter more for AI agents than for humans? A human analyst who gets a blank decompilation knows it is blank. An agent pipeline treats whatever arrives as data; a tool that guesses on failure poisons every downstream step. Fail-closed design is how an analysis chain stays auditable — each refusal is a checkpoint, each success carries its proofs, and a content-addressed ID ties claim to evidence.
fail-closed in practice: three refusals we ran
This is not an abstract virtue. In our 2026-10-12 lab session, REA refused three different things, each naming its reason precisely:
1. missing analysis engines → provider_unavailable
Asking for deep analysis with no engine installed failed closed:
bash — lab@realearn verified: ran 2026-10-12
$ npx rea analyze ./hello code: provider_unavailable rejections[3]: ghidra(not_configured) / hopper(executable_missing) / ida(not_configured)
Three candidates, three different diagnoses, three different fixes — instead of one fuzzy "analysis failed".
2. oversized results → resource_constraint, not truncation
The same layout request on a 4.5MB library over the MCP channel returned resource_constraint with a pointer to the evidence bundle path — the tool refused to silently cut results to fit. Nothing got truncated; the channel told you to take another route.
3. wrong provider → capability_unavailable
Explicitly requesting --provider pwntools-elf for a decompile-style operation refused with capability_unavailable and the exact list of accepted engines: ghidra, hopper, ida. The boundary is declared, not discovered by surprise.
All three come from our own runs — the full walkthrough lives in the evidence contract guide and the REA vs Ghidra comparison.
how to recognize fail-closed design in any tool
- Errors name the specific missing precondition (engine? configured? executable present?), not a generic failure.
- Nothing is silently truncated, defaulted, or substituted when a limit is hit.
- Successes are checkable after the fact — see evidence bundle.
FAQ
What is fail-closed in simple terms?
When something fails or a precondition is missing, the system stops and reports instead of producing a best guess. In binary analysis that means an error naming the exact missing engine — never a plausible-looking result nobody can verify.
Is fail-closed the same as fail-safe?
No. Fail-safe is about harm: on failure, fall to a safe state. Fail-closed is about truth: on failure, produce nothing unverifiable. A tool can be fail-safe yet fail-open — degrading to a harmless but unverified answer. REA is fail-closed: it refuses with a specific code instead.
Why does fail-closed matter for AI agents specifically?
An agent consumes tool output as data without human skepticism in the loop. A fail-open tool that guesses on failure contaminates every downstream step silently. Fail-closed refusals are the checkpoints that keep an automated analysis chain auditable.
Is realearn affiliated with morluto or rea.tools?
No. realearn is independent and non-affiliated; every refusal shown here came from commands we ran in our own lab on 2026-10-12.
Related: evidence bundle · content-addressed ID · REA evidence contract (deep guide) · our evidence practices