OAPERM1 收紧启用前权限冻结

这个提交包含在:
2026-05-24 00:57:11 +08:00
父节点 a3f13eab57
当前提交 65513a5291
共修改 27 个文件,包含 231 行新增和 149 行删除
@@ -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 只能在人工批准后做影子库恢复。"
1 ID Title Description Acceptance Test_Method Tools Dev_Status Review1_Status Regression_Status Files Dependencies Notes
2 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 或数据迁移。
3 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 重新定义角色和验收。
4 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 原访问;薪酬/绩效后续正式启用需独立合同和更细权限。
5 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 中合同/资料搜索权限条件即可恢复原搜索口径。
6 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。回滚/清理:若后续公网发现误伤,回退本次代码或缩小修改面后重跑。
7 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 权限代码后重新部署;报告仅保留脱敏状态。
8 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 并回修。
9 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 人工决定。
10 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 只能在人工批准后做影子库恢复。
@@ -0,0 +1,9 @@
"ID","Title","Description","Acceptance","Test_Method","Tools","Dev_Status","Review1_Status","Regression_Status","Files","Dependencies","Notes"
"OABK1-0","建立影子库恢复演练合同","为 OA 正式启用前补齐备份恢复门禁,建立只针对影子库/临时库的恢复演练执行合同;本合同不覆盖生产库、不重置公网、不改变真实业务数据。","Issue CSV 校验通过;明确演练目标、禁止项、人工批准点、证据格式和清理路径;未批准前不执行任何恢复命令。","受影响流程:备份恢复准备 -> 人工批准 -> 影子库恢复 -> 验证 -> 清理;验证步骤:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-24_00-50-23-oa-backup-restore-drill-v1.csv;node scripts/qa/check-process-contract.mjs --issue issues/2026-05-24_00-50-23-oa-backup-restore-drill-v1.csv --profile general --json。","python3|node|manual","DONE","DONE","DONE","issues/2026-05-24_00-50-23-oa-backup-restore-drill-v1.csv","[]","MAGI 审视:正式启用不能只看备份存在,必须证明可恢复;执行:先做合同和清单;提升:以后把 RTO/RPO 和恢复证据纳入 OALAUNCH1。回滚/清理:本行只新增合同,不执行远端命令;若不采纳可标记 superseded,不影响公网或数据库。"
"OABK1-1","备份源与恢复目标确认","确认公网 OA 当前备份来源、最近备份时间、备份文件或快照位置、附件存储备份位置、恢复目标机器/目录/影子库名和临时凭据。","形成脱敏恢复参数清单;不在仓库、聊天或报告写入密码、Secret、完整连接串、完整本地路径或真实敏感业务内容。","受影响流程:运维备份 -> 参数核对 -> 恢复窗口;验证步骤:人工填写 OAAUTO1 证据模板或临时 /tmp env;只记录脱敏别名、时间、大小、hash/校验状态。","manual|ssh","TODO","TODO","TODO","external|/tmp|artifacts/qa-flow","[""OABK1-0""]","人工确认点:A 使用最近自动备份;B 指定某个备份点;C 暂停演练。回滚/清理:本步骤只读核对,清理临时 env 和脱敏清单即可。"
"OABK1-2","影子库恢复命令草案","准备不会触碰生产库的恢复命令草案:创建临时数据库或临时 schema,导入备份,指向只读验证连接,禁止把恢复目标设为生产 DSN。","命令草案包含 dry-run/echo 预览、目标库二次确认、禁止生产库保护、失败退出和清理命令;未经批准不执行。","受影响流程:命令准备 -> 人工确认 -> 受控执行;验证步骤:bash -n 或 shellcheck 可用时检查脚本片段;人工核查目标 DSN 不是生产库。","bash|manual","TODO","TODO","TODO","artifacts/qa-flow/oa-launch-manual-evidence-*;docs/trialrun/OPS7运维交接Runbook.md","[""OABK1-1""]","建议命名:hyb_oa_restore_shadow_<timestamp>。回滚/清理:DROP 临时库/临时 schema、删除临时连接文件、撤销临时凭据;禁止 DROP/restore 生产库。"
"OABK1-3","恢复后只读抽样验证","在影子库中只读验证关键表和附件引用:员工/角色、报销/发票、付款批次/AP、采购、合同台账、资产台账、审计日志、文件引用一致性。","输出脱敏 summary:表存在、行数区间、最近更新时间、关键外键抽样、附件引用可定位;不输出真实票号、合同正文、银行流水、完整账号、完整路径或原始 payload。","受影响流程:影子库恢复 -> 只读 SQL/脚本抽样 -> 脱敏证据;验证步骤:只读查询或 QA-only 脚本输出 artifacts/qa-flow/oa-backup-restore-drill-<timestamp>/summary.json。","node|psql|manual","TODO","TODO","TODO","scripts/qa;artifacts/qa-flow/oa-backup-restore-drill-*","[""OABK1-2""]","允许新增 QA-only 脚本,但不得写业务库。回滚/清理:删除影子库连接文件和报告中的敏感原文;保留脱敏 summary 作为证据。"
"OABK1-4","RTO/RPO 和负责人记录","记录恢复耗时、备份点时间、RTO/RPO 初始值、演练负责人、问题 owner、下一次演练建议。","RTO/RPO 有明确数值或区间;如果恢复超时或备份过旧,记录 blocker/finding 并进入整改合同,不得直接 Go。","受影响流程:恢复结果 -> 运维指标 -> 启用门禁;验证步骤:summary.json 或人工证据模板包含 rtoMinutes、rpoMinutes、owner、decision。","manual","TODO","TODO","TODO","artifacts/qa-flow/oa-backup-restore-drill-*;issues/2026-05-23_16-49-39-oa-final-launch-readiness-v1.csv","[""OABK1-3""]","回滚/清理:指标记录只保留脱敏信息;如结果不合格,不更新 OALAUNCH 为通过。"
"OABK1-5","人工接受或重跑决策","恢复演练完成后由你选择接受、修复后重跑或暂停正式启用;自动化不能替代该决策。","用户明确选择 A/B/C;A 接受恢复演练结果并进入 Go/No-Go 准备;B 修复后重跑;C 暂停正式启用。","受影响流程:恢复证据 -> 用户决策 -> OALAUNCH1 门禁;验证步骤:在最终回复或 OALAUNCH evidence 中记录脱敏决策,不写入敏感运维凭据。","manual","TODO","TODO","TODO","external|issues/2026-05-23_16-49-39-oa-final-launch-readiness-v1.csv","[""OABK1-4""]","人工选项:A 接受;B 修复后重跑;C 暂停。回滚/清理:未接受前 OALAUNCH1 继续 PAUSED_MANUAL_CONFIRMATION。"
"OABK1-6","OALAUNCH1 恢复证据接入","在恢复演练被接受后,把脱敏 summary 接入 run-oa-final-launch-readiness,作为 BACKUP_RESTORE_DRILL 门禁证据。","OALAUNCH1 不再因备份恢复缺证据阻断;但真实业务闭环、7 天稳定化和 Day 7 Go/No-Go 未完成前仍不得 PASS_OA_LAUNCH_READY。","受影响流程:恢复证据 -> 最终启用汇总;验证步骤:OALAUNCH_BACKUP_EVIDENCE=<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-*","[""OABK1-5""]","回滚/清理:若证据不被接受,不设置 OALAUNCH_BACKUP_EVIDENCE;不伪造通过。"
"OABK1-7","真实业务样本最小人工步骤确认","并行明确真实业务最小样本:1 条真实报销闭环、1 条采购/费用申请、1 条合同台账;这些不能由自动化伪造为真实业务。","步骤和脱敏证据字段明确;不要求大量样本;不上传涉密合同正文、银行流水原件、密码、Secret、完整票号或完整本地路径到仓库/聊天/报告。","受影响流程:真实报销 -> 审批 -> 付款/AP;采购/费用 -> 审批 -> 关联;合同台账 -> 归档位置 -> 权限抽查;验证步骤:人工完成后用 OAAUTO1 evidence 模板记录业务别名、状态、日期、角色和证据路径。","manual","DONE","DONE","DONE","issues/2026-05-23_23-01-55-oa-automation-manual-cutover-v1.csv;artifacts/qa-flow/oa-launch-manual-evidence-*","[""OABK1-0""]","已细化步骤来源 OAAUTO1-8/9/10;本合同只重申最小真实样本边界。回滚/清理:真实业务数据按审计保留;误录按业务状态归档/冲正,不从仓库清理。"
1 ID Title Description Acceptance Test_Method Tools Dev_Status Review1_Status Regression_Status Files Dependencies Notes
2 OABK1-0 建立影子库恢复演练合同 为 OA 正式启用前补齐备份恢复门禁,建立只针对影子库/临时库的恢复演练执行合同;本合同不覆盖生产库、不重置公网、不改变真实业务数据。 Issue CSV 校验通过;明确演练目标、禁止项、人工批准点、证据格式和清理路径;未批准前不执行任何恢复命令。 受影响流程:备份恢复准备 -> 人工批准 -> 影子库恢复 -> 验证 -> 清理;验证步骤:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-24_00-50-23-oa-backup-restore-drill-v1.csv;node scripts/qa/check-process-contract.mjs --issue issues/2026-05-24_00-50-23-oa-backup-restore-drill-v1.csv --profile general --json。 python3|node|manual DONE DONE DONE issues/2026-05-24_00-50-23-oa-backup-restore-drill-v1.csv [] MAGI 审视:正式启用不能只看备份存在,必须证明可恢复;执行:先做合同和清单;提升:以后把 RTO/RPO 和恢复证据纳入 OALAUNCH1。回滚/清理:本行只新增合同,不执行远端命令;若不采纳可标记 superseded,不影响公网或数据库。
3 OABK1-1 备份源与恢复目标确认 确认公网 OA 当前备份来源、最近备份时间、备份文件或快照位置、附件存储备份位置、恢复目标机器/目录/影子库名和临时凭据。 形成脱敏恢复参数清单;不在仓库、聊天或报告写入密码、Secret、完整连接串、完整本地路径或真实敏感业务内容。 受影响流程:运维备份 -> 参数核对 -> 恢复窗口;验证步骤:人工填写 OAAUTO1 证据模板或临时 /tmp env;只记录脱敏别名、时间、大小、hash/校验状态。 manual|ssh TODO TODO TODO external|/tmp|artifacts/qa-flow ["OABK1-0"] 人工确认点:A 使用最近自动备份;B 指定某个备份点;C 暂停演练。回滚/清理:本步骤只读核对,清理临时 env 和脱敏清单即可。
4 OABK1-2 影子库恢复命令草案 准备不会触碰生产库的恢复命令草案:创建临时数据库或临时 schema,导入备份,指向只读验证连接,禁止把恢复目标设为生产 DSN。 命令草案包含 dry-run/echo 预览、目标库二次确认、禁止生产库保护、失败退出和清理命令;未经批准不执行。 受影响流程:命令准备 -> 人工确认 -> 受控执行;验证步骤:bash -n 或 shellcheck 可用时检查脚本片段;人工核查目标 DSN 不是生产库。 bash|manual TODO TODO TODO artifacts/qa-flow/oa-launch-manual-evidence-*;docs/trialrun/OPS7运维交接Runbook.md ["OABK1-1"] 建议命名:hyb_oa_restore_shadow_<timestamp>。回滚/清理:DROP 临时库/临时 schema、删除临时连接文件、撤销临时凭据;禁止 DROP/restore 生产库。
5 OABK1-3 恢复后只读抽样验证 在影子库中只读验证关键表和附件引用:员工/角色、报销/发票、付款批次/AP、采购、合同台账、资产台账、审计日志、文件引用一致性。 输出脱敏 summary:表存在、行数区间、最近更新时间、关键外键抽样、附件引用可定位;不输出真实票号、合同正文、银行流水、完整账号、完整路径或原始 payload。 受影响流程:影子库恢复 -> 只读 SQL/脚本抽样 -> 脱敏证据;验证步骤:只读查询或 QA-only 脚本输出 artifacts/qa-flow/oa-backup-restore-drill-<timestamp>/summary.json。 node|psql|manual TODO TODO TODO scripts/qa;artifacts/qa-flow/oa-backup-restore-drill-* ["OABK1-2"] 允许新增 QA-only 脚本,但不得写业务库。回滚/清理:删除影子库连接文件和报告中的敏感原文;保留脱敏 summary 作为证据。
6 OABK1-4 RTO/RPO 和负责人记录 记录恢复耗时、备份点时间、RTO/RPO 初始值、演练负责人、问题 owner、下一次演练建议。 RTO/RPO 有明确数值或区间;如果恢复超时或备份过旧,记录 blocker/finding 并进入整改合同,不得直接 Go。 受影响流程:恢复结果 -> 运维指标 -> 启用门禁;验证步骤:summary.json 或人工证据模板包含 rtoMinutes、rpoMinutes、owner、decision。 manual TODO TODO TODO artifacts/qa-flow/oa-backup-restore-drill-*;issues/2026-05-23_16-49-39-oa-final-launch-readiness-v1.csv ["OABK1-3"] 回滚/清理:指标记录只保留脱敏信息;如结果不合格,不更新 OALAUNCH 为通过。
7 OABK1-5 人工接受或重跑决策 恢复演练完成后由你选择接受、修复后重跑或暂停正式启用;自动化不能替代该决策。 用户明确选择 A/B/C;A 接受恢复演练结果并进入 Go/No-Go 准备;B 修复后重跑;C 暂停正式启用。 受影响流程:恢复证据 -> 用户决策 -> OALAUNCH1 门禁;验证步骤:在最终回复或 OALAUNCH evidence 中记录脱敏决策,不写入敏感运维凭据。 manual TODO TODO TODO external|issues/2026-05-23_16-49-39-oa-final-launch-readiness-v1.csv ["OABK1-4"] 人工选项:A 接受;B 修复后重跑;C 暂停。回滚/清理:未接受前 OALAUNCH1 继续 PAUSED_MANUAL_CONFIRMATION。
8 OABK1-6 OALAUNCH1 恢复证据接入 在恢复演练被接受后,把脱敏 summary 接入 run-oa-final-launch-readiness,作为 BACKUP_RESTORE_DRILL 门禁证据。 OALAUNCH1 不再因备份恢复缺证据阻断;但真实业务闭环、7 天稳定化和 Day 7 Go/No-Go 未完成前仍不得 PASS_OA_LAUNCH_READY。 受影响流程:恢复证据 -> 最终启用汇总;验证步骤:OALAUNCH_BACKUP_EVIDENCE=<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-* ["OABK1-5"] 回滚/清理:若证据不被接受,不设置 OALAUNCH_BACKUP_EVIDENCE;不伪造通过。
9 OABK1-7 真实业务样本最小人工步骤确认 并行明确真实业务最小样本:1 条真实报销闭环、1 条采购/费用申请、1 条合同台账;这些不能由自动化伪造为真实业务。 步骤和脱敏证据字段明确;不要求大量样本;不上传涉密合同正文、银行流水原件、密码、Secret、完整票号或完整本地路径到仓库/聊天/报告。 受影响流程:真实报销 -> 审批 -> 付款/AP;采购/费用 -> 审批 -> 关联;合同台账 -> 归档位置 -> 权限抽查;验证步骤:人工完成后用 OAAUTO1 evidence 模板记录业务别名、状态、日期、角色和证据路径。 manual DONE DONE DONE issues/2026-05-23_23-01-55-oa-automation-manual-cutover-v1.csv;artifacts/qa-flow/oa-launch-manual-evidence-* ["OABK1-0"] 已细化步骤来源 OAAUTO1-8/9/10;本合同只重申最小真实样本边界。回滚/清理:真实业务数据按审计保留;误录按业务状态归档/冲正,不从仓库清理。