# 阶段 ⑦ 交付与发布(Delivery & Release) > **定义**:让当前结果在**真实交付边界**被接受——真实的评审、必需的 CI、合并、发布——且高风险动作有风险匹配的审批、副作用有可用的回滚/恢复路径。本地测试与 agent 一句"done"属于阶段 ⑥,不属于交付。 > **输入**:⑥ 已通过的实现(验证记录 + 门禁结果 + 审查结论)。 > **输出**:已接受的修订 + 构建/安装包 + 发布记录 + 审计。 > **进入下一阶段(⑧ 学习与沉淀)**:交付边界接受完成、发布记录落档。 --- ## 1. 要求(Requirements) ### 1.1 进入条件 - 阶段 ⑥ 全部质量门通过,无未解决阻塞项。 ### 1.2 完成条件(DoD) - [ ] 真实接受边界(合并/发布/部署)绑定到**当前修订**,有修订级决策证据(不是"跑过 CI"而是"这个 revision 合并了/发布了") - [ ] 每个高风险动作(发布、删除、生产数据、外发、签名)在副作用**之前**获得所需审批并留审计 - [ ] 实际副作用有风险匹配的回滚/恢复路径(回滚、恢复、重试、补偿、幂等重放、安全中止之一)且含 owner 与后置条件 - [ ] 发布记录(版本、变更、产物、验证)落档 --- ## 2. 规则(Rules) ### 2.1 接受边界 | 编号 | 规则 | |---|---| | R-7.1 | **真实边界证据**:把真实接受决策绑定到当前修订与目标分支/环境。本地测试、自测、agent 完成声明均不是交付证据;外部边界打不开时记 `Unobserved`,不编造缺失的 PR/部署。 | | R-7.2 | **合并路径**:改动经默认分支可比较的 diff 进入(分支/PR 或等价受控路径);直接在默认分支开发、无可评审 base diff 属交付缺陷。 | | R-7.3 | **必需检查绑定**:合并前必需检查对最终修订全绿,且与本地命令一致或有明确差异说明。 | ### 2.2 高风险审批 | 编号 | 规则 | |---|---| | R-7.4 | 破坏性/特权/外部/不可逆/共享状态/凭据/发布/生产动作,在效果发生**前**取得所需的人或策略 owner 决策;安全拒绝 + 可用升级路径是正确的控制行为,不是失败。 | | R-7.5 | 高风险动作留审计:谁、何时、什么、批准人/策略、审计引用。 | | R-7.6 | 确认无高风险动作时记 `N/A`(须经检查证明),不允许无理由的 N/A 阻塞结果。 | ### 2.3 回滚与恢复 | 编号 | 规则 | |---|---| | R-7.7 | 每个实际副作用有风险比例匹配的回滚/恢复路径,且绑定到受影响资源/入口/owner/后置条件。 | | R-7.8 | 回滚/恢复须可验证(安全模拟、演练、可比的保留任务或实际恢复结果);禁止仅为提高证据强度而执行破坏性回滚。 | | R-7.9 | 恢复路径对失败与超时也要可运行(清理不得只在成功路径执行)。 | --- ## 3. 输出规范 ### 3.1 发布流程(本仓) > 发布链唯一权威:`docs/release-process.md`(ci-local 门禁 / release.mjs / 四包发布 / pack-audit / install-acceptance / 签名 / OTA);签名细节 `docs/release-signing.md`;本地最短路径 `docs/local-build-quickstart.md`。以下为阶段 ⑦ 在本仓的落地步骤,任一步非零即中止。 ```text Step 0 离线门禁(提交/合并/发布前必过) Windows: build\ci-local.ps1 · macOS/Linux: build/ci-local.sh → run-local-ci.mjs 八步: ① 删 release/ → ② npm ci 离线干净安装 → ③ npm run ci:check (build:verify:runtime → vitest 全量 → build)→ ④ playwright E2E(不重构建) → ⑤ electron-builder --publish never 打安装包 → ⑥ package:audit (asar 禁 dist/mac-*、release/、.map/.d.ts/.ts;体积预算 140 MiB) → ⑦ verify-packaged-app(extraResources 五件断言 + 真启动 5s 冒烟) → ⑧ write-build-report(逐产物 SHA-256 → build-report + SHA256SUMS) Step 1 版本与变更(SDK 四包发布时) node scripts/release.mjs --registry <内网源URL> [--bump patch|minor|major] [--skip-publish] [--dry-run] 九步编排:install → build(拓扑序 api→agent-sdk→account→web-ui) → sync-web-ui-dist(dist/renderer → packages/web-ui/dist,断言 index.html 字节一致) → test → pack-audit → bump(四包+根 lockstep,dk-* 互引钉新版,再生 lockfile) → publish-sdks.mjs 逐包 npm publish 内网源 → install-acceptance → npm run package 日常验证用 --dry-run --skip-publish(shouldPublish 独立纯函数,零副作用有测试断言) Step 2 构建安装包 + 产物审计 npm run package = build + electron-builder --publish never + package:audit + pack:sdks 审计(scripts/pack-audit.mjs):tarball 顶层 ⊆ {dist, bin, README, LICENSE, package.json}; 零测试产物;dk-account 防误发(registry 锁内网 GitLab);公开三包无 /account/ 路径泄漏 安装验收(scripts/install-acceptance.mjs):spawn dk-web → listening banner → GET /health 200 + GET / 200 含