Releases · 产品与数据合同
- Asset
- ADP-DLV-DOC-DOC-0006
- Feature
- releases
- 领域
- delivery-integrations
- 文档状态
- draft
- 文档 Owner
- DOC
- 事实源
- canonical-docs
- 更新
- 2026/10/14
本文承载 Releases PRD 的对象边界、角色与租户边界、读写管理导出
矩阵和稳定状态合同,不复制 PRD 的背景、范围或发布决策。原子 REQ / AC 与正式 TEST Asset 尚未由 PLN、DOC 与
QA owner 登记,因此本页保持 draft。
实现级事实按 PLN · 75c4f1c80ac12f1322fe7bac2132d49a875f3291 固定修订核验。
术语与对象边界
| 术语 | 定义 | 事实 owner |
|---|---|---|
| Release 条目 | Project 级发布沟通对象,包含名称、状态、标签、目标/实际发布日期、变更日志、负责人和稳定身份 | Plane(project_releases) |
| 发布范围 | Release 与 Work Item 的有效关联集合,要求同 Workspace 与同 Project | Plane(project_release_work_items) |
| Milestone 关联 | Release 与 Milestone 的有效关联,双向可读,不改写任一侧状态 | Plane(project_milestone_release_links) |
| 写入 receipt | 按 actor 与幂等键记录的写入结果,用于重放同一请求 | Plane(project_release_mutations) |
| Harbor sealed release artifact | 由 protected-tag 交付链路 seal 出的不可变制品身份 | GitLab 与 Harbor |
| 部署 evidence | TEST/PRODUCTION 目标、health 与 observed commit 等环境事实 | owning release surface,不是本文档 |
边界结论:
- Release 条目是发布沟通对象,不等价于 Harbor sealed release artifact、制品摘要或 TEST/PRODUCTION 部署 evidence。任何“已发布”“已上线”“已验收”结论不得从 Release 状态派生。
- 当前 Plane source 在
apps/api/plane/automation/下没有任何代码引用ProjectRelease;Release 条目与 GitLab/Harbor/GitOps/Argo CD 交付事实没有共享状态。 - 当前 GitLab/Harbor/GitOps/Argo CD 发布链路不读取
project_release_mutations;Plane 的写入 receipt 与 delivery evidence 没有共享状态,引用时不得混用。 - 发布流程、seal、Harbor bundle identity 与部署顺序由 发布流程 和 代码托管与独立发布 拥有。
角色与租户边界
| 维度 | 合同 |
|---|---|
| Workspace 边界 | 每个 Release 条目必须属于一个 Workspace 与一个 Project;读写都以 Workspace slug 与 Project ID 作为上下文 |
| Project 边界 | 发布范围与 Milestone 关联的对象必须与 Release 同 Workspace、同 Project;任一越界 ID 使整批请求失败 |
| 成员边界 | 读取要求请求者是当前 Project 的 active 成员;非成员不返回该 Project 的业务数据 |
| 角色边界 | 写入额外要求 Project Admin 角色;Project Member 只有只读能力 |
| 功能边界 | Project 级 release_view 为关闭时,服务端拒绝写入并返回稳定“功能未启用”错误 |
| 已删除对象 | 已删除或超出范围的 Release 读取返回稳定“已删除或超出范围”错误,不返回内容 |
| 同名对象 | 同名的 Milestone 与 Release 是两个独立对象,不因名称相同产生任何隐式关联或状态传递 |
读写管理导出矩阵
| 能力 | Project Admin(role 20) | Project Member(其它 active 角色) | 非成员 / 其它 Workspace | 依据 |
|---|---|---|---|---|
| 读取 Release 列表与详情 | 允许 | 允许 | 拒绝 | 读请求只校验 active 成员资格 |
| 读取发布范围与关联 Milestone | 允许 | 允许 | 拒绝 | 读请求只校验 active 成员资格 |
| 创建条目 | 允许 | 拒绝 | 拒绝 | 写请求要求 role 20 |
| 更新条目(含状态、日期、负责人) | 允许 | 拒绝 | 拒绝 | 写请求要求 role 20 且携带当前 version |
| 维护发布范围 | 允许 | 拒绝 | 拒绝 | 写请求要求 role 20 且携带当前 version |
| 关联 / 解除 Milestone | 允许 | 拒绝 | 拒绝 | 写请求要求 role 20 且携带当前 version |
| 删除条目 | 允许 | 拒绝 | 拒绝 | 写请求要求 role 20 且携带当前 version |
| 启用 / 停用 Project Releases | 允许 | 拒绝 | 拒绝 | Project Settings 功能开关 |
| 导出 | 当前无导出 API 或 UI 入口(unknown) | 不适用 | 不适用 | 本文不定义导出合同 |
退出条件:以上矩阵是当前实现事实与本期合同的交集。若后续引入更细的角色(只读 Guest、发布角色),必须先 更新本矩阵与 Releases PRD 的待确认事项,再改实现。
稳定状态与转换
Release 状态只有三个稳定值,全部是发布沟通状态:
| 状态值 | 用户可见含义 | 允许的来源 |
|---|---|---|
unreleased | 已规划或进行中,尚未宣布发布 | 创建默认值,或显式设置 |
released | 已宣布发布,可记录实际发布日期 | 显式设置 |
cancelled | 该发布不再推进 | 显式设置 |
当前实现事实:状态是带枚举校验的普通字段,服务端当前不限制转换方向,任何 Admin 都可以在携带当前
version 与幂等键的前提下把状态改为任一允许值;状态变化不触发部署、通知、Milestone 状态或工作项状态变化。
本期合同提案:转换保持显式用户动作,并且
- 状态集合固定为上述三个值,未知值必须被拒绝;
released允许记录实际发布日期,unreleased不得被视为“已发布”;- 任何状态变化必须携带当前
version与幂等键,并被写入 receipt; - 是否把转换收窄为
unreleased → released、unreleased → cancelled、released → cancelled由 Producer 与 PLN owner 决定(见 PRD 第 12 节),在决定前实现不得增加隐式转换,文档也不得把收窄规则写成已批准合同。
其他状态轴不在此列:工作项业务状态、Milestone 交付状态、部署状态与 Automation 运行状态各自由其 owner 定义。
FR 追踪草案
| PRD 功能 | 本页合同 | 仍缺少 |
|---|---|---|
FR-001 启用与发现 | Project 级功能开关、入口可见性与服务端拒绝 | 原子 REQ / AC / TEST |
FR-002 创建与维护条目 | 字段校验、负责人边界、version 递增 | 原子 REQ / AC / TEST |
FR-003 发布范围 | 同 Project 校验、关联唯一性、整批失败 | 原子 REQ / AC / TEST |
FR-004 Milestone 关联 | 双向读模型、状态独立、ID 集合一致 | 原子 REQ / AC / TEST |
FR-005 删除与收敛 | 软删除、关联收敛、重放 | 原子 REQ / AC / TEST |
FR-006 权限与保护 | 角色矩阵、幂等键、乐观并发 | 原子 REQ / AC / TEST |
非目标
- 不把 Release 条目升级为制品、候选、bundle 或环境记录。
- 不让 Release 状态驱动部署、合并、闸门或生产操作。
- 不定义 SemVer 与 CHANGELOG 的事实源。
- 不改写 Milestone、工作项、Cycle、Module 的任何状态。
- 不新增跨 Project Release、Release 模板、附件、导出或通知投递。
- 不把 receipt 表声明为不可篡改审计。