Tell a real fuel loss from daily noise, with a certificate.
Fuel-tank numbers never balance exactly, the question is whether a discrepancy is noise or a leak. at1 wetstock reconciles daily dips, deliveries and pump totals with a model-coupled residual plus a CUSUM change-detector, separating a real leak or meter drift from ordinary scatter, and issues a certified report: loss rate, confidence interval, and estimated onset date.
- leak vs noise
- a model-coupled residual separates a real loss from daily scatter
- loss rate + CI
- not a yes/no, a rate with a confidence interval
- onset date
- CUSUM change-detection estimates when the loss began
- certified report
- a signed, re-checkable verdict, not a spreadsheet guess
Reconcile the tank
Daily dips, deliveries and pump totals should balance. The unexplained residual, the part the model can't account for, is where a leak or meter error hides.
Leak or meter drift
A constant litres-per-day loss reads as a leak; a loss that scales with throughput reads as meter drift. The model tells the two apart with a statistical test, and when the evidence can't separate them, it says so ('mechanism ambiguous') instead of guessing.
When did it start
A CUSUM detector watches the residual for a change in trend and estimates the onset date, so you know there is a loss and roughly when it began.
Input format
One row per tank per day, in ascending date order. Header row, case-insensitive; the tank column is optional (defaults to TANK-1) and lets one file hold many tanks. All volumes are litres.
date,tank,opening_dip,deliveries,pump_sales,closing_dip 2025-01-01,T07,20000.0,0.0,4500.0,15480.0 2025-01-02,T07,15475.0,18000.0,4820.0,28640.0 2025-01-03,T07,28650.0,0.0,4310.0,24325.0
- date
- , day of the reading
- tank
- , tank/site id (optional)
- opening_dip
- , morning gauge/ATG stock
- deliveries
- , fuel delivered that day (0 if none)
- pump_sales
- , metered volume dispensed that day
- closing_dip
- , evening gauge/ATG stock
The workflow
# reconcile a tank's history (dips, deliveries, pump totals) -> certified report at1 wetstock reconcile tank_07.csv -o wetstock-report.json # read the verdict: loss rate + confidence interval + onset date at1 wetstock report wetstock-report.json # re-verify the certified report independently at1 wetstock verify wetstock-report.json
Honest scope
This is a statistical reconciliation, it flags and sizes a loss with a confidence interval, it does not physically locate a leak or replace a certified calibration. Detection power depends on how clean and regular your daily readings are: sparse, erratic or mis-entered dips widen the interval and delay onset detection. Small losses need more days to separate from noise. The right check is your acceptance test on real data, run it over a tank with a known historical loss and see if the report matches. Validated on synthetic tank histories; partner acceptance on real forecourt data is pending.