ES
← Back to Portfolio
Predictive Maintenance August 2026

TruckVitals, Onset Detection on Haul-Truck Telemetry (Regime First, Then Residual)

Every haul-truck channel moves with payload, grade and speed, so a change detector run on raw telemetry detects the truck going uphill, not a fault. TruckVitals segments the operating regime FIRST, from context channels that are disjoint from the monitored ones, and detects on the within-regime residual, so an alarm means a developing fault. The headline carries no detector in it: on six-operating-condition NASA C-MAPSS subsets the fault signature is 0.16 sigma of the pooled spread and 11.95 sigma of the within-regime spread, a ratio of 90.2, while the single-condition subsets return exactly 1.00 as a negative control nobody designed. It also ships a published NULL (regime conditioning does not improve onset localisation) and a WITHDRAWN claim (no false-alarm reduction is claimed anywhere, because the raw arm wins that metric on the synthetic lane). The headline changed after a review commissioned to refute it broke three of the four original numbers.

The pipeline
raw telemetry -> regime segmentation -> within-regime residual -> change point -> onset, with regimes learned from context channels (payload, grade, speed) DISJOINT from the monitored ones
Detection at a matched budget
1 to 6 operating conditions costs 0.93 to 0.17 and 0.73 to 0.24; regime conditioning recovers to 0.98 and to 0.70, which on the second pair is LEVEL with the single-condition reference, not above it
Four data lanes, each scoped
NASA C-MAPSS (the 1-vs-6 operating-condition contrast), SCANIA APS (cost matrix FP 10 / FN 500, doi:10.24432/C51S51), SCANIA Component X (5-class window over 23,550 real vehicles, doi:10.5878/jvb5-d390), and a physically grounded synthetic fleet (onset error)
The lane that does not exist
No public, redistributable dataset of CONTINUOUS haul-truck telemetry with labelled faults was found, which is why onset error is measured on the synthetic lane and the app says so
The review that changed the headline
A review commissioned to refute the result confirmed the mechanism through 8 attacks and broke 3 of 4 numbers (unequal healthy data, a threshold chosen on the data it scored, and an arm run with n_regimes=1); 3 engine defects were fixed and released in regimecpd
Engine and deploy
regimecpd (published separately on PyPI from its own repo; TruckVitals declares no package of its own); static SPA on GitHub Pages, MIT; part of the Faena hub
Architecture diagram of TruckVitals, Onset Detection on Haul-Truck Telemetry (Regime First, Then Residual)
#predictive-maintenance #condition-monitoring #change-point-detection #regime-segmentation #c-mapss #null-results #adversarial-review #mining

Business Context

An unplanned haul-truck failure takes a unit out of the fleet at the worst moment and can turn a component change into a rebuild, so detecting a developing fault earlier is worth real money. The obstacle to actually deploying such a detector is not usually the algorithm, it is trust: a monitoring system that alarms whenever the truck climbs a ramp gets muted within a week, and once muted it protects nothing. Segmenting the operating regime first is what makes an alarm mean something a maintenance planner can act on, and stating the core result as a detector-free effect size is what lets that claim survive a change of threshold, alarm convention or budget. The honesty is part of the value here: a published null on onset localisation and a withdrawn false-alarm claim tell a reader exactly which decisions this method should and should not be used for, which is more useful than a single headline number that quietly depends on how the benchmark was set up.

Strategic Value

TruckVitals is the clearest case in the line of a result that got smaller and more trustworthy on purpose. An earlier version reported 0.96 to 0.05 recovering to 0.98, and 0.69 to 0.06 recovering to 0.88. A review was commissioned specifically to REFUTE it, and across eight attacks (including a shuffled-context placebo) it confirmed the mechanism and broke three of those four numbers. All three causes were real defects and all three flattered the result: the raw arm had been given a third of the residual arm is healthy data, the threshold was chosen on the data it then scored while the code accepted a calibration argument it never read, and the arm carrying the 0.88 had run with n_regimes=1, a global context regression with no segmentation in it at all. The response was to move the headline to a detector-free effect size, recompute it from the eligible arms, quote the WORSE of the two pairs alongside the better, publish the null and withdraw the false-alarm claim entirely. Three engine defects found along the way were fixed and released in the separately published regimecpd package (an ADWIN cut threshold that matched neither the paper nor MOA, a budget-threshold search that could not see qualifying thresholds below a local violation and was costing the multi-condition arms a factor of three to six, and an ineffective degenerate-scale guard). The product declares no package of its own: the engine is regimecpd on PyPI, from its own repository.

