← Back to Autonomy

Diagnostics · Hard Cases · Method

Harder Cases in Diagnosis

Three comfortable assumptions every diagnosis quietly makes — one cause, a fault that stays put, sensors that tell the truth — and what to do when each one breaks.

Abstract

The sufficiency method assumed three things to stay clean: one fault, a fault that stays put, and honest sensors. Real systems break all three. Multiple faults add their symptoms together, so no single cause fits and the unexplained leftover is the tell. Intermittent faults hide between snapshots, so “rich enough” becomes a question of coverage — did you capture the fault in the operating corner that triggers it? — not count. And lying sensors turn a healthy system into a phantom fault, so before trusting a lone reading you must ask whether the gauge itself is broken. We take each in turn, in plain words, with worked EV examples — and fold all three back into the sufficiency gate.

§ 01 — Three Assumptions

The comfortable defaults — and the mark each leaves when it fails

Every tidy diagnosis leans on three quiet assumptions. Naming them is the first defense, because each failure leaves a recognizable fingerprint.

1 · There is one fault

breaks → two faults at once

The tell: no single cause explains everything. The best single-fault story leaves an orphan symptom it cannot account for.

2 · The fault stays put

breaks → intermittent / condition-dependent

The tell: “we can’t reproduce it.” The fault hides between snapshots, or only appears in one corner of the operating range.

3 · Sensors tell the truth

breaks → the instrument lies

The tell: a contradiction that traces to a single reading — a phantom fault from a bad gauge, or a real one a dead sensor is hiding.

None of these replaces the sufficiency method from the prequel — each is a specific way its checks fire, and each has a specific remedy. We use one running system throughout: an EV thermal-management loop (coolant pump, radiator, fan, and the flow and temperature sensors that watch them), complaining of overheating.

Part A — Multiple Simultaneous Faults

When two things are wrong at once

Symptoms do not come labelled by cause. When two faults overlap, their signs add together into a pattern that matches neither alone — and the search for a single culprit quietly fails.

§ 02 — Symptoms Add Up

Two faults look like neither

The pack is overheating on long climbs. Two things are actually wrong: a weakening coolant pump (less flow) and a partly fouled radiator (less heat rejection). Either alone would be a mild, in-spec nuisance. Together they cross the limit.

Now look at the symptoms. Low coolant flow points at the pump — but the pump being weak does not explain why the radiator outlet runs hot. The hot radiator outlet points at the radiator — but that does not explain the low flow. No single fault covers both. A one-cause search keeps finding a suspect that leaves something unexplained.

Figure 1 — Symptoms superpose; one fault leaves an orphan
pump fault explains radiator fault explains low coolant flow hot radiator outlet over-limit pack temp pick only the teal circle → the rust symptoms are the orphan that betrays a second fault
Observed = the union of both circles. A single-fault explanation can only ever cover one circle. The leftover — the symptoms in the other circle — is exactly the coverage failure from the sufficiency gate. An orphan symptom is the cheapest early sign that you are hunting one fault too few.
The connection

This is why coverage is a sufficiency check. “My best cause explains almost everything” is not a near-win — it is a flag. The unexplained remainder is information: usually a second fault, occasionally the wrong fault.

§ 03 — Reasoning About Combinations

Diagnose the set, not the suspect

Once you accept there may be more than one fault, the question changes from “which part?” to “which set of parts?” There is a clean, classic way to do this without checking every combination.

It rests on one idea: a conflict is a group of components that cannot all be healthy given what you observed. Each symptom generates a conflict. A diagnosis is then any set of suspected-faulty parts that “hits” every conflict — picks at least one culprit from each. The smallest such sets are the minimal diagnoses.

Figure 2 — From conflicts to candidate diagnoses
conflict 1 (low flow) { pump , flow-path } not both healthy conflict 2 (hot outlet) { radiator , fan } not both healthy hitting set ≥ 1 from each conflict {pump, radiator} ✓ {pump, fan} {flow-path, radiator}…
Two disjoint conflicts force a pair. Because no single part appears in both conflicts, every valid diagnosis needs two faulty parts — one per conflict. The minimal diagnoses are the pairs; priors then rank them, and {pump, radiator} — both plausible, both degrading with age — wins.
Algorithm 1minimal_diagnoses(conflicts)

