From a code to a decision: how CarStream explains fault codes
A fault code answers none of the three questions an owner has: can I keep driving, what is it likely to be, what do I check first. What the Explain button sends, what comes back, and why the answer is shaped the way it is.
The check-engine lamp raises three questions and answers none of them. Can I keep driving? What is it likely to be? What do I check first? A scanner, or a free app, turns the code into a name: “P0420, catalyst system efficiency below threshold”. That is a translation, not an answer. The owner is left exactly where they started: in a car park, with a search engine.
This post is about what CarStream does with a code instead, and why it is built the way it is.
The problem with looking a code up
Three things make a generic lookup weak.
The same code means different things on different cars. Public code lists cover the ranges the standard defines. The rest is left to each manufacturer, and there a P1xxx means one thing on an Audi and another on a Ford. A generic list either shows “unknown” or shows another car’s meaning.
By numbering range in SAE J2012, not by how often each range shows up. Our table carries about two thousand standard names; everything in the grey part is named with the make and model in hand.
A code rarely comes alone. A P0420 next to a misfire is a misfire story: the catalyst is the victim, not the cause. A code reported by the chassis module is a different conversation from one reported by the engine. A lookup sees one code at a time.
The honest answer depends on the car. “Can I keep driving” with a misfire on a petrol car, where raw fuel reaches a catalyst, is a different answer from the same symptom on a diesel. The name of the code does not carry that.
What CarStream knows before you ask
The unit in the car reads the ECU’s three code lists every 30 seconds while the engine runs, and keeps each fault as an episode: when it was first seen, when it was last seen, how many times it has come back. A new stored code sends one notification. A pending code is tracked but stays quiet, because a first strike is not news yet.
Each row also carries which module reported it. That matters more than it sounds. One of our own cars carried three permanent codes from the chassis module for weeks: the lamp was off, every scanner read clean, and the engine module had nothing to say. CarStream shows those as on record, not as faults, because that is what they are.

And when a code is manufacturer-specific and the standard table has no name for it, the unit does not leave “unknown fault code” on the screen. It asks the model for the code’s short standard name, with the car’s make and model in hand, and writes the name onto that car’s rows only. The same code on a different make gets its own lookup.
What the Explain button sends
“Explain with AI” is not the code pasted into a chat window. The request carries everything the row already knows:
- CodeP0420
- Car from the VINyear · make · model · engine · fuel
- Other active codesP0301
- LampMIL on
- Module0x7E8 · engine ECU
- LanguageEnglish
- Verdictok · caution · danger, and whether to keep driving
- Meaningtwo or three plain sentences
- Causes2 to 4, ranked, each with a weight
- Steps2 to 4, cheap checks first
The context chips under an answer show exactly these inputs: the car, its engine, the neighbouring codes. If a chip is wrong the answer may be wrong, and that is visible before anyone trusts it.
The vehicle comes from the VIN decode: year, make, model, engine, fuel. The other active codes and the lamp state go in, so a P0420 next to a P0301 gets a different answer from a P0420 alone. The reporting module is named. And the answer is asked for in your language, not translated afterwards.
What comes back, and why it is shaped
The model is not allowed to answer in prose. It has to fill a form, every time:
- A verdict: ok, caution or danger, with one line answering the only question that matters in the car park. Can I keep driving?
- The meaning, in two or three plain sentences.
- Two to four likely causes, ranked, each with a weight. The weights are the model’s ordering of the causes, not a measurement from the car. They exist so the list has a shape.
- Two to four steps, in order, starting with the cheap checks.
Have it looked at when convenient.
Book a check this week. No hard acceleration.
Stop and call for help. Driving on costs more than the tow.
One of three words is a required field of the answer. A prose “it depends” is impossible by construction.
Below the answer, the context chips show exactly what the model was given: the car, its engine, the neighbouring codes. If a chip is wrong, the answer may be wrong, and you can see that before you trust it.

Three choices we made on purpose
The strongest model we can run. The verdict is the one place where the system answers “can I keep driving”, and a confidently wrong answer there is the worst thing it can produce. So this is the one call where we pay for the largest model rather than the fastest. A first explanation takes a while, and the screen says so instead of pretending.
One answer per car, code and language, kept. Once generated, an explanation is stored for that car and that code. The second click is instant, and the answer does not drift between visits. Switch the language and you get a fresh answer in that language, not a translation of the old one.
Every answer ends with “verify with a mechanic”, and means it. The explanation is a starting point for a conversation, not a replacement for a lift and a multimeter. What it changes is who arrives prepared. The owner comes in knowing the likely causes, how long the code has been there and what has already been ruled out, and the workshop starts from there instead of from a number.
What that actually solves
The expensive failure mode of a fault code is not the fault. It is the reflex: a lookup that says “catalyst”, a quote for a catalyst, and a lazy sensor that was the real cause still in the car afterwards. The second failure mode is the erase button pressed in the car park, which deletes the evidence and keeps the lamp off for a week.
An explanation that arrives with the code, in the car’s own context, answers the “can I drive” question, ranks the cheap causes ahead of the expensive one and says what to check first. That is the gap between knowing the code and knowing what to do about it. The code was never the hard part.