Skip to content

流程按钮绕过岗位校验:动作体以受信任身份写入被 hook 当系统写入免检,任何岗位可越节点审批/归档 #28

Description

@baozhoutao

背景(来源:#23 UI 实测 K-3,调度员 2026-09-03 已核实成因,维护者拍板立单)

人力审核(仅持 kpi_hr_reviewer 岗位)对「领导审批中」的填报单点「审核通过」真的生效;部门填报人员在自己单上能看到「归档」「审核通过」「驳回」按钮。成因:四个流程按钮(提交填报 / 审核通过 / 驳回 / 归档)是带 api.write 能力的 JS 动作体,平台 17.2.0 以「受信任」方式执行动作体(不携带调用者 ExecutionContext,见运行时 buildActionEngineFacade 注释与 objectstack#2849),写入到达 src/hooks/sheet.hook.tsctx.session.isSystem === true,hasPosition 第一行 if (isSystem(ctx) || !position) return true 直接放行,「非系统写入不得直改 status」等其它以 isSystem 为闸的规则同样失效。经 REST 直接 PATCH pending_action 不受影响(hook 正常拦截)。

目标

按钮发起的每一步流程动作都按发起人的岗位校验,与 REST 路径同一口径;按钮只对当前节点的岗位显示。

范围

  1. src/hooks/sheet.hook.ts(状态机唯一真值,本单允许改):岗位校验不再以 isSystem(ctx) 免检。规则:只要本次写入带有发起用户(ctx.user / actorId(ctx) 可解析)且写入的是 pending_action,就按发起人校验 requiredPositionFor 的岗位;isSystem 免检仅保留给没有发起用户的纯系统写入(发布生成填报单、重算、归档快照回写)。同一口径检查 src/hooks/util.tshasPosition 与其它 hook(bonus / adjustment / check-task / dispute)里以 isSystem 为闸的岗位校验,凡是「用户点按钮 → 动作体写入」能到达的分支一并修正;纯系统写入路径不能被误伤(发布、重算、种子、脚本仍要能跑)。
  2. 按钮可见性:src/actions/index.ts 四个填报单动作的 visibleWhen(或平台等价机制)按「当前状态对应节点的审核岗位 = 当前用户岗位」收敛;归档只对人力审核显示。若平台的 visibleWhen 表达式拿不到当前用户岗位,如实记录并保留 hook 拦截为唯一防线,把平台能力缺口写进「需拍板事项」(只上报不修复)。
  3. 单测:test/ 中为 sheet.hook 补「非本节点岗位经动作体路径发起 approve/reject/archive 被拒」「本节点岗位放行」「系统写入(无发起用户)放行」三类用例;现有 90 个用例不得回退。
  4. 文案:拒绝提示沿用现有三段式 KPI_SHEET_POSITION 文案。

不做

不改流程节点顺序与驳回口径(第 10 章第 8 项);不改 src/lib/scoring.ts;不改平台包;不做 K-1(分公司填报人)、K-5(批量确认)。

方案分级与放行(调度员)

改已有状态机 = 高风险。放行方向 = 上述范围 1 的 A 方案(按发起人校验、系统免检收窄),维护者 2026-09-03 已知悉并同意立单派发。开发子 agent 开工前仍须在本单评论输出「需求理解 + 实现方式 + 受影响写入路径清单(逐条标注 系统/用户)」,与放行方向一致即可直接开工;若发现必须改动 pending_action 机制本身或平台行为,停手升级。

验收标准

  1. 用岗位账号在界面点按钮:人力审核对「领导审批中」的单点「审核通过」被拒并显示岗位提示;部门填报人员对任何单点「审核通过 / 驳回 / 归档」被拒(若按钮已隐藏则以「不可见」为证据);分管领导对「领导审批中」的单审批通过正常;人力审核归档正常。
  2. 同一组动作经 REST 直接 PATCH pending_action 的结果与界面一致。
  3. 发布方案生成填报单、加减分/数据调整落地后的重算、归档快照回写等系统路径全部正常(scripts/software-flow.mjs 在空库软件档案实例上仍 54/54 PASS;scripts/e2e-flow.mjs 在默认档案上仍全 PASS)。
  4. pnpm verify 绿,新增单测通过。
  5. 测试报告(含岗位账号截图,成功与拒绝分支各有)与需求符合度清单挂本单评论,截图走 acceptance-evidence 40 位 SHA 图链。

测试计划草稿

T1 单测三类用例 | T2 界面:人力审核越节点审批被拒 | T3 界面:部门填报人员看不到/点不动审核与归档 | T4 界面:分管领导正常审批、人力审核正常归档 | T5 REST 同口径 | T6 software-flow 54/54 + e2e-flow 全 PASS | T7 pnpm verify

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions