Honest evaluation — embargoed rolling backtests
The metrics on the Machine-learning tab are historical / diagnostic: they use the standard chronological protocol, which lets training labels share advisory events with the test window and inflates apparent performance. The numbers below are deployment-honest: the same evaluation is repeated at many points in time (an expanding-window rolling backtest), and at every fold the training labels are rebuilt using only advisories published before that fold's scoring date (the label embargo). No training label ever depends on an advisory the model is later tested on. Pooled metrics combine every fold's test predictions — hundreds of advisory outcomes across 2023–2025 rather than one two-month window.
Runs marked stored labels use the historical (leaky) labels on the same folds, shown for contrast. Produced by tools/rolling_backtest.py.
Feature-set names are the feature families a run was allowed to see — hover a name for what the family is made of, or expand the legend.
What the feature-set names mean
- Activity-recency clocks
ghclock_— nine day-resolution clocks from GH Archive events, measured at month end: days since the last human push, any push (bots included), release, pull request opened, PR merged, PR review, issue opened and tag created, plus a has-events flag. 'Never' is encoded as a 3,650-day cap plus the flag, so a missing history can never look like recent activity. - Contributor dynamics
ghdyn_— nine columns on who is doing the work, from GH Archive actors over trailing windows: active contributors in the last 3 and 12 months, newcomers and departures over 12 months, turnover rate, event count, the top contributor's share of activity, a single-maintainer flag and a has-actors flag. Bot accounts are excluded. - Install base
installs_— ten columns from stats.jenkins.io monthly installation history: install count (raw and log10), share of all Jenkins installs, ecosystem percentile rank, 3- and 12-month growth (clamped), ratio to the plugin's own peak, 12-month rank change, months of data and a has-data flag. Month T uses figures published through T-1 — what was knowable at scoring time. - Advisory recurrence
advhist_— ten columns from the plugin's own advisory calendar: months since the last and first advisory, advisory months and advisory count to date, advisory months in the trailing 12 and 24 months, mean gap between advisories, size of the ecosystem batch the latest advisory arrived in, an exponential recency decay and a has-history flag. - Security vocabulary in project text
ghtext_— seven columns from the text of commits, pull requests and issues in GH Archive: days since the last security-vocabulary mention (CVE/CWE ids, 'vulnerability', XSS, CSRF, sanitize, disclosure, ...) and since the last CVE id, mention counts over 90 and 365 days, and has-mention flags. Generic 'fix' / 'bug' words are excluded. - Shared-maintainer contagion
contagion_— eight columns from a maintainer graph rebuilt as-of each month from GH Archive actors (push, PR merge, release; trailing 24 months): the plugin's active maintainers, maintainers shared with other plugins, number of neighbouring plugins, neighbours with an advisory in the last 12 and 24 months, months since the latest neighbour advisory, and has-neighbour flags. - Software Heritage visit deltas
swhdelta_— twelve columns comparing consecutive Software Heritage archive visits: visits to date, days since and between visits, commits added and commit rate per month, security-fix commits added, governance/tooling files adopted or dropped (SECURITY.md, Dependabot, GitHub Actions, Jenkinsfile, tests, ...), days since the last adoption, and presence flags. Changes between visits, not levels. - Advisory history (base panel)
advisory_— the advisory columns built into the monthly panel: count to date, count this month, CVE count, maximum and mean CVSS to date, count with CVSS >= 7, days since the first and latest advisory, and advisory span. - Advisory presence flags (base panel)
advisories_— whether the plugin has ever had an advisory and whether it had one in the trailing 365 days. - GH Archive activity (base panel)
gharchive_— the ~100 month-granularity GitHub activity columns of the base panel: event, push, pull-request, issue, release, tag, fork and watch counts over trailing 3- and 6-month windows, human vs bot splits, unique actors, PR merge and issue close rates and times, months since the last activity of each kind, and security / hotfix / dependency-bump keyword counts. - Software Heritage snapshot (base panel)
swh_— the ~37 archive-visit columns of the base panel, as of the most recent visit before the observation month: visit counts and archive age, commit count and days since the last commit, commit-hygiene rates (merge, conventional-commit, issue-reference, empty-message, weekend / late-night fractions), security-fix commit count, and the presence of governance and build files (README, SECURITY.md, Dependabot, GitHub Actions, Jenkinsfile, tests directory, ...).
The turning point
Same features, same test months, honest labels
Each pair is one configuration scored twice on identical test data. Stored labels let a training label be set by an advisory published inside the test window; embargoed rebuilds every training label from advisories known before the fold's forecast date. The gap is the leak. Hover a bar for the value.
ROC-AUC — separation of advisory-bound plugins from the rest; 0.5 is chance
Average precision — concentration of advisories at the top of the ranked list
Best embargoed development result
Activity-recency clocks + Contributor dynamics (Logistic Regression)
13 folds, 53,378 test rows, 760 advisory outcomes.
Every fold, one criterion
ROC-AUC per fold across 16 forecast dates
Each point is one two-month test window scored by a model trained only on what was knowable at that date. The configurations were chosen on the development folds; the criterion was written down before the holdout months were collected; the holdout folds were run once. Larger markers are the recorded out-of-time folds. Hover a point for the fold's outcome count.
Pre-registered out-of-time result
Configurations frozen before any post-boundary data was collected, each run once on months no modelling decision ever saw (3 folds, 12,318 test rows, 127 advisory outcomes). The first recorded run is the result; the development-era pooled ROC-AUC of the same configuration is shown for comparison.
| Feature set | Model | Out-of-time ROC-AUC | Development ROC-AUC | AP lift | Fold ROC range |
|---|---|---|---|---|---|
| Activity-recency clocks + Contributor dynamics oot_champion | Logistic Regression | 0.670 | 0.638 | 3.81× | 0.589 – 0.758 |
| Activity-recency clocks oot_ghclock_logistic | Logistic Regression | 0.638 | 0.627 | 1.77× | 0.580 – 0.717 |
| Activity-recency clocks + Install base oot_runnerup | XGBoost | 0.628 | 0.632 | 2.03× | 0.601 – 0.728 |
What the holdout ranking looks like
Advisories caught vs plugins reviewed, out-of-time
Reviewing the top 20% of plugins by score would have caught 52% of the advisories that followed across the holdout folds (by fold: 42%, 52%, 61%), against a base rate of 1.0%. The thick line is the pooled ranking over every holdout fold; thin lines are the individual folds (12,318 plugin-months, 127 advisory outcomes). The dashed diagonal is random order. Right: the ROC curve of each fold for the first configuration.
Which signals survive, by ecosystem
Pooled embargoed ROC-AUC per feature set
Best model per feature set on the thirteen development folds, training labels rebuilt at every fold. Bars at or below chance are shown on purpose: knowing which signals do not carry forward is part of the result. The same advisory-history features sit at the bottom of the Jenkins ladder and at the top of the PyPI one (outlined bars are the family present in both), which is why the method is the contribution rather than any one feature family.
All rolling backtest runs
| Feature set | Model | Protocol | Window | Folds | Positives | Pooled ROC-AUC | Pooled AP | AP lift | Fold ROC mean (range) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Activity-recency clocks + Contributor dynamics ghclock_ghdyn_logistic | Logistic Regression | embargoed | development | 13 | 760 | 0.638 | 0.0308 | 2.16× | 0.648 (0.479–0.824) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Activity-recency clocks + Install base ghclock_installs_xgb | XGBoost | embargoed | development | 13 | 760 | 0.632 | 0.0253 | 1.78× | 0.648 (0.578–0.748) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Activity-recency clocks + Contributor dynamics + Install base ghclock_ghdyn_installs_xgb | XGBoost | embargoed | development | 13 | 760 | 0.631 | 0.0269 | 1.89× | 0.654 (0.591–0.760) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Activity-recency clocks ghclock_only_logistic | Logistic Regression | embargoed | development | 13 | 760 | 0.627 | 0.0273 | 1.92× | 0.634 (0.464–0.743) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Activity-recency clocks + Contributor dynamics + Install base ghclock_ghdyn_installs_logistic | Logistic Regression | embargoed | development | 13 | 760 | 0.627 | 0.0291 | 2.05× | 0.643 (0.448–0.815) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Activity-recency clocks ghclock_only_xgb | XGBoost | embargoed | development | 13 | 760 | 0.621 | 0.0252 | 1.77× | 0.638 (0.554–0.773) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Activity-recency clocks ghclock_only_lgb | LightGBM | embargoed | development | 13 | 760 | 0.621 | 0.0262 | 1.84× | 0.642 (0.547–0.773) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Activity-recency clocks + Install base ghclock_installs_logistic | Logistic Regression | embargoed | development | 13 | 760 | 0.620 | 0.0290 | 2.04× | 0.635 (0.447–0.782) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Activity-recency clocks + Contributor dynamics ghclock_ghdyn_xgb | XGBoost | embargoed | development | 13 | 760 | 0.611 | 0.0254 | 1.78× | 0.636 (0.531–0.810) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Activity-recency clocks + Security vocabulary in project text ghclock_ghtext_xgb | XGBoost | embargoed | development | 13 | 760 | 0.610 | 0.0264 | 1.85× | 0.637 (0.504–0.792) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Activity-recency clocks + Shared-maintainer contagion ghclock_contagion_logistic | Logistic Regression | embargoed | development | 13 | 760 | 0.607 | 0.0262 | 1.84× | 0.615 (0.450–0.712) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Activity-recency clocks + Security vocabulary in project text ghclock_ghtext_logistic | Logistic Regression | embargoed | development | 13 | 760 | 0.607 | 0.0207 | 1.45× | 0.613 (0.447–0.701) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Activity-recency clocks + Shared-maintainer contagion ghclock_contagion_xgb | XGBoost | embargoed | development | 13 | 760 | 0.602 | 0.0219 | 1.54× | 0.595 (0.514–0.653) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Activity-recency clocks + Security vocabulary in project text + Shared-maintainer contagion + Contributor dynamics + Software Heritage visit deltas honest_all_logistic | Logistic Regression | embargoed | development | 13 | 760 | 0.602 | 0.0260 | 1.83× | 0.590 (0.481–0.704) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Contributor dynamics ghdyn_xgb | XGBoost | embargoed | development | 13 | 760 | 0.574 | 0.0245 | 1.72× | 0.579 (0.441–0.663) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Activity-recency clocks + Software Heritage visit deltas ghclock_swhdelta_logistic | Logistic Regression | embargoed | development | 13 | 760 | 0.574 | 0.0190 | 1.34× | 0.553 (0.458–0.714) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Install base installs_xgb | XGBoost | embargoed | development | 13 | 760 | 0.568 | 0.0184 | 1.29× | 0.589 (0.529–0.683) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Advisory recurrence + Activity-recency clocks advhist_ghclock_clean_xgb | XGBoost | embargoed | development | 13 | 760 | 0.558 | 0.0195 | 1.37× | 0.562 (0.508–0.671) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Activity-recency clocks + Software Heritage visit deltas ghclock_swhdelta_xgb | XGBoost | embargoed | development | 13 | 760 | 0.556 | 0.0189 | 1.33× | 0.530 (0.391–0.613) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| all features in dataset advisory_only_xgb | XGBoost | embargoed | development | 13 | 760 | 0.553 | 0.0245 | 1.72× | 0.565 (0.515–0.623) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Shared-maintainer contagion contagion_xgb | XGBoost | embargoed | development | 13 | 760 | 0.551 | 0.0203 | 1.43× | 0.539 (0.451–0.632) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Activity-recency clocks + Security vocabulary in project text + Shared-maintainer contagion + Contributor dynamics + Software Heritage visit deltas honest_all_xgb | XGBoost | embargoed | development | 13 | 760 | 0.551 | 0.0194 | 1.36× | 0.530 (0.408–0.649) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Advisory history (base panel) + Advisory presence flags (base panel) + Advisory recurrence + Activity-recency clocks advhist_ghclock_xgb | XGBoost | embargoed | development | 13 | 760 | 0.532 | 0.0167 | 1.17× | 0.537 (0.477–0.652) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Security vocabulary in project text ghtext_xgb | XGBoost | embargoed | development | 13 | 760 | 0.491 | 0.0158 | 1.11× | 0.529 (0.399–0.684) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Software Heritage visit deltas swhdelta_xgb | XGBoost | embargoed | development | 13 | 760 | 0.474 | 0.0137 | 0.96× | 0.435 (0.301–0.522) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Advisory recurrence advhist_only_xgb | XGBoost | embargoed | development | 13 | 760 | 0.435 | 0.0134 | 0.94× | 0.424 (0.334–0.493) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Advisory history (base panel) + Advisory presence flags (base panel) advfull_xgb | XGBoost | embargoed | development | 13 | 760 | 0.426 | 0.0139 | 0.97× | 0.430 (0.363–0.545) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Advisory history (base panel) + Advisory presence flags (base panel) + Advisory recurrence advhist_xgb | XGBoost | embargoed | development | 13 | 760 | 0.418 | 0.0130 | 0.91× | 0.404 (0.331–0.478) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Activity-recency clocks + Contributor dynamics ghclock_ghdyn_logistic_asof | Logistic Regression | embargoed | development sensitivity | 13 | 760 | 0.643 | 0.0310 | 2.17× | 0.652 (0.476–0.814) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Activity-recency clocks + Contributor dynamics oot_champion | Logistic Regression | embargoed | out-of-time | 3 | 127 | 0.670 | 0.0393 | 3.81× | 0.660 (0.589–0.758) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (3 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Activity-recency clocks oot_ghclock_logistic | Logistic Regression | embargoed | out-of-time | 3 | 127 | 0.638 | 0.0183 | 1.77× | 0.634 (0.580–0.717) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (3 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Activity-recency clocks + Install base oot_runnerup | XGBoost | embargoed | out-of-time | 3 | 127 | 0.628 | 0.0209 | 2.03× | 0.647 (0.601–0.728) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (3 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Activity-recency clocks + Contributor dynamics oot_champion_asof | Logistic Regression | embargoed | out-of-time sensitivity | 3 | 127 | 0.668 | 0.0372 | 3.61× | 0.659 (0.586–0.746) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (3 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Activity-recency clocks + Contributor dynamics full_curve_champion | Logistic Regression | embargoed | dev + out-of-time | 16 | 887 | 0.648 | 0.0312 | 2.31× | 0.653 (0.487–0.825) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (16 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| all features in dataset advisory_only_xgb_leaky | XGBoost | stored labels | development | 13 | 760 | 0.602 | 0.0367 | 2.57× | 0.607 (0.521–0.684) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Per-fold detail (13 folds)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
How to read these numbers
ROC-AUC measures how well the model separates advisory-bound plugins from the rest across all thresholds; 0.5 is chance. Average-precision lift compares ranking concentration against random selection at the ~1.4% pooled base rate. Under the honest protocol the separation signal is real and consistent across model families, while top-of-list concentration remains modest — CANARY is a triage signal, not proof that a component is vulnerable. Feature sets whose pooled ROC-AUC sits at or below 0.5 (for example advisory-recurrence features) are shown deliberately: measuring which signals do not survive an honest evaluation is part of the research contribution.