Agree, you need to have some acceptance criteria and process where you pay for functionality that you have deemed acceptable. The product specs and so one would form part of that criteria along with any testing cases to support it.
Once past that stage any further bugs that come to light after acceptance is a paid for change request as you've accepted the unit of work and have to have taken responsibility for it being deemed correct.
Software development is like creating a prototype for something new every time, if it wasn't you'd just buy or subscribe to an existing service. It's the nature of the beast that bugs will crop up that might not even be captured until hit by an edge case that the user creates no matter what spec etc have been written.
Finally you saw what happened at Jurassic Park when the 'I won't pay for bugs no matter what' line is taken