The 12 drifts
Authentication, checked at the guard
D08 is caught by reading the handler: an endpoint the spec calls public whose code reads a credential. That direction is unambiguous, but it only answers half the question. Authentication is usually applied by middleware instead of inside the handler, so a handler that reads no header tells you nothing about whether the endpoint is protected. Where a language’s extractor records route middleware, both directions are checked against the guard instead:
The pattern that motivates the first one is ordering.
router.use(mw) guards
only the routes registered after it, so a route sitting above that line is
open however protected the rest of the file looks:
components.securitySchemes names the credential, and any middleware whose
source reads that header counts as an authentication guard, whatever its name.
The three worst ones
D05 Money precision
"1500.50" becomes 1500.50. String parsers break, float parsers lose
precision.D08 Silent auth
A documented-public endpoint starts returning 401.
D10 Webhook signature
Header renamed. Every delivery fails verification on the receiving end.