input conflicts — each a set of components that can’t all be healthy

output minimal sets of faulty parts that explain every symptom

D { {} } # start with the empty diagnosis

for each conflict C:

D { d ∪ {c} : d ∈ D, c ∈ C } # add one culprit from C

drop non-minimal sets from D # keep only the smallest

return sort(D) by prior fault probability # likeliest combination first

The parsimony trap, and the blow-up

Two cautions. First, prefer the simplest explanation, but do not force it. A single fault is more likely than two independent ones, so always test single-fault diagnoses first — but when every single fault leaves an orphan, the simplest explanation that actually fits is the double. Occam’s razor cuts toward the simplest adequate story, not the simplest imaginable one.

Second, the number of possible combinations explodes (N parts give 2ᴾ subsets). Three things keep it tractable: only ever enumerate minimal diagnoses; use independent fault priors, which make multi-fault combinations exponentially unlikely unless the evidence demands them; and let structure help — parts that cannot interact cannot co-explain a symptom.

Figure 3 — Single-fault best vs. the double-fault diagnosis
pump only 0.30 · leaves orphan radiator only 0.28 · leaves orphan pump + radiator 0.88 · explains all a single fault can’t score high while a symptom stays unexplained — coverage caps it
Coverage does the ranking. Each single fault is held down because it cannot explain the orphan symptom; the two-fault diagnosis pays a prior penalty for being two faults but earns it back by explaining everything. The method lands on the double only because the evidence forces it.

Part B — Intermittent Faults & Coverage

Rich enough means you caught it

A fault you never observed under the condition that triggers it is a fault you have no data about — no matter how many gigabytes of the wrong condition you logged.

§ 04 — Richness Is Coverage, Not Count

The operating envelope, and the corner the fault lives in

The overheating only ever happens on a long, steep climb in hot weather. On the bench, at idle, in a cool shop, the system looks perfect — and ten thousand idle logs say exactly nothing about the fault.

Think of every condition the system runs in as a map — the operating envelope. For the thermal loop, two axes that matter are load (how hard the powertrain is working) and ambient temperature. The fault lives in one corner: high load, high heat. If all your logged data sits in the other corners, your dataset is large and empty where it counts.

Figure 4 — Operating-envelope coverage
ambient temp → powertrain load → fault triggers here high load + hot (no data!) all logged data sits here
Lots of data, none of it informative. The logs (slate) blanket the easy corner and never reach the fault corner (red). Adding more of the same logging cannot help — the sufficiency question here is not “how many points?” but “does the coverage include the trigger?”

Intermittency is the same problem in time instead of condition. A fault that flickers on for a second every few minutes is invisible to a snapshot taken between flickers. You can sample forever and miss it if you are not sampling when it happens.

Figure 5 — Intermittent fault vs. snapshot sampling
time → signal fault burst snapshots (▲) all land between bursts → fault never seen
Sampling between the bursts sees a healthy system. The cure is not more snapshots — it is the right kind of observation: continuous logging, or an armed trigger that grabs a freeze-frame the instant the fault condition appears.
§ 05 — Getting the Data You Need

Cover the corner on purpose

If richness is coverage, then collecting data becomes a targeting problem: go to the corner where the fault lives, or arm a trap that fires when it arrives.

Two moves, depending on whether you can summon the condition:

And the sufficiency rule gains a clause: you are not done collecting until your coverage actually includes the suspected trigger region.

Algorithm 2condition_coverage(envelope, logs, trigger)

input envelope (the operating map) · logs · suspected trigger region

output COVERED, or a targeted collection plan

covered region of envelope where logs are dense

if trigger ⊆ covered: return COVERED # we have seen it happen

else:

gap trigger − covered

if can_command(gap): return REPRODUCE(gap) # drive/HIL into the corner

else: return ARM_TRIGGER(gap) # freeze-frame on next event

Plain version

“We have tons of data” is not an answer to “is it enough?” until you can point to data taken while the fault was happening. Until then, the honest status is inconclusive — go capture the event.

Part C — Sensors That Lie

Is the gauge broken?

