{
"protocol": "aabha-ml-v1",
"classification_family": "logistic",
"parameters": {
"model__C": 1.0,
"model__class_weight": null
},
"versions": {
"python": "3.12.14",
"numpy": "2.3.5",
"pandas": "2.2.3",
"scipy": "1.17.0",
"scikit-learn": "1.8.0",
"joblib": "1.5.3",
"threadpoolctl": "3.6.0"
},
"targets": {
"regression": "duration_hours",
"classification": "late = duration_hours > promised_hours; equality is on time"
},
"split_days": {
"train": [
0,
148
],
"calibration": [
150,
173
],
"threshold": [
175,
198
],
"test": [
200,
249
],
"embargo": [
149,
174,
199
]
},
"intended_report": [
"regression MAE/RMSE/R2 vs training-median baseline",
"classification confusion/precision/recall/AP/AUC/log loss/Brier",
"FP+4FN cost and future alert fraction against40% capacity"
],
"calibration": "sigmoid; frozen train-fitted pipeline; days150-173",
"threshold": 0.2,
"threshold_rule": "FP+4*FN, <=40% alerts on days175-198; tie fewer alerts then higher threshold",
"regression_model": "ridge",
"features": [
"distance_km",
"queued_jobs",
"item_count",
"weekday",
"promised_hours",
"priority",
"zone",
"depot_id"
],
"seed": 20261014,
"development_hashes": {
"data/train.csv": "6e8d4d38c22adfcc814af8b37d575c4e4f9d08519e3515c2a16921781faa5c03",
"data/validation.csv": "0c486a0fef24d65fa2cf96e48705a1854601662a4677603519905748bf3d90fa"
},
"source_hashes": {
"courseml/__init__.py": "15fbb070c533ae4a1ecf313762a7da373975114cd891588eba3abab885160564",
"courseml/data.py": "e9fefb74dca6420a7f543210e1a638ab1d3923777a0ab7020227e6dc37006236",
"courseml/final_evaluation.py": "87c3a4ce2f6d13e2f993d7164023493ae5c0cdbd035d733b4b27183289a90c9e",
"courseml/modeling.py": "0cc884f5094af04c6c896632007f172cc5ebe56956c80ca4a21504ac0a84e401",
"courseml/run_all.py": "5bbbab847d7a22c1b47be4c7f823cf7f472c6fc0f30eb7ef37a8dc0cde0ab1ec"
},
"warning": "This transparent course protocol is not a security boundary; test labels remain inspectable."
}