Our customer has a "No unnecessary code" policy. And the people they have assigned to my project think this includes:
- Diagnostic code
- Cross platform compatibility code
- "Software" faultcodes. ("Software doesn't break therefore these are unneeded.")
- Class methods that aren't used for THIS application ("Customer Code Review Issue : Please verify all methods are actually called and remove unused code." Say hello to a divirgent code base.)
- Anything that THEY believe the end user won't care about. (They never actually ask the end user.)
They told me I can have a version I use for "verifying algorithms" but it has to be removed from the customer submittles. I try and explain I can't verify to a different build than I'm submitting, but they don't seem to get it. The cross platform stuff is significant because we typically start both hardware and software designs at the same time, early development has to use a different set of hardware for testing/debugging.
Carefully explain that support requests will take exponentially longer without the diagnostic code in place, and that you cannot be held responsible for extraordinarily long turnaround times on support requests AND you expect to be paid dynamically based on the length of time required to fix a given issue, should the customer maintain their current software policy.
If they still hold to their views, go along with the customer. Until they're burned at least once, they won't feel the need to change their ways.
Edit: I assume unit tests and the like aren't included in your final deliverables, as that would be silly. Perhaps the customer believes this to be the case.