Train one experiment and return the produced model, its training-run row,
and the normalized holdout TrainExperimentResult.Score for the
plan's SuccessMetric. The implementation links the run to the iteration
(ExperimentSessionIterationID).
the experiment to train + the owning iteration/session context
The single ML-execution seam the orchestrator depends on for each iteration — "train this experiment, give me the model + run + normalized score." In production this delegates to the
TrainingEngine(which produces an immutableMJ: ML Models+MJ: ML Training Runs); tests inject a deterministic fake.The orchestrator is intentionally decoupled from the
TrainingEngine's pipeline-id contract: it hands the trainer a TrainExperimentInput (the experiment definition + the owning iteration id) and receives a TrainExperimentResult. The production adapter (TrainingEngineExperimentTrainer) bridges this toTrainingEngine.trainModel.