@asmeurer I did address this in the following post below:

--snip--

There is a default implementation. It returns None, which is the only safe thing to do.

I know that it looks like if

    def _eval_derivative_wrt(self, expr, new_name):
        new_self = Dummy(new_name)
        new_expr = expr.subs(self, new_self)
        return (new_expr, new_self)

would be a reasonable default implementation, but it isn't. It is just the implementation that is backward compatible with the old behavior, but I think that all places where I have added this code now are actually instances where additional checks are necessary.

--snap--