Every measurement is two things stacked together: the real quantity, and the instrument that reports it. When they part ways, a healthy system can look sick — and a sick one can look fine.

§ 06 — The Instrument as Suspect

Tell a sensor fault from a system fault

The coolant-temperature sensor reads 110 °C — alarming. But is the coolant actually that hot, or is the sensor wrong? Same reading, two very different worlds. This is observational equivalence again, except the fault has moved into the measurement chain.

You resolve it the same way you resolve any equivalence: with a measurement the two stories disagree on. For sensors there are three cheap, standard ones.

Plausibility and rate checks. A reading outside what physics allows, or one that jumps faster than the real quantity ever could, is the sensor. Coolant with real thermal mass cannot rise 40 °C in a fifth of a second — so a reading that does is a wiring or sensor fault, full stop.

Hardware redundancy (voting). If two other independent sensors read normal and one reads high, the odd one out is almost certainly lying — the classic two-out-of-three vote.

Analytical redundancy. Even with one sensor, a model can predict what it should read from other signals (inlet temperature, flow, current). A large gap between predicted and measured, when the other signals agree with each other, points at the sensor.

Figure 6 — Sensor fault or system fault?
1 sensor reads abnormal agrees with redundancy? (vote / model / limits) agrees SYSTEM fault the reading is real outvoted SENSOR fault phantom — ignore it
Route every lone alarm through this question first. Acting on an unvalidated single reading is how teams replace healthy battery packs because a two-dollar sensor drifted.
Figure 7 — Analytical redundancy: a model as the second opinion
other signals inlet temp · flow · current (mutually consistent) suspect sensor measured y = 110°C model M estimate ŷ ≈ 85°C residual r = y − ŷ = 25° large & others agree → sensor
The residual is the tell. If the model (fed by signals that agree among themselves) expects 85 °C and the sensor insists on 110 °C, the gap indicts the sensor. If instead the other signals were also high, the residual would be small and the overheat real.
Algorithm 3validate_sensor(y, redundant_R, model_M)

input suspect reading y · redundant sources R · model M

output SENSOR_FAULT · SYSTEM_FAULT · UNDETERMINED

if y outside physical limits or rate(y) impossible:

return SENSOR_FAULT # plausibility — cheapest check

ŷ estimate(R, M) # hardware + analytical redundancy

if |y − ŷ| small: return SYSTEM_FAULT # sensor agrees → fault is real

if R mutually agree and disagree with y:

return SENSOR_FAULT # outvoted

return UNDETERMINED # add a redundant source

In the running example, the 110 °C reading fails the rate check and is outvoted by a model expecting 85 °C — a phantom. Replace the sensor and the alarm vanishes. But note the trap: had we trusted it, we would have “diagnosed” an overheat that never existed and missed the real, slower fault underneath.

§ 07 — The Augmented Procedure

Folding the hard cases back into the gate

None of this is a separate method. Each hard case is a new guard in front of the sufficiency gate — a question to ask before you are allowed to conclude.

Figure 8 — The augmented diagnosis loop
SUFFICIENCY GATE orphan symptom left over? multiple faults? re-frame (§03) trigger condition captured? capture the event (§05) rests on one lone sensor? validate sensor (§06) all clear → CONCLUDE any remedy revises the evidence and re-enters the loop
Three guards, one gate. A leftover symptom routes you to multiple-fault reasoning; a missing trigger condition routes you to capture the event; a lone-sensor dependency routes you to validate the instrument. Each fix loops back — you only conclude once all three are clear and the gate passes.

Run through the whole EV case with the guards on: the 110 °C alarm is caught as a sensor phantom (§06) and set aside; the real overheat is reproduced only after a targeted hot-climb capture (§05); and the leftover — low flow and hot outlet — refuses to collapse into one cause, forcing the two-fault diagnosis of a weak pump plus a fouled radiator (§03). All three hard cases, in one investigation, each handled by its guard.

§ 08 — Practical Notes

Rules of thumb for the hard cases

1
orphan = +1 fault

Treat an unexplained leftover as a second fault until proven otherwise

“Explains almost everything” is a red flag, not a near-win. The remainder is usually a concurrent fault.

