I think the reason is somewhere else. You are setting the axis.Range.Min/.Max only in the case where the corresponding .UseMin/.UseMax is NOT set, and then you apply the axis.GetTransform to the found ymin or ymax value - which are the correct values in this case.
I had set the axis.Range in all cases, and to take care of the user-frozen range I set ymin/ymax to the saved FStoredFranges.Min/.Max. In principle this should work, too, but my mistake was that I applied the axis transformation again to ymin/ymax - but I should have applied it to the FStoredRanges.Min/Max in this case (or, simpler, axis.Range.Min/.Max which is valid in both cases). When I revert my svn version to my commit of yesterday and change the transformation argument this way, the liveview is correct.
I do think, though, that setting
lext.a.y := axis.GetTransform.AxisToGraph(yminAx) is dangerous because lext (the logical extent, the range in the invisible "graph" coordinate system behind the chart) depends on all axes. Therefore, lext.a.y should be the minimum of the current lext.a.y and the result of the transformation, likewise for lext.b.y:
lext.a.y := Min(lext.a.y, axis.GetTransform.AxisToGraph(yminAxis));
...
lext.b.y := Max(lext.b.y, axis.GetTransform.AxisToGraph(ymaxAxis));
Since your solution is working I did not change this and want to keep it for the moment. Maybe we can find an example where your code (without Min() and Max()) leads to an incorrect display.
A simplification is probably to avoid the double usage of an axis and series ymax/ymin. The series method
FindYRange() has ymin and ymax as var parameters and does not initialize them. So they are to be considered as the cumulative value of a list of series, like in the example. Therefore, it should be sufficient to initialize a ymin/ymax outside the series loop and have the total min and max at the end of the loop. For the moment I kept your code, but put the series max/min initialization inside the loop (and renamed these variables to yminser/ymaxser because they represent the range of the series, in contrast to yminax/ymaxax which are the total range of all series in this axis).
Maybe I'll change both items tomorrow. I am attaching a "preview" for you to test.
I added a
if csDesigning in ComponentState then exit at the top because I found that an empty chart in design mode attached to an active liveview always activated an axis range of -1 to +1 - default, however, is an open range (Min/Max = 0 and UseMin/Max = false)