D3-D4 同步 release candidate 并完成 R4 复检
这个提交包含在:
@@ -1,14 +1,14 @@
|
|||||||
# R4 部署预检记录(2026-05-10)
|
# R4 部署预检记录(2026-05-10)
|
||||||
|
|
||||||
**文档状态**:R4 只读预检证据。
|
**文档状态**:R4 预检、D3 同步与 D4 只读复检证据。
|
||||||
**执行范围**:`issues/2026-05-10_12-39-37-release-readiness-live-smoke.csv` 的 R4。
|
**执行范围**:`issues/2026-05-10_12-39-37-release-readiness-live-smoke.csv` 的 R4,以及 `issues/2026-05-10_13-20-38-deployment-version-sync-governance.csv` 的 D1-D5。
|
||||||
**结论**:`BLOCKED`。远端服务健康、迁移状态和 Caddy 基础状态正常,但远端运行时代码未能核对到本轮 release candidate,R5 不能开始。
|
**当前结论**:`DONE`。D3 已用既有部署脚本同步 release candidate,D4 只读复检通过;R5 因缺真实公网账号和 OCR 样票仍保持 `TODO/SKIP`。
|
||||||
|
|
||||||
## 1. 边界
|
## 1. 初始 R4 边界
|
||||||
|
|
||||||
- 本轮未部署。
|
- 初始 R4 只读预检未部署。
|
||||||
- 本轮未修改远端 `.env`。
|
- 初始 R4 未修改远端 `.env`。
|
||||||
- 本轮未执行 migration、seed、备份创建、服务重启或生产数据写入。
|
- 初始 R4 未执行 migration、seed、备份创建、服务重启或生产数据写入。
|
||||||
- 本轮未读取、打印、提交真实密码、JWT secret、企业微信 secret、腾讯 OCR secret 或数据库连接串明文。
|
- 本轮未读取、打印、提交真实密码、JWT secret、企业微信 secret、腾讯 OCR secret 或数据库连接串明文。
|
||||||
- 企业微信真机、公网真实账号登录和真实 OCR 样票验证仍属于 R5;本轮只停留在 readiness 检查。
|
- 企业微信真机、公网真实账号登录和真实 OCR 样票验证仍属于 R5;本轮只停留在 readiness 检查。
|
||||||
|
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
| 远端目录 | `/opt/hyb-oa-trialrun` 存在 |
|
| 远端目录 | `/opt/hyb-oa-trialrun` 存在 |
|
||||||
| 远端版本来源 | 远端不是 git 工作树,无法用 `git rev-parse` 直接确认版本 |
|
| 远端版本来源 | 远端不是 git 工作树,无法用 `git rev-parse` 直接确认版本 |
|
||||||
|
|
||||||
关键运行时文件哈希抽查结果:
|
初始关键运行时文件哈希抽查结果:
|
||||||
|
|
||||||
| 文件 | 结论 |
|
| 文件 | 结论 |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
@@ -37,7 +37,7 @@
|
|||||||
| `server/src/routes/contractsRegistry.js` | 一致 |
|
| `server/src/routes/contractsRegistry.js` | 一致 |
|
||||||
| `server/src/routes/projects.js` | 一致 |
|
| `server/src/routes/projects.js` | 一致 |
|
||||||
|
|
||||||
判定:远端当前可运行,但不能宣称已经是本轮 release candidate。由于不一致文件覆盖审批中心和权限导航护栏,按 R4 规则必须停止在预检阶段,先拆部署版本同步治理 Issue。
|
初始判定:远端当时可运行,但不能宣称已经是本轮 release candidate。由于不一致文件覆盖审批中心和权限导航护栏,按 R4 规则停止在预检阶段,并拆分部署版本同步治理 Issue。
|
||||||
|
|
||||||
## 3. 本地只读检查
|
## 3. 本地只读检查
|
||||||
|
|
||||||
@@ -93,9 +93,9 @@
|
|||||||
| 反代目标 | `/etc/caddy/Caddyfile` 包含 `reverse_proxy 127.0.0.1:3000` |
|
| 反代目标 | `/etc/caddy/Caddyfile` 包含 `reverse_proxy 127.0.0.1:3000` |
|
||||||
| 443 监听 | `caddy` 正在监听 `*:443` |
|
| 443 监听 | `caddy` 正在监听 `*:443` |
|
||||||
|
|
||||||
## 6. R4 判定
|
## 6. 初始 R4 判定
|
||||||
|
|
||||||
R4 未通过,保持 `DOING/TODO/TODO`,原因是远端运行时代码与本轮 release candidate 不一致,且远端不是 git 工作树,无法用提交号直接证明当前运行版本。
|
初始 R4 未通过,保持 `DOING/TODO/TODO`,原因是远端运行时代码与本轮 release candidate 不一致,且远端不是 git 工作树,无法用提交号直接证明当前运行版本。
|
||||||
|
|
||||||
不一致不应在 R4 内通过远端手工修补解决。建议下一步先审批并执行部署版本同步治理:
|
不一致不应在 R4 内通过远端手工修补解决。建议下一步先审批并执行部署版本同步治理:
|
||||||
|
|
||||||
@@ -104,12 +104,12 @@ R4 未通过,保持 `DOING/TODO/TODO`,原因是远端运行时代码与本
|
|||||||
- 使用既有 `deploy/trialrun/deploy.sh` 或批准后的等效流程同步远端文件树、构建并执行部署脚本内置 smoke。
|
- 使用既有 `deploy/trialrun/deploy.sh` 或批准后的等效流程同步远端文件树、构建并执行部署脚本内置 smoke。
|
||||||
- 部署后重新执行 R4 只读预检;通过后才进入 R5 live smoke。
|
- 部署后重新执行 R4 只读预检;通过后才进入 R5 live smoke。
|
||||||
|
|
||||||
## 7. SKIP 与禁止项
|
## 7. 初始 SKIP 与禁止项
|
||||||
|
|
||||||
- `SKIP`:真实公网账号登录,原因是缺 `LIVE_SMOKE_*`。
|
- `SKIP`:真实公网账号登录,原因是缺 `LIVE_SMOKE_*`。
|
||||||
- `SKIP`:真实 OCR 样票,原因是缺 OCR live 文件或目录环境变量。
|
- `SKIP`:真实 OCR 样票,原因是缺 OCR live 文件或目录环境变量。
|
||||||
- `SKIP`:企业微信手机真机,原因是 R5 才执行。
|
- `SKIP`:企业微信手机真机,原因是 R5 才执行。
|
||||||
- 禁止在 R4 内继续部署、重启、迁移、修改 `.env` 或写生产数据。
|
- 初始 R4 内禁止继续部署、重启、迁移、修改 `.env` 或写生产数据。
|
||||||
|
|
||||||
## 8. D1-D2 后续复核(2026-05-10)
|
## 8. D1-D2 后续复核(2026-05-10)
|
||||||
|
|
||||||
@@ -123,6 +123,25 @@ R4 未通过,保持 `DOING/TODO/TODO`,原因是远端运行时代码与本
|
|||||||
| D2 备份目录 | 远端 `deploy/trialrun/backups` 存在 |
|
| D2 备份目录 | 远端 `deploy/trialrun/backups` 存在 |
|
||||||
| D2 最近备份 | 2026-05-10 13:43 已创建 `hyb-oa-db-20260510_134340.dump`(2691566 bytes)和 `hyb-oa-storage-20260510_134341.tar.gz`(2610057 bytes) |
|
| D2 最近备份 | 2026-05-10 13:43 已创建 `hyb-oa-db-20260510_134340.dump`(2691566 bytes)和 `hyb-oa-storage-20260510_134341.tar.gz`(2610057 bytes) |
|
||||||
| D2 回滚路径 | runbook 已包含 DB/storage 备份、恢复、仅代码回滚和 DB 回滚步骤 |
|
| D2 回滚路径 | runbook 已包含 DB/storage 备份、恢复、仅代码回滚和 DB 回滚步骤 |
|
||||||
| D2 结论 | `DONE`:部署前新近备份已创建;D3 受控同步 release candidate 仍需用户单独批准 |
|
| D2 结论 | `DONE`:部署前新近备份已创建;当时 D3 仍需用户单独批准,后续执行结果见第 9 节 |
|
||||||
|
|
||||||
D3 受控同步 release candidate 仍未执行。R5 live smoke 仍保持 `TODO/SKIP`。
|
D3 受控同步 release candidate 后续已执行,结果见第 9 节。R5 live smoke 仍保持 `TODO/SKIP`。
|
||||||
|
|
||||||
|
## 9. D3-D5 发布同步与复检(2026-05-10)
|
||||||
|
|
||||||
|
执行合同:`issues/2026-05-10_13-20-38-deployment-version-sync-governance.csv`。
|
||||||
|
|
||||||
|
| 项目 | 结果 |
|
||||||
|
| --- | --- |
|
||||||
|
| D3 部署同步 | `DONE`:执行 `bash deploy/trialrun/deploy.sh` 成功 |
|
||||||
|
| 环境同步 | `SYNC_ENV=0`,未覆盖远端 `.env` |
|
||||||
|
| 部署脚本门禁 | env contract、rsync、容器重建、init、Prisma migrate status、`/ready`、external deps smoke、runtime smoke、公网 bundle 文案扫描均完成 |
|
||||||
|
| 远端关键文件哈希 | `workspaceSettings.js`、`NavLinks.tsx`、`workflow.js` 及其他抽查运行时文件已与本地一致 |
|
||||||
|
| 远端服务 | `hyb-oa-trialrun-server` 与 `hyb-oa-trialrun-db` 运行中,DB healthy,本机 `/ready` 返回 200 |
|
||||||
|
| Prisma migration | 46 migrations found;`Database schema is up to date!` |
|
||||||
|
| Caddy | `active/enabled`,配置有效,`oa.hyinda.com` 反代到 `127.0.0.1:3000`,443 监听正常 |
|
||||||
|
| 企业微信 config | 公网接口 200,`enabled/entryEnabled/oauthEnabled=true`,响应不包含 secret |
|
||||||
|
| 公网资源扫描 | `node scripts/qa/check-public-bundle-copy.mjs https://oa.hyinda.com`:scanned=54,focused=4,findings=0 |
|
||||||
|
| R5 readiness | `liveSmokeReady=false`、`liveOcrReady=false`;缺 `LIVE_SMOKE_*` 与 OCR live 文件或目录 |
|
||||||
|
|
||||||
|
R4 已可回填 `DONE/DONE/DONE`。R5 真实公网账号、企业微信真机和真实 OCR 样票验证仍未执行,不能宣称通过。
|
||||||
|
|||||||
@@ -10,8 +10,8 @@
|
|||||||
- Release candidate:`537e608 A8 完成首轮主线总回归门禁`。
|
- Release candidate:`537e608 A8 完成首轮主线总回归门禁`。
|
||||||
- 主开发合同:`issues/2026-05-09_20-57-19-mvp-mainline-dev-kickoff.csv`,A1-A8 已全部 `DONE/DONE/DONE`。
|
- 主开发合同:`issues/2026-05-09_20-57-19-mvp-mainline-dev-kickoff.csv`,A1-A8 已全部 `DONE/DONE/DONE`。
|
||||||
- 剩余主线批次合同:`issues/2026-05-10_10-48-03-mvp-remaining-mainline-closeout.csv`,B1-B5 已全部 `DONE/DONE/DONE`。
|
- 剩余主线批次合同:`issues/2026-05-10_10-48-03-mvp-remaining-mainline-closeout.csv`,B1-B5 已全部 `DONE/DONE/DONE`。
|
||||||
- 当前状态:本地门禁已闭环;R4 只读部署预检已执行但被远端运行时代码版本不一致阻断;尚未部署本轮 release candidate。
|
- 当前状态:本地门禁已闭环;R4 部署预检、D3 受控同步和 D4 只读复检已完成;公网已部署本轮 release candidate。
|
||||||
- 当前最大缺口:需先完成远端 release candidate 同步治理;公网真实账号、企业微信真机和真实 OCR 样票条件仍未闭环,继续按 `SKIP` 处理。
|
- 当前最大缺口:公网真实账号、企业微信真机和真实 OCR 样票条件仍未闭环,继续按 `SKIP` 处理,R5 尚未执行。
|
||||||
|
|
||||||
首轮路线保持不变:OA 是唯一业务主系统和正式审批中心;企业微信只做入口、身份、通知、deeplink 和打卡原始采集边界;不接飞书,不接企业微信原生审批。
|
首轮路线保持不变:OA 是唯一业务主系统和正式审批中心;企业微信只做入口、身份、通知、deeplink 和打卡原始采集边界;不接飞书,不接企业微信原生审批。
|
||||||
|
|
||||||
@@ -75,13 +75,13 @@ node scripts/qa/check-live-smoke-env.mjs
|
|||||||
|
|
||||||
如发现服务端权限缺口,必须停止部署并拆独立修复 Issue;不得用前端隐藏临时绕过。
|
如发现服务端权限缺口,必须停止部署并拆独立修复 Issue;不得用前端隐藏临时绕过。
|
||||||
|
|
||||||
R3 审计执行记录见 [`permission-direct-access-audit.md`](permission-direct-access-audit.md)。2026-05-10 本地自动化直连审计已通过,未发现权限泄漏;R4 只读部署预检记录见 [`deployment-preflight-2026-05-10.md`](deployment-preflight-2026-05-10.md),当前因远端运行时代码版本未对齐 release candidate 而阻断。
|
R3 审计执行记录见 [`permission-direct-access-audit.md`](permission-direct-access-audit.md)。2026-05-10 本地自动化直连审计已通过,未发现权限泄漏;R4/D3/D4 记录见 [`deployment-preflight-2026-05-10.md`](deployment-preflight-2026-05-10.md),当前远端运行时代码已对齐 release candidate。
|
||||||
|
|
||||||
## 5. 部署预检
|
## 5. 部署预检
|
||||||
|
|
||||||
部署前只做只读确认,不直接改生产:
|
部署前只做只读确认,不直接改生产:
|
||||||
|
|
||||||
2026-05-10 R4 只读预检结论:`BLOCKED`。远端 `/ready`、Prisma migration、备份目录、Caddy 和企业微信 config 基础状态正常,但远端不是 git 工作树,且 `workspaceSettings.js`、`NavLinks.tsx`、`workflow.js` 等关键运行时文件与 `537e608/2bab4e5` 不一致。R5 不得开始,需先执行 `issues/2026-05-10_13-20-38-deployment-version-sync-governance.csv`。
|
2026-05-10 R4/D3/D4 结论:`DONE`。已创建部署前 DB/storage 备份,执行 `bash deploy/trialrun/deploy.sh` 同步远端文件树并完成脚本内置 smoke;部署后只读复检显示关键运行时文件哈希对齐、Prisma migration up to date、`/ready` 200、Caddy 正常、企业微信 config 不返回 secret、公网资源文案扫描 0 findings。R5 仍需真实账号、企业微信真机和真实 OCR 样票后单独执行。
|
||||||
|
|
||||||
- 当前生产 commit、部署目录和本地 release candidate 是否一致。
|
- 当前生产 commit、部署目录和本地 release candidate 是否一致。
|
||||||
- 生产 `.env` 必需项是否完整;检查时不得打印 secret。
|
- 生产 `.env` 必需项是否完整;检查时不得打印 secret。
|
||||||
|
|||||||
@@ -2,6 +2,6 @@ ID,Title,Description,Acceptance,Test_Method,Tools,Dev_Status,Review1_Status,Regr
|
|||||||
R1,发布候选证据整理,"固定首轮主线 release candidate,汇总 A1-A8 提交、已通过门禁、SKIP 原因、未部署状态和回滚口径;本 Issue 不改业务代码。","1) 明确 release candidate commit;2) A1-A8 与 B1-B5 状态可追溯;3) 本地已通过门禁和 live smoke 缺项清晰;4) 不写入真实账号、密钥或样票路径。","流程级验证:人工核对 git log、主 CSV、批次 CSV 和发布准备清单;命令:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-10_12-39-37-release-readiness-live-smoke.csv;命令:rg -n \"537e608|liveSmokeReady=false|liveOcrReady=false|未部署|SKIP\" docs/trialrun/release-readiness-checklist.md issues/2026-05-10_12-39-37-release-readiness-live-smoke.csv。","git|python3|rg|manual",DONE,DONE,DONE,"docs/trialrun/release-readiness-checklist.md|issues/2026-05-10_12-39-37-release-readiness-live-smoke.csv","[]","已固定 RC=537e608;公网、企业微信真机、真实 OCR 未在本轮执行,必须等 R4/R5 条件满足后补测;回滚优先回到上一稳定提交或恢复上次部署包。"
|
R1,发布候选证据整理,"固定首轮主线 release candidate,汇总 A1-A8 提交、已通过门禁、SKIP 原因、未部署状态和回滚口径;本 Issue 不改业务代码。","1) 明确 release candidate commit;2) A1-A8 与 B1-B5 状态可追溯;3) 本地已通过门禁和 live smoke 缺项清晰;4) 不写入真实账号、密钥或样票路径。","流程级验证:人工核对 git log、主 CSV、批次 CSV 和发布准备清单;命令:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-10_12-39-37-release-readiness-live-smoke.csv;命令:rg -n \"537e608|liveSmokeReady=false|liveOcrReady=false|未部署|SKIP\" docs/trialrun/release-readiness-checklist.md issues/2026-05-10_12-39-37-release-readiness-live-smoke.csv。","git|python3|rg|manual",DONE,DONE,DONE,"docs/trialrun/release-readiness-checklist.md|issues/2026-05-10_12-39-37-release-readiness-live-smoke.csv","[]","已固定 RC=537e608;公网、企业微信真机、真实 OCR 未在本轮执行,必须等 R4/R5 条件满足后补测;回滚优先回到上一稳定提交或恢复上次部署包。"
|
||||||
R2,本地门禁与 Runbook 补强,"把 A8 本地回归真实需要的本地服务参数、命令顺序、live smoke 检查和 SKIP 规则写入当前操作手册,避免后续误判。","1) Runbook 写明 SERVE_CLIENT_DIST、OCR_PROVIDER、IM_NOTIFIER_ENABLED、FIELD_ENCRYPTION_KEY 和项目 feature env 的本地门禁用途;2) live smoke 清单链接到发布准备清单;3) 不新增业务 API、数据库迁移或部署操作。","流程级验证:人工阅读 Runbook 能复现 A8 本地门禁准备;命令:rg -n \"发布候选|SERVE_CLIENT_DIST|OCR_PROVIDER|IM_NOTIFIER_ENABLED|FIELD_ENCRYPTION_KEY|PROJECT_DOMAIN_ENABLED|release-readiness-checklist\" docs/trialrun-runbook.md docs/trialrun/live-smoke-readiness.md docs/文档索引.md。","rg|manual",DONE,DONE,DONE,"docs/trialrun-runbook.md|docs/trialrun/live-smoke-readiness.md|docs/文档索引.md","[\"R1\"]","仅补文档和清单;测试 FIELD_ENCRYPTION_KEY 只能用于本地回归,生产必须使用安全密钥且不得提交。"
|
R2,本地门禁与 Runbook 补强,"把 A8 本地回归真实需要的本地服务参数、命令顺序、live smoke 检查和 SKIP 规则写入当前操作手册,避免后续误判。","1) Runbook 写明 SERVE_CLIENT_DIST、OCR_PROVIDER、IM_NOTIFIER_ENABLED、FIELD_ENCRYPTION_KEY 和项目 feature env 的本地门禁用途;2) live smoke 清单链接到发布准备清单;3) 不新增业务 API、数据库迁移或部署操作。","流程级验证:人工阅读 Runbook 能复现 A8 本地门禁准备;命令:rg -n \"发布候选|SERVE_CLIENT_DIST|OCR_PROVIDER|IM_NOTIFIER_ENABLED|FIELD_ENCRYPTION_KEY|PROJECT_DOMAIN_ENABLED|release-readiness-checklist\" docs/trialrun-runbook.md docs/trialrun/live-smoke-readiness.md docs/文档索引.md。","rg|manual",DONE,DONE,DONE,"docs/trialrun-runbook.md|docs/trialrun/live-smoke-readiness.md|docs/文档索引.md","[\"R1\"]","仅补文档和清单;测试 FIELD_ENCRYPTION_KEY 只能用于本地回归,生产必须使用安全密钥且不得提交。"
|
||||||
R3,权限直连审计,"在部署前用员工、主管、财务、管理员账号直连主路径和备用路径,确认导航隐藏没有掩盖服务端授权缺口。","1) 形成角色 x 路径允许/拒绝矩阵;2) 普通员工直连预算、AP、ERP、完整差旅、票据中心、合同台账、付款批次等备用路径不得获得越权数据;3) 若发现服务端权限缺口,先拆独立修复 Issue,不进入部署。","流程级验证:分别登录员工、主管、财务、管理员账号 -> 直连 /budgets、/ap、/system/integrations/erp、/travel-requests、/invoice-pool、/contracts-registry、/payment-batches 和对应 API -> 记录 HTTP 状态、页面提示和是否泄露数据;命令:cd client && npm run test:e2e -- permission-direct-access.spec.ts settings-governance.spec.ts login-portal-ux.spec.ts --workers=1。","playwright|curl|manual",DONE,DONE,DONE,"client/tests/e2e/permission-direct-access.spec.ts|docs/trialrun/permission-direct-access-audit.md|docs/trialrun/release-readiness-checklist.md|issues/2026-05-10_12-39-37-release-readiness-live-smoke.csv","[\"R2\"]","R3 已完成:新增权限直连 E2E 和审计记录;首次 E2E 因 127.0.0.1:3000 未启动失败,启动本地 OA 服务后重跑通过 10 passed;typecheck/build/CSV/diff check 通过;未发现权限泄漏,未改业务代码,R4 仍未执行。"
|
R3,权限直连审计,"在部署前用员工、主管、财务、管理员账号直连主路径和备用路径,确认导航隐藏没有掩盖服务端授权缺口。","1) 形成角色 x 路径允许/拒绝矩阵;2) 普通员工直连预算、AP、ERP、完整差旅、票据中心、合同台账、付款批次等备用路径不得获得越权数据;3) 若发现服务端权限缺口,先拆独立修复 Issue,不进入部署。","流程级验证:分别登录员工、主管、财务、管理员账号 -> 直连 /budgets、/ap、/system/integrations/erp、/travel-requests、/invoice-pool、/contracts-registry、/payment-batches 和对应 API -> 记录 HTTP 状态、页面提示和是否泄露数据;命令:cd client && npm run test:e2e -- permission-direct-access.spec.ts settings-governance.spec.ts login-portal-ux.spec.ts --workers=1。","playwright|curl|manual",DONE,DONE,DONE,"client/tests/e2e/permission-direct-access.spec.ts|docs/trialrun/permission-direct-access-audit.md|docs/trialrun/release-readiness-checklist.md|issues/2026-05-10_12-39-37-release-readiness-live-smoke.csv","[\"R2\"]","R3 已完成:新增权限直连 E2E 和审计记录;首次 E2E 因 127.0.0.1:3000 未启动失败,启动本地 OA 服务后重跑通过 10 passed;typecheck/build/CSV/diff check 通过;未发现权限泄漏,未改业务代码,R4 仍未执行。"
|
||||||
R4,部署预检,"检查生产/公网环境变量、数据库迁移状态、备份、回滚命令、Caddy/systemd 状态、/ready 和前端资源版本;未经批准不部署。","1) 生产环境变量缺项和敏感项不打印;2) 数据库迁移状态明确且有备份/回滚路径;3) Caddy/systemd 或既有部署方式健康;4) /ready 与前端资源版本可核对;5) 若需要修改生产配置,必须先获得确认。","流程级验证:只读检查部署目录、服务状态和 /ready;命令:node scripts/qa/check-live-smoke-env.mjs;命令:LIVE_SMOKE_BASE_URL=https://oa.hyinda.com bash scripts/qa/run-live-smoke-readiness.sh;生产变更前必须停止等待批准。","ssh|bash|node|manual",DOING,TODO,TODO,"deploy/*|scripts/qa/*|docs/trialrun/release-readiness-checklist.md","[\"R3\"]","R4 只读预检已记录到 docs/trialrun/deployment-preflight-2026-05-10.md;远端健康但运行时代码未对齐 537e608/2bab4e5,保持 BLOCKED,不进入 R5;后续治理合同:issues/2026-05-10_13-20-38-deployment-version-sync-governance.csv。"
|
R4,部署预检,"检查生产/公网环境变量、数据库迁移状态、备份、回滚命令、Caddy/systemd 状态、/ready 和前端资源版本;未经批准不部署。","1) 生产环境变量缺项和敏感项不打印;2) 数据库迁移状态明确且有备份/回滚路径;3) Caddy/systemd 或既有部署方式健康;4) /ready 与前端资源版本可核对;5) 若需要修改生产配置,必须先获得确认。","流程级验证:只读检查部署目录、服务状态和 /ready;命令:node scripts/qa/check-live-smoke-env.mjs;命令:LIVE_SMOKE_BASE_URL=https://oa.hyinda.com bash scripts/qa/run-live-smoke-readiness.sh;生产变更前必须停止等待批准。","ssh|bash|node|manual",DONE,DONE,DONE,"deploy/*|scripts/qa/*|docs/trialrun/release-readiness-checklist.md","[\"R3\"]","R4 完成:先发现远端运行时代码未对齐,后续按治理合同完成部署前备份、D3 受控同步和 D4 只读复检;远端关键运行时文件哈希已对齐,本机/公网 /ready 200,Prisma up to date,Caddy 正常,企业微信 config 不含 secret,公网 bundle 扫描 0 findings;R5 仍未执行。"
|
||||||
R5,公网企业微信和真实 OCR live smoke,"在 R4 预检通过且真实测试账号、企业微信配置和真实 OCR 样票齐备后,执行公网登录、企业微信入口、移动审批、报销/OCR 上传和通知 deeplink。","1) LIVE_SMOKE_* 从缺失变为可执行;2) 企业微信 config、OAuth 跳转和手机入口可验证;3) 真实 OCR 样票上传能进入可解释终态;4) 缺配置时继续 SKIP,不得宣称真机或真实 OCR 通过。","流程级验证:node scripts/qa/check-live-smoke-env.mjs --strict;命令:LIVE_SMOKE_BASE_URL=https://oa.hyinda.com bash scripts/qa/run-live-smoke-readiness.sh;人工真机:手机企业微信工作台打开海音达工作台 -> deeplink 回 OA 审批或详情页 -> 记录结果。","node|bash|playwright|manual",TODO,TODO,TODO,"scripts/qa/*|docs/trialrun/live-smoke-readiness.md|docs/trialrun/real-device-public-checklist.md","[\"R4\"]","真实账号、企业微信凭据、OCR 凭据和样票路径只放环境变量或本机安全位置;不得提交到仓库。"
|
R5,公网企业微信和真实 OCR live smoke,"在 R4 预检通过且真实测试账号、企业微信配置和真实 OCR 样票齐备后,执行公网登录、企业微信入口、移动审批、报销/OCR 上传和通知 deeplink。","1) LIVE_SMOKE_* 从缺失变为可执行;2) 企业微信 config、OAuth 跳转和手机入口可验证;3) 真实 OCR 样票上传能进入可解释终态;4) 缺配置时继续 SKIP,不得宣称真机或真实 OCR 通过。","流程级验证:node scripts/qa/check-live-smoke-env.mjs --strict;命令:LIVE_SMOKE_BASE_URL=https://oa.hyinda.com bash scripts/qa/run-live-smoke-readiness.sh;人工真机:手机企业微信工作台打开海音达工作台 -> deeplink 回 OA 审批或详情页 -> 记录结果。","node|bash|playwright|manual",TODO,TODO,TODO,"scripts/qa/*|docs/trialrun/live-smoke-readiness.md|docs/trialrun/real-device-public-checklist.md","[\"R4\"]","D5 readiness 已判断:publicReady=true,wecom=ready,但 liveSmokeReady=false、liveOcrReady=false;缺 LIVE_SMOKE_* 与 OCR live 文件或目录。真实账号、企业微信真机、真实 OCR 仍需后续单独执行;不得宣称 R5 通过。"
|
||||||
R6,小范围试运行,"公网和真机 smoke 通过后,只开放 2-3 个内部用户按清单试运行报销、请假、采购、审批、企业微信移动入口、付款和导出;反馈转新 Issue。","1) 试运行名单、角色、时间窗口和回滚联系人明确;2) 员工提交、审批人审批、财务付款/导出、企业微信 deeplink 回 OA 均有记录;3) 每日问题只登记和分级,不现场扩大 P2 功能范围;4) 试运行结束形成继续/回滚/修复判断。","流程级验证:员工提交报销/请假/采购 -> 主管或财务审批 -> 财务付款或导出 -> 企业微信通知 deeplink 回 OA -> 管理员检查审计和状态;人工记录问题、截图和处理结论。","manual|playwright",TODO,TODO,TODO,"docs/trialrun/release-readiness-checklist.md|docs/trialrun/manual-trialrun-report.md|issues/*.csv","[\"R5\"]","小范围试运行前不得扩 P2 预算、ERP、AI、完整差旅、复杂 BPM;反馈必须进入新 Issue CSV。"
|
R6,小范围试运行,"公网和真机 smoke 通过后,只开放 2-3 个内部用户按清单试运行报销、请假、采购、审批、企业微信移动入口、付款和导出;反馈转新 Issue。","1) 试运行名单、角色、时间窗口和回滚联系人明确;2) 员工提交、审批人审批、财务付款/导出、企业微信 deeplink 回 OA 均有记录;3) 每日问题只登记和分级,不现场扩大 P2 功能范围;4) 试运行结束形成继续/回滚/修复判断。","流程级验证:员工提交报销/请假/采购 -> 主管或财务审批 -> 财务付款或导出 -> 企业微信通知 deeplink 回 OA -> 管理员检查审计和状态;人工记录问题、截图和处理结论。","manual|playwright",TODO,TODO,TODO,"docs/trialrun/release-readiness-checklist.md|docs/trialrun/manual-trialrun-report.md|issues/*.csv","[\"R5\"]","小范围试运行前不得扩 P2 预算、ERP、AI、完整差旅、复杂 BPM;反馈必须进入新 Issue CSV。"
|
||||||
|
|||||||
|
无法渲染此文件,因为它包含了意外字符,其位于第 2 行和第 616 列。
|
@@ -1,6 +1,6 @@
|
|||||||
ID,Title,Description,Acceptance,Test_Method,Tools,Dev_Status,Review1_Status,Regression_Status,Files,Dependencies,Notes
|
ID,Title,Description,Acceptance,Test_Method,Tools,Dev_Status,Review1_Status,Regression_Status,Files,Dependencies,Notes
|
||||||
D1,部署版本差异确认,"基于 R4 只读预检结果确认远端运行时文件与本轮 release candidate 不一致的范围,固定同步目标和禁止项;本 Issue 不执行部署。","1) 明确目标提交为 2bab4e5,业务运行时代码基线为 537e608;2) 列出远端不一致文件和影响面;3) 确认不采用远端手工补丁;4) 明确 R5 继续保持 TODO。","流程级验证:人工核对 docs/trialrun/deployment-preflight-2026-05-10.md 的版本差异表;命令:git diff --name-only 537e608..2bab4e5;命令:对比本地与远端关键运行时文件 sha256sum;确认差异结论可复现。","git|ssh|manual",DONE,DONE,DONE,"docs/trialrun/deployment-preflight-2026-05-10.md|issues/2026-05-10_12-39-37-release-readiness-live-smoke.csv","[]","D1 只读复核完成:537e608..2bab4e5 仍仅含测试、文档和 CSV;远端仍有 workspaceSettings.js、NavLinks.tsx、workflow.js 与目标不一致,其余抽查运行时文件一致;同步目标固定为 2bab4e5,业务代码基线固定为 537e608;不采用远端手工补丁,R5 保持 TODO。"
|
D1,部署版本差异确认,"基于 R4 只读预检结果确认远端运行时文件与本轮 release candidate 不一致的范围,固定同步目标和禁止项;本 Issue 不执行部署。","1) 明确目标提交为 2bab4e5,业务运行时代码基线为 537e608;2) 列出远端不一致文件和影响面;3) 确认不采用远端手工补丁;4) 明确 R5 继续保持 TODO。","流程级验证:人工核对 docs/trialrun/deployment-preflight-2026-05-10.md 的版本差异表;命令:git diff --name-only 537e608..2bab4e5;命令:对比本地与远端关键运行时文件 sha256sum;确认差异结论可复现。","git|ssh|manual",DONE,DONE,DONE,"docs/trialrun/deployment-preflight-2026-05-10.md|issues/2026-05-10_12-39-37-release-readiness-live-smoke.csv","[]","D1 只读复核完成:537e608..2bab4e5 仍仅含测试、文档和 CSV;远端仍有 workspaceSettings.js、NavLinks.tsx、workflow.js 与目标不一致,其余抽查运行时文件一致;同步目标固定为 2bab4e5,业务代码基线固定为 537e608;不采用远端手工补丁,R5 保持 TODO。"
|
||||||
D2,部署前备份与回滚确认,"在执行任何部署前确认远端 DB 备份、文件存储备份、配置备份和回滚路径;只检查存在性和可用口径,不打印 secret。","1) 最近 DB 与 storage 备份存在;2) 回滚路径明确为上一部署文件树或备份包 + 数据库备份 + 配置备份;3) 若备份缺失,先补备份并记录,不继续部署。","流程级验证:deploy 用户只读列出 deploy/trialrun/backups 最近 DB dump 和 storage tar;人工核对 deploy/trialrun/runbook.md 的备份/恢复章节;若需创建新备份,必须另行批准后执行。","ssh|manual",DONE,DONE,DONE,"deploy/trialrun/runbook.md|docs/trialrun/deployment-preflight-2026-05-10.md","[\"D1\"]","D2 解阻完成:远端 backup/env/compose/storage/postgres 目录存在,runbook 含备份、恢复和代码/DB 回滚步骤;已创建部署前新近备份 hyb-oa-db-20260510_134340.dump 2691566 bytes 与 hyb-oa-storage-20260510_134341.tar.gz 2610057 bytes;D3 仍需用户单独批准后才能执行。"
|
D2,部署前备份与回滚确认,"在执行任何部署前确认远端 DB 备份、文件存储备份、配置备份和回滚路径;只检查存在性和可用口径,不打印 secret。","1) 最近 DB 与 storage 备份存在;2) 回滚路径明确为上一部署文件树或备份包 + 数据库备份 + 配置备份;3) 若备份缺失,先补备份并记录,不继续部署。","流程级验证:deploy 用户只读列出 deploy/trialrun/backups 最近 DB dump 和 storage tar;人工核对 deploy/trialrun/runbook.md 的备份/恢复章节;若需创建新备份,必须另行批准后执行。","ssh|manual",DONE,DONE,DONE,"deploy/trialrun/runbook.md|docs/trialrun/deployment-preflight-2026-05-10.md","[\"D1\"]","D2 解阻完成:远端 backup/env/compose/storage/postgres 目录存在,runbook 含备份、恢复和代码/DB 回滚步骤;已创建部署前新近备份 hyb-oa-db-20260510_134340.dump 2691566 bytes 与 hyb-oa-storage-20260510_134341.tar.gz 2610057 bytes;D3 仍需用户单独批准后才能执行。"
|
||||||
D3,受控同步 release candidate,"在 D1/D2 通过并获得明确部署批准后,使用既有部署流程同步 release candidate 到 /opt/hyb-oa-trialrun,构建服务并执行脚本内置 smoke。","1) 远端文件树同步到目标版本;2) deploy 脚本内置 env contract、/ready、external deps smoke、runtime smoke 通过;3) 未同步本地 secret 到仓库;4) 失败时按回滚路径恢复。","流程级验证:经批准后执行 bash deploy/trialrun/deploy.sh;部署脚本输出契约校验、Prisma status、/ready、external deps smoke、runtime smoke 和服务状态;失败则停止并记录错误,不进入 R5。","bash|ssh|node|manual",TODO,TODO,TODO,"deploy/trialrun/deploy.sh|deploy/trialrun/docker-compose.yml|deploy/trialrun/runbook.md","[\"D2\"]","高风险写操作;未获部署批准前不得执行。默认不修改远端 .env,除非另有明确批准。"
|
D3,受控同步 release candidate,"在 D1/D2 通过并获得明确部署批准后,使用既有部署流程同步 release candidate 到 /opt/hyb-oa-trialrun,构建服务并执行脚本内置 smoke。","1) 远端文件树同步到目标版本;2) deploy 脚本内置 env contract、/ready、external deps smoke、runtime smoke 通过;3) 未同步本地 secret 到仓库;4) 失败时按回滚路径恢复。","流程级验证:经批准后执行 bash deploy/trialrun/deploy.sh;部署脚本输出契约校验、Prisma status、/ready、external deps smoke、runtime smoke 和服务状态;失败则停止并记录错误,不进入 R5。","bash|ssh|node|manual",DONE,DONE,DONE,"deploy/trialrun/deploy.sh|deploy/trialrun/docker-compose.yml|deploy/trialrun/runbook.md","[\"D2\"]","D3 完成:bash deploy/trialrun/deploy.sh 成功;SYNC_ENV=0 未同步本地 .env;脚本完成 env contract、rsync、容器重建、init、Prisma migrate status、/ready、external deps smoke、runtime smoke、公网 bundle 文案扫描;LIVE_SMOKE_* 缺失,部署后 live smoke 按脚本跳过。"
|
||||||
D4,部署后 R4 只读复检,"部署同步后重新执行 R4 只读预检,确认远端版本、服务状态、迁移状态、Caddy、/ready、企业微信 config 和公网资源均可核对。","1) 关键运行时文件哈希与本地目标版本一致;2) Prisma migrate status up to date;3) /ready 200;4) Caddy active 且反代到 127.0.0.1:3000;5) 企业微信 config 不返回 secret;6) R4 可回填 DONE/DONE/DONE。","流程级验证:执行 docs/trialrun/deployment-preflight-2026-05-10.md 中的本地和远端只读检查;命令:node scripts/qa/check-live-smoke-env.mjs;命令:node scripts/qa/check-public-bundle-copy.mjs https://oa.hyinda.com;命令:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-10_12-39-37-release-readiness-live-smoke.csv。","ssh|node|python3|manual",TODO,TODO,TODO,"docs/trialrun/deployment-preflight-2026-05-10.md|docs/trialrun/release-readiness-checklist.md|issues/2026-05-10_12-39-37-release-readiness-live-smoke.csv","[\"D3\"]","只读复检;若发现迁移 drift、配置缺项、Caddy 异常或版本仍不一致,R4 不得标完成。"
|
D4,部署后 R4 只读复检,"部署同步后重新执行 R4 只读预检,确认远端版本、服务状态、迁移状态、Caddy、/ready、企业微信 config 和公网资源均可核对。","1) 关键运行时文件哈希与本地目标版本一致;2) Prisma migrate status up to date;3) /ready 200;4) Caddy active 且反代到 127.0.0.1:3000;5) 企业微信 config 不返回 secret;6) R4 可回填 DONE/DONE/DONE。","流程级验证:执行 docs/trialrun/deployment-preflight-2026-05-10.md 中的本地和远端只读检查;命令:node scripts/qa/check-live-smoke-env.mjs;命令:node scripts/qa/check-public-bundle-copy.mjs https://oa.hyinda.com;命令:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-10_12-39-37-release-readiness-live-smoke.csv。","ssh|node|python3|manual",DONE,DONE,DONE,"docs/trialrun/deployment-preflight-2026-05-10.md|docs/trialrun/release-readiness-checklist.md|issues/2026-05-10_12-39-37-release-readiness-live-smoke.csv","[\"D3\"]","D4 完成:远端关键运行时文件哈希与本地一致;server/db 容器运行,DB healthy;本机 /ready 200;Prisma migrate status up to date;Caddy active/enabled 且反代到 127.0.0.1:3000;企业微信 config 200 且不含 secret;公网 bundle 扫描 0 findings。"
|
||||||
D5,R5 live smoke 解锁判断,"R4 复检通过后,判断是否具备 R5 公网账号、企业微信真机和真实 OCR 样票条件;条件不足时继续 SKIP,不宣称通过。","1) node scripts/qa/check-live-smoke-env.mjs 能清晰显示 liveSmokeReady/liveOcrReady;2) 若缺账号或样票,R5 继续 TODO/SKIP;3) 若条件齐备,形成 R5 执行清单但不在本 Issue 中跑真实业务。","流程级验证:node scripts/qa/check-live-smoke-env.mjs;人工核对 LIVE_SMOKE_*、企业微信测试账号和 OCR 样票路径仅存在本机安全位置,不提交仓库;确认 R5 是否可开始。","node|manual",TODO,TODO,TODO,"scripts/qa/check-live-smoke-env.mjs|docs/trialrun/live-smoke-readiness.md|issues/2026-05-10_12-39-37-release-readiness-live-smoke.csv","[\"D4\"]","R5 涉及真实公网账号、企业微信真机和真实 OCR;必须等 R4 DONE 后单独执行。"
|
D5,R5 live smoke 解锁判断,"R4 复检通过后,判断是否具备 R5 公网账号、企业微信真机和真实 OCR 样票条件;条件不足时继续 SKIP,不宣称通过。","1) node scripts/qa/check-live-smoke-env.mjs 能清晰显示 liveSmokeReady/liveOcrReady;2) 若缺账号或样票,R5 继续 TODO/SKIP;3) 若条件齐备,形成 R5 执行清单但不在本 Issue 中跑真实业务。","流程级验证:node scripts/qa/check-live-smoke-env.mjs;人工核对 LIVE_SMOKE_*、企业微信测试账号和 OCR 样票路径仅存在本机安全位置,不提交仓库;确认 R5 是否可开始。","node|manual",DONE,DONE,DONE,"scripts/qa/check-live-smoke-env.mjs|docs/trialrun/live-smoke-readiness.md|issues/2026-05-10_12-39-37-release-readiness-live-smoke.csv","[\"D4\"]","D5 完成 readiness 判断:publicReady=true,wecom=ready,liveSmokeReady=false,liveOcrReady=false;缺 LIVE_SMOKE_* 与 OCR live 文件或目录,主 R5 保持 TODO/SKIP,不宣称真机或真实 OCR 通过。"
|
||||||
|
|||||||
|
无法渲染此文件,因为它包含了意外字符,其位于第 3 行和第 724 列。
|
在新工单中引用
屏蔽一个用户