2.0 KiB
API deprecation policy — 0pt
BACKLOG P6 (API-24). There is exactly one prior breaking-ish change in this
repo's history to learn from: services/api/orchestrator/main.py moved from
src/orchestrator (docs/09-build-plan.md Phase 0) — internal, pre-contract,
no external consumers yet. This policy is written before it's needed for a
real consumer, on purpose (BACKLOG's own framing: "cheaper to write the
policy than to clean up after breaking someone").
What counts as breaking
- Removing a path, operation, or required request/response field from
contracts/openapi.yaml. - Narrowing an accepted value (enum shrink, type tightening) on a request field.
- Changing a response field's meaning without changing its name/type.
- Changing default auth/tenant behavior on an existing route (e.g. what BACKLOG P0-4 fixed — the reverse of a break, but the same class of change).
Not breaking: adding an optional field, adding a new path, widening an accepted value, adding a new enum member a client can ignore.
Process
- Mark the field/path
deprecated: trueincontracts/openapi.yamlwith anx-siax-deprecated-sincedate and a one-line replacement pointer. - Keep the deprecated shape working for at least one release cycle
after the replacement ships (see
CHANGELOG.mdonce real releases/tags exist — BACKLOG P1-3). - Announce in
CHANGELOG.md's[Unreleased]section before merge, not after. - Only remove once nothing in this repo's own consumers (Protosell/FiveCRM,
VehIQ per
CLAUDE.md) is verified to depend on the old shape — "verified" means checked against those repos, not assumed silent.
What this repo does NOT have yet
No consumers are known to be live against this contract yet
(docs/architecture/ARCHITECTURE.md §2 "Beroenden nedåt": "Inga sådana
anrop finns i det här repot" — unverified downstream). This policy exists
so the first real breaking change has a process to follow, not because one
has happened.