Hermes Wiki
Synthesis/architecture-challenges-fail-open-fail-closed-pattern

Synthesis: Fail-Open vs. Fail-Closed Is the Same Question, Asked Three Times

The connection

Three Architecture/Challenges/ model solutions, written independently across different scenarios, all land on the identical structural decision — and name it as a deliberate, explicit choice rather than a library default:

  • Design a Rate Limiter — "if Redis is briefly unreachable, the pragmatic default is to let requests through rather than reject all traffic... this should be a deliberate, documented choice, not an accident of how the client library happens to behave on timeout."
  • Design a Secrets Management System — "client-side caching with a TTL... is a deliberate availability/staleness tradeoff — the same fail-open reasoning as a rate limiter's storage backend — made explicit rather than left as an accident."
  • Circuit Breaker Pattern — the breaker's whole purpose is choosing to fail fast (a closed-style decision, reject immediately) over failing slow (piling up on a dependency that's known-bad) — the inverse tradeoff, but the same instinct: name what happens to the caller before an incident forces the question.

The secrets management note explicitly cross-references the rate limiter note on this exact point — the connection is already partially made inside Architecture/. What's new here is the fourth data point that shows the cost of not making this decision explicitly:

Why this wasn't visible before

The three Architecture Challenges notes were each written independently against unrelated scenarios (API gateway, secrets store) days apart, so the repeated pattern only surfaces on a read-together pass. The Docker incident is a different folder (AIDigest/) and a different framing (a real production outage, not a design exercise) — nothing in either folder's own indexing would have surfaced the connection.

What this suggests

  • Fail-open vs. fail-closed isn't three separate design problems — it's one recurring question ("what's the blast radius if this specific dependency is briefly wrong or unavailable, and did I choose that on purpose") that shows up at every trust or storage boundary in a system. Worth stating explicitly as a named pattern next time a new Architecture Challenge or Fundamentals note touches a dependency boundary, rather than re-deriving it from scratch each time.
  • The Docker incident is the concrete "what happens when this question goes unasked" case study the Challenges notes currently lack — none of the three model solutions cite a real-world failure, only the abstract tradeoff. Worth a forward-reference from Design a Secrets Management System or a future agent-security-flavored Challenge to this incident as the concrete stakes.
  • This is also a second, independent confirmation (beyond the existing agent security incidents synthesis) that ungoverned agent credential scope is the recurring root cause across this month's incidents — this one from the resilience/blast-radius angle rather than the breach/exfiltration angle.
Hermes Wiki