Deprecation and removal policy
ADR-127 says which classes the semver promise covers. This page says how something leaves that surface again.
The rule from 1.0
Nothing marked @api is removed, renamed or narrowed without a
deprecation first:
- The member ships as
@deprecatedin a released minor (1.N.0). - It keeps working, unchanged, through at least one further minor line — deprecated in 1.N.0 means still present and still working in 1.N+1.0.
- Only then may it go, and only in the next major (2.0.0). A minor
release never removes
@api.
"Narrowed" includes a widened constructor: a new required argument on a
class consumers build with new breaks them exactly as a deleted method
would. The API snapshot records constructors for that reason.
During 0.x
The notice period starts at 1.0. While the extension is pre-1.0, minor releases may break with a CHANGELOG entry under a BREAKING heading — see API stability. Deprecations shipped during 0.x are listed below and are the first candidates for removal at 1.0; the ones marked retained are not, and say why.
What a deprecation must carry
@deprecated since X.in the member's docblock. TheY. 0 — <what to call instead> sinceversion is the evidence for the notice period.- A
### Deprecatedentry inCHANGELOG.naming the replacement.md - A row in the inventory below.
What enforces what
Half of this policy is a gate and half is a review duty. The difference matters, so it is written down rather than implied.
| Rule | Enforced by | Mechanical |
|---|---|---|
A removed @api member cannot land unnoticed | Tests/ — the rendered surface is
frozen in api- and a removal is classified
breaking, which forces an explicit snapshot change in the same
pull request | yes |
| A changed signature — including a widened constructor — cannot land unnoticed | the same test; constructors are part of the rendered surface | yes |
Every @deprecated member of an @api class has a written
migration | Tests/ — the member needs a row
between the inventory markers and a non-empty "Use instead" cell.
It reads the docblocks for all five shapes a deprecation takes:
method, constant, public property, enum case and the type itself | yes |
| The inventory cannot keep listing what the code no longer deprecates | the same test, in the other direction | yes |
| The notice period itself — deprecated for at least one minor line before removal | review. Nothing in the repository knows in which release a docblock
tag first appeared; the since version is the only evidence, and
a reviewer has to read it | no |
The ### Deprecated CHANGELOG entry | review. Build/ refuses a
[Unreleased] section that repeats itself; it does not require any
particular entry to be present | no |
Currently deprecated
Everything @deprecated on an @api class today, with the call that
replaces it. The two directions of this table are asserted against the
docblocks, so it is complete by construction.
| Member | Since | Use instead |
|---|---|---|
Model:: | 0.8.0 | get |
Model:: | 0.8.0 | get. The typed list deduplicates
and drops unknown tokens; the legacy accessor preserves both. |
Model:: | 0.8.0 | get |
Model:: | 0.8.0 | set with a typed set — it validates against the
capability enum and deduplicates. |
Model:: | 0.8.0 | set |
Model:: | 0.8.0 | get — accepts both the enum and the legacy
string form. |
Model:: | 0.8.0 | set |
Model:: | 0.8.0 | set |
Provider:: | 0.8.0 | get. Retained — Extbase hydrates the entity
through this getter/setter pair. |
Provider:: | 0.8.0 | get |
Provider:: | 0.8.0 | set. Retained — Extbase property mapping. |
Provider:: | 0.8.0 | set |
Llm | — | the Model enum, case FIXED |
Llm | — | the Model enum, case CRITERIA |
Llm | 0.8.0 | get. Retained — Extbase property
mapping. |
Llm | 0.8.0 | set. Retained — Extbase property
mapping. |
Llm | 0.8.0 | get. The options field carries provider-specific
extras, so the typed surface stops at the array. Retained — Extbase
property mapping. |
Llm | 0.8.0 | set. Retained — Extbase property mapping. |
Llm | 0.8.0 | get. Retained — Extbase property mapping. |
Llm | 0.8.0 | set. Retained — Extbase property mapping. |
Retained means the member is deprecated for application code but cannot be
deleted: Extbase hydrates the entity through the raw getter/setter pair, so
removing it would break persistence rather than only callers. Those rows
stay past 1.0 and past 2.0. The two SELECTION_ constants predate
the since convention; they carry no version because none was recorded,
not because none applies.