SORTING RULES - OXYGEN SENSOR / AIR-FUEL SENSOR COMPLAINTS (P0130, P0131 AND SISTER CIRCUIT CODES) PulsCar analysis of NHTSA public data, October 2026. License: CC BY 4.0 Fingerprint of the rules text below, taken when it was written and before any complaint was sorted: 19ea18160f0386c1c1035b8c2cae6c2b05c3e1c15735d2c8d9679bb5ddd89a90 (2026-10-27T09:37:49Z) Fingerprint of the addendum for the second batch, taken before that batch was sorted: a499f4edbdbf02efb0c199704aae4a0b73b5a9e80b0ff9ea621a82f0b169b98f (2026-10-27T10:08:20Z) # Sorting rules - oxygen sensor / air-fuel sensor circuit complaints (P0130 study; P0131 and sister circuit codes sorted with it) Written before any complaint in the set was sorted. ## Pool (how the complaints were found) NHTSA complaints received 2015-01-01 to 2026-10-04 (the latest received date in the flat files). A complaint is in the pool if its narrative matches any of the following case-insensitive text searches: 1. R1 - the code P0130, P0131, P0132, P0133 or P0134 by any spelling (letter O for zero, a space, hyphen or period after the P, suffix 00), or a bare number after a code word: `(? N (all flags no). If the complaint's subject IS the engine/check-engine fault and the list is the shop/owner trying parts without a cure -> U. # R2 the owner replaced the sensor themselves after a code reading or a shop named it -> S (the sensor was named as the cause by the reading/shop). The owner's own guess with no reading or shop -> U. # R3 sensor replaced but the owner says the light/symptom stayed or came back and no other cause is named afterwards -> U with returned=yes (precedence rule: a part that did not help does not count). If a later different cause is named as the fix -> that cause's letter. # R4 a shop/dealer estimate, quote or diagnosis that names the sensor as the part to replace counts as named cause -> S. # R5 sensor position does not matter for the category (front, rear, both or unstated); rear-only sensor with a catalytic converter cause -> T. # R6 recall flag = yes only when a recall/campaign/TSB/special coverage is tied to THIS fault or this event; an unrelated recall (air bag, parts delay on another system) mentioned in the same narrative -> recall=no. # R7 stall flag = yes only when stalling, loss of power, limp mode or severe rough running is stated in the same event as the sensor fault and not clearly caused by another named fault. # R8 nostart flag = yes only when hard/no start is stated in the same event; otherwise no. # R9 returned = yes only when the same light, code or symptom is stated to have come back or not been cured after a repair or reset. # R10 when the excerpt does not settle it: the narrower reading (flag no; category U). # R11a root cause: when the narrative states a root cause that damaged the sensor or produced the sensor symptom (block crack, fuel pump leak), the category is that root cause's letter (engine mechanical failure -> O, fuel/air component -> A); the sorting-rules order W,X,A,S,T is used only when no single cause is named. # R12a recall/TSB/extension flag is judged against the complaint's own reported failure event (even when the sensor is only a part tried or a symptom): concerns that failure -> yes; concerns an unrelated system or is not tied in the excerpt -> no. # R13a sensor stripped threads / sensor blown out of its bung (mounting failure) -> X, unless replacing the converter is stated as the repair -> T. # R14a a recall/campaign named but not performed, with no other repair or cause stated -> U (F needs an actual software/campaign repair stated). # R15a idle air control / idle control motor named as cause -> A. # R16a when several parts were replaced or named together and no single cause is named, the sorting-rules order W, X, A, S, T decides the category. # R17a when the catalytic converter and an oxygen sensor are named or replaced together and no other part is involved, the category is T (sorting-rule T text), not S. # R18a when repairs came in sequence (sensor, then pump, then converter), the last repair or last cause stated decides the category (sorting rules precedence: final repair). # R11b converter named/replaced together with the sensor -> T (sorting-rule T definition governs over the W,X,A,S,T order) # R12b sensor and/or other parts replaced, owner says problem not cured, no later cause named -> U (extends R3 to part lists), returned=yes # R13b several causes named at once (harness/exhaust/air) and none singled out -> sorting-rules order W,X,A,S,T # R14b owner invokes, demands or blames a recall for this event -> recall=yes # R17b manufacturer or dealer states this failure is or is not covered by a recall or campaign -> recall=yes (tied to the event per R6) # R18b owner says only 'checked/tested and it says O2 sensor' with no shop or dealer named -> U (scan only) # R19b owner states the sensor had to be replaced two or more times (repeatedly, every N years, second set) -> returned=yes # R20b technician names harness/wiring damaged or to be replaced because another part leaked fluid or failed (trans pressure sensor, cam solenoid/sensor) -> W (sorting-rules order W first; the source part does not override) # R21b owner says only 'known issue' / 'manufacturer knows' with no notice, TSB or recall invoked -> recall=no # R15b stall=no when the engine symptom is attributed to a different named fault (clutch, turbo, engine, transmission) per R7; stalling or sluggish power after sensor/converter damage -> yes # R16b replaced parts with no cure, and shop then reports no fault found -> K (after discounting the failed parts per R3) # Rcons1 consistency pass on category S with returned=yes: precedence rule applied literally. # Rcons1 sensor (alone or with other parts) replaced/named and the narrative says the problem stayed, came back or was not cured, and no later different cause/fix is named -> U (R3/R12b). # Rcons1 sensor and converter named/replaced together -> T (R11b/R17a); a later named different cause or fix -> its own letter (A, O, T). # Rcons1 sensor replaced repeatedly because the sensor itself keeps failing, or the shop names the sensor again after the replacement -> stays S. # Rcons1 recall named but not performed -> U (R14a). Excerpt that does not settle it -> current value kept. ## The text searches as written (Python regular expressions) import re SRC={ 'R1_code': r'(?