Football · methodology, not performance
Live repoReal dataPlayer Availability Analysis
Independent research · deployed two-service product
View the repo →What this is
Per-player-per-day availability-risk decision support from public subjective athlete-monitoring data. Its headline is process rigour and honest negative results: three pre-registered audits overturned favourable-looking results, including its own promoted champion.
Metrics
Champion (pooled rolling-origin)
0.836 ROC-AUC · AP 0.097 · Brier 0.0063
vs prevalence-null 0.500
Alert budget, 2.5% review rate
11 of 18 onsets (recall 0.61)
34.8 false alerts per captured onset
Alert budget, 5% review rate
13 of 18 onsets (recall 0.72)
60.4 false alerts per captured onset
Testing
175 tests, GitHub Actions CI on every push
Stack
Provenance
Decision support only: not a diagnostic or clearance tool, no causal claims. Deployed as two Cloud Run services behind a shared review credential (never a production authentication claim). The single-use confirmatory final-test ROC-AUC (0.827) rests on five onsets and is barred from ever being cited as a performance figure, by the project’s own governance.
What I would not claim
- "production" (shared review credential, not production authentication)
- real-time or online serving (batch inference; deferred to V2)
- the final-test ROC-AUC (0.827) as a performance figure, anywhere
- clinical, diagnostic, clearance or causal framing
- the review credential itself, in any public document
Rigour first, performance nowhere near the headline
The baselines the champion has to beat, the two disclosed alert-budget operating points, and the three pre-registered audits that overturned favourable-looking results along the way.
Baselines the champion has to beat
Prevalence-null
0.500 ROC-AUC
Captures 0 of 5 onsets at any alert budget.
Recent-load heuristic
0.477 ROC-AUC
Below the prevalence-null baseline.
The champion
Selected after a Cox model was rejected on a pre-registered leakage diagnostic and a gradient-boosted classifier was rejected on an overfitting signature. Raw probabilities: no post-hoc calibrator beat them on Brier or log loss.
Pooled rolling-origin
AUC 0.836 · AP 0.097 · Brier 0.0063
Fixed validation window
AUC 0.808 · Brier 0.0037
Alert budget: two measured operating points
Operating points are the two rates the project actually measured. Nothing between them is estimated.
Onsets captured
11 of 18
Recall
0.61
False alerts / captured onset
34.8
Only the two measured operating points are shown. Nothing between them is estimated.
Reversed on my own evidence
- Cox proportional hazards rejected: unseen-player ROC-AUC collapsed from 0.818 to 0.577 under a pre-registered reset-clock leakage diagnostic.
- Gradient boosting rejected: training average precision 0.256 vs validation 0.013, a clear overfitting signature.
- F3 was the leading point estimate (ROC-AUC 0.851) and was promoted, then withdrawn after an audit found its strongest predictor was reading reporting behaviour, not physiology.
- A 2.5% alert threshold frozen on development data realised a 4.7% rate on held-out data — traced to an in-sample-vs-out-of-fold derivation bug, not patched, recorded as a methodological finding.
The number this project will never let you cite
0.827
Rests on five onsets across 8,845 player-days. The project's own governance bars this number from ever being cited as a performance figure, on a CV, in a case study, or in an interview. Shown here only to demonstrate that it is deliberately withheld, not omitted by accident.
Data provenance. Pooled rolling-origin development evidence and disclosed baselines from player-availability-analysis, generated into data/availability.json. Public SoccerMon subjective-monitoring data. Decision support only; no causal or clinical claim.