I’ve been working this type of rigging for years now. In case you need this…
For ease of use and predictability while modeling use Point along Path Roll Frame Normal on the Up Vector page, and it will always point along the path tangent normal. No need for an upvector object. Then you can swap the Affected Axis to the direction you want the objects to point, and roll will work very well. Note, if tangency is X (postitive or negative), then the affected axis can be +Y, -Y, +Z, or +Z, but not +X,-X.
Try this with several cones constrained and you’ll see what I mean.
In general, if you animate this curve, don’t animate the first two points (the first point and tangent handle), or the objects will spin in an undesirable (or desirable) manner.
From the manual:
Up-vector ConstraintsControlling Flipping with Path Animation
In the Path constraint property editor (see Setting Objects on Paths), the Point along Path Roll Frame Normal on the Up Vector page constrains the up-vector of the constrained object to the roll-frame normal of the path curve instead of constraining it to a separate control object or direction (as defined by the Point At options on the Up Vector page). The roll frame normal is a frame based only on the moving tangent of a path curve.
When you select this option, the Point At options become unavailable.
Because this option defines the up-vector direction independently from a separate control object or direction, this can help prevent the constrained object from flipping in cases where the trajectories of the path curve and the up-vector control object would cross.