Skip to content

Extension Maturity

Every x/* package declares its maturity in module.yaml. This page explains what those declarations mean for teams choosing whether to take a dependency on an extension.

Open any x/*/module.yaml and look for two fields:

status: experimental # top-level module maturity
stability_tiers: # optional per-subpackage breakdown
stable:
- provider
- session
experimental:
- orchestration
- semanticcache

Most extensions carry only status: experimental with no stability_tiers block. A few (x/ai) publish a finer breakdown because their subpackages mature at different rates.

StatusSemver guaranteeAPI change policyProduction guidance
betaAPI frozen between minor release refsBreaking changes require a major version bump; deprecation notice before removalSafe for production with minor-version pinning; review changelogs before upgrading
beta surfaceCovered for the named subpackage onlySame as beta; parent family may still be experimentalAdopt the specific subpackage; isolate behind app-local adapters and check module.yaml
experimentalNot yet coveredAPI may change without a deprecation periodEvaluate per use case; pin an exact version and review changelogs on upgrade

These extension families are at beta status. Their APIs are frozen between minor release refs and are backed by two consecutive release refs, exported API snapshots, and owner sign-off.

FamilyPromotedEvidence
x/gatewayv0.2.0beta evidence
x/observabilityv0.2.0beta evidence
x/restv0.2.0beta evidence
x/websocketv0.2.0beta evidence
x/tenantv1.1.0beta evidence
x/frontendv1.1.0beta evidence
x/messagingv1.1.0 (app-facing service)beta evidence

Some families are experimental at the root level but contain specific subpackages that have accumulated their own release evidence and beta sign-off. The parent family can still change shape, but the named subpackage surface is stable.

SurfaceParent familyPromotedWhat is covered
x/ai/providerx/ai (experimental)v1.1.0Provider interface and concrete constructors
x/ai/sessionx/ai (experimental)v1.1.0Session lifecycle and state management
x/ai/streamingx/ai (experimental)v1.1.0Streaming response coordination
x/ai/toolx/ai (experimental)v1.1.0Tool registration and invocation
x/data/filex/data (experimental)v1.1.0File helper and metadata contracts
x/data/idempotencyx/data (experimental)v1.1.0Idempotency key store contracts

For these surfaces, check module.yaml stability_tiers before relying on a specific subpackage. Subpackages listed under stable: are covered; those listed under experimental: are not.

How to check before depending on an extension

Section titled “How to check before depending on an extension”
Terminal window
grep -E "^status:|stability_tiers:" x/<module>/module.yaml

For x/ai with its subpackage breakdown:

Terminal window
cat x/ai/module.yaml | grep -A 12 "stability_tiers:"

Experimental status means:

  • The constructor signatures, interface methods, or configuration field names may change between minor releases.
  • A subpackage may be split, merged, or removed before reaching stable tier.
  • The team is actively using it in production services, so regressions are caught quickly — but the API shape is still being refined.

Experimental does not mean:

  • The code is untested or broken
  • It is unsafe to run in production
  • It will be removed imminently

A subpackage moves from experimental to stable when:

  1. The public API has been used in multiple services without requiring breaking changes.
  2. The interface contracts are documented in module.yaml.
  3. A review confirms no planned breaking changes in the current roadmap.

Until promotion, treat the module.yaml as the authoritative record. If module.yaml lists a subpackage under stable:, you can rely on its API as you would a stable root. If it is absent from stability_tiers or listed under experimental:, pin and review on upgrade.

The nine stable root packages — core, router, contract, middleware, security, store, health, log, metrics — are covered by semver at the module level. They have no x/* dependencies and their APIs will not change without a major version bump. Use them freely without pinning patch versions.