ID,Title,Description,Acceptance,Test_Method,Tools,Dev_Status,Review1_Status,Regression_Status,Files,Dependencies,Notes Q1,固定当前 RC 与部署前提,固定本轮公网部署和 R5 收口目标:当前 HEAD=795e976,运行时代码修复包含 491b42a;确认工作区、SYNC_ENV、远端目录、备份和回滚前提。,1) 工作区干净;2) HEAD 固定为 795e976;3) SYNC_ENV 不为 1;4) 远端目录为 /opt/hyb-oa-trialrun;5) 最近 DB/storage 备份和 runbook 可作为回滚前提;6) 如备份不足,先停止进入备份步骤。,"流程级验证:git status --short;git rev-parse --short HEAD;test ""${SYNC_ENV:-}"" != ""1"";ssh deploy@118.89.77.218 只读列出远端 backups 最近 DB/storage 文件和 runbook;校验本 CSV。",git|ssh|python3|manual,DONE,DONE,DONE,issues/2026-05-10_23-53-32-r5-current-rc-deploy-verify-closeout.csv|deploy/trialrun/*,[],Q1 completed:工作区执行前干净,HEAD=795e976;SYNC_ENV=unset;远端目录 /opt/hyb-oa-trialrun;最近备份 hyb-oa-db-20260510_134340.dump size=2691566 与 hyb-oa-storage-20260510_134341.tar.gz size=2610057;deploy/trialrun/runbook.md 存在。未部署、未改远端 .env、未打印 secret。 Q2,本地自动化与视觉预检,部署前执行后端语法/Prisma、前端 typecheck/build 和移动/企业微信视觉 E2E,确认 491b42a 的移动视口、底部导航、报销详情吸底双按钮和 PDF-only 上传本地通过。,1) server prisma validate 通过;2) workflow 和 invoicePool 语法检查通过;3) client typecheck/build 通过;4) r5/r109/r111/r124 移动和 PDF-only E2E 通过;5) 视觉证据有输出且无横向滚动、遮挡、按钮重叠。,流程级验证:cd server && npm run prisma:validate;cd server && node --check src/routes/invoicePool.js;cd server && node --check src/routes/workflow.js;cd client && npm run typecheck;cd client && npm run build;cd client && npm run test:e2e -- r5-real-device-feedback-mobile-ux.spec.ts r109-mobile-reimbursement-feedback.spec.ts r111-invoice-reimbursement-guard.spec.ts r124-mobile-entry-matrix.spec.ts --workers=1 --reporter=list。,npm|node|playwright,DONE,DONE,DONE,server/src/routes/invoicePool.js|server/src/routes/workflow.js|client/tests/e2e/*.spec.ts,"[""Q1""]",Q2 completed:server prisma:validate、invoicePool/workflow node --check、client typecheck/build 均通过;首次 E2E 因本地 127.0.0.1:3000 未启动失败,启动临时本地 OA 服务和临时库后重跑 r109/r111/r124/r5 共 6 tests 全部通过;临时 server/DB 已清理。 Q3,受控部署最新 RC,执行既有 deploy/trialrun/deploy.sh 将当前 RC 同步到 /opt/hyb-oa-trialrun;默认 SYNC_ENV=0,不覆盖远端 .env。,1) deploy 脚本成功;2) rsync/build/container/init/migrate/seed/ready/runtime smoke 和公网 bundle 扫描通过;3) SYNC_ENV=0 或未设置;4) 失败时停止,不手工修远端,不进入 R5。,流程级验证:bash deploy/trialrun/deploy.sh;记录部署输出摘要,不打印 secret;失败则保持 Q3 未完成并记录阻断。,bash|ssh|docker,DONE,DONE,DONE,deploy/trialrun/deploy.sh|external,"[""Q2""]",Q3 completed:bash deploy/trialrun/deploy.sh 成功;SYNC_ENV 未设置,脚本跳过 .env 同步;完成 env contract、rsync、远端 client build/typecheck、server/init 镜像构建、容器重建、init、Prisma migrate status up to date、/ready、external deps smoke、runtime smoke、公网 bundle 扫描 findings=0。未手工修远端。 Q4,部署后 R4 只读复检,部署成功后复检公网运行环境已对齐 795e976,并确认公网基础服务健康。,1) 关键文件哈希本地与远端一致;2) /ready 200;3) Prisma migrate status up to date;4) server/db 容器健康;5) Caddy active 且反代正确;6) 企业微信 config 可读且不暴露 secret;7) 公网 bundle 扫描 findings=0。,流程级验证:sha256sum 对比关键文件;ssh 只读检查容器和 Prisma status;curl https://oa.hyinda.com/ready;node scripts/qa/check-public-bundle-copy.mjs https://oa.hyinda.com;node scripts/qa/check-live-smoke-env.mjs --strict。,ssh|curl|node|manual,DONE,DONE,DONE,scripts/qa/*|deploy/trialrun/*,"[""Q3""]",Q4 completed:workspaceSettings/NavLinks/workflow/invoicePool/MobileReimbursementDetail/MobileReimbursements/EmployeeAvatar 本地与远端 sha256 一致;公网 /ready ok;远端 server Up、db Up healthy;Prisma 46 migrations up to date;Caddy active/enabled,127.0.0.1:3000 /ready ok;check-live-smoke-env 非 strict 显示 publicReady=true wecom=ready;未 source 凭据时 strict 缺 LIVE_SMOKE_*,已转入 Q5 source 凭据验证;公网 bundle scanned=54 focused=4 findings=0。 Q5,公网 R5 自动化,使用仓库外 live smoke 凭据执行公网 readiness、live smoke、真实 PDF OCR 和公网 bundle 检查。,1) ~/.hyb-oa/live-smoke.env 权限 600;2) check-live-smoke-env --strict 通过;3) run-live-smoke-readiness.sh 通过;4) live smoke 不 SKIP;5) 真实 PDF OCR 不 SKIP 且进入可解释终态;6) public bundle findings=0。,流程级验证:stat -c '%a %n' ~/.hyb-oa/live-smoke.env;source 凭据但不打印;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-*。,node|bash|playwright,DONE,DONE,DONE,scripts/qa/*|artifacts/qa-flow|client/tests/e2e/helpers/liveInvoiceOcr.ts|client/tests/e2e/manual/live-invoice-ocr.spec.ts,"[""Q4""]",Q5 completed:~/.hyb-oa/live-smoke.env 权限 600;source 后 check-live-smoke-env --strict 通过,publicReady=true wecom=ready liveSmokeReady=true liveOcrReady=true;首次 live OCR 因重复样票上传返回不可新增而 helper 等待旧详情超时,已修正测试 helper 处理重复/相同发票可解释终态;client typecheck 通过;重跑 run-live-smoke-readiness.sh 通过,证据 artifacts/qa-flow/live-smoke-readiness-20260511-001603,live smoke 3 passed,真实 PDF OCR 1 passed,终态 ocr_failed/已用于报销不能重复添加,public bundle findings=0,pending OCR 因缺 DATABASE_URL 辅助 SKIP。 后续收紧 helper 判断,避免非重复失败被误判为重复;client typecheck 通过,单独重跑 live-invoice-ocr.spec.ts 1 passed。 Q6,O3 PC/自动化审批链收口,按门禁拆分口径,用 S4 自动化证据或 PC 公网页面补充证明正式测试组织审批链,不要求负责人/财务账号绑定企业微信。,1) SMOKE002->SMOKE101 普通链路通过;2) SMOKE101->SMOKE201 主管本人链路通过;3) SMOKE201 自审阻断通过;4) SMOKE001 admin-only 不能审批通过;5) 小额 finance 与大额 ceo/finance_mgr 节点通过;6) O3 可回填 DONE。,流程级验证:复核 S4 证据;必要时 PC 公网网页登录 SMOKE201/SMOKE301/SMOKE302 补负责人、财务、财务主管页面记录;校验 O3 合同。,playwright|manual|python3,DONE,DONE,DONE,issues/2026-05-10_18-25-33-formal-approval-org-config.csv|docs/trialrun/real-device-public-checklist.md,"[""Q5""]",Q6 completed:按 P 合同门禁拆分口径复用 S4 公网自动化正式测试组织链路证据,且 Q5 最新公网 live smoke 通过;O3 已回填 DONE/DONE/DONE。SMOKE201/SMOKE301/SMOKE302 负责人/财务替身账号不再作为企业微信绑定硬门槛。 Q7,S5 企业微信移动体验复测,使用现有 oa_smoke_01->SMOKE002 和 oa_smoke_02->SMOKE101 真机复测移动入口与体验,验证部署后的移动布局和 PDF-only 修复。,1) 工作台入口和免登录通过;2) 移动首页、审批待办、报销列表、报销详情通过;3) 底部导航首页/审批/报销/我的首屏固定可见;4) 报销详情隐藏底部 Tab;5) 吸底双按钮同行不遮挡;6) PDF 上传入口可用;7) 通知/deeplink 有记录。,流程级验证:按 docs/trialrun/real-device-public-checklist.md 在 iPhone 11/iOS14 和 Redmi K60/MIUI 最新企业微信复测;记录设备、版本、账号角色、URL、步骤、截图或录屏位置。,manual|playwright,DONE,DONE,DONE,docs/trialrun/real-device-public-checklist.md|issues/2026-05-10_20-33-04-formal-smoke-test-accounts.csv,"[""Q5""]",Q7 completed 2026-05-11:公网自动视觉已通过,Playwright 企业微信 UA 覆盖 iPhone 11/iOS14 与 Redmi K60;SMOKE002 移动首页、报销列表、报销详情、PDF-only 上传入口通过,SMOKE101 移动审批列表通过;截图目录 output/playwright/r5-live-mobile-wecom-visual/。用户已确认真实企业微信工作台入口和免登录通过。通知与 deeplink 自动视觉通过:SMOKE101 两条未读报销待办站内通知可见,iPhone 11/Redmi K60 企业微信 UA 下无横向溢出,点击“查看”进入 /mobile/approvals?taskId=177b3a9e-67fe-447d-92f4-96a652a06841,截图 output/playwright/r5-notification-deeplink-live/。2026-05-11 已部署 b1ae41f 并切换到 R5-WECOM-APP-PERSONAL,触发 SMOKE002->SMOKE101 新待办 936362d8-c4e0-454f-a589-9c9653bcbfda,delivery=wecom_app_sent/errcode=0/无 invaliduser;企业微信 UA 自动视觉通过,截图 output/playwright/r5-wecom-app-message-live/。用户已确认 oa_smoke_02 手机企业微信收到“海音达工作台”个人应用消息,标题正确;点击后首次进入提示进入工作台,进入后可看到移动审批,后续再次进入可直接看到移动审批;有消息通知但未观察到系统弹窗。Q7/S5 已完成。 Q8,R5/R6 Gate 与提交,汇总 Q4-Q7 结果,回填主 R5、O3、S5;R5 全部通过后仅创建 R6 小范围试运行准备口径,不直接扩大试运行。,1) Q4-Q7 均通过时 R5 回填 DONE/DONE/DONE;2) O3/S5 按实际结果回填;3) R6 未获名单和窗口前保持 TODO 或仅新建准备合同;4) 新合同、主 R5、O3、S5 CSV 校验通过;5) git diff --check 通过;6) 中文提交。,流程级验证:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py 本合同、主 R5、O3、S5;git diff --check;git status --short;提交 Q1-Q8 部署最新 RC 并完成 R5 验收门禁。,python3|git|manual,DONE,DONE,DONE,issues/*.csv|docs/trialrun/real-device-public-checklist.md,"[""Q6"",""Q7""]",Q8 completed:Q1-Q7 已完成,公网自动视觉、真实企业微信入口/免登录用户确认、站内通知与移动 deeplink 自动视觉均已通过;2026-05-11 已实现并部署 wecom_app_message,delivery 审计为 R5-WECOM-APP-PERSONAL/wecom_app_sent,errcode=0 且无 invaliduser;用户已确认 oa_smoke_02 手机企业微信收到应用消息并可点击回流。主 R5 已满足门禁并回填 DONE/DONE/DONE;R6 继续 TODO,需单独规划和批准。