SOW 设计演进:从路由图到仓库引擎
SOW 在 v0.1 中探索了以 Git 为核心的软件分发控制面,在 v0.2 中转为仓库引擎。 本文记录这次变化,以及后续到 v0.5.0 的改进。
下文版本号指正式 Git 标签。部分归档计划曾用“v0.2”“v0.3”指代开发中的设计; 其中在 RPM 视图内创建硬链接的 C2 布局,已在 v0.2.0 发布前被替换。
早期工作的细节见四篇配套文章:
- v0.1 原始产品计划说明最初的范围,以及范围为何过大。
- v0.1 决策账本记录现存的 44 份 ADR 及其后续变化。
- v0.1 到底证明了什么汇总 112 份按日期记录的测试与评审报告。
- v0.2 重置说明 Plain/Managed 模式拆分,以及从 C2 改为单包体布局的过程。
简要历史
| 版本 | 主要变化 | 公共布局 |
|---|---|---|
| v0.1 | Git/CAS 状态、Route、边缘鉴权、云端工作流与 Pigsty 迁移 | 已退役 |
| v0.2 | Plain/Managed 模式、每仓库一个包池、纯元数据视图、保留 Generation 与目标发布 | 引入沿用至今的 pool/ + dists/ 布局 |
| v0.3 | 移除 V1、缓存包属性、简化 Plain 构建、批量提交包体 | 不变 |
| v0.4 | 单遍校验、独立 RPM 信任环、目标重新绑定、迁移与恢复修复 | 不变 |
| v0.5 | 包路径保留、移除与恢复修复、签名检查、可复现的 Plain 时间戳 | 不变 |
各版本的实现保存在源码标签中: v0.1.0、 v0.2.0、 v0.3.0、 v0.4.0 和 v0.5.0。
v0.1:问题很有价值,产品概念太多
第一版计划覆盖 Git 状态、内容寻址存储、Route 与 View、快照、远端存储服务、边缘鉴权和旧系统迁移。 现存 44 份 ADR(编号至 0045)记录了这些决策及其失败情形。
组合后的范围使所有权难以解释。多个对象都可能描述同一份包体与公开路径。 本地仓库生成也依赖云端、边缘服务和迁移概念。
v0.2 重置移除了 Git 权威数据库、独立 CAS 层、Route/View/Snapshot 命令模型和边缘访问控制, 把本地仓库构建作为核心任务。
v0.2:先建立小而明确的所有权模型
v0.2 将产品拆成两条执行路径:
- Plain 扫描调用者拥有的目录,就地重建 RPM 或 DEB 元数据。
- Managed 管理一个包含独立仓库的工作区。每个仓库都有自己的包池、Dist、SQLite 状态、锁和恢复记录。
这次重置引入了沿用至今的术语:包对象、成员关系、期望状态(Desired)、已构建状态(Built)、 Generation(构建快照)和变更集。稳定锁文件协调访问,协议指针在其他生成文件就绪后替换, Managed 操作日志记录中断后的恢复方式。
最初的 C2 实现仍会在每个 RPM 视图中创建包体硬链接。这一布局在发布前发生了变化。
v0.2.0:把 Repository Root 变成交付单元
单包体决策起草于 2026-08-05,并在 8 月 8 日随 v0.2.0 发布。
它移除了 RPM 视图中的包体别名。一个仓库只有一套 pool/ 与纯元数据 dists/,
完整仓库根目录是复制、托管、鉴权与发布的单位。
v0.2.0 也明确区分了本地与远端状态:
- 包对象、Desired/Built 状态、Generation、变更集与本地保留记录属于仓库。
- 发布尝试、已应用检查点、远端清单、缓存宽限期与删除记录属于一个仓库和一个发布目标前缀。
仓库之间不对包体去重。一个目标前缀只有一个所有者。 兼容性导出在原仓库之外创建独立副本。
v0.3:在同一模型上做减法与优化
v0.3 保持 v0.2.0 公共布局不变。它删除了 V1 运行时与迁移测试工具,引入包属性缓存, 并将 Plain 生成简化为可重建的单遍操作。成员关系改为批量展开,包体改为分组提交,减少文件系统操作。
v0.4:强化校验与恢复
v0.4 将 Managed 深度校验改为有界单遍读取。RPM 验证必须在一个信任环内完整通过, 不能拼接不同信任环的局部结果。显式重新绑定操作可以更新发布目标的可变设置。 迁移、发布恢复与公共交付检查也更严格。
早期协同发布提案曾考虑用 rclone 批量传输。最终设计保留原生存储适配器, 让 SOW 在同一状态机中检查对象身份、记录回执、控制提交顺序并恢复发布。
v0.5:保留包 URL 与已提交状态
v0.5.0 于 2026-09-29 发布,公共布局不变,托管状态升级为 schema 13。 新增的包池路径索引阻止不同字节占用已有 URL,也覆盖历史发布记录中的 URL。
该版本还修复了移除 Dist 后重新添加包的恢复问题,保留中断前已提交的更改,
并在修改期望状态前检查冲突的签名策略。Plain create --metadata-timestamp 为可复现 RPM 元数据
提供显式时间戳,默认值为零。完整变化见
v0.5.0 更新日志。
每次重构都保留下来的原则
v0.1 的部分规则继续用于更小的模型:
- 每个持久事实只有一个所有者。
- 包体与可重建元数据分开保存。
- 不可变包体与元数据就绪后,再替换协议指针。
- 提交意图持久化后,通过前向恢复完成操作。
- 删除前检查引用关系与精确身份;远端删除还要检查缓存宽限期与存储服务能力。
- 兼容性结果记录产生它的源码版本、客户端、存储服务和环境。