2
simple, then enough

Try single faults first, but don’t force one

Prefer the simplest explanation that actually fits. When every single fault leaves an orphan, the double is the parsimonious answer.

3
minimal sets

Enumerate minimal diagnoses, not all subsets

Generate candidates from conflicts and keep the smallest. Independent fault priors keep multi-fault combinations rare unless the evidence demands them.

4
coverage > count

“We have lots of data” is not “we have the data”

Ask where in the operating envelope your data sits. If it never touches the trigger corner, it is empty where it matters.

5
go to the corner

Reproduce or trap the event

Drive the system into the trigger condition, or arm a freeze-frame to catch the next occurrence. One capture beats endless idle logs.

6
validate first

Never act on a lone reading without checking the gauge

Plausibility, rate, a redundant sensor, or a model estimate — run the alarm through one before trusting it.

7
design it in

Redundancy and event-logging are cheaper at design time

Sensor voting, analytical-redundancy relations, and trigger-based recorders turn all three hard cases from detective work into routine checks.

§ 09 — References & Further Reading

Where these ideas come from

Entry points, grouped by the hard case they speak to.

Multiple faults (consistency-based diagnosis)

J. de Kleer & B. C. Williams, “Diagnosing Multiple Faults” (1987). Generating candidate diagnoses from conflicts; reasoning about more than one fault at once. The direct source for §03.

R. Reiter, “A Theory of Diagnosis from First Principles” (1987). Diagnoses as minimal hitting sets of conflicts — the formal backbone of “diagnose the set, not the suspect.”

W. Hamscher, L. Console & J. de Kleer (eds.), Readings in Model-Based Diagnosis (1992). The collected foundations of model-based, multiple-fault diagnosis.

Detection, intermittency & analytical redundancy

R. Isermann, Fault-Diagnosis Systems (2006). Plausibility checks, analytical redundancy, and sensor/actuator/process fault distinctions — the practical engine behind Parts B and C.

J. Gertler, Fault Detection and Diagnosis in Engineering Systems (1998). Parity relations and structured residuals for isolating which signal is at fault.

A. S. Willsky, “A Survey of Design Methods for Failure Detection in Dynamic Systems” (Automatica, 1976). The classic survey of residual-based detection — and the sequential tests that catch intermittent events.

Redundancy, voting & fault tolerance

M. Blanke, M. Kinnaert, J. Lunze & M. Staroswiecki, Diagnosis and Fault-Tolerant Control (Springer). Analytical redundancy relations and structural methods for sensor and actuator faults.

A. Avižienis, J.-C. Laprie, B. Randell & C. Landwehr, “Basic Concepts and Taxonomy of Dependable and Secure Computing” (2004). The vocabulary of redundancy and voting (e.g. triple-modular redundancy) behind “is the gauge broken?”

R. Patton, P. Frank & R. Clark (eds.), Issues of Fault Diagnosis for Dynamic Systems (2000). A broad engineering reference on model-based FDI, including sensor-fault isolation.

A note on these references

These are orientation points into large literatures, not the specific source of any single claim here. Titles and years are given so you can find them.

§ — The Series

The Diagnosis Series

Nine connected parts, from one car’s evidence to a fleet campaign and back to prevention. See the full map & reading guide →

1

Root-Cause Analysis Under Uncertain, Heterogeneous Evidence

Grade, anchor, and fuse messy, unequal-trust clues into one cause.

2

When Is the Evidence Enough?

The sufficiency gate, value of information, and handling conflict.

3

Harder Cases in Diagnosis  you are here

Multiple faults, intermittency, and lying sensors.

4

Fleet-Scale Root-Cause Analysis

One code across a population: de-mix, stratify, remediate.

5

Fleet RCA, Made Rigorous

Significance, surveillance, forecasting, closing the loop.

6

Proving Cause with Experiments

Turn observation into proof with staged rollouts.

7

Diagnosis on the Vehicle

Real-time fault detection at the edge, feeding the fleet.

8

The Data Plumbing Behind Fleet Diagnosis

Joining, aligning, and cleaning the data that makes it work.

9

From Root Cause to No Cause

Prevention and the corrective-action loop — engineer it out.