stepStat && stepStat.endTime && stepStat.startTime or even stepStat && stepStat.stepKey && stepStat.endTime && stepStat.startTime ?
nit: should we standardize getPipelineExpectationSuccessForRun and getStepMaterializationCountForRun to either both fetch from PipelineRunStatsSnapshot or both sum up from the step level counts? I guess the former would require adding expectationsSucceeded and expectationsFailed to PipelineRunStatsSnapshot. :shrug:
nit: => arr.reduce((a,b) => a + b, 0), maybe reduce could be less readable