In fact we discussed that internally. It is beyond the scope of the module to change that, though.
It would certainly be interesting to give the gufunc implementer the ability to complete (and maybe also verify) the signature. That would allow supporting (m,n)->(k) in a way that computes k from m and n (the case of min(m,n) could be handled). It could also allow having that k as 2*n, or even things like checking that m <= n. IMO, that would be great (and could be implemented as optional).
It would also be nice to have a setup and a teardown function. This would allow allocating buffers and deallocating them once for all the execution. Right now, when running several dimensions that cannot be set as a single lineal iteration in the kernel that setup/teardown needs to be repeated in each call to the gufunc function. In this module per-element buffers are needed for intermediate results, that get reused. It is not much of a problem as it is just few allocations and they are not repeated per element, though.