I have completed video 91 in the modular rigging for maya series. I get no errors, and everything works, except for symmetry move. That is symmetry move works until I let go of the mouse. The mirrored group follows as expected, but as soon as I let go of the mouse the mirrored object snaps back to it's original orientation.

I've gone over the code a dozen times, and even tested the expression on a couple of cubes. I've tried restarting Maya too.

Has anyone experienced a similar issue?

Here is my symmetry move expression setup code.
	def setupSymmetryMoveForObject(self, sObj, sMirrorObj, sMirrorAxis, bTranslation, bOrientation, bGlobalScale):
		# duplicate selected object, parent to an empty group
		duplicateObj = mc.duplicate(sObj, parentOnly=True, inputConnections=True, n=sObj+'_mirrorHelper')[0]
		emptyGroup = mc.group(em=True, n=sObj+'mirror_scale_grp')
		mc.parent(duplicateObj, emptyGroup, absolute=True)
		# scale in -1 across the mirrorAxis
		scaleAttr = '.scale' + sMirrorAxis
		mc.setAttr(emptyGroup+scaleAttr, -1)

		# construct the symmetry move mel expression
		# it queries the object t,r,s and maps it to the dulpicate object attrs
		expressionString = ''
		expressionString += 'namespace -setNamespace ":";\n'
		if bTranslation:
			expressionString += '$worldSpacePos = `xform -q -ws -translation ' + sObj + '`;\n'
		if bOrientation:
			expressionString += '$worldSpaceOrient = `xform -q -ws -rotation ' + sObj + '`;\n'
		attrs = []
		if bTranslation:
		if bOrientation:
		for attr in attrs:
			expressionString += duplicateObj+attr + ' = ' + sObj+attr + ';\n'
		for axis in ['X','Y','Z']:
			if bTranslation:
				expressionString += duplicateObj+'.translate'+axis + ' = $worldSpacePos['+str(i)+'];\n'
			if bOrientation:
				expressionString += duplicateObj+'.rotate'+axis + ' = $worldSpaceOrient['+str(i)+'];\n'
			i += 1
		if bGlobalScale:
			expressionString += duplicateObj+'.globalScale = ' + sObj+'.globalScale;\n'

		# create the expression 
		expression = mc.expression(n=duplicateObj+'_symmetryMoveExpression', string=expressionString)

		# constrain the actual mirrored object to the duplicate object
		constraint = ''
		if bTranslation and bOrientation:
			constraint = mc.parentConstraint(duplicateObj, sMirrorObj, mo=False, n=sMirrorObj+'_symmetryMoveConstraint')[0]
		elif bTranslation:
			constraint = mc.pointConstraint(duplicateObj, sMirrorObj, mo=False, n=sMirrorObj+'_symmetryMoveConstraint')[0]
		elif bOrientation:
			constraint = mc.orientConstraint(duplicateObj, sMirrorObj, mo=False, n=sMirrorObj+'_symmetryMoveConstraint')[0]
		if bGlobalScale:
			mc.connectAttr(duplicateObj+'.globalScale', sMirrorObj+'.globalScale')
		# add all symmetry move nodes to the container
		utils.addNodeToContainer('symmetryMove_container', [duplicateObj, emptyGroup, expression, constraint], ihb=True)