兼容与弃用策略¶
状态: v2 模块线的公开策略。本页定义 PRAXO-CORE 视为兼容的范围、加法变更 的审查方式,以及移除流程。
版本¶
PRAXO-CORE 使用干净的语义化版本:
v2.x.y是当前模块线。- 补丁版本修复行为,不改变导出声明。
- 次要版本新增向后兼容功能。
- 破坏性变更需要
v3.0.0和新模块路径。
可选适配器使用独立标签,例如 adapters/mcp/v0.3.0。适配器版本不代表核心版本,
反之亦然。
覆盖范围¶
兼容承诺覆盖导出的 pkg/... 声明:
- 导出接口及其方法集
- 导出结构体字段名、类型和 JSON 标签
- 导出函数和方法签名
- 导出常量和类型化字符串值
- 错误哨兵和类型化错误码
- 已文档化的线格式契约:
- 插件 Manifest v1 和宿主信封
- 事件名、负载字段和 stream kind
pkg/tool/jsonschema文档化的 JSON Schema 子集语义- 可选模块导入路径及其声明的最低核心版本
不覆盖:
- 声明适配器表面之外的具体适配器
- 未导出 helper
- 示例
- 仅测试包
- 明确标记为 experimental 的行为
加法变更¶
次要版本可以新增:
- 新包
- 新函数、类型、常量或变量
- 具体类型的新方法,且不改变导出接口
- 现有类型实现的新可选接口
- 新的导出结构体字段,仅当该结构体文档化为 keyed literal 且字段可选
- 新的可选 JSON 字段或事件 data 键
向导出接口添加方法是破坏性变更,除非接口明确文档化为可扩展。优先使用新的 可选接口。
向导出结构体添加字段可能破坏无键复合字面量。除非类型文档化为仅使用 keyed literal,否则视为破坏性变更。
破坏性变更¶
以下变更需要主版本:
- 删除或重命名导出声明
- 修改函数或方法签名
- 修改导出接口方法集
- 删除或重命名字段或 JSON 标签
- 修改类型化常量字符串值或错误哨兵
- 修改事件类型字符串、stream kind、插件 manifest 字段或宿主信封字段
- 收紧校验,使之前有效的输入被拒绝
- 修改文档化默认值并改变行为
- 修改线格式且没有版本化兼容路径
行为与校验变更¶
当文档化有效输入或文档化默认值变化时,收紧校验和行为变更默认属于破坏性变更。 仅当以下条件全部成立时,补丁版本才可修正行为:
- 规范或现有导出文档已经要求新行为,旧行为与其冲突;
- 被拒绝的输入不属于文档化有效范围,或属于畸形/不安全输入;
- 测试或消费者证据表明没有文档化有效用法依赖旧行为;
- changelog、兼容说明和发布说明记录修正内容与迁移步骤;
- 安全修复遵循相同证据规则,并说明为何此前输入在契约下无效。
如果必须破坏此前文档化的有效用法,应提供可选的兼容路径或使用主版本。无法保留 兼容路径的安全例外必须在发布审查中明确批准,并记录受影响行为和残余风险。
事件顺序、生命周期回调、重试/取消语义和 checkpoint 投影即使导出声明不变,也与
兼容性相关。它们需要行为测试、契约覆盖范围内的一致性向量更新、发布说明和受影响
范围的消费者验证。不能仅因 api/ 未变就把补丁归类为无行为变化。
弃用¶
- 在声明的 doc comment 和
CHANGELOG.md中标记弃用。 - 旧声明至少保持一个次要版本的可用性。
- 记录替代方案和迁移路径。
- 仅在下一个主版本移除;安全原因需要更快移除时,必须在发布说明中记录。
弃用声明在移除前仍受兼容承诺保护。不得静默改变其行为。
可选模块规则¶
- 可选模块标签为
adapters/<name>/vX.Y.Z。 - 不得移动或复用已有模块标签。
- 在模块
go.mod中声明最低兼容核心版本。 - 提供商 Core 不进入核心模块。
- 提供商或协议变化时,模块可以独立发布。
- 适配器兼容性针对声明的核心版本和已发布 consumer 模块测试。
多语言 Core¶
spec/ 树是 Python、TypeScript 和 Java Core 的规范契约。Go 仍是参考实现。
spec/SPEC_VERSION独立于 Core 版本,对契约进行版本化。- 每个 Core 声明其实现的
SPEC_VERSION,并独立版本化。 - wire 变更(JSON 字段名与大小写、事件类型、stream kind、插件 Manifest v1 与 信封、错误码)对所有 Core 都是破坏性变更。
- 行为变更需要更新一致性向量,并以 Core 次要版本发布。
- Core 处于
0.x时,破坏性源码或行为变更需要次要版本和迁移说明;补丁版本不得 静默破坏文档化有效用法。无论 Core 版本如何,wire 变更仍需同步spec/。 - 源码 API 一对一映射,名称符合语言习惯;一致性记录在
spec/parity.md。 - 任何 Core 不得实现 Go 参考实现尚不具备的契约能力。
- 改变文档化 wire 行为的
pkg/...变更必须在同一次变更中更新spec/。
发布门禁¶
候选版本必须通过:
api/快照与差异审查- 根模块 test、vet、build、race、fuzz、staticcheck 和 govulncheck
- 独立适配器 test、vet 和 build
- 无本地
replace的已发布 consumer 测试 - 每个已发布 Core 的
spec/一致性向量和一致性 linter - 严格文档构建
CHANGELOG.md、VERSION、兼容说明和发布说明已更新- 发布工作流生成 SBOM 和校验和
如何审查变更¶
合并前回答:
- 哪些导出声明发生变化?
- 变更是加法、行为变化还是破坏性变更?
- 是否影响现有接口方法集?
- 无键结构体字面量是否失效?
- JSON 标签、事件类型、stream kind 或插件字段是否变化?
- 默认值或校验规则是否收紧?被拒绝的输入在此前文档化契约下是否有效?
- 是否有 API 快照差异和 consumer 测试覆盖?
- 是否需要弃用期?
- 可选模块是否需要新标签?
- 发布说明是否写明该变更没有证明什么?