Designing Auditable, Robust Agentic Systems
The previous page named three ways an agent fails without announcing it. This page covers concrete design responses — not a way to make these failures impossible, since several of them are structural rather than fixable, but a way to make them visible before they cause harm rather than after.
Verification has to come from outside the system
A recurring, well-documented lesson from this site's PatLang case study is worth stating as a general design principle rather than a specific anecdote: a self-healing code repair engine was built with an explicit rule that even the engine's own best suggestion gets checked exactly the same way as anything else, never trusted because of its source. The reasoning generalises directly to any agentic system: an agent has no privileged access to whether its own output is correct, and building a system that lets a component grade its own homework — however sophisticated that component is — reproduces the exact structural gap that let the deception case in the previous page happen unnoticed. Verification needs a path that doesn't run through the component being verified.
Determinism, verifiability, and auditability, applied to agents specifically
This site's material on the Trustworthy Software Initiative names three pillars worth restating here because they map directly onto agentic-system design rather than software design in general: determinism (does the same situation reliably produce the same response), verifiability (can a specific decision be checked against a stated criterion), and auditability (can a decision be reconstructed and explained after the fact, not just observed to have happened). An agent built entirely from an opaque connectionist reasoning stage — see this module's page on symbolic and connectionist reasoning — is weak on all three by construction, which isn't a reason to avoid connectionist components, but is a reason to design the rest of the system so those three properties survive somewhere even if the reasoning stage itself can't provide them directly.
A practical pattern: keep a symbolic, inspectable log of what the agent decided and why it believed the decision was justified, generated as a genuine by-product of the decision process rather than reconstructed afterward from memory. This doesn't require the agent's internal reasoning to be symbolic — it requires the agent to externalise a checkable trace of its reasoning as a real, first-class output, the same discipline this site's material on requirements engineering argues for when it comes to human decisions and stated assumptions.
Human-in-the-loop is a design decision, not a fallback
Where to place a human checkpoint in an agent's decision cycle is itself a specification choice with real consequences, not a generic safety measure to bolt on anywhere convenient. A checkpoint placed before an irreversible action catches a bad decision before it does damage, at the cost of latency and the risk that a human reviewer, faced with a high volume of routine-looking approvals, stops meaningfully checking anything (this is the same erosion the "reflex agent" tier warns about, applied to a human being instead of Procedural Memory — a fast, well-practised rubber stamp is not actually oversight). A checkpoint placed after the action, reviewing a sample of decisions retrospectively, doesn't prevent a specific bad outcome but does provide the auditability trail needed to detect a systematic problem before it recurs many more times. Neither placement is universally correct; the choice should be driven by which failure — one bad decision executed, or a systematic problem going undetected — is more costly for the specific system being built.
Designing for graceful degradation, not just correct operation
A system that has only ever been specified in terms of what it should do when everything works has no defined behaviour for when something doesn't — and per the previous page's argument, brittleness under distributional shift is not an edge case, it's an expected mode of operation for any agent operating outside a controlled environment for long enough. A robust design specifies, as a first-class requirement, what the agent does when its own confidence is low, when a sensor input looks anomalous, or when a plan's expected outcome and its actual outcome diverge significantly — falling back to a simpler, more verifiable tier (routing a low-confidence decision to Procedural Memory's narrower, better-tested behaviour, or to a human) rather than proceeding on an assumption the system itself has reason to doubt.
Where this connects
- When Agents Fail: Brittleness, Misaligned Incentives, and Deception — the failure modes this page's design patterns respond to.
- The Trustworthy Software Initiative — the full account of determinism, verifiability, and auditability this page extends for agentic systems specifically.
- Agent Archetypes: Five Tiers on One Diagram — why falling back to a lower tier under uncertainty is a legitimate design pattern, not a failure to reach the top tier.