Illustration. The first version added the criteria up; the rebuild lets one hard blocker cap the band.
First instinct
Weight every criterion and add them up.
The evidence
A test profile with strong finances and a long unexplained gap in the academic record came out as a pass. A caseworker would reject it on the gap alone.
What I chose
Tiered band-capping: every criterion still counts, but one hard blocker caps the final band, whatever the total. The rules live as data.
Still open
I can't yet separate a borderline pass from a borderline fail. That needs outcome data I don't have.
Illustration, not to scale. The time went to waiting for a connection, not to the query.
First instinct
Go after the slow queries.
The evidence
The query plans were unremarkable. The failures happened before any query ran: requests held connections while iterating unbounded result sets, and the pool drained.
What I chose
Bound the queries so no request holds a connection while streaming an open-ended set, resize the pool, and fail fast instead of queueing.
What I kept
Find where the time is actually spent before optimising whatever looks slowest.
Illustration, drawn in two dimensions. The real feature space has ten.
First instinct
Train a supervised classifier on labelled faults.
The evidence
Nobody labels the readings. A fault gets recorded, if at all, in a maintenance note once the vehicle is already in the workshop. There was nothing to train on.
What I chose
Learn what normal looks like across a 10-dimensional feature space, with Isolation Forest and Local Outlier Factor together, because they fail differently.
Still open
With no labels there's no precision or recall to quote, and the alert threshold is a judgement call tuned by inspection.