My solution is the function forgetful_csign. Maybe using a private context would be better, but
this seems to work for what I was doing.
/* On exiting from sign or csign, temporary assumptions are not immediately forgotten. This function
removes these temporary assumptions before returning. */
forgetful_csign(e) := block([fcts : setify(facts())],
unwind_protect(csign(e),
fcts : setdifference(setify(facts()), fcts),
for f in fcts do (forget(f))));
--Barton