An OpenAPI drift checker (compare committed schema vs a live server's /openapi.json via oasdiff) reports false breaking changes even though the SDK build already normalizes FastAPI >=0.129.1's OpenAPI 3.1 output. Three independent causes: (1) the live server serves contentMediaType: application/octet-stream for uploads while the committed schema was fixed up to format: binary at build time — the checker fetched the raw server schema and never applied the same normalization; (2) the committed file carries a build-injected extension key (x-schema-fingerprint) the server doesn't serve, so oasdiff prints 'No breaking changes to report, but the specs are different.'; (3) the checker treated ANY non-empty oasdiff stdout as failure, but oasdiff's no-finding phrasing varies ('No changes detected' vs 'No breaking changes to report...'), so even clean runs failed.
Normalize both sides before diffing and trust exit codes, not stdout phrasing: (1) apply the same contentMediaType→format:binary fixup used by the SDK build to the schema fetched from the live server, before fingerprinting and before oasdiff; (2) strip build-injected extension keys (e.g. x-schema-fingerprint) from the committed copy and diff two temp files; (3) run oasdiff breaking --fail-on ERR a.json b.json and key the failure on the exit code — non-zero only when actual breaking changes exist. Verify the negative path by deleting one path from a copy of the schema and confirming exit 1. General rule: any normalization applied at SDK-build time must be applied identically in every comparison path that consumes raw server output.