Fault Tree

OBD-II differential diagnosis

A trouble code is a symptom report from one sensor, not a diagnosis, but it gets read as one. P0420 says catalyst efficiency below threshold and the driver is quoted $1,400.00 for a converter, when the cause is more often a $118.00 oxygen sensor. This takes a code plus the freeze frame the ECU captured when it set, and produces a ranked differential with prices attached.

Code structure decoder

SAE J2012 codes are structured, not arbitrary: the letter is the system, the first digit says whether the definition is generic or manufacturer-specific, and the third character selects the subsystem. Any well-formed code decodes even when no repair data is loaded for it.

Diagnosis

P0128 minor will fail emissions
Coolant thermostat below regulating temperature
The engine is not reaching operating temperature in the expected time. It still runs, but it runs rich, uses more fuel, and wears faster.
Vehicle
2015 Subaru Outback 2.5i · 2.5L H4 · 121,744 mi
Complaint
heater takes forever to warm up
Scanned
2026-07-20 04:35
Code family
Powertrain · generic SAE
Subsystem
Fuel and air metering

Most likely cause, given the freeze frame

Thermostat stuck open — 72% likely
Coolant temperature plateaus well below 85°C on a highway run.
▸ coolant only reached 64°C
parts $42.00 + labour 1.2h @ $142.00/h = $212.40

Full ranked differential

CausePriorUpdatedRepair
Thermostat stuck open
coolant only reached 64°C
62% 72% $212
Coolant temperature sensor out of range 24% 17% $103
Low coolant level 14% 10% $61
The prior column is what the code alone tells you. The updated column is after conditioning on the freeze-frame values below. Green moved up on the evidence, red moved down.

What the diagnosis is worth

Work the ranked path, stop when fixed $247 expected
Replace thermostat stuck open first $212
Expected cost sums each cause's probability against the cumulative cost of reaching it in order. On this scan the ranked path expects $247 against $212 for going straight at the expensive component, which is the quote most people are handed.

Freeze frame — sensor state when the code set

PIDParameterValue
MAF Mass air flow rate 11.2 g/s
RPM Engine RPM 2100 rpm
SPEED Vehicle speed 88 km/h
O2_B1S1 O2 sensor, bank 1 sensor 1 0.44 V
O2_B1S2 O2 sensor, bank 1 sensor 2 0.61 V
LONG_FT1 Long-term fuel trim, bank 1 3.4 %
SHORT_FT1 Short-term fuel trim, bank 1 2.1 %
ENGINE_LOAD Calculated engine load 26 %
INTAKE_TEMP Intake air temperature 9 °C
COOLANT_TEMP Engine coolant temperature 64 °C