The Challenge

Condition monitoring on mobile equipment has a problem that fixed machinery does not. A haul truck changes what it is doing constantly: payload, road grade and speed all move, and every monitored channel moves with them. Run a change detector straight on that telemetry and the largest changes it finds are the truck loading, climbing and tipping, so the alarm fires on normal operation and the genuine fault signature is buried inside a spread that is mostly context. Averaging over the fleet does not rescue it either, because the pooled spread is dominated by the difference between operating conditions rather than by the difference between healthy and failing. The deeper trap is in how such a method gets evaluated: pick the threshold on the data you then score, give the arms unequal healthy data, or quietly run the strong arm with the segmentation disabled, and you can report a large improvement that is an artefact of the harness rather than of the method.

Our Approach

The pipeline is one idea applied strictly: raw telemetry, then REGIME SEGMENTATION, then the within-regime residual, then the change point, then the onset. The regimes are learned from CONTEXT channels (payload, grade, speed) that are disjoint from the monitored ones, and that disjointness is what stops the segmentation from absorbing the very fault it exists to expose. The headline claim is stated with no detector in it at all, as an effect size, so no threshold rule, alarm convention or budget can move it: on six-operating-condition NASA C-MAPSS subsets the fault signature is 0.16 sigma of the pooled spread and 11.95 sigma of the within-regime spread, a ratio of 90.2 on one pair and 62.3 on the second, while the single-operating-condition subsets return exactly 1.00, a negative control nobody designed. Detection at a matched budget is reported separately and honestly: going from one operating condition to six costs 0.93 to 0.17 and 0.73 to 0.24, and regime conditioning recovers to 0.98 and to 0.70, which on the second pair is LEVEL with the single-condition reference rather than above it. Four data lanes each carry only what they can support: NASA C-MAPSS for the controlled one-versus-six operating-condition contrast, SCANIA APS for decision under a published cost matrix (FP 10, FN 500), SCANIA Component X for five-class window prediction over 23,550 real vehicles, and a physically grounded synthetic fleet for onset error against a truth that exists by construction. The lane that does not exist is named: no public, redistributable dataset of continuous haul-truck telemetry with labelled faults was found, which is exactly why the onset measurement lives on the synthetic lane.

Key Performance Indicators

KPIBaselineResultImpact
A headline with no detector in itA detection score, which any threshold rule, alarm convention or budget can moveAn effect size: on 6-operating-condition C-MAPSS subsets the fault signature is 0.16 sigma of the pooled spread and 11.95 sigma of the within-regime spread (ratio 90.2; 62.3 on the second pair)The claim survives a change of threshold, convention or budget
A negative control nobody designedNo control, so a large ratio could be an artefact of the metricThe single-operating-condition subsets return exactly 1.00, because with one regime the pooled and within-regime spreads are the same quantityThe effect appears only where the mechanism says it should
A published null and a withdrawn claimReport the wins; drop the metrics that did not workRegime conditioning does NOT improve onset localisation (paired over 5 seeds: -0.08 +/- 0.74 in chance-corrected skill, ahead in 2 of 5), and no false-alarm-reduction claim is made anywhere because the raw arm wins that metric on the synthetic laneA reader knows which decisions the method should not be used for

Architecture

truckvitals pipeline

truckvitals pipeline

Technology Stack

Python regimecpd NumPy/SciPy scikit-learn TypeScript React Vite uPlot

In action

A short tour of the live app: the real interface, recorded from the deployed site.

TruckVitals, Onset Detection on Haul-Truck Telemetry (Regime First, Then Residual) in action

Application Screenshots

TruckVitals, Onset Detection on Haul-Truck Telemetry (Regime First, Then Residual)
TruckVitals, Onset Detection on Haul-Truck Telemetry (Regime First, Then Residual)