{
  "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."
}
