规划(08-08-production-deployment-execution): 生产部署执行与验收
ci-e2e / e2e (push) Canceled after 0s
ci-minimal / check-minimal (push) Canceled after 0s

这个提交包含在:
2026-08-08 12:01:59 +08:00
父节点 93818fd849
当前提交 4596ed0686
共修改 6 个文件,包含 310 行新增和 0 行删除
@@ -0,0 +1 @@
{"_example": "Fill with {\"file\": \"<path>\", \"reason\": \"<why>\"}. Put spec/research files only — no code paths. Run `python3 .trellis/scripts/get_context.py --mode packages` to list available specs. Delete this line once real entries are added."}
@@ -0,0 +1,87 @@
# 生产部署执行与验收:设计说明
## 1. 设计边界
这是一次受控运维执行,不是新的产品开发。已归档的 `08-08-production-deployment-validation` 提供部署 tooling、target gate、迁移 reconciliation 和报告脱敏实现;本 task 只负责在明确批准的生产窗口调用它们、读取结果、分流失败并形成证据。
不修改应用代码、Prisma schema、生产环境变量或业务数据模型。若运行中发现实现缺陷,保留现场并另建 task,不在部署窗口临时修复。
## 2. 状态序列与硬门禁
```text
候选发布来源
-> 上游/工作区/13 项部署体检
-> 生产 target identity(只读)
-> Prisma pre-status + _prisma_migrations 对账(只读)
-> terminated 行数与 rollbackWindow(只读)
-> 变更冻结确认
-> deploy-existing(唯一允许的迁移/发布写入)
-> post-status(只读)
-> /ready、SHA、smoke、权限负向(只读)
-> 证据收口 / PAUSED 分类
```
每一条箭头都是 fail-closed 闸门。任何闸门失败都不得执行下一步;特别是 pre-status、窗口判定和权限负向检查必须先于任何真实终止写入(本 task 不执行该写入)。
## 3. 候选来源与发布授权
- 先在本地完成 task 规划提交,使工作区 clean;再以明确的已提交 commit 作为候选。
- 运行 `check-source-provenance.mjs`,要求候选 commit 已进入配置的上游远端且 remote verification 为 true。
- `deploy-existing.sh` 拒绝 `DEPLOY_ALLOW_UNPUBLISHED_COMMIT` 和 `DEPLOY_UNPUBLISHED_REASON`;不得通过环境变量绕过。
- 当前只读发现本地发布线领先远端,因此“是否将精确候选发布到上游”是执行前唯一外部授权问题。未获批准时停在 planning/PAUSED,不连接生产。
## 4. 目标身份与迁移读取
`deploy-existing.sh` 从受控 systemd unit 读取六个部署合同值,不从 Compose 标签猜路径或 SSH 身份。它先执行既有聚合体检,再将合同值和运行时输入传给 `production-preflight.mjs`。
远端 helper 的顺序固定为:
1. 比较 `APP_ORIGIN`、`POSTGRES_DB`、`NODE_ENV`、`COOKIE_SECURE` 与执行时 hash 输入;拒绝 HTTPS 以外、回环、本地回归库和 staging/trialrun 身份。
2. 检查唯一 server/db 容器、运行时 `DATABASE_URL` host/database 和当前数据库名。
3. 执行 `npx prisma migrate status`,在 marker 内输出原始结果。
4. 只读查询 `_prisma_migrations`,计算 applied、异常和 pending 集合,与候选 manifest 和批准 allowlist 精确对账。
5. 查询 `contract_registry` 的 `terminated` 行数并输出 `rollbackWindow=OPEN|CLOSED`。
status 原文仅存在受控 SSH/执行现场;本地 helper 写入 `prisma-migrate-status.txt` 时去除 datasource、连接串和预期身份值,并将稳定摘要写入 `preflight-output.txt`。报告目录复用时只删除两个已知文件,防止旧 PASS 污染新证据。
## 5. 发布与 post gate
只有 target/pre-status/窗口/冻结全部通过,才调用:
```bash
DEPLOY_SERVER=<受控目标> \
DEPLOY_REFRESH_SERVER=<受控刷新目标> \
EXPECTED_PRODUCTION_ORIGIN=<进程输入> \
EXPECTED_PRODUCTION_DB_NAME=<进程输入> \
EXPECTED_PENDING_MIGRATIONS=<明确 allowlist> \
bash deploy/trialrun/deploy-existing.sh
```
包装器固定 `SYNC_ENV=0`、`DEPLOY_DATA_MODE=existing` 和 `DEPLOY_STATUS_OUTPUT_MODE=quiet`。`deploy.sh` 内部的 `prisma migrate deploy` 是本 task 唯一允许的 schema 写入;不允许 seed、业务 API 写入、reset、resolve 或手工 DDL。
部署后 helper 以空 pending allowlist重新执行 target/status/reconciliation,要求 schema up to date;随后才执行 refresh 和只读 readiness。refresh 失败分类为 `DEPLOYED_BUT_CONTRACT_REFRESH_FAILED`,不重复发布应用。
## 6. 回滚窗口
部署前查询 `SELECT count(*) FROM contract_registry WHERE status = 'terminated'`:
- `0` → `rollbackWindow=OPEN`;应用健康失败可按既有发布合同回退兼容版本,但不得 drop 三列。
- `>0` → `rollbackWindow=CLOSED`;旧应用不识别 `terminated`,只能 roll-forward 或兼容 hotfix。
窗口在第一条已提交记录产生的事件时刻关闭,不按时间计算。当前 task 不写入该记录,因此不主动改变窗口状态。任何 rollback 决策必须引用部署前实际读数,而不是部署后补查。
## 7. 证据与失败分流
| 阶段 | 成功证据 | 失败处理 |
| --- | --- | --- |
| 来源/13 项体检 | commit、published/remoteVerified、13 项 PASS 计数 | 停止,不 SSH 写入 |
| target/pre-status/窗口 | 原始受控输出引用、脱敏副本、pending/异常计数、窗口状态 | `PAUSED`,不进入 deploy |
| migrate deploy | deploy wrapper 返回、候选 migration ID | 保留现场,不 reset/resolve/drop/重复部署 |
| post-status/readiness | applied、schema up to date、`/ready`/SHA/smoke | 按窗口状态决定回退或 roll-forward |
| refresh | exact forced-command PASS | `DEPLOYED_BUT_CONTRACT_REFRESH_FAILED`,只修复合同 |
缺少生产凭据、真机或公网条件的项目必须标 `PAUSED/SKIP`,不能转写为 PASS。所有结果都要记录“是否发生真实业务写入=否”。
## 8. 只读复核与收口
本任务涉及生产部署、迁移和回滚规则,实施后启动只读 reviewer;reviewer 只检查门禁顺序、原始/脱敏证据、失败分流和回滚窗口,不修改代码或生产状态。最终只有在所有获批生产、公网和必要真机检查通过时才可告知用户可以测试,否则保留 PAUSED。
@@ -0,0 +1 @@
{"_example": "Fill with {\"file\": \"<path>\", \"reason\": \"<why>\"}. Put spec/research files only — no code paths. Run `python3 .trellis/scripts/get_context.py --mode packages` to list available specs. Delete this line once real entries are added."}
@@ -0,0 +1,65 @@
# 生产部署执行与验收:实施清单
## 0. 规划与启动门禁
- [ ] 已向用户呈现本 task 的最终规划摘要,并取得对该摘要的最新明确批准。
- [ ] 已解决候选发布是否可进入上游的外部授权;未获授权不得使用 unpublished override。
- [ ] 任务从 `planning` 切换到 `in_progress` 前,确认本清单、PRD、design 与 Open Questions 已收敛。
## 1. 候选与本地证据
- [ ] 提交本 task 的规划 artifacts,确认工作区 clean。
- [ ] 记录候选完整 commit、短 SHA、分支和上游包含关系;不把连接串、SSH target 或环境值写入文档。
- [ ] 运行 `node deploy/trialrun/check-source-provenance.mjs`,要求 `published=true`、`remoteVerified=true`。
- [ ] 运行既有本地合同门禁:
- [ ] `node deploy/trialrun/validate-env-contract.js`
- [ ] 相关部署 shell `bash -n`
- [ ] `node --check deploy/trialrun/production-preflight.mjs`
- [ ] 聚焦 `deployment-safety-contract.test.js`
## 2. 生产 preflight(全部只读)
- [ ] 从受控渠道取得 `EXPECTED_PRODUCTION_ORIGIN`、`EXPECTED_PRODUCTION_DB_NAME`、`EXPECTED_PENDING_MIGRATIONS`、`DEPLOY_SERVER`、`DEPLOY_REFRESH_SERVER`;仅存在于进程环境或受控 secret store。
- [ ] 先运行 `check-existing-deployment.sh`,记录 13 项真实 PASS/FAIL 数字;任何 FAIL 停止。
- [ ] 运行 `deploy-existing.sh` 内置的 source/target/preflight,或按同一 wrapper 的只读阶段执行;人工阅读 target gate 原始输出和 Prisma status marker 原文。
- [ ] 核对 candidate migration manifest、`_prisma_migrations` applied/异常/pending 集合和批准 allowlist;未知 pending、failed、rolled-back、unfinished、diverged 或目标身份不确定均 `PAUSED`。
- [ ] 同一只读窗口查询 `terminated` 行数,记录 `rollbackWindow=OPEN|CLOSED`、实际 count 和读取时间;确认这是部署前快照。
- [ ] 确认 preflight 到 deploy 之间有配置/数据库变更冻结;无法保证则停止。
## 3. 获批发布(唯一写入阶段)
- [ ] 再次确认 preflight 所有门禁仍为 PASS,且没有新的远端配置/候选变化。
- [ ] 仅调用 `deploy/trialrun/deploy-existing.sh`,固定 `SYNC_ENV=0`、`DEPLOY_DATA_MODE=existing`、`DEPLOY_STATUS_OUTPUT_MODE=quiet`。
- [ ] 允许的 schema 写入仅为候选 migration;不得执行 `migrate dev`、`reset`、`db push`、`resolve`、手工 DDL、seed 或业务 API 写入。
- [ ] 若 deploy/migrate/init 中途失败,保留远端现场并停止;不自行重试、回滚或清理。
## 4. 发布后只读验收
- [ ] 保存 post-status 原始输出(仅受控现场)及脱敏副本;确认全部候选 migration applied / schema up to date。
- [ ] 核对 `/ready`、完整 build SHA、公开短 SHA 与候选 commit。
- [ ] 运行基础 smoke、external deps smoke、runtime smoke 和公开 bundle 扫描,记录真实数字和输出摘要。
- [ ] 在任何真实终止写入前完成未登录、无权限、详情不存在/无权等权限负向路径及合同详情只读检查;缺凭据项标 `PAUSED/SKIP`。
- [ ] 检查备份合同 refresh;失败记 `DEPLOYED_BUT_CONTRACT_REFRESH_FAILED`,不重复发布应用。
## 5. 失败分流、review 与收口
- [ ] 将每个失败归入 target/migration、应用健康、refresh、public/live/permission 之一;不得把迁移失败与产品回归混为一类。
- [ ] 记录真实业务写入计数为 0(本 task 不主动写入 `terminated` 或其他业务数据)。
- [ ] 对照部署前窗口快照决定兼容回退或 roll-forward;`CLOSED` 时不得回退到不识别 `terminated` 的旧应用,不 drop 三列。
- [ ] 启动只读 reviewer,确认门禁顺序、原始证据可追溯、脱敏副本无敏感信息、失败后没有继续推进。
- [ ] 运行最终 Trellis/process/docs/governance/sensitive/diff 门禁;通过后提交中文 commit 并引用 `08-08-production-deployment-execution`。
- [ ] 只有生产、公网和必要真机全部获批并通过时才可告知用户可以测试;否则保留 `PAUSED`。
- [ ] 归档 task 并记录会话日志,报告中保留 pre/post status、target gate、窗口判定和所有 `PAUSED/SKIP` 原因。
## Rollback Points
1. 来源或 preflight 失败:尚未写入,停止并修正授权/输入后重新检查。
2. `migrate deploy`/init 失败:保留现场,禁止 reset/resolve/drop,等待明确处置。
3. `/ready`/smoke 失败:窗口 OPEN 可按既有合同回退兼容应用;窗口 CLOSED 只 roll-forward。
4. refresh 失败:应用已部署但合同刷新失败,不重复发布应用,只走合同修复流程。
## Evidence Notes
- 原始 target gate 和 Prisma status stdout/stderr 不进 Git;只在受控执行现场留存。
- 任务 artifacts 只保存脱敏副本、commit、状态码、migration ID、计数、窗口状态和证据引用。
- 不保存生产 origin、数据库名、SSH target、用户名、绝对远端路径、连接串、凭据、业务正文或原始 payload。
@@ -0,0 +1,120 @@
# 生产部署执行与验收
## Goal
在已完成生产目标与迁移门禁实现的基础上,于明确批准的生产窗口内执行一次可审计的既有部署,验证合同 `terminated` 三列迁移已经安全落地,并完成部署后只读 readiness 检查。任何门禁失败都必须停止,不得以退出码、部分输出或后续部署结果替代人工核对。
本任务不主动制造真实 `terminated` 记录,也不执行其他业务写入;它只在生产侧执行获批的迁移/发布动作,并保留足以产出审查的脱敏证据。
## Background and Confirmed Facts
- 生产部署入口是 `deploy/trialrun/deploy-existing.sh`。它读取受控 systemd deployment contract,固定 `SYNC_ENV=0`、`DEPLOY_DATA_MODE=existing`,并在 `deploy.sh` 前调用生产 target/pre-migration gate,部署后再做 post-status gate。
- 生产 target gate 必须确认 HTTPS origin、预期 origin、`NODE_ENV=production`、`COOKIE_SECURE=true`、数据库名与预期一致,并拒绝回环、本地回归库、staging/trialrun 等身份。生产判据不能复用本地任务“必须是回环地址”的规则。
- pre-status 的原始 stdout/stderr 只能留在受控执行现场;任务目录和报告只保存脱敏副本、稳定状态码、迁移 ID、计数和证据引用。
- 候选发布必须是干净、已提交并已进入上游的 commit。当前仓库的远端 `origin/main` 落后于本地发布线,且严格 wrapper 拒绝未发布提交 override;在候选发布前必须解决发布来源问题。
- 当前候选迁移为 `20260807193000_contract_registry_termination_workspace`。部署前须从候选 commit 生成 manifest,并以生产 `_prisma_migrations` 与 `prisma migrate status` 原始输出共同核对 pending、failed、rolled-back、unfinished 和 diverged 状态。
- `contract_registry.status = 'terminated'` 的第一条已提交记录会关闭回滚窗口。窗口按事件定义,不按发布时间或时间窗口定义;本任务不执行终止写入。
- 既有生产部署、真实合同写入、企业微信、付款、审批和其他业务数据操作均需受控;本任务明确只授权本节列出的发布迁移和只读验证。
## Scope
1. 在候选发布进入上游且工作区干净后,执行生产 target gate、既有 13 项部署体检、pre-migration status 与 `terminated` 行数查询。
2. 在所有 pre-gate 通过且变更冻结成立后,使用唯一获批入口执行既有部署;允许的 schema 写入仅为候选 commit 已声明的 Prisma migration。
3. 部署后执行 post-migration status、`/ready`、候选 build SHA、基础/external/runtime smoke、公开 bundle 扫描和权限负向/详情只读检查,并生成脱敏证据包。
4. 按失败阶段记录 `PAUSED`、`FAIL` 或 `DEPLOYED_BUT_CONTRACT_REFRESH_FAILED`,完成只读 review、收口和归档。
## Requirements
### R1 发布来源与生产目标
- 候选 commit 必须干净、已提交、已进入配置的上游远端;严格 wrapper 不接受 `DEPLOY_ALLOW_UNPUBLISHED_COMMIT` 或 `DEPLOY_UNPUBLISHED_REASON`。
- 执行时才提供 `EXPECTED_PRODUCTION_ORIGIN`、`EXPECTED_PRODUCTION_DB_NAME` 和 `EXPECTED_PENDING_MIGRATIONS`;这些值不写入仓库、任务文档或普通日志。
- target gate 必须验证 origin、数据库身份、运行时 `DATABASE_URL` host/database、`NODE_ENV` 和 cookie 安全配置;任何身份不确定均 fail-closed。
### R2 pre-status 与回滚窗口先行
- 在任何 `migrate deploy`、seed、应用切换或业务写入前,人工阅读 target gate 和 `prisma migrate status` 原始输出,并核对脱敏副本。
- pending 集合必须与批准 allowlist 精确一致;未知 migration、failed/rolled-back/unfinished/diverged、不可解释 status 或数据库目标漂移均立即停止。
- 同一只读阶段查询 `terminated` 行数:0 记 `rollbackWindow=OPEN`,大于 0 记 `CLOSED`。必须在权限负向路径与任何未来真实终止写入前完成。
### R3 受控发布
- 只使用 `DEPLOY_SERVER=<受控目标> DEPLOY_REFRESH_SERVER=<受控刷新目标> bash deploy/trialrun/deploy-existing.sh`。
- 保持 `SYNC_ENV=0`、`DEPLOY_DATA_MODE=existing`,不得覆盖生产 `.env`,不得选择其他部署脚本或 SSH 身份。
- 只有 R1/R2 全部 PASS 且能证明 preflight 到 deploy 期间目标与配置冻结,才允许进入 schema/app 写入阶段。
### R4 发布后只读验收
- post-status 必须显示候选迁移全部 applied / schema up to date;不能只看命令退出码。
- `/ready`、完整 build SHA、公开短 SHA、基础 smoke、external/runtime smoke、公开 bundle 扫描和权限负向路径必须与候选 commit 一致。
- 登录态、企业微信真机、真实 OCR 或其他缺少专用凭据/样本的检查只能记 `PAUSED/SKIP`,不得伪装成 PASS。
### R5 失败与回滚边界
- target/preflight/status 失败:不部署、不写库,保留现场并返回 `PAUSED`。
- migrate deploy/init 中途失败:保留现场,禁止 reset、resolve、drop、手工 DDL 或重复部署,等待明确决策。
- `OPEN` 窗口下应用健康失败可按既有合同回退兼容应用但不 drop 三列;`CLOSED` 窗口下只允许 roll-forward 或兼容 hotfix。
- refresh 失败标记 `DEPLOYED_BUT_CONTRACT_REFRESH_FAILED`,不重复发布应用。
## Acceptance Criteria
- [ ] AC1:候选 commit 已提交、工作区 clean、已进入上游;来源校验和既有 13 项体检均 PASS。若候选未发布,任务在此处 PAUSED,不使用 override。
- [ ] AC2:target gate 的原始输出在受控现场可供人工阅读,脱敏副本只证明 PASS/FAIL 和原因;HTTPS origin、预期数据库、运行时身份和生产配置全部匹配,未泄露环境值。
- [ ] AC3:任何 schema 写入前完成 pre-status;原始 status 输出与脱敏副本可对账,异常集合为空,pending 与 allowlist 精确一致,`terminated` 行数和 `rollbackWindow=OPEN|CLOSED` 判定已记录。
- [ ] AC4:仅在 AC1–AC3 全部 PASS 后调用 `deploy-existing.sh`;未执行 reset、db push、resolve、手工 DDL、seed 之外的业务写入或真实 `terminated` 写入。
- [ ] AC5:部署后 status 显示全部候选迁移 applied/schema up to date,`/ready`、build SHA、smoke、external/runtime smoke、bundle scan 结果与候选 commit 一致。
- [ ] AC6:权限负向路径和合同详情只读检查排在任何真实终止写入之前;缺少凭据项明确标记 `PAUSED/SKIP`。
- [ ] AC7:结果证据包含候选 commit、target gate、pre/post status 引用、窗口状态、各检查真实数字/输出摘要、失败分流和业务写入计数;不含凭据、原始环境或合同正文。
- [ ] AC8:Trellis task validate、process contract、docs audit、governance、sensitive scan 和 diff check 通过;生产、公网或真机未全通过时,最终答复不得告知“可以测试”。
## Out of Scope
- 不执行真实 `terminated` 写入、合同编辑/归档/恢复、报销/付款/审批/银行/ERP/企业微信写入。
- 不执行 `prisma migrate dev`、`migrate reset`、`db push`、`migrate resolve`、手工 DDL、删除/修改 `_prisma_migrations` 或自动 drop 新列。
- 不修改合同业务代码、权限模型、状态机、生产 `.env` 或应用配置;如发现缺陷,登记后另建 task。
- 不以本地、staging、trialrun 或临时 runner 代替预期生产目标;不以删除断言、缺失凭据或历史报告冒充通过。
- 不在本任务内自行 push/发布候选 commit;候选发布需要明确的外部仓库授权(见 Open Questions)。
## Accepted Risk and Deferred Items
- 首条已提交 `terminated` 记录出现后,旧应用回退窗口永久关闭;本任务只读取并记录窗口状态,不主动关闭它。
- 生产公网 smoke、企业微信真机、登录态或真实 OCR 可能因专用凭据/样本缺失而 `PAUSED/SKIP`,不等同于部署通过。
- preflight 与 deploy 之间无法建立配置/数据库变更冻结时,必须在写入前暂停;post-status 不能事后补救错误目标写入风险。
- 任何非迁移产品失败不得在本任务内顺手修复,应登记为独立后续任务。
## Operational Inputs (not committed)
- `EXPECTED_PRODUCTION_ORIGIN`
- `EXPECTED_PRODUCTION_DB_NAME`
- `EXPECTED_PENDING_MIGRATIONS`
- 受控 `DEPLOY_SERVER`、`DEPLOY_REFRESH_SERVER`、systemd contract 与 live smoke 凭据(如获批提供)
## Open Questions
- **阻塞执行决策:是否批准将本次候选发布线(包含已批准部署 tooling 及本执行 task 的规划提交)发布到配置的上游 `origin/main`,以满足严格 provenance gate?** 当前只读证据显示本地 `HEAD` 尚未在远端,且 wrapper 明确拒绝未发布 override。推荐发布精确候选 commit;若不批准,任务只能停在 AC1/`PAUSED`,不能安全进入生产 preflight。
## Test Plan
### 规划/本地
- `node deploy/trialrun/validate-env-contract.js`
- 新增执行 task 后运行 `python3 ./.trellis/scripts/task.py validate 08-08-production-deployment-execution`
- `node scripts/qa/check-process-contract.mjs --baseline --json`
- `node scripts/qa/audit-docs.mjs --check-registry`
- `node scripts/qa/check-trellis-governance.mjs --json`
- `node scripts/qa/check-sensitive-content.mjs`
- `git diff --check`
### 生产执行窗口
- 先保存 target gate、13 项体检、candidate provenance、pre-status 原始输出(受控现场)及脱敏副本。
- 核对 migration manifest、`_prisma_migrations`、pending allowlist、异常集合和 `terminated` 行数;任一失败即停止。
- 仅在前置证据全部 PASS 后运行 `deploy-existing.sh`。
- 部署后保存 post-status 原始输出及脱敏副本,运行 `/ready`、build/SHA、基础/external/runtime smoke、bundle scan 和权限负向检查。
- 失败按阶段分流;不重复部署、不 reset、不 resolve、不 drop。
## Evidence Rules
- 原始 target/status stdout/stderr 只留在受控执行现场;任务 artifacts 只保存脱敏副本、短 ID、计数、状态码和引用。
- 不记录生产 origin、数据库名、SSH target、用户名、路径、连接串、凭据、业务正文或原始 payload。
- 报告目录重用时仅清理已知 evidence 文件,不能保留旧 PASS。
@@ -0,0 +1,36 @@
{
"id": "production-deployment-execution",
"name": "production-deployment-execution",
"title": "生产部署执行与验收",
"description": "在已完成生产目标与迁移门禁实现的基础上,按独立批准窗口执行生产 target/pre-status、合同终止回滚窗口检查、受控部署、post-status 与只读 readiness 验证;不执行真实 terminated 或其他业务写入,失败即停并保留脱敏证据。",
"status": "in_progress",
"dev_type": null,
"scope": "deployment-production-execution-and-readonly-acceptance",
"package": null,
"priority": "P1",
"creator": "shunli",
"assignee": "shunli",
"createdAt": "2026-08-08",
"completedAt": null,
"branch": null,
"base_branch": "main",
"worktree_path": null,
"commit": null,
"pr_url": null,
"subtasks": [],
"children": [],
"parent": null,
"relatedFiles": [
"deploy/trialrun/deploy-existing.sh",
"deploy/trialrun/deploy.sh",
"deploy/trialrun/check-existing-deployment.sh",
"deploy/trialrun/check-source-provenance.mjs",
"deploy/trialrun/production-preflight.mjs",
"deploy/trialrun/production-preflight-remote.sh",
"deploy/trialrun/deployment-contract-lib.sh",
".trellis/spec/hyb-oa/deployment-trialrun.md",
"server/prisma/migrations/20260807193000_contract_registry_termination_workspace"
],
"notes": "本 task 只执行获批生产发布与只读验收,不执行真实 terminated 或其他业务写入。target/pre-status/terminated 窗口检查必须先于任何写入;首条已提交 terminated 记录按事件关闭回滚窗口。严格 wrapper 拒绝 unpublished override;当前候选发布前必须解决上游发布授权。原始 status 仅留受控现场,任务证据脱敏。",
"meta": {}
}