In late 2024 an institutional researcher asked me a question I could not answer, and it turned into the most useful eighteen months of work I have done here.
The question was simple: of the students who did not persist, what fraction had we flagged — split by first-generation status? We had not built that report. When I built it, we had been under-flagging first-generation students by eleven points for two terms.
We had done the obvious thing, and it was not enough
There were no protected attributes in the model. We had been deliberate about that, and it is the answer most vendors give when asked about fairness. It is also nearly irrelevant.
The culprit was LMS engagement — logins, resource views, time-on-task. About forty per cent of the model’s feature importance. It is a genuinely predictive signal and it looks entirely neutral. It is also recorded far less densely for students who study offline, work during the day, or share a device with siblings.
For those students the model saw sparse engagement and read it as normal rather than as missing. The feature was not a proxy for first-generation status by design. It was a proxy for reliable individual internet access, which is correlated with it in ways that are not subtle once you look.
Excluding a protected attribute does nothing here. What matters is whether your most informative features are equally informative for everyone.
What we changed
- The model now distinguishes “low engagement” from “engagement not observed”. Treating those as the same thing was the specific bug.
- Flag thresholds are set within programme and mode of study, so an evening cohort is not competing against a day cohort for a fixed number of flags.
- Fairness reporting runs on every refit, not on request. A subgroup gap above five points blocks deployment and needs a human override.
- Where an institution does not record an attribute, we report that we cannot audit it rather than substituting a postcode proxy.
It cost us accuracy, and that is fine
Closing the gaps cost 2.1 points of overall precision. I want to be direct that this is a real cost and we chose to pay it, because the alternative is a system that performs best for the students who need it least.
If you run an early-warning system, the report I could not produce in 2024 is worth producing this week. Flag rate against observed outcome rate, split by every attribute you record. It takes an afternoon and you may not like the answer.
The full study is EPR-2026-02, and the fairness reporting harness is open — it runs against any binary classifier with subgroup labels.