跳转到内容

稳定根

稳定根是仓库根部那些长期公开的包。它们定义了默认学习路径,承接 Plumego 希望长期保留的最窄公共契约,也为规范应用路径提供稳定支点。

从 `specs/repo.yaml` 与 `specs/task-routing.yaml` 同步

稳定根清单

9 稳定根

  • contract
  • core
  • router
  • middleware
  • security
  • store
  • health
  • log
  • metrics

从 `specs/repo.yaml` 与 `specs/task-routing.yaml` 同步

默认归类意图

Change kernel, lifecycle, route structure, transport contracts, transport middleware, auth primitives, or storage primitives.

不鼓励的新根目录

  • ai
  • tenant
  • net
  • pubsub
  • rest
  • validator
  • utils
  • frontend

这些事实块来自仓库 machine-readable specs,而不是 docs 中手工复制的列表。

只有当改动属于 Plumego 希望每个维护者都理解的默认服务路径时,稳定根才是正确归属。

通常来说,这类改动会落在四种事情上:

  • HTTP 应用内核与生命周期
  • 路由结构或传输合约 -传输层中间件适配器
  • 可供扩展层复用的窄安全原语或持久化原语

只要改动开始需要能力策略、租户感知 分支、拓扑较重的行为,或者 能力家族 级发现入口,它就已经在越过稳定根契约。

在你把改动放进稳定根之前,先问自己三个问题。

  1. 一个读者是否仍会期待这段行为出现在最小规范服务路径里?
  2. 这段行为能否保持窄边界,而不学习 tenant、gateway、AI 或协议家族策略?
  3. 即使这段代码只存在于稳定根,reference/standard-service 仍然会是一个合理示例吗?

只要答案开始变成“只对某些能力成立”或“只有特定产品策略开启时才成立”,更安全的归属通常就是某个对应的 x/* 家族,而不是继续拉伸稳定根。

当前仓库已经给出了足够具体的模块级边界,可以直接拿来判断。

稳定根适合留在这里的工作一旦变成这些问题就应移出
core应用构造、路由挂载、middleware attachment,以及 Prepare / Server / Shutdown 生命周期feature catalog、tenant policy、debug metadata 或能力特定运行时行为
middlewarerequest ID、tracing hook、access log、auth/security transport 适配器、HTTP metrics 这类传输层wrappertenant resolution、quota policy、API version negotiation 或协议 / payload 适配
storestore/filestore/kvstore/idempotencystore/cache 这类窄持久化契约与基础抽象拓扑较重的 cache engine、租户感知 适配器、signed URL、文件元数据管理、SQL/provider policy 或 HTTP-facing caching

这些不是抽象的风格偏好,而是当前仓库已经写出来的实际归属边界。

一旦你已经确认改动仍属于稳定表面,就不要停留在概念层,而应继续进入对应模块的 primer。

如果工作主要触及下一步打开的 primer为什么这里是更合适的下一跳
lifecycle、显式 应用构造、logger injection 与 路由挂载Core Primer它会把稳定根规则继续落到 core 的实际生命周期与内核边界
transport wrapper、request ID、tracing hook、access logging、auth/security HTTP适配器与 rate-limit适配器Middleware Primer它会继续说明哪些仍然属于 传输层,哪些必须移动到 x/tenantx/restx/gateway
文件 contract、cache primitive、KV helper、幂等合约 与 DB helper 边界Store Primer它给出了稳定持久化原语与 x/datax/data/cachex/fileapix/tenant 之间最清楚的具体拆分

几个反复出现的例子会让判断更清楚。

  • core 中,显式应用构造与单一路径生命周期应该保留在稳定层,但 debug snapshot 应进入 x/observability/devtools,feature-specific wiring 应留在应用本地代码或扩展层。
  • middleware 中,request ID、tracing hook、access logging 与 HTTP metrics 仍然属于稳定层,因为它们依旧是 传输层。API version negotiation 应移动到 x/rest/versioning,协议适配应移动到 x/gateway/*
  • store/file 中,共享文件 contract 与错误类型留在稳定层,但 租户感知 storage backend 与 metadata persistence 应移动到 x/data/file,而 upload/download HTTP endpoint 应移动到 x/fileapi
  • store/cache 中,基础 cache primitive 留在稳定层,但 distributed cache 行为应移动到 x/data/cache,HTTP response caching 应移动到 x/gateway/cache,租户感知 cache适配器应移动到 x/tenant/store/cache

很多读者会因为某个改动“看起来很基础”,就误以为它应该属于稳定根。当前仓库其实明确反对这种判断方式。

  • “每个服务都会用到”并不自动等于它属于 core
  • “它处理 HTTP 请求”并不自动等于它属于稳定 middleware
  • “它和数据存储有关”并不自动等于它属于稳定 store

更关键的问题是:实现完成之后,这段行为是否仍然保持窄边界、默认路径属性,以及 capability-agnostic 特征。

当稳定边界开始破裂时该去哪里

Section titled “当稳定边界开始破裂时该去哪里”

一旦某个稳定根候选开始学习扩展语义,就不要继续拉伸根目录,而应转去对应的归属目的地。

  • 租户感知 策略转去 x/tenant
  • 协议或 gateway 行为转去 x/gateway
  • 可复用资源接口传输层转去 x/rest
  • export wiring 与更高层 telemetry 适配器转去 x/observability
  • 拓扑较重的数据与存储实现转去 x/datax/data/cachex/fileapi