Since sign is clearly documented as assuming that its argument is a real-valued expression, I would argue that as soon as it sees anything explicitly complex, it should raise an error, even if the overall value of the expression is real.

That is, all the following cases should raise an error:

sign(%i) << already gives error
sign(z)
sign(z^2)
sign(j^2)
sign(abs(x+%i))
sign((x+%i)*(x-%i)) => pos (because it expands)

The error should be something like
:The sign function is only defined for expressions not involving complex quantities.

The rationale is that if it acts as though it works on any complex quantities, users will have the reasonable expectation that it will work in general with complex quantities, such as sqrt(x), log(x), asin(x), ....

After all, sign(sqrt(x)) doesn't even ask whether whether x is negative.