chore(issues): 新增 P2/P3/P4 执行合同快照

- P2: 2026-02-08_14-20-25-p2-ci-and-tests.csv
- P3: 2026-02-08_17-05-00-p3-full-delivery.csv
- P4: 2026-02-08_21-50-09-p4-trialrun-ready.csv
这个提交包含在:
2026-02-08 23:09:02 +08:00
父节点 7a6f5573a6
当前提交 4d4866d10e
共修改 3 个文件,包含 41 行新增和 0 行删除
@@ -0,0 +1,6 @@
ID,Title,Description,Acceptance,Test_Method,Tools,Dev_Status,Review1_Status,Regression_Status,Files,Dependencies,Notes
C1,平台级CI最小门禁(GitHub Actions),新增 GitHub Actions 工作流复用本地最小门禁脚本并在 PR/Push 自动执行,`.github/workflows/ci-minimal.yml` 可触发且成功执行 `./scripts/check-minimal.sh` 全流程,cd /home/shunli/Projects/hyb-oa && ./scripts/check-minimal.sh,manual,DONE,DONE,DONE,.github/workflows/ci-minimal.yml | scripts/check-minimal.sh,[],复用现有门禁脚本避免重复造轮子
C2,审计接口自动化测试,补齐 `/api/audit-logs` 的权限/分页/筛选自动化测试,覆盖 `PERM_001/分页/过滤` 核心断言并可重复执行,manual: 新增脚本后执行并验证断言通过,manual,TODO,TODO,TODO,server/src/routes/audit.js | server/scripts/*,"[""C1""]",优先使用现有回归脚本模式
C3,OCR 自动化测试(Mock优先),为 OCR 队列补充 mock provider 测试与并发锁语义测试,无真实腾讯凭据下也可稳定跑通 OCR 状态流转与锁语义断言,manual: 运行 OCR 回归脚本(mock 模式)并断言通过,manual,TODO,TODO,TODO,server/src/jobs/ocrJob.js | server/src/services/ocr/* | server/scripts/*,"[""C1""]",真实凭据测试作为可选非阻塞项
C4,P3-a 待办列表页落地,将 `workflow/tasks` 占位页改为真实待办列表与筛选交互,有审批权限用户可见真实待办列表并可打开详情入口,manual: 前端登录审批角色验证列表加载与筛选,manual,TODO,TODO,TODO,client/src/pages/WorkflowTasksPage.tsx | client/src/api/*,"[""C1""]",高频入口优先
C5,P3-a 审批详情与动作联调,落地审批详情页并联调 approve/reject/return/transfer 动作闭环,动作执行后列表与详情状态一致刷新且错误提示正确,manual: 前端端到端操作 approve/reject/return/transfer 并校验返回,manual,TODO,TODO,TODO,client/src/pages/* | client/src/router/* | client/src/api/*,"[""C4""]",先对接已有后端能力不改接口契约
1 ID Title Description Acceptance Test_Method Tools Dev_Status Review1_Status Regression_Status Files Dependencies Notes
2 C1 平台级CI最小门禁(GitHub Actions) 新增 GitHub Actions 工作流复用本地最小门禁脚本并在 PR/Push 自动执行 `.github/workflows/ci-minimal.yml` 可触发且成功执行 `./scripts/check-minimal.sh` 全流程 cd /home/shunli/Projects/hyb-oa && ./scripts/check-minimal.sh manual DONE DONE DONE .github/workflows/ci-minimal.yml | scripts/check-minimal.sh [] 复用现有门禁脚本避免重复造轮子
3 C2 审计接口自动化测试 补齐 `/api/audit-logs` 的权限/分页/筛选自动化测试 覆盖 `PERM_001/分页/过滤` 核心断言并可重复执行 manual: 新增脚本后执行并验证断言通过 manual TODO TODO TODO server/src/routes/audit.js | server/scripts/* ["C1"] 优先使用现有回归脚本模式
4 C3 OCR 自动化测试(Mock优先) 为 OCR 队列补充 mock provider 测试与并发锁语义测试 无真实腾讯凭据下也可稳定跑通 OCR 状态流转与锁语义断言 manual: 运行 OCR 回归脚本(mock 模式)并断言通过 manual TODO TODO TODO server/src/jobs/ocrJob.js | server/src/services/ocr/* | server/scripts/* ["C1"] 真实凭据测试作为可选非阻塞项
5 C4 P3-a 待办列表页落地 将 `workflow/tasks` 占位页改为真实待办列表与筛选交互 有审批权限用户可见真实待办列表并可打开详情入口 manual: 前端登录审批角色验证列表加载与筛选 manual TODO TODO TODO client/src/pages/WorkflowTasksPage.tsx | client/src/api/* ["C1"] 高频入口优先
6 C5 P3-a 审批详情与动作联调 落地审批详情页并联调 approve/reject/return/transfer 动作闭环 动作执行后列表与详情状态一致刷新且错误提示正确 manual: 前端端到端操作 approve/reject/return/transfer 并校验返回 manual TODO TODO TODO client/src/pages/* | client/src/router/* | client/src/api/* ["C4"] 先对接已有后端能力不改接口契约
@@ -0,0 +1,13 @@
ID,Title,Description,Acceptance,Test_Method,Tools,Dev_Status,Review1_Status,Regression_Status,Files,Dependencies,Notes
D1,CSV快照收口,创建P3全量交付快照,承接C2~C5并扩展D6~D12执行合同,新CSV通过校验且依赖关系正确,旧快照保持不变,python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-02-08_17-05-00-p3-full-delivery.csv,manual,DONE,DONE,DONE,issues/2026-02-08_17-05-00-p3-full-delivery.csv,[],旧快照保持不可变
D2,审计接口自动化回归,新增审计回归脚本覆盖权限/分页/筛选/参数非法,regression-audit.sh 可重复执行并覆盖 PERM_001/分页/筛选/VALID_001,cd server && ./scripts/regression-audit.sh,manual,DONE,DONE,DONE,server/scripts/regression-audit.sh | server/src/routes/audit.js | server/README.md,"[""D1""]",复用现有回归脚本模式
D3,OCR自动化回归(Mock优先),新增mock OCR provider与回归脚本,覆盖状态流转与并发锁,regression-ocr.sh 在 mock 模式可跑通 pending_ocr->available、重复票据、失败重试、并发唯一认领,cd server && ./scripts/regression-ocr.sh,manual,DONE,DONE,DONE,server/src/services/ocr/index.js | server/src/services/ocr/mock.js | server/scripts/regression-ocr.sh | server/scripts/regression-all.sh,"[""D1""]",真实腾讯凭据测试为可选非阻塞
D4,平台级回归CI补强,新增可选全回归工作流,支持workflow_dispatch和nightly,新增workflow可在CI中完成DB+migrate+seed+server+全回归脚本执行,manual: GitHub Actions workflow_dispatch 触发通过,manual,DONE,DONE,DONE,.github/workflows/ci-regression.yml | server/scripts/regression-all.sh,"[""D2"",""D3""]",保留ci-minimal不变
D5,工作流详情与转审候选API,新增任务详情与候选审批人接口并增强任务列表分页,新增 /api/workflow/tasks/:taskId 与 /api/workflow/approvers,列表返回分页字段,cd server && node --check src/routes/workflow.js,manual,DONE,DONE,DONE,server/src/routes/workflow.js | server/README.md,"[""D1""]",保持既有动作接口语义不变
D6,前端待办列表+详情+动作,替换待办占位页,落地列表、详情与approve/reject/return/transfer动作,审批角色可在前端完成待办闭环,动作后列表与详情同步刷新,cd client && npm run typecheck && npm run build,manual,DONE,DONE,DONE,client/src/pages/WorkflowTasksPage.tsx | client/src/pages/WorkflowTaskDetailPage.tsx | client/src/api/workflow.ts | client/src/router/index.tsx,"[""D5""]",引入react-query统一缓存失效
D7,报销列表API,新增报销分页列表接口并支持状态筛选与权限范围,/api/reimbursements 支持 page/pageSize/status/scope 且权限行为正确,cd server && node --check src/routes/reimbursements.js,manual,DONE,DONE,DONE,server/src/routes/reimbursements.js | server/README.md,"[""D1""]",仅增不破
D8,前端报销页落地,实现报销列表/详情并联调创建提交撤回支付,employee/finance角色可完成报销基础流程并正确处理错误码,cd client && npm run typecheck && npm run build,manual,DONE,DONE,DONE,client/src/pages/ReimbursementsPage.tsx | client/src/pages/ReimbursementDetailPage.tsx | client/src/api/reimbursements.ts,"[""D7""]",支付动作遵循后端幂等语义
D9,票据池列表API,新增票据池分页列表接口支持状态与ownerScope筛选,/api/invoice-pool 返回分页列表并按 invoice.manage / own 权限过滤,cd server && node --check src/routes/invoicePool.js,manual,DONE,DONE,DONE,server/src/routes/invoicePool.js | server/README.md,"[""D1""]",保持既有上传/绑定接口不变
D10,前端票据页落地,实现票据中心列表上传轮询OCR绑定与签名预览,票据页可上传并展示OCR状态,支持绑定报销与签名预览,cd client && npm run typecheck && npm run build,manual,DONE,DONE,DONE,client/src/pages/InvoicePoolPage.tsx | client/src/api/invoicePool.ts,"[""D9""]",ocr_failed显示错误并支持重试提示
D11,前后端错误语义统一,统一前端错误映射与mutation后缓存失效策略,同类错误提示一致,动作后相关页面数据自动刷新,cd client && npm run typecheck && npm run build,manual,DONE,DONE,DONE,client/src/api/types.ts | client/src/api/errorMessages.ts | client/src/main.tsx | client/src/query/*,"[""D6"",""D8"",""D10""]",优先复用react-query成熟能力
D12,全链路验收与发布清单,补齐文档、回归入口与发布回滚清单,server/client README 更新且 regression-all 支持 audit/ocr 分层入口,cd /home/shunli/Projects/hyb-oa && ./scripts/check-minimal.sh,manual,DONE,DONE,DONE,server/README.md | client/README.md | server/scripts/regression-all.sh,"[""D4"",""D11""]",最终交付需回归证据可复现
1 ID Title Description Acceptance Test_Method Tools Dev_Status Review1_Status Regression_Status Files Dependencies Notes
2 D1 CSV快照收口 创建P3全量交付快照,承接C2~C5并扩展D6~D12执行合同 新CSV通过校验且依赖关系正确,旧快照保持不变 python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-02-08_17-05-00-p3-full-delivery.csv manual DONE DONE DONE issues/2026-02-08_17-05-00-p3-full-delivery.csv [] 旧快照保持不可变
3 D2 审计接口自动化回归 新增审计回归脚本覆盖权限/分页/筛选/参数非法 regression-audit.sh 可重复执行并覆盖 PERM_001/分页/筛选/VALID_001 cd server && ./scripts/regression-audit.sh manual DONE DONE DONE server/scripts/regression-audit.sh | server/src/routes/audit.js | server/README.md ["D1"] 复用现有回归脚本模式
4 D3 OCR自动化回归(Mock优先) 新增mock OCR provider与回归脚本,覆盖状态流转与并发锁 regression-ocr.sh 在 mock 模式可跑通 pending_ocr->available、重复票据、失败重试、并发唯一认领 cd server && ./scripts/regression-ocr.sh manual DONE DONE DONE server/src/services/ocr/index.js | server/src/services/ocr/mock.js | server/scripts/regression-ocr.sh | server/scripts/regression-all.sh ["D1"] 真实腾讯凭据测试为可选非阻塞
5 D4 平台级回归CI补强 新增可选全回归工作流,支持workflow_dispatch和nightly 新增workflow可在CI中完成DB+migrate+seed+server+全回归脚本执行 manual: GitHub Actions workflow_dispatch 触发通过 manual DONE DONE DONE .github/workflows/ci-regression.yml | server/scripts/regression-all.sh ["D2","D3"] 保留ci-minimal不变
6 D5 工作流详情与转审候选API 新增任务详情与候选审批人接口并增强任务列表分页 新增 /api/workflow/tasks/:taskId 与 /api/workflow/approvers,列表返回分页字段 cd server && node --check src/routes/workflow.js manual DONE DONE DONE server/src/routes/workflow.js | server/README.md ["D1"] 保持既有动作接口语义不变
7 D6 前端待办列表+详情+动作 替换待办占位页,落地列表、详情与approve/reject/return/transfer动作 审批角色可在前端完成待办闭环,动作后列表与详情同步刷新 cd client && npm run typecheck && npm run build manual DONE DONE DONE client/src/pages/WorkflowTasksPage.tsx | client/src/pages/WorkflowTaskDetailPage.tsx | client/src/api/workflow.ts | client/src/router/index.tsx ["D5"] 引入react-query统一缓存失效
8 D7 报销列表API 新增报销分页列表接口并支持状态筛选与权限范围 /api/reimbursements 支持 page/pageSize/status/scope 且权限行为正确 cd server && node --check src/routes/reimbursements.js manual DONE DONE DONE server/src/routes/reimbursements.js | server/README.md ["D1"] 仅增不破
9 D8 前端报销页落地 实现报销列表/详情并联调创建提交撤回支付 employee/finance角色可完成报销基础流程并正确处理错误码 cd client && npm run typecheck && npm run build manual DONE DONE DONE client/src/pages/ReimbursementsPage.tsx | client/src/pages/ReimbursementDetailPage.tsx | client/src/api/reimbursements.ts ["D7"] 支付动作遵循后端幂等语义
10 D9 票据池列表API 新增票据池分页列表接口支持状态与ownerScope筛选 /api/invoice-pool 返回分页列表并按 invoice.manage / own 权限过滤 cd server && node --check src/routes/invoicePool.js manual DONE DONE DONE server/src/routes/invoicePool.js | server/README.md ["D1"] 保持既有上传/绑定接口不变
11 D10 前端票据页落地 实现票据中心列表上传轮询OCR绑定与签名预览 票据页可上传并展示OCR状态,支持绑定报销与签名预览 cd client && npm run typecheck && npm run build manual DONE DONE DONE client/src/pages/InvoicePoolPage.tsx | client/src/api/invoicePool.ts ["D9"] ocr_failed显示错误并支持重试提示
12 D11 前后端错误语义统一 统一前端错误映射与mutation后缓存失效策略 同类错误提示一致,动作后相关页面数据自动刷新 cd client && npm run typecheck && npm run build manual DONE DONE DONE client/src/api/types.ts | client/src/api/errorMessages.ts | client/src/main.tsx | client/src/query/* ["D6","D8","D10"] 优先复用react-query成熟能力
13 D12 全链路验收与发布清单 补齐文档、回归入口与发布回滚清单 server/client README 更新且 regression-all 支持 audit/ocr 分层入口 cd /home/shunli/Projects/hyb-oa && ./scripts/check-minimal.sh manual DONE DONE DONE server/README.md | client/README.md | server/scripts/regression-all.sh ["D4","D11"] 最终交付需回归证据可复现
@@ -0,0 +1,22 @@
ID,Title,Description,Acceptance,Test_Method,Tools,Dev_Status,Review1_Status,Regression_Status,Files,Dependencies,Notes
E1,CSV快照收口(试运行上线版),新建P4试运行上线版执行合同快照承接全部前后端与联动工作,新CSV通过校验且依赖关系正确旧快照不改动,python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-02-08_21-50-09-p4-trialrun-ready.csv,manual,DONE,DONE,DONE,issues/2026-02-08_21-50-09-p4-trialrun-ready.csv,[],none
E2,前端UI组件基线(成熟复用),引入UI primitives与移动端44px触控规范并保持现有token策略,三大业务页可复用组件且typecheck与build通过,cd client && npm run typecheck && npm run build,manual,TODO,TODO,TODO,client/src/components/ui/* | client/src/lib/* | client/src/styles/mobile-touch.css | client/src/index.css | client/tailwind.config.js | client/package.json,"[""E1""]",本地拷贝shadcn风格组件子集并记录来源/许可证与回滚路径
E3,前端布局导航收敛,统一Sidebar与Topbar交互视觉响应式与权限菜单体验,四角色菜单正确窄屏可用路由守卫无闪烁,"manual: 按server与client README启动联调并验证employee manager finance finance_mgr菜单与守卫",manual,TODO,TODO,TODO,client/src/layouts/AppShellLayout.tsx | client/src/components/navigation/* | client/src/components/common/PageHeader.tsx | client/src/router/*,"[""E2""]",none
E4,待办页精修(列表详情动作),用UI primitives收敛待办列表与详情动作区统一加载空态错误并补data-testid,approve reject return transfer动作可用且动作后列表详情刷新一致,cd client && npm run typecheck && npm run build,manual,TODO,TODO,TODO,client/src/pages/WorkflowTasksPage.tsx | client/src/pages/WorkflowTaskDetailPage.tsx | client/src/api/workflow.ts,"[""E3""]",为E2E补稳定选择器data-testid
E5,报销页精修(列表详情联动),收敛报销列表详情展示并优化支付凭证与票据区块一致性并补data-testid,employee可create submit withdraw且finance可pay并填写凭证字段,cd client && npm run typecheck && npm run build,manual,TODO,TODO,TODO,client/src/pages/ReimbursementsPage.tsx | client/src/pages/ReimbursementDetailPage.tsx | client/src/api/reimbursements.ts,"[""E3""]",为E2E补稳定选择器data-testid
E6,票据中心精修(OCR与预览),收敛上传列表详情并强化OCR状态展示绑定与签名预览交互并补data-testid,OCR_PROVIDER=mock联调可轮询pending_ocr且ocr_failed展示原因且预览可用,cd client && npm run typecheck && npm run build,manual,TODO,TODO,TODO,client/src/pages/InvoicePoolPage.tsx | client/src/api/invoicePool.ts | client/src/api/http.ts,"[""E3""]",为E2E补稳定选择器data-testid
E7,委派管理前端页(运营可用),新增委派管理页与API封装支持创建列表撤销并加菜单入口与守卫,可创建委派撤销后delegate不可代办且无权限用户403提示正确,"manual: manager创建委派让delegate代办一次后撤销再验证PERM_002",manual,TODO,TODO,TODO,client/src/pages/DelegationsPage.tsx | client/src/api/delegations.ts | client/src/router/index.tsx | client/src/components/navigation/Sidebar.tsx,"[""E3""]",权限码沿用expense.proxy_manage
E8,默认账号与失败体验收敛,补dev seed默认账号文档并让前端对网络失败给出可操作提示(含“忘记密码请联系管理员重置”),登录页后端不可达提示服务未启动且README列出默认账号且SYS_001提示可读,"manual: 停后端访问登录页看到提示并按README默认账号登录成功",manual,TODO,TODO,TODO,client/src/pages/LoginPage.tsx | client/src/api/errorMessages.ts | server/README.md | client/README.md,"[""E1""]",仅写dev seed账号不写生产密码与密钥
E9,DB索引补强(试运行性能),为列表分页与筛选补组合索引以降低试运行慢查询风险,迁移可重复执行且回归全绿,cd server && npm run prisma:migrate:deploy && ./scripts/regression-all.sh,manual,TODO,TODO,TODO,server/prisma/schema.prisma | server/prisma/migrations/*,"[""E1""]",新增组合索引仅增不破回滚成本低
E10,后端安全基线(上线级),增加安全头与关键接口限流并完善上传校验与日志脱敏约定,限流触发行为正确安全头存在上传非法类型被拒绝且不泄露token,"manual: curl压测login并验证429与headers并做一次上传非法类型校验",manual,TODO,TODO,TODO,server/src/app.js | server/src/config.js | server/src/routes/auth.js | server/src/routes/invoicePool.js | server/README.md | server/package.json,"[""E1""]",优先使用@fastify/helmet与@fastify/rate-limit并写回滚说明
E11,可观测性基线(ready与作业统计),新增/ready进行DB探活并为OCR与委派回收作业输出结构化统计,ready可反映db状态且作业日志输出claimed updated audited等计数便于排障,"manual: 启动服务curl /ready并触发一次job观察日志字段",manual,TODO,TODO,TODO,server/src/app.js | server/src/jobs/delegationRevokeJob.js | server/src/jobs/ocrJob.js | server/README.md,"[""E10""]",不引入外部监控先提供最小可观测字段
E12,单域部署(server托管client静态),支持server托管client dist实现同域cookie并提供开关与SPA回退,开启后通过server根路径访问前端且登录刷新正常,"manual: cd client && npm run build 然后SERVE_CLIENT_DIST=true启动server访问http://127.0.0.1:3000完成登录",manual,TODO,TODO,TODO,server/src/app.js | server/src/config.js | server/README.md | docker-compose.yml,"[""E10""]",优先复用@fastify/static并用正则fallback避开/api
E13,部署与运维包(试运行),提供deploy/trialrun含env模板compose示例反向代理示例与启动停止runbook,按runbook可在新机器完成启动升级迁移与回滚演练一次,"manual: 按deploy/trialrun/runbook执行docker compose启动并验证ready与登录与回归入口",manual,TODO,TODO,TODO,deploy/trialrun/* | docker-compose.yml | server/.env.example | server/README.md | client/README.md,"[""E12""]",先覆盖试运行环境后续再细化生产
E14,备份与恢复演练(DB+文件),提供DB(pg_dump)与文件存储(票据上传目录)备份恢复脚本并把演练步骤写入runbook,可生成DB+文件备份并在空库与空存储恢复后通过smoke与登录验证,"manual: 执行备份脚本后restore到新库与新存储目录并跑smoke-test",manual,TODO,TODO,TODO,scripts/backup-db.sh | scripts/restore-db.sh | scripts/backup-storage.sh | scripts/restore-storage.sh | deploy/trialrun/* | server/README.md,"[""E13""]",脚本读取DATABASE_URL与STORAGE_DIR不写死密码并输出可审计日志
E15,Playwright E2E(上线门禁),引入Playwright覆盖主链路登录待办审批报销提交票据上传OCR轮询绑定预览支付登出,本地与CI均可稳定跑通且失败输出可定位trace与截图,cd client && npm run test:e2e,manual,TODO,TODO,TODO,client/playwright.config.ts | client/tests/e2e/* | client/package.json | client/README.md | client/src/pages/*,"[""E12"",""E4"",""E5"",""E6"",""E8""]",测试环境OCR_PROVIDER=mock且OCR_POLL_CRON改为秒级以保证E2E稳定
E16,CI集成E2E与全链门禁,新增ci-e2e工作流在PR与nightly跑E2E并保留现有最小门禁与后端回归,PR能跑min+e2e smoke nightly跑regression+e2e全量,"manual: GitHub Actions workflow_dispatch触发并通过",manual,TODO,TODO,TODO,.github/workflows/ci-e2e.yml | .github/workflows/ci-minimal.yml | .github/workflows/ci-regression.yml,"[""E15""]",CI中OCR默认mock避免外部凭据不稳定
E17,账号与角色管理API(后端运营),新增system.users下的员工创建启用禁用重置密码角色分配接口并写审计,system.users可完成一轮创建与禁用与角色分配且审计完整,"manual: curl或postman完成创建禁用改角色与重置密码并验证权限阻断",manual,TODO,TODO,TODO,server/src/routes/users.js | server/src/app.js | server/src/constants/permissions.js | server/README.md | server/package.json,"[""E10""]",禁止自注册仅运营接口并记录回滚策略
E18,账号与角色管理页(前端最小可运营),新增系统用户管理页与API封装并加菜单入口与守卫,具备system.users账号可管理普通账号且无权限用户403,"manual: admin登录进入用户管理页完成创建与禁用与重置密码",manual,TODO,TODO,TODO,client/src/pages/UserManagementPage.tsx | client/src/api/users.ts | client/src/router/index.tsx | client/src/components/navigation/Sidebar.tsx,"[""E17"",""E3""]",页面先满足运营闭环不做复杂组织管理
E19,上线发布清单与回滚策略收口,把试运行上线步骤门禁回归备份回滚监控要点写成可执行checklist,按清单可完成一次发布并可在10分钟内回滚到上个版本,"manual: 按runbook checklist执行一次演练并记录证据",manual,TODO,TODO,TODO,server/README.md | client/README.md | deploy/trialrun/*,"[""E9"",""E11"",""E13"",""E14"",""E16"",""E18""]",形成可审计可回滚的发布闭环
E20,试运行引导管理员账号(bootstrap),新增试运行引导脚本创建首个管理员账号用于后续运营(管理员重置密码策略),空库可通过脚本创建管理员且可登录并进入用户管理页,"manual: 空库migrate后运行seed:trialrun并用管理员账号调用/login与进入前端用户管理页",manual,TODO,TODO,TODO,server/src/scripts/seed-trialrun.js | server/package.json | server/README.md | deploy/trialrun/*,"[""E1""]",避免使用seed-dev默认弱口令;密码由env提供或首次启动输出一次性口令
E21,服务优雅停机(单机部署),补齐SIGTERM/SIGINT优雅退出(停止job/关闭HTTP/断开DB)并写入runbook,容器stop或Ctrl+C退出时无Unhandled且能在超时前完成close,"manual: 本地启动server后发送SIGTERM观察日志并确认端口释放",manual,TODO,TODO,TODO,server/src/index.js | server/README.md | deploy/trialrun/*,"[""E1""]",单机同样需要保证升级/重启过程中连接与作业可控
1 ID Title Description Acceptance Test_Method Tools Dev_Status Review1_Status Regression_Status Files Dependencies Notes
2 E1 CSV快照收口(试运行上线版) 新建P4试运行上线版执行合同快照承接全部前后端与联动工作 新CSV通过校验且依赖关系正确旧快照不改动 python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-02-08_21-50-09-p4-trialrun-ready.csv manual DONE DONE DONE issues/2026-02-08_21-50-09-p4-trialrun-ready.csv [] none
3 E2 前端UI组件基线(成熟复用) 引入UI primitives与移动端44px触控规范并保持现有token策略 三大业务页可复用组件且typecheck与build通过 cd client && npm run typecheck && npm run build manual TODO TODO TODO client/src/components/ui/* | client/src/lib/* | client/src/styles/mobile-touch.css | client/src/index.css | client/tailwind.config.js | client/package.json ["E1"] 本地拷贝shadcn风格组件子集并记录来源/许可证与回滚路径
4 E3 前端布局导航收敛 统一Sidebar与Topbar交互视觉响应式与权限菜单体验 四角色菜单正确窄屏可用路由守卫无闪烁 manual: 按server与client README启动联调并验证employee manager finance finance_mgr菜单与守卫 manual TODO TODO TODO client/src/layouts/AppShellLayout.tsx | client/src/components/navigation/* | client/src/components/common/PageHeader.tsx | client/src/router/* ["E2"] none
5 E4 待办页精修(列表详情动作) 用UI primitives收敛待办列表与详情动作区统一加载空态错误并补data-testid approve reject return transfer动作可用且动作后列表详情刷新一致 cd client && npm run typecheck && npm run build manual TODO TODO TODO client/src/pages/WorkflowTasksPage.tsx | client/src/pages/WorkflowTaskDetailPage.tsx | client/src/api/workflow.ts ["E3"] 为E2E补稳定选择器data-testid
6 E5 报销页精修(列表详情联动) 收敛报销列表详情展示并优化支付凭证与票据区块一致性并补data-testid employee可create submit withdraw且finance可pay并填写凭证字段 cd client && npm run typecheck && npm run build manual TODO TODO TODO client/src/pages/ReimbursementsPage.tsx | client/src/pages/ReimbursementDetailPage.tsx | client/src/api/reimbursements.ts ["E3"] 为E2E补稳定选择器data-testid
7 E6 票据中心精修(OCR与预览) 收敛上传列表详情并强化OCR状态展示绑定与签名预览交互并补data-testid OCR_PROVIDER=mock联调可轮询pending_ocr且ocr_failed展示原因且预览可用 cd client && npm run typecheck && npm run build manual TODO TODO TODO client/src/pages/InvoicePoolPage.tsx | client/src/api/invoicePool.ts | client/src/api/http.ts ["E3"] 为E2E补稳定选择器data-testid
8 E7 委派管理前端页(运营可用) 新增委派管理页与API封装支持创建列表撤销并加菜单入口与守卫 可创建委派撤销后delegate不可代办且无权限用户403提示正确 manual: manager创建委派让delegate代办一次后撤销再验证PERM_002 manual TODO TODO TODO client/src/pages/DelegationsPage.tsx | client/src/api/delegations.ts | client/src/router/index.tsx | client/src/components/navigation/Sidebar.tsx ["E3"] 权限码沿用expense.proxy_manage
9 E8 默认账号与失败体验收敛 补dev seed默认账号文档并让前端对网络失败给出可操作提示(含“忘记密码请联系管理员重置”) 登录页后端不可达提示服务未启动且README列出默认账号且SYS_001提示可读 manual: 停后端访问登录页看到提示并按README默认账号登录成功 manual TODO TODO TODO client/src/pages/LoginPage.tsx | client/src/api/errorMessages.ts | server/README.md | client/README.md ["E1"] 仅写dev seed账号不写生产密码与密钥
10 E9 DB索引补强(试运行性能) 为列表分页与筛选补组合索引以降低试运行慢查询风险 迁移可重复执行且回归全绿 cd server && npm run prisma:migrate:deploy && ./scripts/regression-all.sh manual TODO TODO TODO server/prisma/schema.prisma | server/prisma/migrations/* ["E1"] 新增组合索引仅增不破回滚成本低
11 E10 后端安全基线(上线级) 增加安全头与关键接口限流并完善上传校验与日志脱敏约定 限流触发行为正确安全头存在上传非法类型被拒绝且不泄露token manual: curl压测login并验证429与headers并做一次上传非法类型校验 manual TODO TODO TODO server/src/app.js | server/src/config.js | server/src/routes/auth.js | server/src/routes/invoicePool.js | server/README.md | server/package.json ["E1"] 优先使用@fastify/helmet与@fastify/rate-limit并写回滚说明
12 E11 可观测性基线(ready与作业统计) 新增/ready进行DB探活并为OCR与委派回收作业输出结构化统计 ready可反映db状态且作业日志输出claimed updated audited等计数便于排障 manual: 启动服务curl /ready并触发一次job观察日志字段 manual TODO TODO TODO server/src/app.js | server/src/jobs/delegationRevokeJob.js | server/src/jobs/ocrJob.js | server/README.md ["E10"] 不引入外部监控先提供最小可观测字段
13 E12 单域部署(server托管client静态) 支持server托管client dist实现同域cookie并提供开关与SPA回退 开启后通过server根路径访问前端且登录刷新正常 manual: cd client && npm run build 然后SERVE_CLIENT_DIST=true启动server访问http://127.0.0.1:3000完成登录 manual TODO TODO TODO server/src/app.js | server/src/config.js | server/README.md | docker-compose.yml ["E10"] 优先复用@fastify/static并用正则fallback避开/api
14 E13 部署与运维包(试运行) 提供deploy/trialrun含env模板compose示例反向代理示例与启动停止runbook 按runbook可在新机器完成启动升级迁移与回滚演练一次 manual: 按deploy/trialrun/runbook执行docker compose启动并验证ready与登录与回归入口 manual TODO TODO TODO deploy/trialrun/* | docker-compose.yml | server/.env.example | server/README.md | client/README.md ["E12"] 先覆盖试运行环境后续再细化生产
15 E14 备份与恢复演练(DB+文件) 提供DB(pg_dump)与文件存储(票据上传目录)备份恢复脚本并把演练步骤写入runbook 可生成DB+文件备份并在空库与空存储恢复后通过smoke与登录验证 manual: 执行备份脚本后restore到新库与新存储目录并跑smoke-test manual TODO TODO TODO scripts/backup-db.sh | scripts/restore-db.sh | scripts/backup-storage.sh | scripts/restore-storage.sh | deploy/trialrun/* | server/README.md ["E13"] 脚本读取DATABASE_URL与STORAGE_DIR不写死密码并输出可审计日志
16 E15 Playwright E2E(上线门禁) 引入Playwright覆盖主链路登录待办审批报销提交票据上传OCR轮询绑定预览支付登出 本地与CI均可稳定跑通且失败输出可定位trace与截图 cd client && npm run test:e2e manual TODO TODO TODO client/playwright.config.ts | client/tests/e2e/* | client/package.json | client/README.md | client/src/pages/* ["E12","E4","E5","E6","E8"] 测试环境OCR_PROVIDER=mock且OCR_POLL_CRON改为秒级以保证E2E稳定
17 E16 CI集成E2E与全链门禁 新增ci-e2e工作流在PR与nightly跑E2E并保留现有最小门禁与后端回归 PR能跑min+e2e smoke nightly跑regression+e2e全量 manual: GitHub Actions workflow_dispatch触发并通过 manual TODO TODO TODO .github/workflows/ci-e2e.yml | .github/workflows/ci-minimal.yml | .github/workflows/ci-regression.yml ["E15"] CI中OCR默认mock避免外部凭据不稳定
18 E17 账号与角色管理API(后端运营) 新增system.users下的员工创建启用禁用重置密码角色分配接口并写审计 system.users可完成一轮创建与禁用与角色分配且审计完整 manual: curl或postman完成创建禁用改角色与重置密码并验证权限阻断 manual TODO TODO TODO server/src/routes/users.js | server/src/app.js | server/src/constants/permissions.js | server/README.md | server/package.json ["E10"] 禁止自注册仅运营接口并记录回滚策略
19 E18 账号与角色管理页(前端最小可运营) 新增系统用户管理页与API封装并加菜单入口与守卫 具备system.users账号可管理普通账号且无权限用户403 manual: admin登录进入用户管理页完成创建与禁用与重置密码 manual TODO TODO TODO client/src/pages/UserManagementPage.tsx | client/src/api/users.ts | client/src/router/index.tsx | client/src/components/navigation/Sidebar.tsx ["E17","E3"] 页面先满足运营闭环不做复杂组织管理
20 E19 上线发布清单与回滚策略收口 把试运行上线步骤门禁回归备份回滚监控要点写成可执行checklist 按清单可完成一次发布并可在10分钟内回滚到上个版本 manual: 按runbook checklist执行一次演练并记录证据 manual TODO TODO TODO server/README.md | client/README.md | deploy/trialrun/* ["E9","E11","E13","E14","E16","E18"] 形成可审计可回滚的发布闭环
21 E20 试运行引导管理员账号(bootstrap) 新增试运行引导脚本创建首个管理员账号用于后续运营(管理员重置密码策略) 空库可通过脚本创建管理员且可登录并进入用户管理页 manual: 空库migrate后运行seed:trialrun并用管理员账号调用/login与进入前端用户管理页 manual TODO TODO TODO server/src/scripts/seed-trialrun.js | server/package.json | server/README.md | deploy/trialrun/* ["E1"] 避免使用seed-dev默认弱口令;密码由env提供或首次启动输出一次性口令
22 E21 服务优雅停机(单机部署) 补齐SIGTERM/SIGINT优雅退出(停止job/关闭HTTP/断开DB)并写入runbook 容器stop或Ctrl+C退出时无Unhandled且能在超时前完成close manual: 本地启动server后发送SIGTERM观察日志并确认端口释放 manual TODO TODO TODO server/src/index.js | server/README.md | deploy/trialrun/* ["E1"] 单机同样需要保证升级/重启过程中连接与作业可控