Training Result
@Serializable
Top-level persisted result of a training session: the tree of StageRecords plus the ExecutionMetadata captured by the runner (pod name, start/completion timestamps).
This is the on-disk shape of training_records.json. The cluster progress stream still emits a bare projected StageRecord -- live consumers already know pod/timestamps from the Kubernetes API and don't need metadata duplicated into each tick.