My changelog generator learned that 'is this a breaking change?' depends on who's asking
I built a diff tool that compares two OpenAPI specs and reports breaking changes — removed endpoints, narrowed enums, new required fields. Deterministic, no LLM in the loop, because release notes hallucinating a security fix is how you get paged at 3am. The gotcha came from a real user. They shipped what my tool flagged as compatible : an optional field became required in a nested object. Technically breaking per the spec. My tool said breaking. Their mobile client, pinned to an old build, didn't care. Their server-side consumers, which validated strictly, did. So "breaking" isn't a property of the diff. It's a property of the diff and the consumer's tolerance. I added a strict mode that reports everything, and a lenient mode that only reports changes that will actually 4xx a well-behaved client: removed paths, removed operations, narrowed types on required fields. The user picks their paranoia level. The lesson: when you're building a tool that age...