PULSCAR ANALYSIS OF NHTSA PUBLIC DATA — THE ABS WARNING LAMP PulsCar analysis of NHTSA public data, September 2026. License: CC BY 4.0. Files in this folder may be reused with attribution to PulsCar (pulscar.io). -------------------------------------------------------------------------- 1. SOURCE FILES -------------------------------------------------------------------------- NHTSA public flat files, downloaded from static.nhtsa.gov and loaded into a local SQLite database on 16 September 2026: Complaints FLAT_CMPL.txt 777,040 owner complaints (ODINO), received 1 January 2015 - 8 September 2026. Field definitions: https://static.nhtsa.gov/odi/ffdd/cmpl/CMPL.txt Recalls FLAT_RCL.txt one row per make/model/model year per campaign. Campaigns counted DISTINCT on the campaign number; the potentially-affected population is taken once per campaign (checked: no campaign in the file carries two different population figures). Field definitions: https://static.nhtsa.gov/odi/ffdd/rcl/RCL.txt Investigations FLAT_INV.txt ODI investigations, opening and closing resumes. Counted DISTINCT on the action number. Field definitions: https://static.nhtsa.gov/odi/ffdd/inv/INV.txt Complaints are owner reports. They are not verified repairs, not failure rates, and they have no denominator of vehicles on the road. Nothing in this folder ranks any brand for reliability, and no share here should be read as "X% of ABS lights are caused by Y" — see section 5. -------------------------------------------------------------------------- 2. THE COMPLAINT QUERY (6,676 -> 4,126) -------------------------------------------------------------------------- Step 1 - FTS5 full-text prefilter on the narrative for any of: "abs light", "abs lamp", "abs indicator", "abs warning", "anti-lock", "antilock", "anti lock". FTS5 folds case, so this step is case-insensitive by construction. -> 6,676 complaints. Step 2 - the phrase itself. Python regex, compiled with re.IGNORECASE: \b(?:abs|anti[- ]?lock(?:\s+brake\w*)?)\s+(?:warning\s+)?(?:light|lamp|indicator)s?\b i.e. "ABS" or "anti-lock" / "antilock" / "anti lock brake(s)", optionally followed by "warning", then light, lamp or indicator. Adjacency is required: the word for the lamp must follow the word for the system. -> 4,126 complaints. Every figure on the page and in these files uses that set. CASE SENSITIVITY IS NOT A DETAIL HERE. NHTSA complaint narratives are recorded in ALL CAPS through 2020 and in mixed case from 2021 onward. The same regex written without re.IGNORECASE, matching uppercase only, returns 1,909 of the 4,126 - and the loss is not spread evenly: received year case-insensitive uppercase-only uppercase catches 2015 399 399 100% 2016 262 262 100% 2017 262 262 100% 2018 304 304 100% 2019 338 338 100% 2020 213 213 100% 2021 261 100 38% 2022 280 7 2% 2023 552 8 1% 2024 521 11 2% 2025 455 5 1% 2026 279 0 0% An uppercase regex or an uppercase SQLite GLOB therefore looks like a working instrument while silently deleting almost the entire modern half of the file - including every complaint about campaigns opened after 2021. Every query behind these files is case-insensitive: FTS5 folds case, SQLite LIKE folds ASCII case, and every Python regex carries re.IGNORECASE. Step 3 - SAMPLE READING. 30 members of the 4,126 were drawn at random (random.seed(7)) and read in full. All 30 described an ABS or anti-lock warning lamp illuminated on the dashboard: no false positive on the phrase itself. In 4 of the 30, however, the ABS lamp was an incidental line in a complaint about something else - a total electrical failure, an airbag that did not deploy, a seat-belt chime, a body-control fault that lit every lamp at once. So: the phrase filter is clean, and roughly one complaint in eight in this set is on topic only in the sense that the lamp was among the things that lit. No further filter was applied; the rate is published here instead. A NUMBER THAT MOVED. An earlier pass of this article reported 4,607 complaints for the same idea. That figure is not reproducible from any query we could write down, and the closest match we found was a proximity rule (the two words within 30-40 characters of each other) rather than an adjacency rule. The set was rebuilt from scratch for this pass with the regex printed above, and every derived figure on the page was recomputed from it. Where the page and this file disagree with the older number, this file is the one that can be re-run. -------------------------------------------------------------------------- 3. WHAT IS COUNTED -------------------------------------------------------------------------- abs-light-by-context.csv Two kinds of row, marked by measure_group. "what the narrative also mentions" - a case-insensitive category search over the whole narrative. A complaint can appear in several rows; shares are of 4,126, not parts of a whole. "part named in a diagnosis or repair sentence" - the same category search, but the narrative must ALSO contain a diagnosis or repair verb (diagnosed / determined / informed / told / advised / replaced / found that). This is what owners wrote that somebody named, not what was wrong with the car. towed / crash / fire are NHTSA's own structured flags. All-file baselines over 777,040 complaints: towed 5.11%, crash 4.37%, fire 1.82%. Mileage: values <= 0 and >= 400,000 dropped. 2,504 of 4,126 carry a usable figure; median 90,429 miles, Q1 51,995, Q3 130,000. abs-light-by-make.csv - makes with 10 or more complaints in the set. abs-light-top-models.csv - the 60 most-reported make/model pairs. abs-recall-campaigns.csv - every recall campaign in the file whose component string contains "ANTILOCK", one row per campaign: 170 campaigns. 16 of them are equipment campaigns (a supplier recalling a part: 7,135,791 units) and 154 are vehicle campaigns (15,652,226 vehicles), of which 111 cover light vehicles (14,163,027) once heavy trucks, buses and motorcycles are set aside by make. The class column carries that split. 25 of the 111 light-vehicle campaigns have a defect or consequence description naming fire, burning, smoke or thermal event, and those 25 cover 8,135,310 vehicles. 34 of the 111 have a software remedy. -------------------------------------------------------------------------- 4. INVESTIGATIONS -------------------------------------------------------------------------- 58 distinct ODI investigations in the file name an anti-lock component or carry "ABS" or "ANTI-LOCK" in the subject line. Four are quoted on the page, and each quotation is taken verbatim from the resume text in FLAT_INV.txt: DP26-004 (opened 9 April 2026, open), AQ23-002 (opened 17 November 2023, open), PE22-012 (opened 28 November 2022, closed 3 March 2025) and PE20-014 (opened 21 September 2020, closed 30 March 2021). -------------------------------------------------------------------------- 5. LIMITATIONS -------------------------------------------------------------------------- * Self-selection. People file a federal complaint when a repair is expensive, refused or unresolved. A wheel-speed-sensor ring cleaned in an hour rarely produces one. That is the most likely reason the ABS module is named eight times more often here than a wheel speed sensor, while a manufacturer bulletin (GM 17-NA-047) says the same lamp is often fixed with a brush and no parts. Read section "part named" as a map of what owners are told when the cheap answer has already failed, not as a cause distribution. * No denominator. Ram 2500 is 13.3% of this set. That is a count, not a rate; it reflects one long-running defect investigation and a large fleet. * Structured flags are inconsistently filled. The towed field is the narrowest of the three and is often left N even when the narrative describes a tow. * Mileage is owner-stated and missing for 39% of the set. * Model-year windows in the recall flat file are the years present in the file, not the build-date windows in the Part 573 report. Eligibility for any campaign is decided by VIN. Questions, corrections, or a figure that does not reproduce: support@pulscar.io