13 KiB
13 KiB
| 1 | ID | Title | Description | Acceptance | Test_Method | Tools | Dev_Status | Review1_Status | Regression_Status | Files | Dependencies | Notes |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | OAFLOW1-0 | 建立负责人本人申请兜底审批合同 | 承接 wangshunli/HYD000006 提交报销时因无直属主管触发 no_actionable_approver 的真实试运行反馈,建立 OAFLOW1 执行合同。边界:不为了过流程伪造组织直属上级;不允许自审;不改当前公网数据;后续实现前必须再次批准方案。 | Issue CSV 通过校验;明确短期 OAOPS1 真实报销闭环优先由普通员工提交,负责人本人申请兜底规则作为独立实现项;不把 admin 权限等同于业务审批权。 | 受影响流程:负责人本人提交报销 -> 审批人解析 -> 阻断或兜底审批;验证步骤:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-24_19-03-07-oa-owner-application-fallback-approval-v1.csv。 | python3|manual | DONE | DONE | DONE | issues/2026-05-24_19-03-07-oa-owner-application-fallback-approval-v1.csv | [] | 本行仅建合同,不改代码、不改数据库、不部署;当前线上阻断符合现有规约,但暴露负责人本人申请缺少非本人兜底规则。 |
| 3 | OAFLOW1-1 | OAOPS1 当前闭环绕行策略 | 在 OAFLOW1 实现前,OALAUNCH1/OAOPS1 首条真实报销闭环不使用 wangshunli 本人发起,而由普通员工或专用真实试用员工提交;wangshunli 作为 CEO/admin 观察或在高额节点处理。 | 不调整 wangshunli 的直属主管为假上级;普通员工提交报销能按直属主管进入审批;OALAUNCH1 真实业务证据记录该绕行原因和后续 OAFLOW1 计划。 | 受影响流程:真实报销 PDF OCR -> 提交 -> 审批 -> 付款批次 -> 回单 -> 已付款 -> AP 导出;验证步骤:人工在公网 OA 使用普通员工完成 1 条低风险真实报销闭环,再运行 scripts/qa/run-oa-final-launch-readiness.sh 汇总。 | manual|bash | TODO | TODO | TODO | external|issues/2026-05-22_20-09-22-oa-real-use-stabilization-v1.csv|issues/2026-05-23_16-49-39-oa-final-launch-readiness-v1.csv | ["OAFLOW1-0"] | 真实票据、银行回单、合同正文、敏感报价和未脱敏票面不得进入仓库、聊天或自动化报告;这只是启用验收路径选择,不是业务规则永久绕行。 |
| 4 | OAFLOW1-2 | 只读诊断负责人本人申请审批链 | 新增或复用 QA-only 只读诊断,报告 CEO/admin/root-like 员工本人提交报销时当前审批规则会解析到谁、是否缺直属主管、是否会自审、是否存在可用非本人兜底角色或人员。 | 诊断默认只读;报告只输出员工号、角色摘要、规则名、节点类型、脱敏 finding,不输出手机号、邮箱、密码、token、Secret、附件、票据原文或完整 payload;当前 HYD000006 应报告 owner_self_application_missing_fallback。 | 受影响流程:管理员发现提交阻断 -> 运行只读诊断 -> 决定配置或开发;验证步骤:node --check scripts/qa/check-owner-application-approval-route.mjs;公网只读运行后 summary.json 不含敏感值。 | node|bash | DONE | DONE | DONE | scripts/qa/check-owner-application-approval-route.mjs|artifacts/qa-flow/owner-application-approval-route-* | ["OAFLOW1-0"] | 已新增 scripts/qa/check-owner-application-approval-route.mjs;公网容器只读运行报告 artifacts/qa-flow/owner-application-approval-route-20260524-auto/summary.json 为 PASS_WITH_FINDINGS,确认 HYD000006 在 3 条报销金额规则第 0 步 manager 均因 no_manager_found 阻断,并发现 manager/finance_mgr/finance 等非本人候选角色存在但尚未配置为负责人本人申请兜底;隐私 grep 未发现敏感值;未写业务数据、未创建待办、未改配置。 |
| 5 | OAFLOW1-3 | 设计审批规则数据模型扩展 | 设计并实现可配置的负责人本人申请兜底规则,优先支持按业务类型和金额规则配置非本人兜底角色或指定人员。推荐字段方向:当 department_manager 无法解析或解析到申请人本人时,可按审批规则配置 fallback role/employee;fallback 必须非本人、active、未归档且具备业务审批角色。 | Prisma 迁移可回滚;审批规则不再只表达 level1/2/3 role,还能表达负责人本人或无主管时的非本人兜底;现有普通员工审批规则不回归;无兜底时仍阻断。 | 受影响流程:审批规则配置 -> 报销提交 -> 工作流任务创建;验证步骤:cd server && npm run prisma:validate;迁移 SQL review;负责人本人、普通员工、缺兜底三类用例通过。 | prisma|node|manual | DONE | DONE | DONE | server/prisma/schema.prisma|server/prisma/migrations/*|server/src/routes/approvalRules.js|server/src/utils/workflow.js | ["OAFLOW1-2"] | 已实现 approval_rules.owner_self_fallback_role / API ownerSelfFallbackRole;OAFLOW1 V1 只允许 finance_mgr 或 null,现有启用规则迁移回填 finance_mgr;显式 null 保持无兜底。回滚路径:停止服务并确认无新单依赖该列后,回退代码并执行 ALTER TABLE "approval_rules" DROP COLUMN "owner_self_fallback_role"。 |
| 6 | OAFLOW1-4 | 实现报销提交兜底解析 | 在报销提交和后续审批推进中,当审批节点为直属主管但申请人为 root-like/负责人且无直属主管,或主管节点解析到申请人本人时,使用配置的非本人兜底角色或人员。不得自动升级到 admin,不得让申请人自审,不得生成无可处理人的 role task。 | wangshunli/HYD000006 低风险报销在配置兜底后可提交到非本人审批人;未配置或兜底不可用时仍返回 no_actionable_approver;普通员工仍走直属主管;审批通过、驳回、退回、撤回和通知不回归。 | 受影响流程:报销草稿 -> 提交 -> 首个待办 -> 审批推进 -> 通知;验证步骤:cd server && node --check src/routes/reimbursements.js src/routes/workflow.js src/utils/workflow.js;运行 workflow/reimbursement 相关回归。 | node|bash | DONE | DONE | DONE | server/src/routes/reimbursements.js|server/src/routes/workflow.js|server/src/utils/workflow.js|server/tests | ["OAFLOW1-3"] | 已实现负责人本人报销审批快照:ceo owner 无直属主管时用 ownerSelfFallbackRole=finance_mgr 替换 manager,移除本人 ceo 节点和重复角色;提交前校验 active 非本人 finance_mgr 持有人;不自动升级 admin,不允许自审;审批推进继续只读 workflow_steps_snapshot。 |
| 7 | OAFLOW1-5 | 管理端配置与操作手册 | 在审批规则管理或系统设置中展示负责人本人申请兜底配置,并在管理员手册说明小团队推荐口径:普通员工走直属主管,主管本人走负责人,负责人本人走指定非本人复核人。 | 管理员能在 UI 中看懂并配置兜底角色或人员;页面不要求新建复杂 BPM;手册写明不要用假直属主管绕行,不要用 admin 代替业务审批。 | 受影响流程:管理员配置审批规则 -> 员工提交 -> 审批链生效;验证步骤:cd client && npm run typecheck && npm run build;rg -n "负责人本人|兜底审批|非本人复核|假直属主管" docs client/src。 | typescript|rg|manual | DONE | DONE | DONE | client/src|docs/管理员手册.md|docs/需求-统一审批中心规约.md | ["OAFLOW1-3","OAFLOW1-4"] | 已在审批规则页面新增负责人本人兜底角色配置,V1 仅 finance_mgr 或无;已回写管理员手册、统一审批规约、人工试运行报告、文档索引、事实源矩阵和项目 skill;明确不要用假直属主管绕行,不要用 admin 代替业务审批。 |
| 8 | OAFLOW1-6 | 自动化回归覆盖 | 补充自动化用例覆盖负责人本人申请、主管本人申请、普通员工申请、无兜底阻断、兜底人停用、自审防护和角色待办可处理性。 | 至少覆盖:1) 普通员工报销不变;2) HYD000006 无兜底时阻断;3) 配置非本人兜底后可提交;4) fallback 指向本人或停用人时阻断;5) 任务不能被申请人本人审批。 | 受影响流程:报销提交 -> 待办分配 -> 审批动作;验证步骤:cd server && npm run prisma:validate && ./scripts/regression-workflow-actions.sh && ./scripts/regression-all.sh;必要时增加定向测试命令。 | bash|node | DONE | DONE | TODO | server/tests|server/scripts/regression-workflow-actions.sh|server/scripts/regression-all.sh | ["OAFLOW1-4"] | 已补充 workflow 单测覆盖普通员工不变、负责人 finance_mgr 兜底、无兜底阻断、无 active 非本人持有人阻断、owner 同持兜底角色阻断、unsupported role 阻断;新增无端口 Fastify app.inject 提交路径测试,验证 CEO owner 报销会保存 finance_mgr 兜底 workflow_steps_snapshot 并创建 finance_mgr 待办,且兜底无人时不创建流程实例。定向 vitest 21 项通过;后端完整 vitest 141 个文件、707 项测试通过。HTTP workflow regression 因沙箱禁止本地 server 监听且提升权限被 auto_review 拒绝(避免加载真实 .env 后定时任务写库)未执行,保留 Regression_Status=TODO。 |
| 9 | OAFLOW1-7 | 只读 reviewer 审查 | 由于本项涉及审批规则、权限模型和可能的数据迁移,实施后启动只读 reviewer subagent 审查,不允许其改代码。 | reviewer 明确检查:自审是否被阻断,admin 是否未被当作业务审批权,兜底角色是否可能无 active 持有人,迁移是否可回滚,普通员工流程是否回归。 | 受影响流程:实现完成 -> 独立评审 -> 修复或记录 blocker;验证步骤:reviewer 输出无 blocker 或 blocker 已处理,Issue 状态再进入 QA。 | subagent|manual | DONE | DONE | DONE | N/A | ["OAFLOW1-3","OAFLOW1-4","OAFLOW1-6"] | 只读 reviewer 已完成首轮审查并提出 4 项 finding;已修复高/中/低风险配置问题:fallback 限定 finance_mgr/null、前端不再暴露 ceo/hr/admin/administration、创建接口尊重显式 null,并补充回滚路径。第二轮复审请求超时后已关闭;主线程复核和自动门禁未发现新增 blocker,不进入公网部署。 |
| 10 | OAFLOW1-8 | 公网部署与负责人本人低风险验证 | 在本地门禁、reviewer 和 QA 通过后,经人工批准部署到公网;由 wangshunli 提交 1 条低风险报销验证非本人兜底审批链,再继续 OALAUNCH1 真实启用门禁。 | 部署后 /ready 通过;负责人本人低风险报销能进入非本人审批人待办;审批历史显示非本人处理;不会自审;不会执行真实付款;报告脱敏留存。 | 受影响流程:部署 -> /ready -> 负责人本人提交低风险报销 -> 非本人审批 -> OALAUNCH1 汇总;验证步骤:SYNC_ENV=0 bash deploy/trialrun/deploy.sh;公网 /ready;人工提交低风险报销;运行 OAOPS1/OALAUNCH1 只读汇总。 | bash|manual | DONE | DONE | DONE | deploy/trialrun/deploy.sh|artifacts/qa-flow/oa-real-use-daily-*|artifacts/qa-flow/oa-final-launch-readiness-* | ["OAFLOW1-7"] | 已部署 commit 2e778d3,SYNC_ENV=0 未覆盖远端 .env;远端 migration 20260524193000_owner_self_fallback_role 已应用;部署内置 /ready、external deps smoke、runtime smoke、公网资源扫描和 live smoke 通过。公网 /ready 返回 ok;live readiness 报告 artifacts/qa-flow/live-smoke-readiness-20260524-211907 通过;OAOPS1 日巡检 artifacts/qa-flow/oa-real-use-daily-20260524-212004/summary.json 为 PASS_OA_REAL_USE_DAILY_READY 且 findingCount=0;远端只读诊断 artifacts/qa-flow/owner-application-approval-route-20260524-deploy/summary.json 为 PASS_OWNER_APPLICATION_ROUTE_READY,HYD000006 三条规则均会创建 finance_mgr 兜底角色待办且 ownerSelfApplicationBlocked=false;OALAUNCH1 汇总 artifacts/qa-flow/oa-final-launch-readiness-20260524-212516/summary.json 为 PAUSED_MANUAL_CONFIRMATION。用户人工验证公网低风险报销审批进度显示“当前位于第 1/1 步;第 1 步 · 负责人本人申请兜底:finance_mgr;当前节点”,证明负责人本人申请已进入 finance_mgr 非本人兜底待办,提交侧 live 验证通过;不执行真实付款,验证单后续可按撤回或驳回留痕处理。rollback/cleanup:如公网验证发现阻断,按 trialrun runbook 回滚代码到上一稳定镜像/提交;已应用迁移仅在确认无新单依赖 owner_self_fallback_role 后按 OAFLOW1-3 记录的 ALTER TABLE DROP COLUMN 路径回退;验证单不物理删除,按撤回或驳回保留审计。 |
| 11 | OAFLOW1-9 | 消除前端 Vite circular chunk warning | 处理 OAFLOW1 本地构建中发现的 Vite/Rollup circular chunk warning,避免手工页面分包强拆互相依赖的页面和共享模块。边界:只调整构建分包策略,不改业务页面行为、不部署。 | client build 不再输出 Circular chunk warning;前端 typecheck 和 build 通过;Issue CSV 校验通过。 | 受影响流程:前端构建 -> 部署产物生成 -> OAFLOW1 本地门禁;验证步骤:cd client && npm run build;确认输出无 Circular chunk;python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-24_19-03-07-oa-owner-application-fallback-approval-v1.csv。 | typescript|vite|python | DONE | DONE | DONE | client/vite.config.ts | ["OAFLOW1-6"] | 已删除页面组手工分包,只保留 vendor/app-core/app-domain-shared 等稳定共享分包;client build 通过且未再输出 Circular chunk warning。 |