Resources · tool
A procurement pipeline and vendor scorecard in plain SQLite and Python — every vendor scored from what actually happened, never from opinion.
A vendor with the cheapest quote in the county won the shrimp order. The truck was 105 minutes late on event day, six pounds short, and the invoice came in 6.7% over the agreed price. Invoice cost is not true cost — but nobody could show that in one row.
Only observations. Every event carries an expected value and an actual one: expected_qty against actual_qty, expected_at against actual_at. Ordered ten cases, got eight. Window was six to eight, truck showed at 9:45. Nothing in the database ever says "late".
Thresholds live in a config table as bands: 1–15 minutes late is a nudge (−5), 15–60 is a ding (−20), over 60 is a failure (−100). A view compares each observation against the bands and sums points lost per delivery. Change one band and the entire history re-scores itself, because no opinion was ever written down.
A vendor invited to a sourcing round who never answers is scored for it — a no_response event derived from the invitee list and the deadline, never typed by hand. A vendor who declined is a different thing from one who went quiet, and the schema keeps them apart.
One table: overall score, then delivery, quality, pricing and responsiveness. Delivery is weighted heaviest, because a short order on event day is unrecoverable in a way a pricing dispute is not. Weights are config too, and they renormalise over the families a vendor has actually been observed in — no free hundred for the unobserved.
Plain SQLite and Python 3, no dependencies. Clone the repo, run python3 build_db.py, and it prints every scored observation and the scorecard. Then edit one band in seeds/thresholds.csv, rebuild, and watch history change its mind.