New advisory gate (Fase 8 B.4) that diffs the public API contract
docs/reference/openapi.yaml against the base branch via oasdiff, surfacing
removed endpoints, newly-required params, removed response fields, etc.
- scripts/check/check-openapi-breaking.mjs: resolves base spec via
git show <BASE_REF>:docs/reference/openapi.yaml to a temp file, runs
oasdiff breaking --format json, parses+counts breaking changes, emits
openapiBreaking=N (KEY=VALUE for collect-metrics). ADVISORY: exit 0 always;
graceful SKIP when oasdiff is absent or the base spec can't be resolved.
- package.json: check:openapi-breaking script.
- .github/workflows/ci.yml (quality-extended, advisory): install oasdiff via
gh release download, add the breaking-change step (BASE_REF via env, never
shell-interpolated), fetch-depth: 0 so git show can read the base spec.
- tests/unit/build/check-openapi-breaking.test.ts: parser counting/grouping +
binary-absent SKIP integration.
- docs/architecture/QUALITY_GATES.md: document the quality-extended job table.
- docs/reference/openapi.yaml: define the BadRequest/NotFound/InternalError
response components that were referenced (14 call sites) but never defined —
a pre-existing dangling-$ref defect that blocked oasdiff from loading the spec.
No path behavior changes; purely additive to components.responses.