文件
hyb-oa/docs/trialrun/发布试运行准备清单.md
T

221 行
17 KiB
Markdown
原始文件 Blame 文件历史

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
# 发布试运行准备清单
**文档状态**:当前操作手册,用于首轮主线发布候选、live smoke 和小范围试运行准备。
**适用范围**:`hyb-oa` MVP 首轮主线 A1-A8 之后,部署前和部署后试运行前。
**当前状态(2026-05-14 / R7E)**:本清单保留 A1-A8、R5、R6 和 MIF7TD 的历史证据;当前事实已经推进到 R7E,`5491e92` 真机反馈修复已部署到试运行环境。R7E 浏览器业务线已通过,企业微信消息 deeplink、移动真机反馈和最终验收结论仍未关闭。
本文不替代 PRD、模块规约或 Issue CSV;它只回答“当前是否可以从本地可回归进入公网/企业微信/真实 OCR 验收”。
## 1. 当前结论
- 首轮本地 release candidate:`537e608 A8 完成首轮主线总回归门禁`。
- 当前公网 R5 运行代码:`b1ae41f W1-W3 实现企业微信个人应用消息通知`。
- 主开发合同:`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`。
- 当前状态:本地门禁已闭环;R4 部署预检、D3 受控同步、D4 只读复检、R5 公网 live smoke、真实 PDF OCR、PC/自动化审批链、企业微信真机入口、个人应用消息和 deeplink 均已完成。
- 当前最大缺口:MIF7-7 已收口;若要启动 R7,必须另建 R7E 执行合同,固定试运行名单、时间窗口、回滚联系人和问题登记规则后再开始。
本清单中的 A1-A8/R5/R6/R7E 证据保留当时路线:OA 是首轮主业务系统和正式审批中心,企业微信只做入口、身份、通知、deeplink 和打卡原始采集边界。当前最新产品口径已由 WFOC/DBWFOC/WFDG/WDRG 覆盖:HR/考勤员工日常审批优先复用企业微信,OA 做按域镜像、人工接管、恢复回写、财务闭环和审计中台;财务、报销、采购、合同、项目、付款批次、AP、代账交接和高敏附件仍由 OA 主办。后续正式迁移前先读 [企微优先开发路线图](../企微优先开发路线图.md),再做 `WECOM-CAPABILITY-POC-V1`,不直接大规模开发。
## 2. 已完成证据
| 范围 | 证据 | 结论 |
| --- | --- | --- |
| A1 代码盘点 | `644852f A1 完成MVP主线代码盘点` | 已确认复用现有能力,不从零重写 |
| A2 统一审批中心 | `d871a40`、`f8c99c8`、`28be209` | PC/移动审批、状态展示和本地回归已闭环 |
| A3 报销/发票/OCR | `e79d252 A3 收口报销发票 OCR 主链路` | mock OCR、查重、主流程和视觉验证已通过 |
| A4 企业微信入口/通知 | `86451b3 A4 收口企业微信入口与通知回 OA` | 自动化入口和通知 deeplink 已收口,真机留到 live smoke |
| 测试与交付规约 | `9d6abc7 A1-A5 落地测试与交付规约` | 测试、视觉、SKIP、commit 规则已固定 |
| A5 请假考勤 | `d2bd4dc A5 收口请假考勤审批口径` | 请假审批、团队状态/日历本地通过 |
| A6 采购合同项目 | `d6ee25f A6 收口采购合同项目最小可用` | 采购、合同、项目最小可用验证已完成 |
| A7 权限导航 | `a18d477 A7 收口权限导航与备用模块护栏` | 导航护栏完成,部署前仍需直连权限审计 |
| A8 总回归 | `537e608 A8 完成首轮主线总回归门禁` | 本地总回归通过,公网/真机/真实 OCR 仍 SKIP |
## 3. 本地门禁复跑条件
A8 的本地门禁不是裸跑脚本即可完成,必须先用本地回归配置启动服务。推荐本地服务参数:
```bash
SERVE_CLIENT_DIST=true
OCR_PROVIDER=mock
IM_NOTIFIER_ENABLED=true
FIELD_ENCRYPTION_KEY=<local-test-key>
PROJECT_DOMAIN_ENABLED=true
PROJECT_LINKING_ENABLED=true
PROJECT_COMMUNICATION_LOG_ENABLED=true
PROJECT_CLOSURE_CHECKLIST_ENABLED=true
```
说明:
- `FIELD_ENCRYPTION_KEY` 必须只使用本地测试值;生产密钥不得提交、打印或写入文档。
- `OCR_PROVIDER=mock` 只证明本地 OCR 状态机和页面链路,不能替代真实 OCR 验收。
- `IM_NOTIFIER_ENABLED=true` 用于覆盖通知 outbox 和企业微信通知分支;缺真实企业微信配置时仍不能宣称真机通过。
- 项目相关开关用于复跑项目轻管理 E2E 和本地 smoke,不表示扩大 P2 范围。
部署前建议复跑:
```bash
cd server && npm run prisma:validate
cd server && ./scripts/regression-all.sh
cd client && npm run typecheck
cd client && npm run build
bash scripts/qa/run-web-gates.sh smoke-local
node scripts/qa/check-live-smoke-env.mjs
```
## 4. 权限直连审计矩阵
部署前必须补一轮“直连 URL / API 权限审计”。导航隐藏只能改善体验,不能替代服务端授权。
| 角色 | 必查主路径 | 备用或敏感路径 | 期望 |
| --- | --- | --- | --- |
| 普通员工 | `/portal`、`/workflow/tasks`、`/reimbursements`、`/leave`、`/purchase-requests`、`/mobile` | `/budgets`、`/ap`、`/integrations/erp`、`/travel`、`/invoice-pool`、`/contracts-registry`、`/payment-batches` | 主路径可用;备用或敏感路径不得泄露数据 |
| 主管/审批人 | `/workflow/tasks`、业务详情、移动审批 | 预算、ERP、票据中心、付款批次 | 只可见其审批和管理范围内数据 |
| 财务 | 报销复核、付款、导出、发票相关页面 | 管理员配置、员工敏感档案 | 财务能力可用,不越权到系统管理 |
| 管理员 | 系统配置、权限、审计、企业微信配置 | 真实凭据和密钥明文 | 可配置系统,但接口不得返回 secret 明文 |
如发现服务端权限缺口,必须停止部署并拆独立修复 Issue;不得用前端隐藏临时绕过。
R3 审计执行记录见 [`权限直连审计记录.md`](权限直连审计记录.md)。2026-05-10 本地自动化直连审计已通过,未发现权限泄漏;R4/D3/D4 旧部署预检长记录已在 DCL7 中从当前树移除,如需审计可从 `5da05eb` 的 git 历史恢复查看。
## 5. 部署预检
部署前只做只读确认,不直接改生产:
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 已完成公网自动化、真实 PDF OCR、企业微信真机和个人应用消息验收。
- 当前生产 commit、部署目录和本地 release candidate 是否一致。
- 生产 `.env` 必需项是否完整;检查时不得打印 secret。
- 数据库迁移状态是否干净;若存在 drift,先备份并拆数据库治理 Issue。
- 对象存储、附件目录、OCR provider、IM provider、企业微信回调域名是否与试运行目标一致。
- Caddy/systemd 或既有部署脚本状态是否健康。
- `/ready`、前端资源、企业微信 config 探活是否正常。
- 回滚方式是否明确:上一个部署包、上一个 commit、数据库备份和配置备份位置。
## 6. 公网 live smoke 条件
执行前必须准备以下环境变量或本机安全文件,不提交到仓库:
- `LIVE_SMOKE_ADMIN_IDENTIFIER` / `LIVE_SMOKE_ADMIN_PASSWORD`
- `LIVE_SMOKE_EMPLOYEE_IDENTIFIER` / `LIVE_SMOKE_EMPLOYEE_PASSWORD`
- `LIVE_EXPECT_WECOM_STATUS=ready`
- `PLAYWRIGHT_OCR_LIVE_FILE` 或 `PLAYWRIGHT_OCR_LIVE_DIR`
- 可选:`PLAYWRIGHT_OCR_LIVE_IDENTIFIER` / `PLAYWRIGHT_OCR_LIVE_PASSWORD`
命令:
```bash
node scripts/qa/check-live-smoke-env.mjs
LIVE_SMOKE_BASE_URL=https://oa.hyinda.com bash scripts/qa/run-live-smoke-readiness.sh
```
2026-05-10 R5 准入执行记录:
- `node scripts/qa/check-live-smoke-env.mjs`:`publicReady=true`,`wecom=ready`,`liveSmokeReady=false`,`liveOcrReady=false`。
- `node scripts/qa/check-live-smoke-env.mjs --strict`:按预期失败,缺 `LIVE_SMOKE_*` 与 OCR live 文件或目录。
- `LIVE_SMOKE_BASE_URL=https://oa.hyinda.com bash scripts/qa/run-live-smoke-readiness.sh`:公网 `/ready` 可访问,公网资源文案扫描 `scanned=54 focused=4 findings=0`;live smoke 与真实 OCR 因缺凭据和样票 `SKIP`。
- 证据目录:`artifacts/qa-flow/live-smoke-readiness-20260510-161113/`。
2026-05-10 R5 解阻复查:
- 执行合同:`issues/2026-05-10_16-28-34-r5-live-smoke-unblock.csv`。
- `node scripts/qa/check-live-smoke-env.mjs`:`publicReady=true`,`wecom=ready`,`liveSmokeReady=false`,`liveOcrReady=false`。
- `node scripts/qa/check-live-smoke-env.mjs --strict`:仍失败,缺 `LIVE_SMOKE_*` 与 OCR live 文件或目录。
- 结论:F3 公网业务 smoke、F4 企业微信真机验收和 R6 小范围试运行仍不能开始。
2026-05-10 R5 credentialed 复查:
- 执行合同:`issues/2026-05-10_16-39-17-r5-credentialed-live-smoke.csv`。
- `/home/shunli/.hyb-oa/live-smoke.env` 不存在,未执行 `source`。
- `node scripts/qa/check-live-smoke-env.mjs`:`publicReady=true`,`wecom=ready`,`liveSmokeReady=false`,`liveOcrReady=false`。
- `node scripts/qa/check-live-smoke-env.mjs --strict`:仍失败,缺公网 smoke 账号和 OCR live 文件或目录。
- 结论:H3 公网自动化业务 smoke、H4 企业微信真机验收和 R6 小范围试运行仍不能开始。
2026-05-10 R5 历史凭据自动化复查:
- 执行合同:`issues/2026-05-10_16-56-44-r5-history-credential-live-smoke.csv`。
- 历史 `LIVE_SMOKE_*` 可临时提取,OCR 样票存在,`check-live-smoke-env --strict` 通过;凭据未落盘、未打印。
- 公网 `/ready` 与企业微信 config 正常,公网资源文案扫描 `scanned=54 focused=4 findings=0`。
- 公网 live smoke 未通过:管理员登录后停留 `/login`,接口返回 401;员工 smoke 和真实 OCR 未执行。
- 证据目录:`artifacts/qa-flow/live-smoke-readiness-20260510-165833/`。
- smoke 数据只读审计:`SMOKE001/SMOKE002` 均 active,`authSessions=555`,`invoices=5`,`ocrResultsLinkedFromInvoices=1`,`auditLogs=258`。
- 结论:R5 仍未通过,下一步需重置或重新提供 `SMOKE001/SMOKE002` 密码后重跑;R6 仍不能开始。
2026-05-10 R5 smoke 密码重置与自动化复查:
- 执行合同:`issues/2026-05-10_17-10-42-r5-smoke-password-reset-and-live-smoke.csv`。
- K1 只读确认:R4 已完成,R5 仍未完成;`SMOKE001/SMOKE002` 均 active;部署前备份 `hyb-oa-db-20260510_134340.dump` 与 `hyb-oa-storage-20260510_134341.tar.gz` 可追溯。
- K2 已受控重置两个 smoke 账号密码和登录失败状态;新凭据仅写入仓库外 `~/.hyb-oa/live-smoke.env`,权限 `600`,未打印或提交密码。当前登录接口按邮箱/手机号查询,live smoke 登录标识使用 smoke 邮箱,员工编号仍为 `SMOKE001/SMOKE002`。
- `node scripts/qa/check-live-smoke-env.mjs --strict`:通过,`liveSmokeReady=true`,`liveOcrReady=true`。
- `LIVE_SMOKE_BASE_URL=https://oa.hyinda.com bash scripts/qa/run-live-smoke-readiness.sh`:通过;公网资源文案扫描 `scanned=54 focused=4 findings=0`;公网 live smoke `3 passed`;真实 OCR 样票不再 `SKIP`。
- 真实 OCR 终态:样票识别出发票代码/号码、销售方、金额和日期;因历史样票重复,页面提示“已识别出相同发票,不能重复添加”,记录为可解释终态。
- 证据目录:`artifacts/qa-flow/live-smoke-readiness-20260510-172421/`。
- pending OCR 辅助扫描仍因缺 `DATABASE_URL` 记录 `SKIP`,不作为 R5 硬阻断。
- K4 副作用只读审计:`authSessions=555 -> 572`,`auditLogs=258 -> 263`;`reimbursements=1`、`invoices=5`、`ocrResultsLinkedFromInvoices=1` 保持不变;未清理数据。
- 阶段结论:公网自动化和真实 OCR 已通过;当时企业微信真机人工验收尚未执行,所以主 R5 仍不能置为 `DONE/DONE/DONE`。
2026-05-11 R5 最终收口:
- 当前公网已部署 `b1ae41f`,R4 复检通过;企业微信通知渠道切换为 `R5-WECOM-APP-PERSONAL / wecom_app_message`,旧 mock 渠道已停用。
- `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` 通过;证据目录 `artifacts/qa-flow/live-smoke-readiness-20260511-092236/`。
- 真实 PDF OCR 不再 `SKIP`,重复样票进入“已用于报销,不能重复添加”的可解释终态。
- 测试组织审批链、admin-only 无业务审批权、自审阻断、财务/财务主管节点已由 PC/自动化证明。
- 企业微信真机已确认:`oa_smoke_01 -> SMOKE002`、`oa_smoke_02 -> SMOKE101` 绑定、工作台入口、免登录、提交、审批和移动回流通过。
- 个人应用消息已确认:`SMOKE002` 触发 `SMOKE101` 待办 `936362d8-c4e0-454f-a589-9c9653bcbfda`,delivery 为 `wecom_app_sent`、`errcode=0`、无 `invaliduser`;用户确认手机企业微信收到“海音达工作台”消息,标题正确,点击后可进入移动审批。
- 结论:主 R5 已 `DONE/DONE/DONE`。R6 仍需单独规划和批准,不能自动扩大试运行。
判定:
- `liveSmokeReady=false` 时只能记录公网账号条件缺失。
- `liveOcrReady=false` 时只能记录真实 OCR 条件缺失。
- 手机企业微信入口必须用真实企业微信客户端补测;普通浏览器 UA 不等于真机通过。
## 7. 小范围试运行
R5 已完成。R6 准备合同已创建:`issues/2026-05-11_10-23-41-r6-small-trialrun-prep.csv`。R6-2 已固定名单、窗口、回滚联系人和问题登记负责人;R6-3 自动检查已通过,且 WZ6 已创建真实财务候选账号 `wangzhiling`,只读核验为 `active`、角色 `employee,finance`。主 R6 仍保持 `TODO/TODO/TODO`,因为 R6-4 到 R6-6 的真实小范围流程、每日收口和结论尚未执行;不能直接把 R5/R6-3 通过解释为“自动进入正式试运行完成”。
建议首批角色:
- 普通员工 1 人:提交报销、请假、采购,使用移动入口补资料。
- 审批人 1 人:处理待办、驳回或退回一条测试申请。
- 财务或管理员 1 人:复核发票、标记付款、导出、检查审计和通知记录。
试运行规则:
- 每日固定收集问题,按阻断、重要、体验、后续需求分级。
- 问题先登记到新 Issue CSV,不在试运行现场扩大范围。
- P2 的预算、ERP、AI、完整差旅、复杂 BPM 继续不进入首轮试运行。
- 出现权限泄漏、付款状态错乱、真实 OCR 大面积失败、企业微信入口无法进入时,应暂停试运行并回滚或修复。
## 8. QAOPS8 Go/No-Go 清单
本节是 `QAOPS8-17` 的上线和扩大试运行门禁。它只给当前时点结论,不替代 R7E 真实人工验收。
当前结论:`No-Go/Pause`。
| 门禁 | 当前状态 | 结论 |
| --- | --- | --- |
| 本地和公网自动化 | 已有通过证据 | MIF7TD、QAOPS8-5、QAOPS8-6、QAOPS8-8 的历史证据可作为启动前基础门禁,但 R7E 启动当天仍需复核公网健康 |
| 备份、恢复和回滚边界 | 已确认方案 | QAOPS8-10..16 已记录备份策略、恢复演练方案、SLO/DORA、发布 Runbook、回滚演练窗口;真实恢复或生产回滚执行前仍需单独批准 |
| R7E 启动确认 | 已确认 R7E-1..7 | 参与人、窗口、回滚联系人、问题登记负责人和暂停决策人已确认 |
| R7E 启动当天公网健康 | 已完成 | `4b14c92` 已完成 R7E-8;2026-05-14 22:05 追加部署 `5491e92` 真机反馈修复,`/ready`、public bundle、live readiness、真实 OCR 样票和公网移动矩阵通过 |
| 企业微信入口和 deeplink 真机 | 未完成 | `R7E-9`、`WF8-11` 需要 `SMOKE002`、`SMOKE101` 等真实企业微信或真机点击新消息回目标页;`SMOKE301`、`SMOKE302` 当前未启用且没有企业微信 |
| 真实业务流程试运行 | 部分完成 | `R7E-10..13` 浏览器业务线已通过;`R7E-14` 按付款批次延期到 P2 口径收口;`R7E-15` 仍需移动真机反馈 |
| 问题清单和验收结论 | 未完成 | `R7E-16..18` 仍需每日问题收口、阻断分流和最终验收结论 |
| 移动业务入口扩展反馈 | 未完成 | `BIZ8-12` 自动化已有代表性截图证据,但仍需真机和角色反馈后才能关闭 |
Go 条件:
- `R7E-8..18` 均有当天或试运行窗口内证据,并且阻断问题为 0;`R7E-14` 按已确认的付款批次延期到 P2 口径验收,不要求当前启用 `payment_batch_v1`。
- 企业微信入口、通知 deeplink 和移动主流程至少有代表性真机确认,且没有未解释的权限、审批链或财务数据问题。
- 备份和回滚联系人在线;若进入真实恢复或生产回滚,必须另行获得明确批准。
Pause 或 No-Go 条件:
- 公网 `/ready`、public bundle、企业微信入口或登录任一启动门禁失败。
- 报销、审批、请假、采购、财务任一主流程阻断。
- 出现权限泄漏、财务状态错误、审批链错误、无法回 OA、真实 OCR 大面积失败,或两个以上高优先级问题当天无法解释。
- R7E 人工证据缺失,或把自动化结果误当作真实试运行结论。