Skip to content

Extension Boundary

This page defines the structure and governance of Plumego’s x/* extension families. It explains what x/* is, how packages are organized within it, and what the path to promotion looks like.

For promotion criteria in detail, see Extension Stability Policy. For current maturity status of each family, see Extension Maturity.

x/* is not a plugin market. Plugin markets have these properties:

  • Packages are contributed by the community with varying quality standards.
  • There is no common ownership or review expectation.
  • Maturity is inferred from download count or age, not from explicit criteria.

Plumego’s x/* does not work this way. Every extension family has an owner, a defined responsibility boundary, a machine-readable manifest, and a stated maturity level. Packages in x/* are capability families with explicit maturity levels and validation paths.

When evaluating an x/* package, the first question is not “does it exist?” but “what is its maturity status and what evidence supports that status?”

x/* is the layer where product capability, protocol adaptation, and business-domain features live — kept separate from the stable kernel to prevent those concerns from stretching the kernel’s compatibility promise.

The split serves two purposes:

  1. Stability isolation. Stable roots carry a long-term compatibility promise. Extension families are allowed to evolve faster, which is appropriate for product capability and ecosystem-facing integrations.

  2. Scope clarity. A new engineer or AI agent looking at a change can immediately know whether it touches the long-term stable kernel or an explicitly-bounded capability area.

Direct application entrypoints for common service patterns. These are the primary extension discovery surface.

FamilyPrimary role
x/restResource route conventions, CRUD patterns, pagination
x/websocketWebSocket hub, connection lifecycle, room broadcast
x/gatewayReverse proxy, rewrite rules, backend pooling, edge transport
x/tenantTenant resolution, policy, quota, rate limiting, session, tenant-aware stores
x/observabilityExporter, tracer, collector, and adapter wiring
x/fileapiHTTP file upload/download transport
x/aiAI provider contracts, session, streaming, tool invocation
x/messagingApp-facing messaging flows
x/frontendStatic and embedded asset serving, SPA fallback
x/resilienceCircuit breaker and rate-limit primitives for extension-layer use
x/observability/opsProtected admin routes, runtime diagnostics

Start from the app-facing family before going deeper into subordinate primitives.

Lower-level building blocks consumed by category A families or by application code that needs direct access to a specific primitive.

PackageParent familyRole
x/data/cachex/dataCache topology and Redis-backed implementations
x/gateway/discoveryx/gatewayService discovery backend contracts and adapters
x/messaging/mqx/messagingMessage queue primitive
x/messaging/pubsubx/messagingPub/sub broker primitive
x/messaging/schedulerx/messagingIn-process cron, delayed jobs, retryable tasks
x/messaging/webhookx/messagingOutbound webhook dispatch
x/gateway/ipcx/gatewayInter-process communication transport primitive
x/dataPersistence surface: file, idempotency, advanced topology

Discovery starts from the owning family entrypoint, not from the subordinate primitive directly.

C — Local development and protected operations

Section titled “C — Local development and protected operations”

Packages that must never be exposed in production without explicit auth gating.

PackageRole
x/observability/devtoolsDebug endpoints, request inspector, local-only diagnostics
x/observability/opsProtected admin and runtime diagnostics routes

Both require the caller to mount them explicitly under an authenticated path. Neither self-registers or defaults to a public route.

Families where the domain itself evolves quickly and compatibility expectations are correspondingly lighter.

PackageNotes
x/aiStable-tier subpackages (provider, session, streaming, tool) are evaluated separately from the experimental root family
x/frontendSPA and asset-serving patterns change with web tooling
x/data advanced topologySub-surface inventory selects specific stable targets

All x/* packages start as experimental. Promotion is explicit and requires meeting the criteria in Extension Stability Policy.

StatusMeaningAdoption guidance
experimentalAPI shape may change; no compatibility expectationUse for evaluation, prototyping, or when you own the upgrade risk
betaAPI stable within current major version; breaking changes require deprecationAcceptable for production use in clearly scoped scenarios
gaFull v1 compatibility promiseDefault production choice

Current status of all families: Extension Maturity.

When evaluating an x/* extension family:

  1. Check Extension Maturity for current status and recommended entrypoint.
  2. Read the primer at the family’s README under docs/modules/.
  3. Read the module.yaml for responsibilities and non-goals.
  4. Start from the matching reference/with-* app for wiring guidance.
  5. Check specs/extension-beta-evidence.yaml for known blockers before committing to production adoption.

Do not infer production readiness from the existence of a package alone.

Extension families are not allowed to:

  • Import stable roots in ways that force stable-root changes to accommodate them.
  • Self-register routes, middleware, or lifecycle hooks without explicit caller mounting.
  • Define alternate canonical application layouts.
  • Promote themselves by changing their own module.yaml status.

Boundary violations are caught automatically:

Terminal window
go run ./internal/checks/dependency-rules
go run ./internal/checks/extension-maturity
go run ./internal/checks/extension-beta-evidence