OceanWayOceanWay

验收、发布与回滚

OceanWay 仓库内完成定义、跨仓证据、Writer 切换与发布记录规范

实施计划的完成单位不是“代码合并”,而是可复现的交付证据。仓库内验收证明本仓增量正确;跨仓验收证明版本、身份、网络、事务和故障边界在真实组合中仍成立。

Definition of Ready

进入实现前必须具备:

  • 明确的 Owner、范围与非目标;
  • 已通过的上游批次门禁;
  • 固定 Contracts 版本或明确的 Contracts 变更工作包;
  • 数据 Owner、Writer、幂等键、事务与授权边界;
  • 正常、拒绝、重放、超时、崩溃与回滚验收条件;
  • 不使用真实客户数据和明文 Secret 的测试方案。

缺少这些条件的内容只能进入探索或设计,不能接生产 Writer。

仓库内完成定义

每个仓库至少提供:

  1. 格式、静态检查、类型检查和生产构建。
  2. 单元测试以及与风险匹配的集成/契约测试。
  3. 依赖漏洞、Secret 与许可证检查。
  4. 数据库变更的真实 PostgreSQL 正向、负向和并发证据。
  5. API/事件的当前版本与上一兼容版本消费验证。
  6. 运行配置、健康检查、Metrics、Alert 和回滚说明。
  7. 固定 Commit、CI Run、Release/Package/Image Digest 与变更记录。

Surface 仓还必须完成关键流程浏览器回归、窄屏和权限状态;Gateway/Core 还必须完成幂等、未知状态和崩溃窗口;Infrastructure 还必须完成目标环境演练。

跨仓证据清单

跨仓门禁使用一个不可变 Evidence Manifest,至少记录:

evidenceId / schemaVersion / generatedAt
deliveryBatch / environment
contractsPackageVersion / packageDigest
repositories[] {
  repository / commitSha / workflowRunId
  releaseOrImageRef / artifactDigest
}
testSuites[] { name / result / reportDigest }
scenarios[] { scenarioId / expected / observed / evidenceRef }
cutoverDecisionRef? / rollbackDecisionRef?
approvers[] / evidenceDigestAlgorithmVersion / evidenceDigest

证据正文不得包含 Raw Credential、Prompt、客户输入、Provider Secret、长期签名 URL 或客户媒体。敏感日志只保存受控引用与授权读取路径。

Writer 切换

每类命令的切换记录必须包含:

  • 旧 Writer、新 Writer 与命令范围;
  • 路由规则版本和切换生效点;
  • 幂等水位、在途 Operation 与归属处理器;
  • Shadow 对比结果及已知差异;
  • 数据写入、Outbox、费用和副作用的不变量;
  • 观察指标、停止条件与回滚条件;
  • Secret、Webhook、Cron 和部署引用的迁移状态。

合法迁移只有“旧入口代理到新 Owner”或“旧 Owner 继续写、新实现无副作用 Shadow”两种模式。禁止旧新实现同时创建业务事实或外部副作用。

回滚原则

  • 回滚只改变后续新命令的路由;已受理 Operation 由原 Owner 处理至终态或进入正式恢复流程。
  • 已提交事件、Ledger、Asset Version、Provider Task 和审计事实保持不可变,不能通过删除伪装回滚。
  • Contracts 不能回滚到无法读取已经产生的新版本事实;消费者兼容期必须覆盖观察窗口。
  • 数据库回滚不得依赖破坏性删除。未上线项目可直接按新设计修改 Schema,但生产切流后必须有明确前向修复策略。
  • 未达到恢复门禁时保持功能关闭或只读,不以人工改表恢复服务。

文档与状态更新

一个批次通过后,同一个 Pull Request 或紧随其后的文档变更必须更新:

  • 对应仓库实施页的基线与证据;
  • 当前状态下一阶段
  • Changelog
  • 受影响的 ADR 状态或限制说明;
  • Infrastructure Evidence 索引和运行手册。

Issue 关闭、PR 合并或页面可访问都不能单独把状态改为“已验收”或“已上线”。

On this page