code: func fixComponentDuration(c context.Context, comp *BuildComponent) Interval {
  	// Leaf nodes do not require fixing.
  	if len(comp.Children) == 0 {
  		return comp.ExecutionTime
  	}
  	// Set start and end times to be out of bounds.
  	// Each variable can have 3 states:
  	// 1. Undefined.  In which case they're set to farFuture/PastTime
  	// 2. Current (fin only).  In which case it's set to zero time (time.Time{})
  	// 3. Definite.  In which case it's set to a time that isn't either of the above.
  	start := farFutureTime
  	fin := farPastTime
  	for _, subcomp := range comp.Children {
  		i := fixComponentDuration(c, subcomp)
  		if i.Started.Before(start) {
  			start = i.Started
  		}
  		switch {
  		case fin.IsZero():
  			continue // fin is current, it can't get any farther in the future than that.
  		case i.Finished.IsZero(), i.Finished.After(fin):
  			fin = i.Finished // Both of these cased are considered "after".
  		}
  	}
  	comp.ExecutionTime = NewInterval(c, start, fin)
  	return comp.ExecutionTime
  }
docs: // fixComponentDuration makes all parent steps have the max duration of all
  // of its children.