What a fault code actually tells you, and what it doesn't
P0420 is not a diagnosis. It is the engine computer saying that one measured value stayed out of bounds long enough to matter. How to read that, and why clearing it fixes nothing.
The lamp comes on. A scanner at the car wash reads P0420, the attendant says “catalyst”, and twenty minutes later someone is pricing catalytic converters. That is the usual story, and the first step in it is wrong. A fault code is not a diagnosis. It is a test that failed.
A code is a symptom the computer could measure
The engine control unit watches a few dozen signals and, for each one, keeps a window of values it considers normal. When a signal leaves its window and stays out long enough, the ECU writes a code. That is all a code says: this test failed.
Take P0420, “catalyst system efficiency below threshold”. The ECU cannot see the catalyst. What it can see is two oxygen sensors, one before the converter and one after. A healthy catalyst smooths out the swings in oxygen, so the rear sensor should trace a much flatter line than the front one. When the two lines start to look alike, the test fails.
A schematic, not a recording. The front sensor always oscillates: that is how the mixture is regulated. The only question is whether the rear one copies its shape.
Now list what makes the two lines look alike: a worn catalyst, yes, but also a lazy rear oxygen sensor, an exhaust leak ahead of that sensor, a misfire pushing raw fuel through, or a temperature sensor that keeps the engine in its rich warm-up mixture. One code, five causes, and only one of them costs four figures.
Three kinds of code, three different meanings
Scanners lump everything together as “codes”, but the standard keeps three lists, and the list a code sits on changes what it means.
Pending. The test failed once, on the current or the last drive. The ECU is not convinced yet. Many emissions tests have to fail on two consecutive drive cycles before the lamp lights, so a pending code is a first strike, not a verdict. It can also disappear on its own if the next drive passes.
Confirmed. The test failed again. The lamp is on and the code is stored together with a freeze frame: speed, revs, coolant temperature, load and fuel trim at the moment of the second failure. The freeze frame is the most under-read piece of data in the whole system. A misfire logged at 3,000 rpm under load points somewhere very different from one logged at idle with the engine cold.
Permanent. Since 2010 the ECU also keeps a third list that no scanner can erase. A permanent code clears itself only when the ECU runs the same test again and the test passes. This is the one that matters at an inspection: an empty memory with a permanent code still on it says someone wiped the evidence without fixing the cause.
- 1Drive 1pendingThe test fails once
Lamp off. If the next drive passes, the code goes away on its own.
- 2Drive 2storedMILIt fails again
Lamp on. The ECU stores the code and a freeze frame of the conditions at the moment it failed.
- 3UntilpermanentThe test passes again
A third list no scanner can erase. It clears only after the ECU re-runs the test and the test passes.
Clear codes erases the first two lists, the freeze frame and the readiness monitors. The third list and the fault itself stay.
CarStream shows these as three sections on the Diagnostics screen: ACTIVE, ON RECORD · PERMANENT and PAST FAULTS. A pending code sits in the active list with a tag, because a first strike is still something you want to know about.

Clearing is not fixing
Every cheap scanner has an erase button, and it is tempting. Here is what it does: it deletes the stored codes, deletes the freeze frames, and resets the readiness monitors, the ECU’s own record of which self-tests have run since the last erase. It does not touch the fault.
So right after a clear, the honest state of the car is unknown. The lamp is off because the memory is empty, not because anything passed. Two things follow. First, you have just thrown away the freeze frame, the best clue you had. Second, if the fault is intermittent, it may take days before the test runs again under the right conditions and the code comes back, and in the meantime the car looks healthy.
This is why CarStream refuses to say “no faults” right after a clear. The screen says waiting for the car to confirm until the next diagnostics read comes back with the tests actually re-run. We would rather show a question mark than a false green.
How to read a code, then
A short routine that costs nothing:
- Note when it first appeared and how often. A code that has fired three times this week and one that fired once last winter are different animals. CarStream keeps first seen, last seen and an occurrence count per code for exactly this reason.
- Read the freeze frame before anyone clears anything. Cold or hot, idle or load, rich or lean.
- Look at the neighbours. A P0420 next to a P0301 misfire is a misfire story. A P0420 on its own, on a car with 200,000 km, is more likely the converter.
- Check the cheap causes first. Exhaust leaks, sensor connectors and vacuum hoses are visible with a torch. Replace parts last.
- Ask for an explanation, not a verdict. The Explain with AI button on each code lists the likely causes in order, with what to check for each. It is a starting point for a conversation with a mechanic, which is why every answer ends with “verify with a mechanic”. We mean it.

A fault code is where the diagnosis starts, not where it ends. The computer told you which test failed. Finding out why is still the interesting part.
