In this case it’s perfect fine. The only problem would be if smoothstep didn’t fullfill its contract. To cover that hypothetical situation the compare really should be <= 0
rather than some ad-hoc constant.
But again, the discard doesn’t buy you any quality. In either case (with or without) if you render anything behind…it will be wrong. The advantage of the bounding rectangle wrong is that it will be immediately obvious what the problem is. The “jaggy” depth buffer wrong could take awhile to figure out…esp if it pops up at a much later date. (aliased looking thing behind with a strangely colored edge of the forward).
On fwidth: The problem is that it’s a misleading function name. You expect it to be L2 when it’s in fact Linf. Want you really want is some approximation of pixel coverage, for cheapish I’d go for (L2)2: dFdx2+dFdy2