Where is it specified on the template that the second argument needs to be a constant?
In standard. All template arguments should be known in compile time.
Quote from page you linked:
the value of template parameters is determined on compile-time to generate a different instantiation of the function fixed_multiply, and thus the value of that argument is never passed during runtime
A non-type template argument of an integral type must be a constant expression; an expression that can be evaluated at compile time. This is a requirement; akin to the requirement that the size of an array must be an integral constant expression.