规划(08-08-production-deployment-execution): 校准唯一生产环境身份门禁
ci-e2e / e2e (push) Canceled after 0s
ci-minimal / check-minimal (push) Canceled after 0s

这个提交包含在:
2026-08-08 17:07:19 +08:00
父节点 e2ad1e2932
当前提交 6ccb9cd5e3
共修改 4 个文件,包含 76 行新增和 32 行删除
@@ -4,12 +4,17 @@
这是一次受控运维执行,不是新的产品开发。已归档的 `08-08-production-deployment-validation` 提供部署 tooling、target gate、迁移 reconciliation 和报告脱敏实现;本 task 只负责在明确批准的生产窗口调用它们、读取结果、分流失败并形成证据。
不修改应用代码、Prisma schema、生产环境变量或业务数据模型。若运行中发现实现缺陷,保留现场并另建 task,不在部署窗口临时修复。
不修改应用代码、Prisma schema、生产环境变量或业务数据模型;本次规划修订允许仅调整部署/QA tooling 及其安全测试。若运行中发现实现缺陷,保留现场并另建 task,不在部署窗口临时修复。
拓扑事实:没有独立预发环境。历史名称为 `hyb-oa-trialrun` 的既有部署就是承载公网 OA 的唯一环境;`trialrun` 只是遗留命名。当前 target gate 的名称启发式与真实拓扑不一致,必须先校准为精确身份匹配,再连接生产。
## 2. 状态序列与硬门禁
```text
候选发布来源
-> 历史身份恢复 + refresh exact probe(只读)
-> systemd contract / 公网 origin 精确核对(只读)
-> 远端 POSTGRES_DB 只读引导(同一进程、不回显)
-> 上游/工作区/13 项部署体检
-> 生产 target identity(只读)
-> Prisma pre-status + _prisma_migrations 对账(只读)
@@ -28,31 +33,44 @@
- 先在本地完成 task 规划提交,使工作区 clean;再以明确的已提交 commit 作为候选。
- 运行 `check-source-provenance.mjs`,要求候选 commit 已进入配置的上游远端且 remote verification 为 true。
- `deploy-existing.sh` 拒绝 `DEPLOY_ALLOW_UNPUBLISHED_COMMIT` 和 `DEPLOY_UNPUBLISHED_REASON`;不得通过环境变量绕过。
- 当前只读发现本地发布线领先远端,因此“是否将精确候选发布到上游”是执行前唯一外部授权问题。未获批准时停在 planning/PAUSED,不连接生产。
- 规划修订前的候选已发布并通过 provenance;修订会产生新的候选 commit,实施前仍须重新提交、推送并确认 `published=true`、`remoteVerified=true`。
## 4. 目标身份与迁移读取
`deploy-existing.sh` 从受控 systemd unit 读取六个部署合同值,不从 Compose 标签猜路径或 SSH 身份。它先执行既有聚合体检,再将合同值和运行时输入传给 `production-preflight.mjs`。
`deploy-existing.sh` 从受控 systemd unit 读取六个部署合同值,不从 Compose 标签猜路径或 SSH 身份。现有实现只校验这些值的格式并把它们传给 preflight,没有将 `DEPLOY_SERVER`、`REMOTE_DIR`、`COMPOSE_PROJECT_NAME` 与独立预期值精确对账;同时远端 helper 对 origin/数据库/host 使用 `trialrun` 名称排除。规划修订要求先补齐独立身份引导与精确比较,再执行生产连接。
远端 helper 的顺序固定为:
### 4.1 只读身份引导
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`。
1. 从已审查历史提交 `34181e3` 的部署入口,在本地进程内恢复既有 `DEPLOY_SERVER`、`REMOTE_DIR` 和 `COMPOSE_PROJECT_NAME`;不输出字面值。
2. 从本机受控 SSH 配置无回显探测 refresh 候选,只有 exact forced-command `probe` 唯一 PASS 时才采用;零个或多个候选均停止。
3. 使用恢复的部署目标只读读取受控 systemd contract,并要求 contract 的远端目录、Compose project 及其余路径合同通过 13 项既有校验;历史身份与当前 contract 不一致即停止。
4. 从 OPS7 当前公网检查基准取得预期 HTTPS origin;只读比较远端 `.env` 和运行容器的 `APP_ORIGIN`,一致后才认为目标已被独立识别。
5. 仅在前四步通过后,从同一远端 `.env` 读取 `POSTGRES_DB` 到当前进程变量;不打印、不写文件。它作为已确认目标的数据库身份基线,用于后续 env、`current_database()` 和运行时 `DATABASE_URL` 三方一致性核对。
数据库名读取不是“连接任意目标后相信其自述”:它必须排在历史目标、远端 contract 和公网 origin 三层独立匹配之后。任一前置失败时不得读取或进入 Prisma status。
### 4.2 完整 target/pre-status
校准后的 helper 顺序固定为:
1. 精确比较执行时恢复的部署目标、远端目录、Compose project、受控 contract、公网 origin 和引导出的数据库身份;不再因合法身份值含 `trialrun` 而拒绝。
2. 继续拒绝 HTTPS 以外、回环/零地址、local regression、staging、shadow、测试占位符,以及任何精确身份组不一致。
3. 检查唯一 server/db 容器、运行时 `DATABASE_URL` host/database、当前数据库名、`NODE_ENV=production` 和 `COOKIE_SECURE=true`。
4. 执行 `npx prisma migrate status`,在 marker 内输出原始结果。
5. 只读查询 `_prisma_migrations`,计算 applied、异常和 pending 集合,与候选 manifest 和批准 allowlist 精确对账。
6. 查询 `contract_registry` 的 `terminated` 行数并输出 `rollbackWindow=OPEN|CLOSED`。
status 原文仅存在受控 SSH/执行现场;本地 helper 写入 `prisma-migrate-status.txt` 时去除 datasource、连接串和预期身份值,并将稳定摘要写入 `preflight-output.txt`。报告目录复用时只删除两个已知文件,防止旧 PASS 污染新证据。
## 5. 发布与 post gate
只有 target/pre-status/窗口/冻结全部通过,才调用:
只有身份引导、target/pre-status、窗口和冻结全部通过,才调用:
```bash
DEPLOY_SERVER=<受控目标> \
DEPLOY_REFRESH_SERVER=<受控刷新目标> \
EXPECTED_PRODUCTION_ORIGIN=<进程输入> \
EXPECTED_PRODUCTION_DB_NAME=<进程输入> \
DEPLOY_SERVER=<历史身份恢复,仅进程内> \
DEPLOY_REFRESH_SERVER=<exact probe 唯一身份,仅进程内> \
EXPECTED_PRODUCTION_ORIGIN=<OPS7 公网基准,仅进程内> \
EXPECTED_PRODUCTION_DB_NAME=<只读引导,仅进程内> \
EXPECTED_PENDING_MIGRATIONS=<明确 allowlist> \
bash deploy/trialrun/deploy-existing.sh
```
@@ -70,11 +88,14 @@ bash deploy/trialrun/deploy-existing.sh
窗口在第一条已提交记录产生的事件时刻关闭,不按时间计算。当前 task 不写入该记录,因此不主动改变窗口状态。任何 rollback 决策必须引用部署前实际读数,而不是部署后补查。
由于没有同构预发环境,`OPEN` 窗口下的兼容应用回退是本轮唯一可用的旧版本退路;一旦窗口 CLOSED,所有恢复只能在唯一公网环境 roll-forward 或部署兼容 hotfix。不得把本地 synthetic fixture 当作预发替代证据。
## 7. 证据与失败分流
| 阶段 | 成功证据 | 失败处理 |
| --- | --- | --- |
| 来源/13 项体检 | commit、published/remoteVerified、13 项 PASS 计数 | 停止,不 SSH 写入 |
| 历史身份/refresh/bootstrap | 历史 commit 引用、exact probe 计数、contract/origin 匹配和 DB 引导状态码 | 任一不唯一/不一致即停止,不进入 Prisma status |
| 来源/13 项体检 | commit、published/remoteVerified、13 项 PASS 计数 | 停止,不执行部署写入 |
| 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 |
@@ -5,6 +5,7 @@
- [x] 已向用户呈现本 task 的最终规划摘要,并取得对该摘要的最新明确批准。
- [x] 已解决候选发布是否可进入上游的外部授权;未获授权不得使用 unpublished override。
- [x] 任务从 `planning` 切换到 `in_progress` 前,确认本清单、PRD、design 与 Open Questions 已收敛。
- [ ] **规划修订复核:**确认唯一公网环境拓扑、精确身份匹配和数据库名只读引导的修订摘要,并重新批准后再改 tooling/连接生产。
## 1. 候选与本地证据
@@ -15,12 +16,22 @@
- [x] `node deploy/trialrun/validate-env-contract.js`
- [x] 相关部署 shell `bash -n`
- [x] `node --check deploy/trialrun/production-preflight.mjs`
- [x] 聚焦 `deployment-safety-contract.test.js`(既有提交证据为 13/13,本轮未重复触发生产动作)
- [x] 聚焦 `deployment-safety-contract.test.js`(既有提交证据为 13/13,本轮未重复触发生产动作)
## 1.1 拓扑校准与 tooling 修订(生产前)
- [ ] **刻意次序调整:**本轮 target gate 不再是第一条生产命令;历史身份恢复、refresh exact probe、systemd contract/公网 origin 核对、远端 `POSTGRES_DB` 只读引导四步探测排在其之前。四步全程只读、逐步 fail-closed,任一失败均不得进入 target gate 或 Prisma status。
- [ ] 从 `34181e3` 只读恢复历史 `DEPLOY_SERVER`、`REMOTE_DIR`、`COMPOSE_PROJECT_NAME`,仅保存在当前进程;不把值写入 task、日志或对话。
- [ ] 无回显探测 `DEPLOY_REFRESH_SERVER`,要求 exact forced-command `probe` 唯一 PASS;多个候选或零候选均 PAUSED。
- [ ] 修改 production preflight:取消对合法 `trialrun` 命名的单独拒绝,增加部署目标、远端目录、Compose project、systemd contract、公网 origin 的精确身份对账;保留回环/零地址/local regression/staging/shadow/placeholder 防线。
- [ ] 增加只读数据库身份 bootstrap:身份组匹配后读取远端 `.env` 的 `POSTGRES_DB`,只在内存中传给 target gate,禁止回显/落盘;读取失败或身份组不一致时不得进入 Prisma status。
- [ ] 增加 synthetic fixture:合法 `hyb-oa-trialrun` 身份通过;错误目录/project/host/db、回环、staging、占位符和多 refresh 候选 fail-closed;断言 bootstrap 不泄露值且顺序早于 status。
- [ ] 重新运行部署安全测试、shell/Node syntax、task/governance/sensitive/diff 门禁,提交并推送新的候选后重新通过 provenance。
## 2. 生产 preflight(全部只读)
- [ ] 从受控渠道取得 `EXPECTED_PRODUCTION_ORIGIN`、`EXPECTED_PRODUCTION_DB_NAME`、`EXPECTED_PENDING_MIGRATIONS`、`DEPLOY_SERVER`、`DEPLOY_REFRESH_SERVER`;仅存在于进程环境或受控 secret store。——**PAUSED:本次执行环境中均未注入;未猜测或回显值。**
- [ ] 先运行 `check-existing-deployment.sh`,记录 13 项真实 PASS/FAIL 数字;任何 FAIL 停止。——**PAUSED:生产输入缺失,未连接生产。**
- [ ] 在同一进程内加载现行 OPS7 origin、历史身份恢复结果、exact refresh identity、只读 DB bootstrap 结果和 `EXPECTED_PENDING_MIGRATIONS`;不把任何值写入仓库或对话。
- [ ] 先运行 `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 和读取时间;确认这是部署前快照。
@@ -78,3 +89,9 @@
- 仓库外的三份验收 env 文件仍存在且为受控用户、`0600` 权限;它们只包含 live smoke、SMTP 或一次性账号键,不包含生产部署身份/数据库输入,未被本 task 读取或 source。
- Git 历史没有 `deploy/trialrun/.env`、`deploy.env` 或上述验收 env 文件的删除记录;`.gitignore` 从始终将 `.env` 排除在版本库之外。
- shell 历史没有五个部署变量的字面赋值记录。结论:部署输入不是被本 task 删除,而是按运维合同设计为每次执行时临时注入。
## Planning Revision Evidence (2026-08-08)
- 历史提交 `34181e3` 的旧 `deploy.sh` 确有默认试运行身份;该身份的目录/project 命名与公网 origin 属于同一唯一运行环境,不能因 `trialrun` 字样单独拒绝。
- 现行 gate 尚未对 `DEPLOY_SERVER`、`REMOTE_DIR`、`COMPOSE_PROJECT_NAME` 与独立预期身份做精确对账;本节修订只允许先改部署/QA tooling,不改业务代码或生产数据。
- 修订后的第一条远端动作仍是只读身份 bootstrap;数据库名读取排在 exact identity 匹配之后,任何 bootstrap 或 target gate FAIL 都不得继续。
@@ -9,16 +9,17 @@
## 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 等身份。生产判据不能复用本地任务“必须是回环地址”的规则。
- 当前没有独立预发环境:历史命名为 `hyb-oa-trialrun` 的既有部署就是承载公网 OA 的唯一运行环境。`trialrun` 是遗留命名,不代表另一套非生产实例;这次 schema 迁移无法先在同构预发环境演练。
- 生产 target gate 必须确认 HTTPS 公网 origin、`NODE_ENV=production`、`COOKIE_SECURE=true`、数据库身份和既有部署合同。不得再以名称中含 `trialrun` 作为拒绝依据;改为精确匹配已确认的部署身份组,并继续拒绝回环、本地回归库、staging、shadow、测试占位符等真实非生产目标。
- pre-status 的原始 stdout/stderr 只能留在受控执行现场;任务目录和报告只保存脱敏副本、稳定状态码、迁移 ID、计数和证据引用。
- 候选发布必须是干净、已提交并已进入上游的 commit。当前仓库的远端 `origin/main` 落后于本地发布线,且严格 wrapper 拒绝未发布提交 override;在候选发布前必须解决发布来源问题。
- 候选发布必须是干净、已提交并已进入上游的 commit。规划阶段曾发现 `origin/main` 落后并已通过受控提交解决;严格 wrapper 仍拒绝未发布提交 override,任何规划修订都必须重新提交、推送并复核 provenance。
- 当前候选迁移为 `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` 行数查询。
1. 在候选发布进入上游且工作区干净后,先从已审查的历史 Git 事实和受控远端合同完成只读身份引导,再执行生产 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、收口和归档。
@@ -28,8 +29,11 @@
### 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。
- 公网 origin 从当前 OPS7 运维交接 Runbook 的现行公网检查基准取得;部署 SSH 目标、远端目录和 Compose project 从已审查历史提交 `34181e3` 的既有部署入口恢复,只在执行进程内使用,不复制到任务文档或普通日志。
- `DEPLOY_REFRESH_SERVER` 通过本机受控 SSH 配置的 exact forced-command `probe` 唯一识别;零个或多个候选均立即停止,不按别名、顺序或连接速度猜测。
- 生产数据库名只允许在部署目标、远端目录、Compose project、受控 systemd contract 和公网 origin 已精确匹配后,通过一次获批的远端 `.env` 只读读取取得;值仅保留在同一执行进程内并转换为 target gate 所需的比较输入,不回显、不落盘。
- target gate 必须精确验证 `DEPLOY_SERVER`、`REMOTE_DIR`、`COMPOSE_PROJECT_NAME`、公网 origin 与读取后的 `POSTGRES_DB` 身份组,并继续核对运行时 `DATABASE_URL` host/database、当前数据库、`NODE_ENV` 和 cookie 安全配置;任一身份不确定均 fail-closed。
- `EXPECTED_PENDING_MIGRATIONS` 可先以空集合运行只读 pre-status 发现实际 pending;只要实际集合非空或不等于批准 allowlist,就必须停止并逐条复核 SQL,不能自动进入部署。
### R2 pre-status 与回滚窗口先行
@@ -59,7 +63,7 @@
## Acceptance Criteria
- [ ] AC1:候选 commit 已提交、工作区 clean、已进入上游;来源校验和既有 13 项体检均 PASS。若候选未发布,任务在此处 PAUSED,不使用 override。
- [ ] AC2:target gate 的原始输出在受控现场可供人工阅读,脱敏副本只证明 PASS/FAIL 和原因;HTTPS origin、预期数据库、运行时身份和生产配置全部匹配,未泄露环境值。
- [ ] AC2:只读身份引导证明历史部署目标、远端目录、Compose project、受控 systemd contract 与公网 origin 属于同一唯一运行环境;数据库名只在该前提下读取到同一进程。target gate 的原始输出在受控现场可供人工阅读,脱敏副本只证明 PASS/FAIL 和原因,未泄露任何身份值。
- [ ] 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 一致。
@@ -72,26 +76,27 @@
- 不执行真实 `terminated` 写入、合同编辑/归档/恢复、报销/付款/审批/银行/ERP/企业微信写入。
- 不执行 `prisma migrate dev`、`migrate reset`、`db push`、`migrate resolve`、手工 DDL、删除/修改 `_prisma_migrations` 或自动 drop 新列。
- 不修改合同业务代码、权限模型、状态机、生产 `.env` 或应用配置;如发现缺陷,登记后另建 task。
- 不以本地、staging、trialrun 或临时 runner 代替预期生产目标;不以删除断言、缺失凭据或历史报告冒充通过。
- 不在本任务内自行 push/发布候选 commit;候选发布需要明确的外部仓库授权(见 Open Questions)。
- 不以本地、staging、shadow、回归库或临时 runner 代替预期生产目标;不得仅凭环境名称包含或不包含 `trialrun` 判定身份,必须使用精确身份组。
- 不把从历史 Git 或远端 `.env` 读取到的身份值写回仓库、任务文档、普通日志或对话。
## Accepted Risk and Deferred Items
- 首条已提交 `terminated` 记录出现后,旧应用回退窗口永久关闭;本任务只读取并记录窗口状态,不主动关闭它。
- 当前没有同构预发环境;13 项体检、target/pre-status、回滚窗口和 `/ready` 是唯一运行环境上的主要安全网。窗口 OPEN 时的兼容回退是本轮唯一一次可用的旧版本回退机会。
- 生产公网 smoke、企业微信真机、登录态或真实 OCR 可能因专用凭据/样本缺失而 `PAUSED/SKIP`,不等同于部署通过。
- preflight 与 deploy 之间无法建立配置/数据库变更冻结时,必须在写入前暂停;post-status 不能事后补救错误目标写入风险。
- 任何非迁移产品失败不得在本任务内顺手修复,应登记为独立后续任务。
## Operational Inputs (not committed)
- `EXPECTED_PRODUCTION_ORIGIN`
- `EXPECTED_PRODUCTION_DB_NAME`
- `EXPECTED_PRODUCTION_ORIGIN`(从现行 OPS7 公网基准在进程内取得)
- `EXPECTED_PRODUCTION_DB_NAME`(仅在精确身份引导通过后,从远端 `.env` 只读取得并保留在同一进程)
- `EXPECTED_PENDING_MIGRATIONS`
- 受控 `DEPLOY_SERVER`、`DEPLOY_REFRESH_SERVER`、systemd contract 与 live smoke 凭据(如获批提供)
- 受控 `DEPLOY_SERVER`(从已审查历史入口恢复)、`DEPLOY_REFRESH_SERVER`(exact probe 唯一识别)、systemd contract 与 live smoke 凭据(如获批提供)
## Open Questions
- **阻塞执行决策:是否批准将本次候选发布线(包含已批准部署 tooling 及本执行 task 的规划提交)发布到配置的上游 `origin/main`,以满足严格 provenance gate?** 当前只读证据显示本地 `HEAD` 尚未在远端,且 wrapper 明确拒绝未发布 override。推荐发布精确候选 commit;若不批准,任务只能停在 AC1/`PAUSED`,不能安全进入生产 preflight。
- 无。唯一公网环境拓扑、精确身份匹配和数据库名只读引导方式均已由用户确认;修订规划仍需复核批准后才实施 tooling 改动或连接生产。
## Test Plan
@@ -107,7 +112,8 @@
### 生产执行窗口
- 先保存 target gate、13 项体检、candidate provenance、pre-status 原始输出(受控现场)及脱敏副本。
- 先验证历史身份恢复与 exact refresh probe;只读核对远端 systemd contract 和公网 origin,再在不回显值的同一进程中读取数据库名。
- 保存 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 和权限负向检查。
@@ -31,6 +31,6 @@
".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;规划提交 4596ed0 与暂停证据提交 73f1467 均已发布且 provenance PASS。2026-08-08 执行因五个必需生产进程输入(预期 origin、数据库名、pending allowlist、部署 SSH 身份、刷新 SSH 身份)未注入而 PAUSED;追溯确认部署输入未被本 task 删除,而是按合同不持久化、每次临时注入。受控 contract 路径按设计由远端 systemd unit 读取,不属于本地输入缺失。未连接生产、未写库;后续必须在同一受控环境从 target gate 重新开始。原始 status 仅留受控现场,任务证据脱敏。",
"notes": "本 task 只执行获批生产发布与只读验收,不执行真实 terminated 或其他业务写入。target/pre-status/terminated 窗口检查必须先于任何写入;首条已提交 terminated 记录按事件关闭回滚窗口。规划提交 4596ed0、暂停证据提交 73f1467、证据校准提交 e2ad1e2 均已发布且 provenance PASS。已确认不存在独立预发环境,历史 hyb-oa-trialrun 身份承载唯一公网 OA;规划修订要求用精确身份组替代 trialrun 名称排除,并在身份匹配后只读引导 POSTGRES_DB。当前未连接生产、未写库;修订 tooling 需用户复核批准后再实施。原始 status 仅留受控现场,任务证据脱敏。",
"meta": {}
}