背景(来源:#23 UI 实测 K-3,调度员 2026-09-03 已核实成因,维护者拍板立单)
人力审核(仅持 kpi_hr_reviewer 岗位)对「领导审批中」的填报单点「审核通过」真的生效;部门填报人员在自己单上能看到「归档」「审核通过」「驳回」按钮。成因:四个流程按钮(提交填报 / 审核通过 / 驳回 / 归档)是带 api.write 能力的 JS 动作体,平台 17.2.0 以「受信任」方式执行动作体(不携带调用者 ExecutionContext,见运行时 buildActionEngineFacade 注释与 objectstack#2849),写入到达 src/hooks/sheet.hook.ts 时 ctx.session.isSystem === true,hasPosition 第一行 if (isSystem(ctx) || !position) return true 直接放行,「非系统写入不得直改 status」等其它以 isSystem 为闸的规则同样失效。经 REST 直接 PATCH pending_action 不受影响(hook 正常拦截)。
目标
按钮发起的每一步流程动作都按发起人的岗位校验,与 REST 路径同一口径;按钮只对当前节点的岗位显示。
范围
src/hooks/sheet.hook.ts(状态机唯一真值,本单允许改):岗位校验不再以 isSystem(ctx) 免检。规则:只要本次写入带有发起用户(ctx.user / actorId(ctx) 可解析)且写入的是 pending_action,就按发起人校验 requiredPositionFor 的岗位;isSystem 免检仅保留给没有发起用户的纯系统写入(发布生成填报单、重算、归档快照回写)。同一口径检查 src/hooks/util.ts 的 hasPosition 与其它 hook(bonus / adjustment / check-task / dispute)里以 isSystem 为闸的岗位校验,凡是「用户点按钮 → 动作体写入」能到达的分支一并修正;纯系统写入路径不能被误伤(发布、重算、种子、脚本仍要能跑)。
- 按钮可见性:
src/actions/index.ts 四个填报单动作的 visibleWhen(或平台等价机制)按「当前状态对应节点的审核岗位 = 当前用户岗位」收敛;归档只对人力审核显示。若平台的 visibleWhen 表达式拿不到当前用户岗位,如实记录并保留 hook 拦截为唯一防线,把平台能力缺口写进「需拍板事项」(只上报不修复)。
- 单测:
test/ 中为 sheet.hook 补「非本节点岗位经动作体路径发起 approve/reject/archive 被拒」「本节点岗位放行」「系统写入(无发起用户)放行」三类用例;现有 90 个用例不得回退。
- 文案:拒绝提示沿用现有三段式
KPI_SHEET_POSITION 文案。
不做
不改流程节点顺序与驳回口径(第 10 章第 8 项);不改 src/lib/scoring.ts;不改平台包;不做 K-1(分公司填报人)、K-5(批量确认)。
方案分级与放行(调度员)
改已有状态机 = 高风险。放行方向 = 上述范围 1 的 A 方案(按发起人校验、系统免检收窄),维护者 2026-09-03 已知悉并同意立单派发。开发子 agent 开工前仍须在本单评论输出「需求理解 + 实现方式 + 受影响写入路径清单(逐条标注 系统/用户)」,与放行方向一致即可直接开工;若发现必须改动 pending_action 机制本身或平台行为,停手升级。
验收标准
- 用岗位账号在界面点按钮:人力审核对「领导审批中」的单点「审核通过」被拒并显示岗位提示;部门填报人员对任何单点「审核通过 / 驳回 / 归档」被拒(若按钮已隐藏则以「不可见」为证据);分管领导对「领导审批中」的单审批通过正常;人力审核归档正常。
- 同一组动作经 REST 直接 PATCH
pending_action 的结果与界面一致。
- 发布方案生成填报单、加减分/数据调整落地后的重算、归档快照回写等系统路径全部正常(
scripts/software-flow.mjs 在空库软件档案实例上仍 54/54 PASS;scripts/e2e-flow.mjs 在默认档案上仍全 PASS)。
pnpm verify 绿,新增单测通过。
- 测试报告(含岗位账号截图,成功与拒绝分支各有)与需求符合度清单挂本单评论,截图走
acceptance-evidence 40 位 SHA 图链。
测试计划草稿
T1 单测三类用例 | T2 界面:人力审核越节点审批被拒 | T3 界面:部门填报人员看不到/点不动审核与归档 | T4 界面:分管领导正常审批、人力审核正常归档 | T5 REST 同口径 | T6 software-flow 54/54 + e2e-flow 全 PASS | T7 pnpm verify
背景(来源:#23 UI 实测 K-3,调度员 2026-09-03 已核实成因,维护者拍板立单)
人力审核(仅持
kpi_hr_reviewer岗位)对「领导审批中」的填报单点「审核通过」真的生效;部门填报人员在自己单上能看到「归档」「审核通过」「驳回」按钮。成因:四个流程按钮(提交填报 / 审核通过 / 驳回 / 归档)是带api.write能力的 JS 动作体,平台 17.2.0 以「受信任」方式执行动作体(不携带调用者 ExecutionContext,见运行时buildActionEngineFacade注释与 objectstack#2849),写入到达src/hooks/sheet.hook.ts时ctx.session.isSystem === true,hasPosition第一行if (isSystem(ctx) || !position) return true直接放行,「非系统写入不得直改 status」等其它以isSystem为闸的规则同样失效。经 REST 直接 PATCHpending_action不受影响(hook 正常拦截)。目标
按钮发起的每一步流程动作都按发起人的岗位校验,与 REST 路径同一口径;按钮只对当前节点的岗位显示。
范围
src/hooks/sheet.hook.ts(状态机唯一真值,本单允许改):岗位校验不再以isSystem(ctx)免检。规则:只要本次写入带有发起用户(ctx.user/actorId(ctx)可解析)且写入的是pending_action,就按发起人校验requiredPositionFor的岗位;isSystem免检仅保留给没有发起用户的纯系统写入(发布生成填报单、重算、归档快照回写)。同一口径检查src/hooks/util.ts的hasPosition与其它 hook(bonus / adjustment / check-task / dispute)里以isSystem为闸的岗位校验,凡是「用户点按钮 → 动作体写入」能到达的分支一并修正;纯系统写入路径不能被误伤(发布、重算、种子、脚本仍要能跑)。src/actions/index.ts四个填报单动作的visibleWhen(或平台等价机制)按「当前状态对应节点的审核岗位 = 当前用户岗位」收敛;归档只对人力审核显示。若平台的visibleWhen表达式拿不到当前用户岗位,如实记录并保留 hook 拦截为唯一防线,把平台能力缺口写进「需拍板事项」(只上报不修复)。test/中为 sheet.hook 补「非本节点岗位经动作体路径发起 approve/reject/archive 被拒」「本节点岗位放行」「系统写入(无发起用户)放行」三类用例;现有 90 个用例不得回退。KPI_SHEET_POSITION文案。不做
不改流程节点顺序与驳回口径(第 10 章第 8 项);不改
src/lib/scoring.ts;不改平台包;不做 K-1(分公司填报人)、K-5(批量确认)。方案分级与放行(调度员)
改已有状态机 = 高风险。放行方向 = 上述范围 1 的 A 方案(按发起人校验、系统免检收窄),维护者 2026-09-03 已知悉并同意立单派发。开发子 agent 开工前仍须在本单评论输出「需求理解 + 实现方式 + 受影响写入路径清单(逐条标注 系统/用户)」,与放行方向一致即可直接开工;若发现必须改动
pending_action机制本身或平台行为,停手升级。验收标准
pending_action的结果与界面一致。scripts/software-flow.mjs在空库软件档案实例上仍 54/54 PASS;scripts/e2e-flow.mjs在默认档案上仍全 PASS)。pnpm verify绿,新增单测通过。acceptance-evidence40 位 SHA 图链。测试计划草稿
T1 单测三类用例 | T2 界面:人力审核越节点审批被拒 | T3 界面:部门填报人员看不到/点不动审核与归档 | T4 界面:分管领导正常审批、人力审核正常归档 | T5 REST 同口径 | T6 software-flow 54/54 + e2e-flow 全 PASS | T7 pnpm verify