Extension Stability Policy
Extension Stability Policy
Section titled “Extension Stability Policy”This document defines the criteria for advancing an x/* extension module from experimental to beta (stable-candidate), and from beta to ga.
It does not override the stable-root compatibility promise defined in Deprecation Policy. Stable roots follow a separate, stronger policy.
Status ladder
Section titled “Status ladder”The status field in each module’s module.yaml tracks position on this ladder:
| Status | Meaning |
|---|---|
experimental | API shape may change; no compatibility expectation |
beta | API shape is stable within the current major version; breaking changes require deprecation notice |
ga | Full v1 compatibility promise; follows Deprecation Policy |
All x/* modules start as experimental. Promotion is explicit and requires meeting the criteria below.
Promotion evidence is tracked in specs/extension-beta-evidence.yaml. A module remains experimental until both the evidence file and the module manifest are updated in a promotion card.
Criteria for experimental → beta
Section titled “Criteria for experimental → beta”An extension may be proposed as beta when all of the following are true:
-
Stable public API surface. No exported symbol changes have been needed for at least two consecutive minor releases. All public types use constructor injection rather than mutable fields or global registration.
-
Boundary compliance. The module passes
go run ./internal/checks/dependency-ruleswith no violations. It does not import stable roots in ways that would force stable-root changes to accommodate it. -
Test coverage. The module has unit tests for every documented public behavior path, including negative paths (errors, empty inputs, context cancellation). The test suite runs cleanly with
go test -race ./.... -
Module manifest. The
module.yamlis complete and schema-valid (go run ./internal/checks/module-manifests).responsibilities,non_goals,review_checklist, andagent_hintsaccurately describe the current implementation. -
Module primer. The primer under
docs/modules/documents all public entrypoints, boundary rules, and a validation command. It is consistent with the current API surface (not aspirational). -
No known regressions. No open regression reports against the module’s documented behavior.
-
Owner sign-off. The module owner listed in
module.yamlconfirms the criteria are met.
Criteria for beta → ga
Section titled “Criteria for beta → ga”In addition to maintaining all beta criteria, a beta module must:
-
Production usage evidence. At least one production deployment (internal or external) is documented or known to the owner.
-
Two-release stability. The
betastatus has been held for at least two consecutive minor releases with no breaking changes. -
Deprecation pathway. Any symbols previously deprecated while in
experimentalorbetahave been removed or have a documented removal timeline. -
GA compatibility claim reviewed. The module owner and a stable-root reviewer have confirmed the public surface is ready for the full Deprecation Policy promise.
Promotion process
Section titled “Promotion process”- Open a task card in
tasks/cards/active/referencing this policy. - Update
specs/extension-beta-evidence.yamlwith required release refs, exported API snapshot refs, blocker state, and owner sign-off. - Generate or compare exported API snapshots with
go run ./internal/checks/extension-api-snapshot. - For release-to-release evidence, compare selected refs with
go run ./internal/checks/extension-release-evidence. - Validate the evidence ledger and blocker state with
go run ./internal/checks/extension-beta-evidence. - Update the
statusfield in the module’smodule.yaml. - Update the module’s primer under
docs/modules/to reflect the new status. - Update
docs/release/roadmap.mdto record the promotion. - The CI-equivalent release gate must pass before merging:
make gates.
Current evaluation
Section titled “Current evaluation”| Module | Candidate for | Status / remaining action |
|---|---|---|
x/rest | beta | Blocked until release-history evidence proves two consecutive minor releases without exported API changes |
x/websocket | beta | Blocked until release-history evidence proves two consecutive minor releases without exported API changes |
x/tenant | beta | Blocked until release-history evidence proves two consecutive minor releases without exported API changes |
x/observability | beta | Blocked until release-history evidence proves two consecutive minor releases without exported API changes |
x/gateway | beta | Blocked until release-history evidence proves two consecutive minor releases without exported API changes |
Not yet evaluated or with clear open work: x/ai (stable-tier subpackages evaluated individually), x/gateway/discovery, x/data, x/messaging/scheduler, x/messaging/webhook, x/messaging, x/messaging/mq, x/messaging/pubsub.
Non-goals
Section titled “Non-goals”- Do not promote
x/*packages togawithout this process. - Do not weaken the stable-root promise to accommodate extension promotion.
- Do not let
betastatus become a permanent holding pattern; set a target release forgaat promotion time or record the blocker explicitly.
Read next
Section titled “Read next”- Deprecation Policy — full v1 compatibility policy for stable roots
- Extension Maturity — current dashboard of all x/* families
- x/* Family — how optional capabilities are organized
- Release Posture — support matrix and adoption guidance