My curves do not affect the ribbon. I make two curves, and pm.loft() them. Then I put follicles on the lofted nurbsSurface, and the ribbon is just skinned to my brow controls. The original curves get deleted, and the loft has no construction history.
This is my guide. A bunch of simple control_01 nodes. The bigger ones are just parents so you can move 3 at a time.
This is not complete code, but maybe you can see a bit what I am doing:
# Get a list of objects to define and constraint the CnsCurve
# CnsCurve in mGear follows the objects.
# double up points on  and  for a sharper brow edge. This is what I showed in an image further up, where you get a nice sharp corner.
fancyOrder = [0,1,2,3,3,4,5,5,6,7,8]
# These are the lists of my brow controls.
browCurvePos = [oBrowControls[i] for i in fancyOrder]
# The upvector controls are just pushed somewhat forward in translateZ
browCurveUpPos = [oBrowUps[i] for i in fancyOrder]
browJoints2 = [browJoints[i] for i in fancyOrder]
browCurve = curve.addCnsCurve(browComponents, 'brow_curve', browCurvePos, 3)
browUpCurve = curve.addCnsCurve(browComponents, 'brow_upv_curve', browCurveUpPos, 3)
# generate a ribbon from the CnsCurves. mGear likes motion paths, and I say BLEGH!!!!!
oLoft = pm.loft(browCurve, browUpCurve, ch=False, range=True, n='brow_ribbon')
# Skin the loft (my own skin function, but nothing fancy.)
oSkin = tenave.skin_geometry(browJoints, oLoft, 'brow_ribbon_skinCluster')
# Set the skinning 1 row per each joint.
# Keeping in mind that browCurvePos is a list where the controls repeat themselves for hard tangent purposes.
for ii, each in enumerate(browJoints2):
cvRow = oLoft.cv[0:][ii]
pm.skinPercent( oSkin, cvRow, transformValue=[(each, 1)])