Should `min.(1,f)` be broadcasting as `broadcast(x->min(1,x),f)`?

If you want to special-case a few such functions, there is no point in using dot calls at all for those functions; in such cases you could just call abs(f), like you currently do. The main point of using dot call syntax with ApproxFun, from my perspective, is to exploit fusion (so that you don’t have to create multiple temporary Chebyshev approximations when you compose several functions), but that will only ever work to the extent that you can auto-analyze user-supplied functions.

(I seem to recall that ChebFun automatically detects breakpoints for user-defined functions with discontinuities, by subdividing the interval if the coefficients aren’t converging at the expected exponential rate?)

Yes i think that’s the way to go, the argument is more academic then practical, in that the fusing behaviour is hard to predict from the docs.

Chebfun has turned off the auto-edge detection, but its still there if you specify a parameter. I think this was due to reliability issues. The basic idea was to use bisection to find the jump down to the bit.

I’m try to think of a way to find singularities automatically using auto-differentiation-like techniques, possibly combined with interval arithmetic, and bisection.