|
|
|
@@ -0,0 +1,10 @@
|
|
|
|
|
"ID","Title","Description","Acceptance","Test_Method","Tools","Dev_Status","Review1_Status","Regression_Status","Files","Dependencies","Notes"
|
|
|
|
|
"OAPERM1-0","建立权限冻结与搜索过滤修复合同","承接 OAAUTO1-4 发现:差旅、薪酬、绩效和合同/涉密资料搜索结果在最终启用前需要按 blocker 处理。本合同只处理上线前权限收口,不做真实业务写入、不付款、不恢复数据库。","Issue CSV 校验通过;明确本轮目标为 P0 + 轻 P1 启用前权限收口;未授权的后置模块返回 403 或功能关闭 409;搜索不泄露合同台账、涉密资料或差旅摘要给非授权角色。","受影响流程:公网权限矩阵 -> blocker 分类 -> 修复合同;验证步骤:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-23_23-42-53-oa-permission-freeze-search-filter-v1.csv。","python3|manual","DONE","DONE","DONE","issues/2026-05-23_23-42-53-oa-permission-freeze-search-filter-v1.csv","[]","已完成:Issue CSV 已创建并通过 validate_issues_csv.py 和 check-process-contract general。MAGI 审视:权限问题必须先收口再启动 7 天稳定化;执行:按最小启用范围修冻结项和搜索过滤;提升:后续模块启用必须先扩权限矩阵。回滚/清理:本合同可通过回退本次权限常量、路由守卫和搜索过滤代码恢复原访问口径;不涉及 schema 或数据迁移。"
|
|
|
|
|
"OAPERM1-1","差旅模块上线前冻结","差旅申请不属于当前最终启用范围,员工、主管、财务、CEO、财务经理和行政在上线前不应通过直连 API、导航、审批待办或全局搜索访问差旅申请;仅 admin/system.settings 保留治理可见性。","employee、manager、finance 对 /api/travel-requests?page=1&pageSize=5 返回 403 或 409;全局搜索不返回 travel_request;导航不展示差旅入口给无 travel 权限角色;历史差旅 workflow task 只向 system.settings/admin 暴露摘要或详情。","受影响流程:角色登录 -> 差旅列表直连 -> 导航 -> 审批待办 -> 全局搜索;验证步骤:node scripts/qa/check-oa-permission-matrix.mjs,重点检查 travel-requests 和 global-search-sensitive;npx vitest run tests/unit/constants/permissions.test.js tests/unit/routes/workflow*.test.js。","node|playwright","DONE","DONE","TODO","server/src/constants/permissions.js;client/src/auth/permissions.ts;server/src/routes/workflow.js;server/src/routes/search.js;client/src/components/navigation/NavLinks.tsx;server/src/services/workspaceSettings.js;scripts/qa/check-oa-permission-matrix.mjs","[""OAPERM1-0""]","已实现:从 employee/manager/finance/ceo/finance_mgr/administration 默认权限移除 travel.*;前端权限事实源和导航同步;search/workflow 对 travel_request 改为仅 system.settings/admin 可见;受影响 vitest 12 个文件 49 条通过。公网权限矩阵待部署后复核。权限模型变更。回滚/清理:恢复相关角色的 travel.* 权限、导航 anyOf、search 条件和 workflow visibility 即可恢复原差旅访问;如未来启用差旅,需新 Issue 重新定义角色和验收。"
|
|
|
|
|
"OAPERM1-2","薪酬和绩效管理入口收紧","薪酬配置和绩效周期属于高敏/后置模块;HR 当前可管理人员,但不应默认拥有薪酬项目、薪资导出、绩效周期管理权限、员工档案薪资/绩效入口或统计摘要。","HR 访问 /api/payroll/items 返回 403;HR 访问 /api/performance/cycles 返回 403 或 409;员工统计对非 system.settings 不返回薪酬/绩效摘要;admin 仍可通过对应正例;不影响 HR 的人员管理和企微归档查看正例。","受影响流程:HR 登录 -> 薪酬配置直连 -> 薪资导出 -> 员工档案薪资/绩效入口 -> 绩效周期直连 -> 员工统计 -> admin 正例;验证步骤:node scripts/qa/check-oa-permission-matrix.mjs;npx vitest run tests/unit/routes/employees.stats.test.js tests/unit/routes/payroll*.test.js tests/unit/routes/performance*.test.js;cd client && npm run typecheck。","node|playwright","DONE","DONE","TODO","server/src/routes/payroll.js;server/src/routes/performance.js;server/src/routes/exports.js;server/src/routes/employees.js;server/src/services/employeeStats.js;client/src/router/index.tsx;client/src/pages/PeopleStatsPage.tsx;client/src/pages/EmployeeProfilePage.tsx;scripts/qa/check-oa-permission-matrix.mjs","[""OAPERM1-0""]","已实现:薪酬项目、薪资资料、薪资导出、绩效周期/评审、前端 payroll/performance 路由、员工档案薪资/绩效 tab 和员工统计敏感摘要改由 system.settings 管理;人员统计页文案同步 system.settings。公网权限矩阵待部署后复核。权限模型变更。回滚/清理:将相关路由守卫和员工统计 include 条件恢复为 system.users 即可恢复 HR 原访问;薪酬/绩效后续正式启用需独立合同和更细权限。"
|
|
|
|
|
"OAPERM1-3","合同台账和涉密资料搜索过滤","合同台账和涉密资料引用属于敏感台账;非管理员/系统设置角色不得从全局搜索看到 contract_registry 或 confidential_doc_ref 结果,即使其有项目查看/管理权限。","employee、manager、finance、HR、CEO 的 /api/search?q=TEST&limit=10 不包含 contract_registry、confidential_doc_ref 或对应 href;admin 正例仍可搜索。","受影响流程:全局搜索 -> 搜索结果权限过滤 -> 点击入口;验证步骤:node scripts/qa/check-oa-permission-matrix.mjs,重点检查 global-search-sensitive。","node|playwright","DONE","DONE","TODO","server/src/routes/search.js;client/src/components/GlobalSearchDialog.tsx;scripts/qa/check-oa-permission-matrix.mjs","[""OAPERM1-0""]","已实现:全局搜索中 contract_registry/confidential_doc_ref 仅 system.settings 或 admin 可见;新增项目经理搜索负例单测并通过。只调整搜索暴露面,不在本轮重构合同台账业务权限。回滚/清理:恢复 search.js 中合同/资料搜索权限条件即可恢复原搜索口径。"
|
|
|
|
|
"OAPERM1-4","后端语法与最小静态门禁","完成权限修复后运行后端语法、前端类型检查和项目最小门禁,确认无语法或构建回归。","node --check 覆盖修改路由;受影响 vitest 通过;cd client && npm run typecheck 通过;bash scripts/check-minimal.sh 通过;git diff --check 通过。","受影响流程:代码修改 -> 静态检查 -> 最小回归;验证步骤:node --check server/src/routes/search.js;node --check server/src/routes/payroll.js;node --check server/src/routes/performance.js;node --check server/src/routes/travelRequests.js;node --check server/src/routes/exports.js;node --check server/src/routes/workflow.js;bash scripts/check-minimal.sh;git diff --check。","node|bash|git","DONE","DONE","DONE","server/src/routes/search.js;server/src/routes/payroll.js;server/src/routes/performance.js;server/src/routes/exports.js;server/src/routes/travelRequests.js;server/src/routes/workflow.js;server/src/routes/employees.js;server/src/services/employeeStats.js;server/src/services/workspaceSettings.js;server/src/constants/permissions.js;client/src/auth/permissions.ts;client/src/components/navigation/NavLinks.tsx;client/src/router/index.tsx;client/src/pages/EmployeeProfilePage.tsx;client/src/pages/PeopleStatsPage.tsx","[""OAPERM1-1"",""OAPERM1-2"",""OAPERM1-3""]","两轮 reviewer 阻断已回修:同步前端权限事实源、员工统计、search/workflow 差旅强冻结、员工档案敏感 tab 和权限常量测试。已通过受影响 vitest 12 个文件 49 条、client typecheck、node --check、git diff --check 和 bash scripts/check-minimal.sh。回滚/清理:若后续公网发现误伤,回退本次代码或缩小修改面后重跑。"
|
|
|
|
|
"OAPERM1-5","公网权限矩阵复核","修复部署前可本地语法验证;部署后使用 live smoke env 跑公网权限矩阵,确认 OAAUTO1-4 finding 已消除或可解释。","权限矩阵结论达到 PASS_PERMISSION_MATRIX_READY;如外部配置阻断,必须记录为 SKIP/BLOCKED_BY_EXTERNAL_CONFIG 且不得伪装为通过。","受影响流程:多角色登录 -> 正例入口 -> 负例直连 -> 搜索过滤;验证步骤:LIVE_SMOKE_BASE_URL=https://oa.hyinda.com node scripts/qa/check-oa-permission-matrix.mjs。","node|playwright","TODO","TODO","TODO","scripts/qa/check-oa-permission-matrix.mjs;artifacts/qa-flow/oa-permission-matrix-*","[""OAPERM1-4""]","本地不能代表公网角色状态;公网验证需要 live smoke env,但不得打印密码或完整账号。回滚/清理:公网发现误伤时回滚本次部署或恢复 OAPERM1 权限代码后重新部署;报告仅保留脱敏状态。"
|
|
|
|
|
"OAPERM1-6","只读 reviewer 评审","由于本轮涉及权限模型和高敏入口,实施后启动只读 reviewer subagent 审查 diff、测试覆盖和潜在越权/误伤。","reviewer 只输出意见不改代码;无 P0 blocker 后才能进入回归/部署判断;发现问题则回到对应 OAPERM1 行修复。","受影响流程:权限修复 -> 独立评审 -> 回归;验证步骤:reviewer 阅读 diff、Issue CSV 和权限矩阵输出,重点检查员工/主管/财务/HR/CEO/admin 权限边界。","subagent|manual","DONE","DONE","DONE","server/src/constants/permissions.js;client/src/auth/permissions.ts;server/src/routes/search.js;server/src/routes/workflow.js;server/src/routes/payroll.js;server/src/routes/performance.js;server/src/routes/employees.js","[""OAPERM1-4""]","已完成两轮只读 reviewer:第一轮发现权限常量测试、员工统计、前端事实源和 workflow 差旅待办残留;第二轮发现 travel_request 搜索/workflow 仍应强制 system.settings 和 HR 前端薪资 tab 噪声;均已回修。最终 reviewer 结论:不再阻断提交,也不阻断进入部署/公网权限矩阵复核。回滚/清理:若后续公网矩阵失败,保持 OAPERM1-5 未 DONE 并回修。"
|
|
|
|
|
"OAPERM1-7","OALAUNCH1 权限证据刷新","权限矩阵通过后刷新最终启用汇总,把权限 blocker 从 open gate 中移除或转为已解释 finding;真实业务、备份恢复、7 天稳定化和 Go/No-Go 仍保持人工门禁。","run-oa-final-launch-readiness 输出不再因 OAAUTO1-4 权限 blocker 阻断;但在人工项未完成前仍不得输出 PASS_OA_LAUNCH_READY。","受影响流程:权限证据 -> OALAUNCH 汇总 -> 启用门禁;验证步骤:OALAUNCH_PERMISSION_EVIDENCE=<new summary.json> bash scripts/qa/run-oa-final-launch-readiness.sh。","bash|manual","TODO","TODO","TODO","scripts/qa/run-oa-final-launch-readiness.sh;artifacts/qa-flow/oa-final-launch-readiness-*","[""OAPERM1-5"",""OAPERM1-6""]","回滚/清理:若权限证据不通过,不刷新为通过结论;最终启用仍由 Day 7 Go/No-Go 人工决定。"
|
|
|
|
|
"OAPERM1-8","备份恢复与真实业务后续边界","本轮只把备份恢复演练和真实业务样本接入后续顺序,不执行影子库恢复、不提交真实报销/采购/合同、不做真实付款。","明确下一步仍为 OABK1 影子库恢复演练合同、最小真实业务样本和 7 天稳定化;不产生公网业务写入。","受影响流程:权限收口 -> 备份恢复准备 -> 真实业务样本 -> 7 天稳定化;验证步骤:最终回复列明剩余人工项和禁止自动替代边界。","manual","DONE","DONE","DONE","issues/2026-05-24_00-50-23-oa-backup-restore-drill-v1.csv;issues/2026-05-23_23-01-55-oa-automation-manual-cutover-v1.csv;issues/2026-05-23_16-49-39-oa-final-launch-readiness-v1.csv","[""OAPERM1-6""]","已新建 OABK1 影子库恢复演练合同并重申真实业务最小样本步骤;未执行恢复、未提交真实业务、未付款。回滚/清理:这是执行边界记录,不修改系统;后续 OABK1 只能在人工批准后做影子库恢复。"
|