The minimum viable pipeline
An end-to-end ML project has a fixed shape: contract → data ingestion → audit → split → preprocessing pipeline → baseline → tuned model → evaluation → calibration → threshold → artifact → deployment → monitoring. Skip any step and a known failure mode appears in production.
The folder structure that scales
ml_project/
├── data/{raw,interim,processed}
├── notebooks/
├── src/
│ ├── contract.py
│ ├── features.py
│ ├── train.py
│ ├── eval.py
│ └── predict.py
├── tests/
├── artifacts/
└── README.md
Reproducibility hooks
Pin dependencies (uv, pip-tools, or poetry). Seed every random source. Log dataset hash, code commit, hyperparameters, and metrics in one experiment record. If a teammate cannot rerun your experiment in 10 minutes, the project is not reproducible.