All work

03

What is a used car actually worth?

Every one of the 119 value deductions in the model survived an independent attempt to refute it before it was allowed in.

  • Python
  • SQL
  • idempotent seeds
  • adversarial review

The valuation grid is 84 baseline cells, one per year, engine and mileage band, plus 119 researched deductions in zloty, one for every inspection finding at every severity. The research ran as a governed fleet: finders proposed numbers, a matching set of verifiers were told to break those numbers, and a plausibility auditor held back anything that could not be defended.

The part I am most pleased with is not the model, it is the loader. It refuses to half load. Row count, currency, price sanity and severity ordering are all checked inside the transaction, and any violation rolls the whole thing back. A worse fault priced above a milder one is not a rounding error, it is a broken model, and the database will not accept it.

backend/supabase/seed/013_fmv_deductions.sql
-- Self-checks: abort on a dropped slug, a banned dash, a bad band, or broken
-- severity ordering within an item.
DO $$
DECLARE bad integer; cnt integer;
BEGIN
  SELECT count(*) INTO cnt FROM fmv_deductions WHERE source = 'fleet_curated_2026_06';
  IF cnt <> 119 THEN
    RAISE EXCEPTION 'expected 119 fmv_deduction rows, found %', cnt;
  END IF;

  SELECT count(*) INTO bad
    FROM fmv_deductions a
    JOIN fmv_deductions b
      ON a.inspection_item_id = b.inspection_item_id AND a.severity < b.severity
   WHERE a.pln_low > b.pln_low OR a.pln_high > b.pln_high;
  IF bad > 0 THEN
    RAISE EXCEPTION '% severity-monotonicity violations (a milder grade priced above a worse one)', bad;
  END IF;
END $$;
84baseline valuation cells
119verified deductions
18research agents, half of them hostile
0entries shipped unverified

What the market pays, by build year

The band is the honest part. There is no single price for a used car, so the model carries a range and shows it, rather than inventing a confident number.

20k 40k 60k 80k 2013 2014 2015 2016 2017 2018 2019 32 000 to 41 700 zl 59 600 to 77 400 zl

Source: fmv_baselines, 84 rows, 1.6 Valvematic between 80 000 and 130 000 km. Manual market curation, sample sizes 8 to 18 per cell. PLN.

How it was done

  1. Price a range, never a point

    There is no single price for a used car. Every cell carries a low and a high, and the interface shows the band rather than collapsing it into one confident looking number.

  2. Have someone try to break each figure

    Researchers proposed numbers and a matching set of verifiers were briefed to refute them, not to confirm them. A plausibility auditor held back anything that could not be defended.

  3. Make the loader refuse bad data

    Row count, currency, price sanity and severity ordering are all asserted inside the transaction. A worse fault priced below a milder one is not a rounding error, it is a broken model, and the load aborts rather than half completing.

  4. Make the load reproducible

    The seed is generated from a committed research file rather than hand edited, so re running it reproduces exactly the same grid, including the corrections the audit forced.

What this does not tell you

Every dataset has an edge. Here is where this one stops, said plainly, because a number you have to qualify is worth more than one you do not.

  • Of the 84 baseline cells, 44 are grounded in observed listings and 40 are extrapolated to fill combinations the market rarely offers. The extrapolated cells are flagged in the data rather than presented as observations.
  • Sample sizes behind the observed cells run from 8 to 18 listings. That is enough to place a band, not enough to claim precision.
  • It reflects asking prices in one market at one time. It is a guide for a negotiation, not a valuation, and it is stated as such wherever it is shown.

Move the mileage slider

Back to all six projects