## 发布与版本

<!-- slot: 目标 -->
本章说明 Workflow Plan 的直接编译、发布和不可变版本。未关联 Team 的 Plan 由普通 Plan 发布路径管理；关联 Team 的 Plan 由当前 Team Leader 通过 Team Workflow 直接创建或更新。两者都在一次事务中校验草稿、编译 artifact、追加版本并更新 current/default 指针。

<!-- slot: 边界 -->
本章只覆盖 Plan 发布准入与版本生命周期。运行图里的 `request_approval` 是某次 Workflow Run 的业务步骤，不是 Team Workflow Plan 的作者审批。

<!-- slot: 提示词 -->
发布前读取最新 `planRevision` 和 working/draft revision，保留精确 source、layout 和 Team ID。不要猜 revision，也不要把已发布版本的 ID 当作草稿 revision。

<!-- slot: 流程 -->
- 未关联 Team 的 Plan 使用 `update`、`validate`、`publish`。
- Team-linked Plan 使用带 `teamId` 的直接 `update`；创建 Team Workflow 时，`create` 已完成首次编译和发布。
- 当前 Team Leader 的身份、Team/Plan/draft revision 和 Agent edit wake 都在事务内验证。授权、校验或并发失败不会留下半个版本或半个 relation。
- 每次成功发布追加一条不可变 `PlanVersion`。`currentVersion` 指向最新版本；`makeDefault:true` 才移动 `defaultVersion`，首版没有默认版本时自动成为默认版本。

<!-- slot: 配置 -->
普通 Plan：

```bash
$ printf '%s\n' '{"action":"update","planId":"pln_bug_triage","expectedRevision":2,"source":"<yaml>"}' | loop exec workflow plan -
$ printf '%s\n' '{"action":"publish","planId":"pln_bug_triage","expectedRevision":3,"makeDefault":true}' | loop exec workflow plan -
```

Team Plan：

```bash
$ printf '%s\n' '{"action":"update","teamId":"team_bug_ops","planId":"pln_bug_triage","expectedRevision":2,"expectedPlanRevision":3,"draftRevision":2,"makeDefault":true,"source":"<yaml>"}' | loop exec workflow plan -
```

Team `update` 会直接返回 `plan` 与新增 `version`；不会创建 `approval_instances`、pending proposal、审批 card 或 generic Approval ledger row。创建 Team Workflow 时，`create` 也会返回首个已发布版本。旧 Run 继续使用其启动时固定的 PlanVersion，不会被 current/default 指针重写。

<!-- slot: 异常 -->
- `plan_revision_conflict` 或 draft revision conflict：重新读取 Plan 和 draft，使用服务端返回的最新 revision 决定是否重试；不要只把数字加一。
- Team Leader 不再有效、Team/Plan 被归档、Agent edit wake 冲突或校验诊断：事务整体回滚，保持此前的 draft、版本、current/default 和 relation。
- 相同 client request 重试会返回原 immutable version；相同 request ID 搭配不同 source、makeDefault 或 revision 会得到 idempotency conflict。
- 归档/删除通过 Team ownership boundary 执行。归档不删除版本历史，既有 Run 仍可读取其 pinned version；删除保留 ownership tombstone，防止 Plan 变成无主 workspace Plan。

<!-- slot: 审计 -->
每个版本保留编译器版本、semantic digest、source/layout、发布 actor、draft revision 和 publish time。Relation revision 在直接创建/更新和 archive/restore/delete 时作为独立 CAS fence 前进；migration cutover 只取消历史 pending Team proposals，不应用其 frozen payload，并强制后续调用使用 cutover 后的 relation revision。

<!-- slot: 验收 -->
- [ ] Team 创建已原子地产生首个 immutable version 和 current/default 指针。
- [ ] Team 更新直接编译并发布，不创建 Approval 或 pending state。
- [ ] 非 Leader、验证失败、过期 Plan/draft/relation revision 都是原子失败。
- [ ] Idempotent replay、版本 actor history、makeDefault 和旧 Run pinning 都保持正确。
- [ ] 能区分 Run 内 `request_approval` 与 Team Workflow Plan 的直接发布。

<!-- slot: 媒体槽位 -->
<!-- media: fig-07-01-publish-version.png -->
图 7-1 直接 Plan 发布路径：Team Leader/普通 Plan → revision 校验 → compile → immutable version → current/default 与 relation 更新。
