An article of faith in the software engineering community is that it is possible to document the requirements for a system before it is built.
I beg to differ. Sure, we can capture some of the obvious transactions that a system needs to support, and Use Cases are a great way of capturing this aspect of requirements. But, by definition, implicit constraints only really surface when someone is surprised by the difference between what they expected and what they got.
It is hard work to probe and question early on in a project to attempt to discover the implicit constraints, and my experience is that most projects don’t do very well at this. All seem to suffer from a nasty surprise or two just when everyone (except possibly the quality assurance people) is starting to think that the project is starting to really look like it is going to deliver a good system this time.