← Operating Log
AI SafetyPostmortem

Failed Open

A safety control passed every test in its suite — and still failed. The postmortem changed how I test everything.

A worn brass valve wheel lit against deep navy shadow — an industrial control whose failure position is set by design.

A user filed a report on a system I operate: "this worked two days ago." The same input had triggered a crisis intervention on one run and sailed through with an ordinary answer on the next. Same input. Opposite outputs. Filed as a regression.

It wasn't a regression. It was worse.

The investigation almost lied to me twice

The first verdict came from a screenshot. The second came from a git log scoped to a single file — used to defend a claim about a change that touched four. Neither conclusion had been measured. Both were inference wearing a verdict's uniform, and both were mine.

The third pass did it the slow way: the exact input, run through every safety check at both code versions, the failure-handling path read line by line. That one held.

A safety verdict requires running the actual input through the actual code. Screenshots and scoped git logs are hypothesis generators, not measurement. I knew that. I still reached for the fast answer twice before doing the work.

What the slow pass found

The highest-risk input class had no deterministic coverage. Its only net was a probabilistic classifier — a coin flip on ambiguous phrasing, catching the same input on some runs and missing it on others.

And on any error, any non-OK response, any timeout past two seconds, the control returned "no finding" and let the input through.

The failure branch was commented:

// FAIL SAFE

It was the opposite. It failed open.

Nothing had changed in the code. The two contradictory outputs were the control working exactly as built: a coin flip in fair weather, absent entirely in foul. The green test suite proved the control was configured. It never proved the control was reachable when its dependency failed — because nobody had tested the failure path. Only the happy one.

The fix was old discipline, not new prompts

On a ship, every critical valve has a designed failure position — fail open or fail shut — and the watchstander knows which, because someone decided it on purpose and wrote it down. Nobody discovers a valve's failure position during the casualty.

That's the standard this control now meets:

- Deterministic checks fire first. The highest-risk input class moved onto pattern checks that run before any network call. The coin flip became a guarantee.
- The classifier was demoted to defense-in-depth. Still there, still useful — a second layer, never again the sole net.
- Failure polarity is a named decision. The failure branch is now a function whose comment explains the choice: fail open, fail closed, or fail to a safe default — with the rationale written down. A mislabeled branch that nobody read is not a decision. It's a gap wearing the uniform of one.

And then the test that actually matters: a suite that stubs the classifier out entirely and proves the protection still fires with the dependency dark. It passed this week. That green check is the only one I trust, because it's the only one that interrogated failure instead of configuration.

What transfers

1. A green test suite proves configuration, not behavior under failure. Test the path where the dependency dies. Happy-path coverage on a safety control is not safety coverage.
2. Measure, don't infer. On a safety verdict, run the actual input through the actual code, and scope the conclusion to the whole change — not the file you happened to read.
3. Treat a persistent, specific anomaly report as signal. The user who said "this worked two days ago" was wrong about the cause and right about everything that mattered.

The full case study — context, investigation, root cause, resolution — is published at Blue Jacket Consultancy: The Safeguard That Passed Every Test and Failed Open, with a downloadable PDF.

Steady on. ⚓


The canonical case study is published by Blue Jacket Consultancy at bluejacket.io and © 2026 Blue Jacket Businesses LLC, d/b/a Blue Jacket Consultancy; it may be shared in unmodified form with attribution, and not used for machine-learning training without written permission. This log entry is personal commentary around that artifact.


Subscribe to the Operating Log

Field notes on building governed, production AI systems — new issues to your inbox.

Subscribe on Substack →

Handled by Substack. Unsubscribe anytime.