ID,Title,Description,Acceptance,Test_Method,Tools,Dev_Status,Review1_Status,Regression_Status,Files,Dependencies,Notes P15A-0,P15A执行合同建档,创建并校验P15A(权限全域解耦)执行合同CSV,CSV通过校验且字段完整,python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-06_14-30-00-p15a-l5-permission-decouple.csv,manual,DONE,DONE,DONE,issues/2026-03-06_14-30-00-p15a-l5-permission-decouple.csv,[],需在P14彻底结束后建档 P15A-1,常量字典与角色补齐,重构 permissions.js 新增 LEAVE 域权限集并应用给相应角色,字典分离成功并且在测试或路由里可以解析出权限,manual,manual,DONE,DONE,DONE,server/src/constants/permissions.js | server/src/scripts/seed-dev.js,"[""P15A-0""]",应用角色权限 P15A-2,工作流动态鉴权剥离,将硬编码的 expense.approve 替换为 resolveEntityPermission 以根据 entityType 支持多态鉴权,提交和审批节点鉴权可自动识别 leave 和 expense 的不同所需 Token,cd server && npm run test,manual,DONE,DONE,DONE,server/src/constants/permissions.js | server/src/plugins/auth.js | server/src/routes/workflow.js,"[""P15A-1""]",核心路由侧改动;不新增中间映射文件 P15A-3,前端路由与菜单显隐域解耦,调整现有待办与审批入口的 anyOf 守卫以支持 leave.approve 避免菜单与路由继续借用 expense 域,具备 leave.approve 的审批人可见现有审批入口且不新增独立请假配置菜单,manual,manual,DONE,DONE,DONE,client/src/components/navigation/NavLinks.tsx | client/src/router/index.tsx,"[""P15A-1""]",仅调整现有入口守卫,不扩独立请假菜单 P15A-4,OpenAPI Tag分离,更新 leave 相关的 OpenAPI schema 注释将其脱离 Finance 组并收归 HR 分区,导出或查阅 json 中正确呈现独立 tag,curl /api/docs/json,manual,DONE,DONE,DONE,server/src/routes/leave.js,"[""P15A-2""]",不涉及业务逻辑 P15A-5,P15A全量回归测试,运行回归脚本确保由 P15A 引发的基座层鉴权改动并未破坏原有的报销流转 (Expense),全量基线回归绿柱通过,cd server && ./scripts/regression-all.sh,manual,DONE,DONE,DONE,none,"[""P15A-3"",""P15A-4""]",严查expense业务回归