I built the signup chain for our sessions myself, with an agent. The payment platform, the meeting tool, the email, our customer system, all of it wired together, and I did not type the code.
It worked. Somebody enters a credit card. The card is approved immediately. The confirmation link goes out and they are in.
Then some people did it the other way. They paid straight out of their bank account instead of with a card. A bank transfer is not instant, it takes two or three days, so the payment platform sat there saying in progress, processing, not successful yet. My software had been built to wait for the word successful. So it did nothing. No link, no email, nothing, for people who had already paid me.
The platform was not lying to me either. It said in progress. It said processing. Both of those are true and neither of them is successful.
I found out because two of them called me that morning, while I was doing something else, to ask where their link was. I apologized and sent the links out by hand, one at a time, which is the work I had built the thing to stop doing.
It worked 98% of the time. 2% of the time, my software failed. The 2% was the people who had trusted me with a bank account number, which is the group you would least like to pick.
The payment platform did its job. The code did what the requirement said. I checked it and the check passed. So where was the defect?
In none of the three, which is why nothing caught it. Successful was the only word my software had been taught to wait for, and I am the one who taught it. The requirement was right about the cases it covered. The code was right about the requirement. The check was right about the code. I checked it against the list in my own head, which is where the software had come from in the first place, and nobody had written the slow payment down because it was unusual. A check is only ever as wide as the cases somebody thought of, and my cases and my code came out of the same place, so the gap in one was the gap in the other. One person was standing on both sides of the question.