Skip to content

软件公司岗位 KPI 演示数据集(独立种子档案 + 岗位人员脚本)与全流程实测 #23

Open

Description

@baozhoutao

背景与目标

维护者 2026-09-03 要求:以软件公司为纬度,为各个岗位做 KPI 考核,按此要求做一套基础数据,并测试一遍。
现有演示种子(市场部/运营部/人力资源部 + 4 家分公司)是通用企业样例,操作手册 62 张截图依赖它,不能替换。本单新增一套「软件公司」基础数据档案,并用它把第 4 章全流程真实跑通一遍,作为后续演示、验收用例与数据准备阶段的样板。

口径决定(调度员假设,维护者可推翻;推翻即打回本单)

  1. 独立种子档案,不替换默认:新增 software 档案,以环境变量 OS_SEED_PROFILE=software 启用;不设变量时行为与当前 main 完全一致(手册截图依赖默认档案)。
  2. 「各岗位」在一期口径下通过「到人分工 + 个人承接项」表达(设计方案 §8 到人口径):员工按岗位挂到部门板块,承接本岗位典型指标。个人考核单是设计方案 V1.1 第 24 项,客户未确认,不做。
  3. 用户不可种子(CLAUDE.md D4):岗位人员账号、流程岗位分配、到人分工、分管领导(均引用 sys_user)由运行期脚本创建,不进种子。
  4. 分公司保留 3 家(华东/华南/华北,销售型分公司),用来让「分公司核对(并行)」节点有真实业务含义:销售相关下达以分公司为核对方。

范围

A. 种子档案(src/data/ 下新增档案模块,src/data/index.ts 按 OS_SEED_PROFILE 选档)

  • 组织树:总公司 + 部门 ≥ 8(研发部、产品部、测试部、销售部、市场部、客户成功部、人力行政部、财务部)+ 分公司 3 家(华东/华南/华北)。编码唯一、上级存在。
  • 指标库:每部门 ≥ 3 项,整体覆盖四种计分方式(线性/阶梯/区间/公式)、两种方向、三种数据来源;阶梯指标带完整区间表;公式指标只用 actual / target / weight / 完成率;名称与口径说明按软件公司实际(如:版本按期交付率、线上严重故障数、需求交付周期、缺陷逃逸率、自动化测试覆盖率、签约金额完成率、回款率、线索数、获客成本、续费率、客户满意度、工单响应及时率、关键岗位招聘完成率、离职率、费用预算偏差率、报表准时率——由开发方按部门职责定,名称按需求 §1.4 术语与 std-copy 四条红线)。数字字段四件套显式声明。
  • 方案:「2026 年第 3 季度考核」(季度,2026-07-01 ~ 2026-09-30),四节点默认流程(部门填报 → 分公司核对(并行)→ 人力审核 → 领导审批);参与主体 = 全部部门 + 3 分公司,主体权重齐全;指标下达每主体权重合计 100,目标值取软件公司合理量级;销售相关下达的核对方为对应分公司。
  • 夹具覆盖:src/data/align-demo-units.ts 的租户对齐夹具按 DEMO_UNIT_IDS 工作(Sharing rules with a business-unit recipient silently grant nothing when the unit row has organization_id = NULL objectstack#14547 的临时夹具),新档案的组织单元 id 必须一并进入夹具覆盖范围,否则按方案的共享规则对新单元静默失效。

B. 运行期数据脚本(scripts/ 下新增,或扩展现有 e2e-flow.mjs 的档案参数)

  • 创建岗位账号(业务岗位 ≥ 8:研发工程师、测试工程师、产品经理、销售经理、市场专员、客户成功经理、HRBP、财务专员;流程岗位六类各 ≥ 1)并分配流程岗位;
  • 为业务岗位人员建到人分工(员工 × 部门板块 × 分工权重 × 个人系数,系数含 ≠1 的样例)与个人承接项(每人 ≥ 1,承接本岗位典型指标);
  • 为方案设置分管领导(≥ 2 位,分管范围不同);
  • 脚本可重复执行(幂等或明确要求空库)。

C. 全流程实测(本单交付的核心)

  • API 脚本:发布 → 各主体填报实际值(含超额、未达、临界三类样本)→ 提交 → 分公司核对(含一处争议及其处理)→ 人力审核(含一次驳回与重提)→ 领导审批 → 加减分(提出 + 审批)→ 数据调整(源数据、结果各一)→ 四维汇总 → 归档;每步断言;得分断言按设计方案 §7 表 4 手算预期,不从实现反推。
  • UI 实测:用岗位账号(部门填报人员、分公司核对人员、人力审核、人力负责人、分管领导)在浏览器走关键步骤,截图 ≥ 12 张,覆盖成功与拦截分支(未填不能提交、驳回原因必填、归档后不可改)。
  • 数据范围断言:部门填报人员只见本部门填报单;分公司核对人员只见本分公司核对任务;分管领导只见分管主体;到人结果只见本人。

D. 文档

  • README 或 CLAUDE.md 补一行档案启用方式与脚本用法;操作手册不改。

不做

个人考核单、通知/待办、指标模板库(均属 V1.1 待确认项);修改默认演示种子;修改 src/lib/scoring.ts 与 src/hooks/sheet.hook.ts;修复平台问题(界面英文标签、页签溢出、相对日期等已单独上报平台,截图中出现照实记录即可)。

验收标准

  1. OS_SEED_PROFILE=software pnpm dev 空库启动后,指标库、方案、参与主体、指标下达全部可见且数据完整;不设变量启动与 main 行为一致;pnpm verify 绿。
  2. 方案发布前完整性检查通过(权重合计 100、目标齐全、争议关闭、节点合法);发布后填报单数 = 参与主体数,每张填报单明细行带目标/权重/计分规则冻结副本。
  3. 全流程脚本一次跑完,断言全部 PASS;至少 3 条得分断言给出手算过程(线性封顶、阶梯、区间插值各一)。
  4. 四维结果均非空且排名正确;到人得分 = Σ(部门板块得分 × 分工权重 × 个人系数)+ Σ(承接项得分率 × 承接权重);分管领导得分 = 分管主体按主体权重加权平均。
  5. 三类岗位账号的数据范围断言通过(越权访问被明确拒绝)。
  6. 测试报告按 os-project-dev-test 模板挂本单评论,截图走孤儿分支 acceptance-evidence、40 位 commit SHA 图链;需求符合度清单挂本单评论,逐条三态。
  7. 全部用户可见文案过 std-copy 四条红线;数字字段四件套齐全;pnpm validate 零错。

测试计划草稿(细化自证)

T1 空库按档案启动、种子计数 | T2 未设变量启动 = 默认档案 | T3 发布检查:故意抹掉一个目标值 → 拦截并逐条提示 | T4 发布成功、填报单/明细计数 | T5 填报保存即出分 + 计算说明 | T6 未填不能提交 | T7 提交冻结 | T8 分公司并行核对、争议阻断、处理后推进 | T9 人力驳回(原因必填)退回上一节点、重提 | T10 领导审批通过 → 四维结果生成 | T11 加减分审批后重算 | T12 源数据调整触发重算 / 结果调整标记「已调整」 | T13 归档快照校验和、归档后改数被拒 | T14 岗位账号数据范围 | T15 pnpm verify

依赖与风险

  • 依赖:无(基线 main)。
  • 风险:分管领导、到人分工引用用户,只能脚本建 → 已按口径 3 处理;夹具覆盖遗漏 → 已列入范围 A;第 4 章流程在默认四节点下人力驳回只能退到分公司核对(见交接记录第四节),脚本按现状走「退回上一节点」,不改状态机。

交付物

种子档案模块 + 运行期脚本 + 全流程脚本断言输出 + 带截图测试报告 + 需求符合度清单 + 一行文档 + PR。

Activity

  1. self-assigned this
    on Sep 3, 2026
  2. baozhoutao commented on Sep 3, 2026

    @baozhoutao
    ContributorAuthor

    认领(调度员占坑,2026-09-03)

    • 会话:local_0e65d2bc-719b-4314-aae2-351176a17e5f(派发 | 软件公司岗位KPI数据集+全流程实测 | 0903)
    • 分支:issue-23-software-dataset,基线 main @ 4a02994d837bcc4641555520a4da0a95f1cc8bed
    • 环境分配:worktree ../kpi-issue-23-software-dataset,dev 端口 3111,数据库 file:./.objectstack/issue-23.db
    • 执行方式:按 os-project-pm-dispatch 派发独立开发子 agent(Opus)在上述 worktree 开发;调度员只做收单核实与评审闸门,不写代码。
  3. baozhoutao commented on Sep 3, 2026

    @baozhoutao
    ContributorAuthor

    需求理解与实现方式(方案要点 · 开工前)

    分支 issue-23-software-dataset,基线 main @ 4a02994。

    需求理解(一句话)

    在不动默认演示种子、不动计分引擎与状态机的前提下,新增一套「软件公司」独立种子档案(OS_SEED_PROFILE=software 启用),配套运行期岗位人员脚本与全流程实测脚本,把第 4 章四节点流程用这套数据真跑一遍。

    风险分级:低(主体纯新增,路径唯一)

    • 纯新增:src/data/software-profile.ts(种子档案)、scripts/software-people.mjs(岗位人员/到人分工/分管领导)、scripts/software-flow.mjs(全流程断言)。
    • 改已有文件(两处,最小改动、默认行为不变):
      1. src/data/index.ts:只加档案选择逻辑,默认档案的记录内容一字不改。改法 = 文件末尾把 KpiSeedData 由固定数组改为按 process.env.OS_SEED_PROFILE 选档;不设变量 → 与 main 完全一致的默认数组。
      2. DEMO_UNIT_IDS(同文件导出,喂 align-demo-units.ts 的租户对齐夹具)改为默认档案 id ∪ 软件档案 id 的并集,与档案变量无关。理由:夹具按 id IN (...) 且 organization_id IS NULL 查,默认档案下软件单元根本不存在 → 查不出行 → 行为与 main 逐字一致;而并集写法避免「切档案忘了切夹具」这一类静默失效。夹具本身(Sharing rules with a business-unit recipient silently grant nothing when the unit row has organization_id = NULL objectstack#14547 的临时夹具)语义不改。
    • 不碰:src/lib/scoring.ts、src/hooks/sheet.hook.ts、默认档案数据、docs/手册/。

    数据集设计要点

    • 组织树:总公司 + 8 部门(研发/产品/测试/销售/市场/客户成功/人力行政/财务)+ 3 家销售型分公司(华东/华南/华北),id 前缀 bu_sw_,编码 SW-* 唯一。
    • 指标库:24 项(每部门 3 项),覆盖四种计分方式(线性 / 阶梯 / 区间插值 / 公式)、两种方向(越高越好 / 越低越好)、三种数据来源(人工填报 / 批量导入 / 系统计算);阶梯指标带完整区间表;公式指标只用 actual / target / weight。数字字段四件套(小数位 / 最小值 / 最大值 / 单位)在对象层已显式声明,种子只给取值。
    • 方案:「2026 年第 3 季度考核」(季度,2026-07-01 ~ 2026-09-30),四节点默认流程;参与主体 11 个(8 部门 + 3 分公司),主体权重合计 100;指标下达 36 条,每主体权重合计 100;分公司下达的是销售 / 客户成功口径指标。
    • 用户不可种子(CLAUDE.md D4):15 个岗位账号、流程岗位分配、到人分工、个人承接项、分管领导全部由运行期脚本创建,不进种子。

    已知口径差异(不自行选边,报验收侧)

    「销售相关下达的核对方为对应分公司」:一期实现里没有「每条下达指定核对方」这一字段——分公司核对(并行) 节点由 SheetAfterTransitionHook 按方案里全部分公司主体统一生成并行核对任务(自己那张单除外),这是 main 的既有状态机行为,本单不改。本档案把 3 家分公司放进参与主体,使该节点对销售类下达有真实业务含义;实际效果是每张部门填报单都由 3 家分公司并行核对。符合度清单里按 ⚠️ 列出。

    交付顺序

    种子档案 → 岗位人员脚本 → 全流程 API 断言(得分断言按设计方案 §7 表 4 手算)→ UI 实测截图 → 测试报告 + 符合度清单挂本单 → PR。

  4. baozhoutao commented on Sep 3, 2026

    @baozhoutao
    ContributorAuthor

    objectstack-ai/objectstack#23 软件公司岗位 KPI 演示数据集 测试报告

    1. 结论

    结论:❌ 存在问题

    共 17 条用例:通过 16、没通过 1。

    未通过的一条是平台控制台的按钮可见性问题(不在本单交付物范围内,本单按「只上报不修复」处理),数据集与全流程本身 16 条全部通过。

    问题清单

    用例 现象(预期 vs 实际) 截图
    T17 部门填报人员在界面录入实际值 预期:填报单处于「填报中」时,部门填报人员能在界面上把实际值填进「填报明细」。实际:该账号的填报明细记录页没有「编辑」入口(同一条记录管理员有),而同一账号经 REST 写实际值是成功的(T5 的 API 断言用的就是该账号)。「填报明细」网格的「行内编辑」本轮自动化浏览器点不动(管理员账号同样点不动),因此该路径未能取证。 13

    关键截图

    填报保存即出分

    图 1 「签约金额完成率」明细页:实际值 5,000.0000、目标值 4,000.0000、完成率 125.00、得分率 120.00、指标得分 60.00、最终得分 60.00;计算说明栏写「实际 5000 / 目标 4000(越高越好)→ 完成率 125%;权重 50%;线性:得分率 = 完成率限定在 [0%, 120%] = 120%;得分 = 50% × 120% = 60」。

    四维考核结果

    图 2 「考核结果」列表共 21 条记录,汇总维度列出现「部门 / 分公司 / 到人 / 分管领导」四种取值;华东分公司 106.12 排名 1、市场部 106.08 排名 1、赵敏 165.60 排名 1、徐涛 100.43 排名 1,各维度排名从 1 起独立编号。

    归档快照

    图 3 「归档快照」列表出现一条「2026 年第 3 季度考核 · 销售部 · 归档快照」,带校验和与归档总分。

    2. 测试环境与账号

    项 值
    被测版本 分支 issue-23-software-dataset,已合入 origin/main(含 zh-CN 翻译包);dev 实例在合入后 rm -rf dist 重启,启动日志 Seeds: com.objectstack.kpi 99 rows 与 → ./.objectstack/issue-23.db 可核实 serving 的是本分支与本档案
    环境 本机 dev 实例 http://localhost:3111,控制台 /_console/,数据库 .objectstack/issue-23.db(空库启动)
    端 PC 端浏览器(Chromium,1600×1000)
    前置数据 OS_SEED_PROFILE=software 种子档案(99 行)+ node scripts/software-people.mjs(15 个账号、组织归属、六类流程岗位、8 条到人分工、8 项个人承接项、2 位分管领导)
    测试日期 2026-09-03

    测试账号(口令统一 Passw0rd!23;管理员 admin@objectos.ai / admin123)

    姓名 岗位 账号 组织单元 流程岗位
    张伟 研发工程师 rd.engineer@kpi.demo 研发部 部门填报人员
    王强 产品经理 pd.manager@kpi.demo 产品部 部门填报人员
    李娜 测试工程师 qa.engineer@kpi.demo 测试部 部门填报人员
    赵敏 销售经理 sales.manager@kpi.demo 销售部 部门填报人员
    孙磊 市场专员 mkt.specialist@kpi.demo 市场部 部门填报人员
    周雪 客户成功经理 cs.manager@kpi.demo 客户成功部 部门填报人员
    吴刚 HRBP hrbp@kpi.demo 人力行政部 部门填报人员
    郑洁 财务专员 fin.specialist@kpi.demo 财务部 部门填报人员
    陈东 华东分公司核对人员 east.checker@kpi.demo 华东分公司 分公司核对人员
    林南 华南分公司核对人员 south.checker@kpi.demo 华南分公司 分公司核对人员
    高北 华北分公司核对人员 north.checker@kpi.demo 华北分公司 分公司核对人员
    马丽 人力审核 hr.reviewer@kpi.demo 人力行政部 人力审核
    何平 人力负责人 hr.head@kpi.demo 人力行政部 人力负责人
    徐涛 分管领导(技术线) leader.tech@kpi.demo — 分管领导
    冯薇 分管领导(市场线) leader.gtm@kpi.demo — 分管领导

    3. 测试计划与结果总表

    计划取自工作项「测试计划草稿」T1~T15,补 T16(汇总口径)与 T17(界面录入入口)。

    编号 标题 类型 端 角色 结果 证据
    T1 空库按档案启动、种子计数与内容 主流程 PC 管理员 ✅ 03/04/05/06/07 + API T1a~T1g
    T2 未设变量启动 = 默认档案(与 main 一致) 边界 — 管理员 ✅ 启动日志 46 行 + 组织/指标/方案清单
    T3 发布前完整性检查:目标值缺失 / 权重≠100 / 争议未关闭 异常 PC 管理员 ✅ 08 + API T2a/T2b/T2c/T2d
    T4 发布成功、填报单与明细计数、发布后冻结 主流程 PC 管理员 ✅ 09/10 + API T3/T4a/T4b/T4c
    T5 填报保存即出分 + 计算说明(超额 / 未达 / 临界三类样本) 主流程 PC 管理员、销售经理 ✅ 11/12/13 + API T5b/T5c/T5d/T5e
    T6 有指标未填不能提交 异常 PC 销售经理 ✅ 15 + API T6
    T7 提交后数据冻结 异常 PC 销售经理 ✅ 16 + API T7a/T7b
    T8 分公司并行核对、争议阻断、处理后推进 主流程/异常 PC 分公司核对人员 ✅ 17/18/19/20/21 + API T8a~T8f
    T9 人力驳回(原因必填)退回上一节点、重提 异常/主流程 PC 人力审核 ✅ 22/23/24 + API T9a~T9d
    T10 领导审批通过 → 四维结果生成 主流程 PC 分管领导 ✅ 25/26/29/30 + API T10/T15a
    T11 加减分登记与审批后重算 主流程 PC 人力审核、人力负责人 ✅ 27/28 + API T13a/T13b
    T12 源数据调整触发重算 / 结果调整标记「已调整」 主流程 — 部门填报人员、人力审核 ✅ API T14a/T14b/T15e
    T13 归档快照校验和、归档后改数被拒 主流程/异常 PC 人力审核 ✅ 31/32/33 + API T16a~T16d
    T14 岗位账号数据范围(部门 / 分公司 / 分管 / 到人) 权限 PC 5 类账号 ✅ 13/14/17/25/34/35 + API T17a~T17d
    T15 pnpm verify(含新增的 i18n 同步门禁) 主流程 — — ✅ 见 §6
    T16 到人 / 分管领导汇总口径与排名 主流程 PC 管理员 ✅ 29 + API T15b/T15c/T15d
    T17 部门填报人员在界面录入实际值 主流程 PC 销售经理 ❌ 13(记录页无「编辑」入口)

    4. 逐用例明细

    T1:空库按档案启动、种子计数与内容

    • 前置条件:空库,OS_SEED_PROFILE=software。
    • 操作步骤:1) rm -rf dist && OS_PORT=3111 OS_DATABASE_URL=file:./.objectstack/issue-23.db OS_SEED_PROFILE=software pnpm dev;2) 控制台依次打开「指标库」「方案版本 → 2026 年第 3 季度考核」「参与主体」「指标下达」「到人分工」。
    • 预期结果:1) 启动日志种子行数 = 99;2) 指标库 24 条,四种计分方式齐;3) 方案为草稿、参与主体 11、下达指标 36、未关闭争议 0;4) 参与主体 11 条、指标下达 36 条、到人分工 8 条。
    • 实际观察:1) 日志 Seeds: com.objectstack.kpi 99 rows;2) 指标库列表底部「24 条记录」,计分方式列出现「完成率线性 / 阶梯计分 / 区间插值」,公式指标见 API 断言 T1d;3) 方案详情页状态「草稿」,参与主体数 11、下达指标数 36、未关闭争议数 0;4) 参与主体列表 11 条、指标下达 36 条、到人分工 8 条(个人系数 1.10 / 1.20 / 0.90 / 0.95 / 1.00 均出现)。
    • 结果:✅
    • 截图:
      • 03-zhibiaoku-24xiang:指标库列表,可见 SWCS01~SWQA02 等编码与「经营业绩/管理效能/服务质量」类别,底部「24 条记录」。
      • 04-fangan-caogao:方案详情,状态条停在「草稿」,参与主体数 11、下达指标数 36、未关闭争议数 0。
      • 05-canyu-zhuti-11ge:参与主体列表,8 个「总公司部门」+ 3 个「分公司」,主体权重列有值。
      • 06-zhibiao-xiada-36tiao:指标下达列表,底部「36 条记录」。
      • 07-daoren-fengong:到人分工列表,8 条,含个人系数列。

    T2:未设变量启动 = 默认档案

    • 前置条件:另一空库文件 .objectstack/issue-23-default.db,不设 OS_SEED_PROFILE,先 rm -rf dist。
    • 操作步骤:启动 dev,经 REST 读组织单元、指标、方案、参与主体、指标下达计数。
    • 预期结果:与 main 完全一致 —— 种子 46 行、8 个组织单元(bu_hq/bu_market/…)、6 个指标(REV/PROFIT/COST/CSAT/SAFE/TRAIN)、方案「2026 年 8 月 月度考核」、参与主体 5、指标下达 18。
    • 实际观察:日志 Seeds: com.objectstack.kpi 46 rows;units 8 bu_east,bu_hq,bu_hr,bu_market,bu_north,bu_ops,bu_south,bu_west;indicators 6 TRAIN,SAFE,COST,PROFIT,REV,CSAT;plans 2026 年 8 月 月度考核;subjects 5 plan_indicators 18。逐项与 main 相同。
    • 结果:✅
    • 截图:无(命令行取证,输出如上)。

    T3:发布前完整性检查

    • 前置条件:方案草稿、配置完整。
    • 操作步骤:1) 把「签约金额完成率 · 销售部」的目标值置空,在方案详情点「发布方案」→「继续」;2) 恢复目标值,把「回款率 · 销售部」权重改成 10,再发布;3) 恢复权重,对「签约金额完成率 · 华东分公司」提一条指标争议,再发布;4) 处理该争议(不采纳 + 处理结论)。
    • 预期结果:1)~3) 每次发布被拒绝并逐条列出问题;4) 争议关闭、盖处理时间。
    • 实际观察:1) 提示「发布失败,发布前完整性检查未通过:1. 指标下达:「签约金额完成率 · 销售部」未设置目标值」;2) 「1. 指标下达:主体「销售部」的权重合计为 80%,必须等于 100%」;3) 「1. 指标争议:还有 1 项指标争议未关闭」;4) 争议状态变「已驳回」,resolved_at 有值。
    • 结果:✅
    • 截图:08-fabu-jiancha-butongguo:点「发布方案」后弹出「确认操作 —— 发布前将做完整性检查;通过后方案冻结,并为每个参与主体生成填报单。确认发布?」。

    T4:发布成功、填报单与明细计数、发布后冻结

    • 操作步骤:方案详情点「发布方案」→「继续」;打开「填报单」列表。
    • 预期结果:方案状态变「已发布」;填报单 11 张(= 参与主体数),全部「填报中」;明细 36 行,每行带目标值 / 权重 / 计分方式 / 指标方向的冻结副本;发布后改指标下达被拒。
    • 实际观察:方案状态条停在「已发布」;填报单列表 11 张;明细 36 行,列出目标值、权重(%)、计分方式、指标方向;改权重返回「修改失败:方案已发布,配置已冻结。如需调整指标、权重、目标或流程,请新建方案版本。」
    • 结果:✅
    • 截图:09-fabu-chenggong、10-tianbaodan-liebiao-11zhang。

    T5:填报保存即出分 + 计算说明

    • 操作步骤:管理员打开「签约金额完成率 · 销售部」明细 → 「编辑」→ 实际值填 5000 → 「更新」;其余两行由脚本写入(回款率 72、新签客户数 60)。
    • 预期结果(手算,《设计方案》V1.0 §7 表 4):
      1. 签约金额完成率:5000 ÷ 4000 = 125%,线性封顶 120% → 得分率 120% → 得分 = 50% × 120% = 60.00(超额样本);
      2. 回款率:72 ÷ 90 = 80%,区间插值下限 60%→0、100%→100%,(80−60)÷(100−60) = 50% → 得分 = 30% × 50% = 15.00(未达样本);
      3. 新签客户数:60 ÷ 60 = 100% → 得分率 100% → 得分 = 20% × 100% = 20.00(临界样本);
      4. 指标得分合计 = 60 + 15 + 20 = 95.00,权重合计 100。
    • 实际观察:1) 完成率 125.00、得分率 120.00、指标得分 60.00,计算说明「实际 5000 / 目标 4000(越高越好)→ 完成率 125%;权重 50%;线性:得分率 = 完成率限定在 [0%, 120%] = 120%;得分 = 50% × 120% = 60」;2) 完成率 80.00、得分率 50.00、指标得分 15.00;3) 完成率 100.00、得分率 100.00、指标得分 20.00;4) 填报单「指标得分合计 95」「权重合计(%) 100」。
    • 结果:✅
    • 截图:11-luru-shijizhi(编辑弹窗里实际值输入 5000)、12-baocun-jishi-chufen(保存后的完成率/得分率/得分与计算说明)、13-bumen-tianbao-renyuan-mingxi(销售经理看到的三行:完成率 80.00 / 100.00 / 125.00,得分率 50.00 / 100.00 / 120.00,指标得分 15.00 / 20.00 / 60.00)。

    T6:有指标未填不能提交

    • 操作步骤:先清空「新签客户数」的实际值,销售经理在填报单点「提交填报」。
    • 预期结果:提交被拒绝,提示还差几项。
    • 实际观察:右下角提示「提交失败:还有 1 个指标未填写实际值。请补齐后再提交。」,状态条仍停在「填报中」。
    • 结果:✅
    • 截图:15-weitian-buneng-tijiao。

    T7:提交与提交后冻结

    • 操作步骤:补齐实际值,销售经理点「提交填报」→「继续」;随后尝试改实际值。
    • 预期结果:状态进「分公司核对中」,提交时间与提交人盖章;改实际值被拒。
    • 实际观察:状态条停在「分公司核对中」;改实际值返回「修改填报明细失败:填报单已提交,数据已冻结。如需更正,请发起数据调整申请。」
    • 结果:✅
    • 截图:16-tijiao-chenggong-fengongsi-hedui。

    T8:分公司并行核对、争议阻断、处理后推进

    • 操作步骤:1) 陈东(华东)打开「分公司核对」列表;2) 打开本分公司任务点「提出争议」,争议内容留空点「确认」;3) 填写争议内容后提交;4) 管理员在填报单点「审核通过」;5) 陈东改为「确认无误」,林南、高北各自确认。
    • 预期结果:1) 只看到本分公司任务;2) 争议内容必填被拦;3) 争议提出成功;4) 有争议时不能推进;5) 三家全确认后自动进「人力审核中」。
    • 实际观察:1) 列表只有「华东分公司」的任务(10 条,分公司列全部华东);2) 弹窗内提示「争议内容(必填) 为必填项」;3) 任务状态变「有争议」;4) 提示「推进失败:还有 2 家分公司未核对、1 家分公司有争议未解决。请待全部确认后再推进。」;5) 三家确认后填报单状态条停在「人力审核中」。
    • 结果:✅
    • 截图:17、18、19、20、21。

    T9:人力驳回(原因必填)退回上一节点、重提

    • 操作步骤:马丽(人力审核)点「驳回」,原因留空点「确认」;填原因「新签客户数请附客户清单后重报。」再驳回;三家分公司重新确认;马丽点「审核通过」。
    • 预期结果:原因必填被拦;驳回后退回上一节点(分公司核对中)、核对任务重置为待核对、原因留痕;重新确认后回到人力审核中;审核通过后进「领导审批中」。
    • 实际观察:弹窗提示「驳回原因(必填) 为必填项」;驳回后状态条停在「分公司核对中」,三条核对任务状态全部「待核对」,「最近驳回原因」= 新签客户数请附客户清单后重报。;重新确认后回到「人力审核中」;审核通过后状态条停在「领导审批中」。
    • 结果:✅
    • 截图:22、23、24。

    说明:默认四节点流程下,人力审核的上一节点就是「分公司核对」,所以驳回退到分公司核对而不是部门填报 —— 与《设计方案》第 4 章「驳回退回上一节点」一致,本单不改状态机。

    T10:领导审批通过 → 四维结果生成

    • 操作步骤:冯薇(市场线分管领导)打开填报单点「审核通过」;管理员打开「考核结果」与「结果看板」。
    • 预期结果:填报单进「已通过」并盖审批时间/审批人;考核结果出现部门 / 分公司 / 到人 / 分管领导四个维度。
    • 实际观察:状态条停在「已通过」;考核结果列表 21 条,汇总维度四种取值齐;结果看板出现各维度图表。
    • 结果:✅
    • 截图:26、29、30。

    T11:加减分登记与审批后重算

    • 操作步骤:马丽(人力审核)登记加分「重大项目中标」3 分;何平(人力负责人)在加减分记录点「批准」。
    • 预期结果:批准后填报单加减分合计 = 3,最终得分 = 95 + 3 = 98.00;人力审核本人不能批准自己登记的加减分。
    • 实际观察:批准后填报单「加减分合计 3」「最终得分 98」;人力审核账号点批准被拒:「审批加减分失败:只有人力负责人岗位可以审批加减分。请转交人力负责人处理。」(API 断言 T13a)。
    • 结果:✅
    • 截图:27、28。

    T12:数据调整(源数据 / 计算结果各一)

    • 前置条件:填报单已通过。本用例在 API 全流程脚本里执行(见 §6 的 T14a / T14b / T15e)。
    • 操作步骤:1) 销售经理对「新签客户数」发起源数据调整 60 → 66,人力审核提交并批准;2) 管理员对客户成功部「工单响应及时率」发起计算结果调整,得分 24 → 20,提交并批准。
    • 预期结果:1) 调整前值记录为 60,落地后实际值 66、完成率 110%、得分 = 20% × 110% = 22.00,填报单最终得分 = 98 + 2 = 100.00;2) 该行「已调整」= 是、调整类型 = 计算结果、最终得分 20.00,未调整行保持否,客户成功部最终得分 40 + 31.5 + 20 = 91.50,考核结果的计算明细里该指标行 is_adjusted = true。
    • 实际观察:与预期逐条一致(T14a / T14b / T15e 全部 PASS,输出见 §6)。
    • 结果:✅

    T13:归档快照与归档后拦截

    • 操作步骤:马丽点「归档」;管理员打开「归档快照」;再尝试改已归档填报单的明细实际值。
    • 预期结果:填报单进「已归档」;生成一条带 64 位校验和的快照,总分与填报单一致;改明细被拒。
    • 实际观察:状态条停在「已归档」;归档快照列表一条「2026 年第 3 季度考核 · 销售部 · 归档快照」,总分 98;改明细弹窗顶部与右下角同时提示「修改填报明细失败:填报单已提交,数据已冻结。如需更正,请发起数据调整申请。」;API 断言另证快照不可改、不可删,归档后加减分与调整申请均被拒。
    • 结果:✅
    • 截图:31、32、33。

    T14:岗位账号数据范围

    • 操作步骤:分别用销售经理、华东核对人员、市场线分管领导、技术线分管领导登录,打开「填报单」「填报明细」「分公司核对」「考核结果」。
    • 预期结果:部门填报人员只见本部门填报单与明细、越权打开别的部门填报单被拒;分公司核对人员只见本分公司核对任务;分管领导只见分管主体;到人结果只见本人。
    • 实际观察:销售经理填报单列表只有「销售部」1 张、填报明细只有本部门 3 行,直接 GET 研发部填报单返回 404;华东核对人员核对任务 10 条,分公司列全部「华东分公司」;市场线分管领导只见销售/市场/客户成功/华东/华南/华北;技术线分管领导只见研发部、测试部、产品部 3 张,GET 销售部填报单返回 404;销售经理的考核结果里「到人」维度只有本人 1 条。
    • 结果:✅
    • 截图:13、14、17、25、34、35。

    T15:pnpm verify

    • 实际观察:见 §6。validate 零错、tsc --noEmit 无输出、vitest 6 文件 90 用例通过、i18n:extract:check 报「1 bundle(s) are in sync with the schema」。
    • 结果:✅

    T16:到人 / 分管领导汇总口径与排名

    • 预期结果(《设计方案》V1.0 §8 表 6,脚本内按公式独立实现一遍再比对):
      • 到人得分 = Σ(部门板块得分 × 分工权重% × 个人系数) + Σ(承接项得分率% × 承接权重%);
      • 分管领导得分 = 分管主体最终得分按主体权重加权平均;
      • 各维度组内按得分降序排名,同分同名次。
    • 实际观察(界面数值,UI 轮次):赵敏 = 98.00 × 100% × 1.20 + 120% × 40% = 117.60 + 48.00 = 165.60,界面 165.60 排名 1;徐涛 =(98.00×12 + 102.75×8 + 101.75×8)÷ 28 = 100.43,界面 100.43;冯薇 =(98.00×14 + 106.08×8 + 95.50×10 + 106.12×12 + 91.76×9 + 105.57×7)÷ 60 = 100.23,界面 100.23。API 轮次的 8 条到人、2 条分管领导逐条与公式重算值相等(T15c / T15d)。
    • 结果:✅
    • 截图:29。

    T17:部门填报人员在界面录入实际值

    • 前置条件:销售部填报单处于「填报中」。
    • 操作步骤:销售经理打开「填报明细」中本部门任一行的记录页,找编辑入口。
    • 预期结果:能在界面上把实际值填进去(部门填报人员的核心操作)。
    • 实际观察:该记录页右上角只有「…」与刷新,没有「编辑」按钮;同一条记录用管理员打开时有「编辑」。同一销售经理账号经 REST PATCH /data/kpi_entry_line/{id} 写实际值是成功的(T5 的完成率/得分断言就是用该账号写入后读回的)。「填报明细」网格的「行内编辑」开关点开后单击/双击/回车都未进入单元格编辑态,管理员账号表现相同,故该路径本轮未能取证。
    • 结果:❌
    • 截图:13-bumen-tianbao-renyuan-mingxi。

    5. 问题记录

    # 用例 现象 复现步骤 截图 处置
    1 T17 部门填报人员在「填报明细」记录页看不到「编辑」入口,管理员看得到;服务端对同一账号的写入是放行的 空库 + OS_SEED_PROFILE=software 启动 → node scripts/software-people.mjs → 管理员发布方案 → 用 sales.manager@kpi.demo / Passw0rd!23 登录 → 填报明细 → 打开「签约金额完成率」记录页 → 右上角无「编辑」 13 待定:疑似平台控制台按钮可见性只看对象级 writeScope,未把记录级共享算进去(填报单 OWD 为 private,本部门可见性由方案发布写入的动态共享规则放宽)。按 CLAUDE.md「平台问题只上报不修复」,本单不改代码;建议维护者授权后向 objectstack-ai/objectstack 提一条上报单,附本条最小复现

    6. 平台侧观察(照实记录,不计入用例判定)

    # 现象 位置
    O1 方案详情「周期开始 / 周期结束」显示为 Jun 30 / Sep 29,库里存的是 2026-07-01 / 2026-09-30(显示比实际早一天;API 断言 T1e 读到的值是正确的) 04-fangan-caogao
    O2 错误提示前缀带 KpiError:(平台 toast 拼接的错误类名) 15-weitian-buneng-tijiao
    O3 已归档填报单再改明细,提示文案是「填报单已提交,数据已冻结」而不是「已归档」——拦截行为正确,文案可更精确(应用侧文案,记入遗留问题) 33-guidang-hou-gaishu-beiju

    7. 附录:API 全流程断言输出(54 条,全部 PASS)

    执行命令:OS_PORT=3111 node scripts/software-flow.mjs(空库 + scripts/software-people.mjs 之后)。

    - PASS T0 管理员登录
    - PASS T1a 软件档案组织树:1 家总公司 + 8 个部门 + 3 家分公司,编码唯一、上级存在
    - PASS T1b 指标库:24 项,每部门 ≥3 项,四种计分方式 / 两种方向 / 三种数据来源全覆盖
    - PASS T1c 阶梯指标带完整区间表(首段从 0 起、段间不留缝、末段无上限)
    - PASS T1d 公式指标只使用 actual / target / weight 变量
    - PASS T1e 方案:季度周期、四节点流程、11 个参与主体、36 条下达;每主体权重合计 100,主体权重合计 100
    - PASS T1f 软件档案的组织单元已进入租户对齐夹具覆盖范围(objectstack-ai/objectstack#14547 的临时夹具)
    - PASS T1g 运行期脚本产物就位:8 条到人分工(含个人系数 ≠1 的样例)、≥2 位分管领导
    - PASS T2a 抹掉一个目标值后发布被拦截,并逐条列出问题
    - PASS T2b 主体权重合计 ≠ 100 时发布被拦截并点名主体与实际合计
    - PASS T2c 有未关闭的指标争议时发布被拦截
    - PASS T2d 争议处理后关闭(处理结论必填、状态留痕)
    - PASS T3 完整性检查通过后发布成功
    - PASS T4a 发布生成的填报单数 = 参与主体数(11)
    - PASS T4b 明细行数 = 指标下达数(36),每行带目标 / 权重 / 计分规则的冻结副本
    - PASS T4c 发布后修改指标下达被冻结拒绝
    - PASS T5a 发布把填报单的数据范围展开成逐人记录共享行
    - PASS T6 仍有指标未填实际值时提交被拒绝并说明缺几项
    - PASS T5b 线性封顶(超额):签约金额 5000/4000 = 125% → 封顶 120% → 得分 50 × 120% = 60.00
    - PASS T5c 区间插值(未达):回款率 72/90 = 80% → (80−60)/(100−60) = 50% → 得分 30 × 50% = 15.00
    - PASS T5d 临界:新签客户数 60/60 = 100% → 得分率 100% → 得分 20 × 100% = 20.00
    - PASS T5e 填报单指标得分合计 = 60 + 15 + 20 = 95.00(手算,《设计方案》§7 表 4)
    - PASS T7a 销售经理提交本部门填报单 → 进入分公司核对中
    - PASS T7b 提交后修改实际值被冻结拒绝(更正须走数据调整申请)
    - PASS T8a 按方案里的 3 家分公司生成并行核对任务
    - PASS T8b 提出争议但未写核对意见被拒绝
    - PASS T8c 分公司核对人员提出争议(意见必填)成功
    - PASS T8d 有分公司争议未解决时不能推进到下一节点
    - PASS T8e 争议处理后改为确认无误
    - PASS T8f 3 家分公司全部确认后自动推进到人力审核中
    - PASS T9a 驳回原因为空被拒绝
    - PASS T9b 人力审核驳回 → 退回上一节点(分公司核对),核对任务重置为待核对,原因留痕
    - PASS T9c 重新核对后再次推进到人力审核中
    - PASS T9d 人力审核通过 → 领导审批中
    - PASS T10 分管领导审批通过 → 已通过并盖章
    - PASS T11 其余 10 张填报单全部推进到已通过
    - PASS T12 阶梯计分:客户满意度 87.3/90 = 97% → 命中「达标」区间得分率 90% → 得分 35 × 90% = 31.50
    - PASS T13a 人力审核登记加减分成功;同一账号自批被岗位判定拒绝(职责分离)
    - PASS T13b 人力负责人批准加减分后计入最终得分:95.00 + 3 = 98.00
    - PASS T14a 源数据调整落地并触发重算:新签客户数 60 → 66,完成率 110%,得分 20 × 110% = 22.00;最终得分 100.00
    - PASS T14b 计算结果调整只改被调整指标的得分并标记「已调整」,未调整行保持否
    - PASS T15a 四维结果均非空:部门 8、分公司 3、到人 8、分管领导 2,且各维度组内排名正确
    - PASS T15b 部门维度得分等于填报单最终得分,加权得分 = 得分 × 主体权重
    - PASS T15c 到人得分 = Σ(部门板块得分 × 分工权重 × 个人系数) + Σ(承接项得分率 × 承接权重)
    - PASS T15d 分管领导得分 = 分管主体最终得分按主体权重加权平均
    - PASS T15e 结果的计算明细逐指标带「已调整」标记,可钻取回被调整的那一行
    - PASS T16a 归档生成带校验和的不可变快照(总分与填报单一致)
    - PASS T16b 归档快照不可修改、不可删除
    - PASS T16c 归档后填报明细、加减分、数据调整一律被拒绝
    - PASS T16d 审核记录完整留痕(生成 / 提交 / 争议 / 确认 / 驳回 / 通过 / 调整 / 归档)且不可篡改
    - PASS T17a 部门填报人员只见本部门填报单,打开其他部门的填报单被拒绝
    - PASS T17b 到人结果只见本人
    - PASS T17c 分公司核对人员只见本分公司的核对任务
    - PASS T17d 分管领导只见分管主体的填报单,打开非分管主体的填报单被拒绝
    {"passed":54,"failed":0}
    

    8. 附录:pnpm verify 输出

    ✓ Validation passed
      Data: 17 Objects  184 Fields
      UI: 1 Apps  17 Views  1 Pages  2 Dashboards  3 Reports  16 Actions
      Security: 6 Positions  6 Permissions
    
    > tsc --noEmit        (无输出)
    
     Test Files  6 passed (6)
          Tests  90 passed (90)
    
    > objectstack i18n extract --locales=zh-CN … --check
      Skeleton summary
        zh-CN      529 key(s)  (of 529 expected)
      ✓ 1 bundle(s) are in sync with the schema
    

    9. 附录:scripts/software-people.mjs 幂等性

    同一实例连跑两次,第二次全部步骤仍 OK 且「新增 0 条」:

    ===== RUN 1 =====
     OK  岗位账号已创建 — 15 个账号,统一口令 Passw0rd!23
     OK  组织归属已分配 — 新增 13 条,应有 13 条
     OK  流程岗位已分配 — 新增 15 条
     OK  到人分工已建立 — 8 条(新增 8);个人系数样本 0.95 / 1.2 / 0.9 / 1 / 1.1,含 ≠1 的样例:true
     OK  个人承接项已建立 — 8 条(新增 8),每人至少 1 项
     OK  分管领导已设置 — 2 位领导,覆盖 9 个主体(技术线 3 + 市场线 6),分管范围不重叠
    ===== RUN 2(幂等)=====
     OK  组织归属已分配 — 新增 0 条,应有 13 条
     OK  流程岗位已分配 — 新增 0 条
     OK  到人分工已建立 — 8 条(新增 0)
     OK  个人承接项已建立 — 8 条(新增 0),每人至少 1 项
    {"ok":8,"failed":0}
    

    截图提交在孤儿分支 acceptance-evidence,commit f17e50058f4ef0086c9990f89ac24b23d21ac802,路径 issue-23/。

  5. baozhoutao commented on Sep 3, 2026

    @baozhoutao
    ContributorAuthor

    objectstack-ai/objectstack#23 需求符合度清单(逐条三态)

    对照工作项正文的「范围 A/B/C/D」「不做」「验收标准」逐条核对。分支 issue-23-software-dataset,已合入 origin/main。
    ✅ = 与需求逐字相符;⚠️ = 实现了但有出入(附差异与原因 + 出口);❌ = 未实现(附原因 + 出口)。

    A. 种子档案

    # 需求条目 态 说明
    A1 src/data/ 下新增档案模块,src/data/index.ts 按 OS_SEED_PROFILE 选档 ✅ 新增 src/data/software-profile.ts;src/data/index.ts 只在文件末尾加选档逻辑,默认档案记录内容一字未改
    A2 组织树:总公司 + 部门 ≥8 + 分公司 3 家,编码唯一、上级存在 ✅ 软件总公司 + 研发/产品/测试/销售/市场/客户成功/人力行政/财务 8 个部门 + 华东/华南/华北 3 家分公司;编码 SW-* 12 个互不重复,全部挂在 bu_sw_hq 下(API 断言 T1a)
    A3 指标库每部门 ≥3 项 ✅ 24 项 = 8 个部门 × 3 项(T1b)
    A4 覆盖四种计分方式(线性/阶梯/区间/公式) ✅ linear 17 项、step 3 项、range 3 项、formula 1 项(T1b)
    A5 覆盖两种指标方向 ✅ positive / negative 均有(T1b)
    A6 覆盖三种数据来源 ✅ manual / import / system 均有(T1b)
    A7 阶梯指标带完整区间表 ✅ 3 项阶梯指标共 11 段;首段从 0 起、段间不留缝、末段无上限(T1c)
    A8 公式指标只用 actual / target / weight / 完成率 ✅ 唯一的公式指标「线上严重故障数」= actual == 0.0 ? weight : (actual <= 2.0 ? weight * 0.5 : 0.0),只用 actual 与 weight(T1d)
    A9 名称与口径说明按软件公司实际,遵需求 §1.4 术语与 std-copy 四条红线 ✅ 版本按期交付率、线上严重故障数、需求交付周期、缺陷逃逸率、自动化测试覆盖率、签约金额完成率、回款率、有效线索数、获客成本、客户续费率、客户满意度、工单响应及时率、关键岗位招聘完成率、关键人员离职率、费用预算偏差率、报表准时率等;口径说明为业务语言,无内部代号、无异常原文;「部门板块」「指标下达」「到人分工」「个人承接项」「考核主体」等名词按 §1.4 术语表
    A10 数字字段四件套(小数位/最小值/最大值/单位)显式声明 ✅ 本单不新增任何字段,四件套在既有 kpi_indicator / kpi_plan_indicator 字段定义上已显式声明(scale / min / max);档案侧对 24 个指标逐项显式给出「计量单位」与「数值小数位」(0/1/2 按指标性质),没有靠平台默认
    A11 方案「2026 年第 3 季度考核」(季度,2026-07-01 ~ 2026-09-30) ✅ period_type=quarter、year=2026、period_no=3、周期 2026-07-01 ~ 2026-09-30(T1e)
    A12 四节点默认流程(部门填报 → 分公司核对(并行)→ 人力审核 → 领导审批) ✅ 4 个流程节点,类型与审核岗位与默认流程一致(T1e)
    A13 参与主体 = 全部部门 + 3 分公司,主体权重齐全 ✅ 11 个主体,权重逐条非零,合计 100(T1e)
    A14 指标下达每主体权重合计 100 ✅ 36 条下达,11 个主体的权重合计逐个等于 100(T1e)
    A15 目标值取软件公司合理量级 ✅ 如签约金额 4,000 万元(分公司 900~1,600 万元)、有效线索 1,500 条、需求交付周期 15 天、获客成本 800 元、满意度 90 分
    A16 销售相关下达的核对方为对应分公司 ⚠️ 差异:一期实现里没有「每条指标下达指定核对方」这个字段;「分公司核对(并行)」节点由 src/hooks/sheet.hook.ts 按方案里全部分公司主体统一生成并行核对任务(自己那张单除外),这是 main 的既有状态机行为。本档案的做法:把 3 家销售型分公司放进参与主体,让销售/客户成功/市场口径的下达确实由 3 家分公司并行核对(T8a:销售部填报单生成 3 条核对任务);副作用是非销售部门的填报单也由这 3 家核对。原因:改成「按下达路由核对方」必须动 src/hooks/sheet.hook.ts,而本单明确禁触碰该文件。出口:实现困难 → 已升级给验收侧裁定,列在返回报告「基准差异」与「需拍板事项」;未自行选边、未改状态机
    A17 新档案的组织单元 id 进入租户对齐夹具覆盖范围 ✅ DEMO_UNIT_IDS 改为两套档案单元 id 的并集(与档案变量无关);实测 12 个 bu_sw_* 单元启动后全部补上组织归属(T1f)

    B. 运行期数据脚本

    # 需求条目 态 说明
    B1 业务岗位账号 ≥8(研发/测试/产品/销售/市场/客户成功/HRBP/财务) ✅ 8 个,逐一对应上述岗位,账号与口令见测试报告 §2
    B2 流程岗位六类各 ≥1 ⚠️ 差异:脚本建齐了五类持有人 —— 部门填报人员 8、分公司核对人员 3、人力审核 1、人力负责人 1、分管领导 2;第六类「考核系统管理员 kpi_admin」没有另建账号。原因:平台内置的组织 owner(admin@objectos.ai)自动等同该岗位(README「角色与岗位」表已载明),再建一个重复的管理员账号只会让演示数据多一条噪声。出口:口径待确认 → 已列入返回报告「需拍板事项」,由验收侧裁定是否要求脚本另建一个显式的 kpi_admin 账号;不自行改判
    B3 到人分工(员工 × 部门板块 × 分工权重 × 个人系数,含系数 ≠1 的样例) ✅ 8 条,系数取 1.10 / 1.20 / 0.90 / 0.95 / 1.00,含 ≠1 的样例;分工权重含 100 与 80 两种(T1g)
    B4 个人承接项每人 ≥1,承接本岗位典型指标 ✅ 8 项,每人 1 项,承接本部门本岗位的典型指标(研发→版本按期交付率、测试→自动化测试覆盖率、销售→签约金额完成率等)
    B5 方案设置分管领导 ≥2 位,分管范围不同 ✅ 徐涛(技术线:研发/产品/测试)、冯薇(市场线:销售/市场/客户成功 + 3 家分公司),范围不重叠,共覆盖 9 个主体(T1g)
    B6 脚本可重复执行 ✅ 连跑两次第二次全部「新增 0 条」且仍 OK(测试报告 §9);方案已发布时脚本主动报错退出并说明原因

    C. 全流程实测

    # 需求条目 态 说明
    C1 API 脚本走完发布→填报→提交→核对(含争议及处理)→人力审核(含驳回与重提)→领导审批→加减分→数据调整(源/结果各一)→四维汇总→归档,每步断言 ✅ scripts/software-flow.mjs 共 54 条断言,一次跑完全部 PASS(测试报告 §7)
    C2 填报含超额、未达、临界三类样本 ✅ 签约金额 125%(超额封顶)、回款率 80%(未达)、新签客户数 100%(临界)(T5b/T5c/T5d)
    C3 得分断言按 §7 表 4 手算,不从实现反推;≥3 条给手算过程 ✅ 线性封顶 50%×120%=60.00、区间插值 (80−60)/(100−60)=50% → 30%×50%=15.00、阶梯命中「达标」90% → 35%×90%=31.50,三条手算过程写在测试报告 T5 与 T12
    C4 UI 实测:岗位账号在浏览器走关键步骤,截图 ≥12 张,覆盖成功与拦截分支 ✅ 35 张,岗位账号覆盖部门填报人员、分公司核对人员、人力审核、人力负责人、分管领导(两位)与管理员;拦截分支含未填不能提交、争议意见必填、有争议不能推进、驳回原因必填、归档后不可改
    C5 数据范围断言:部门只见本部门、分公司只见本分公司核对任务、分管领导只见分管主体、到人结果只见本人 ✅ 四条全部通过,越权读取返回 404(T17a~T17d + 截图 13/14/17/25/34/35)

    D. 文档

    # 需求条目 态 说明
    D1 README 或 CLAUDE.md 补档案启用方式与脚本用法 ✅ README「演示种子档案(OS_SEED_PROFILE)」一节:两套档案对照表 + 三行命令 + 「换档案必须先删 dist」的坑 + 脚本前置条件
    D2 操作手册不改 ✅ docs/手册/ 零改动

    不做项(核对未越界)

    # 条目 态 说明
    N1 个人考核单、通知/待办、指标模板库 ✅ 未做 均未触碰
    N2 不修改默认演示种子 ✅ 未做 src/data/index.ts 里默认档案的记录内容一字未改,只在末尾加了选档逻辑与 DEMO_UNIT_IDS 取并集;不设变量启动的行为经 T2 实测与 main 一致
    N3 不修改 src/lib/scoring.ts 与 src/hooks/sheet.hook.ts ✅ 未做 两文件零改动(git diff origin/main -- src/lib/scoring.ts src/hooks/sheet.hook.ts 为空)
    N4 不修复平台问题 ✅ 未做 界面英文标签在合入 main 的 zh-CN 翻译包后已消失;新发现的「部门填报人员记录页无编辑入口」按只上报不修复处理,未改任何平台包与应用代码

    验收标准

    # 标准 态 说明
    S1 OS_SEED_PROFILE=software 空库启动后数据完整;不设变量与 main 一致;pnpm verify 绿 ✅ T1(99 行种子、四类配置齐)、T2(46 行、组织/指标/方案/主体/下达逐项与 main 相同)、T15(validate + typecheck + vitest 90 + i18n 同步检查全绿)
    S2 发布前完整性检查通过(权重、目标、争议、节点);发布后填报单数 = 参与主体数,明细带冻结副本 ✅ T3(三类问题各被拦一次并逐条列出)、T4(11 张填报单 = 11 个主体;36 行明细带目标/权重/计分方式/方向的冻结副本)
    S3 全流程脚本一次跑完断言全 PASS;≥3 条得分断言给手算过程 ✅ 54/54 PASS;三条手算(线性封顶、区间插值、阶梯)见测试报告
    S4 四维结果均非空且排名正确;到人与分管领导口径符合 §8 表 6 ✅ 部门 8 / 分公司 3 / 到人 8 / 分管领导 2,组内降序排名、同分同名次;到人与分管领导得分逐条与按公式独立重算的值相等(T15a/T15c/T15d)
    S5 三类岗位账号的数据范围断言通过(越权被明确拒绝) ✅ 部门填报人员、分公司核对人员、分管领导三类均通过,越权读取 404(T17a/T17c/T17d),另加到人结果只见本人(T17b)
    S6 测试报告按 dev-test 模板挂本单;截图走孤儿分支 40 位 SHA 图链;需求符合度清单逐条三态 ✅ 测试报告已挂本单;截图在 acceptance-evidence 的 f17e50058f4ef0086c9990f89ac24b23d21ac802,图链用 40 位 SHA,已用 contents API 抽查存在;本清单即符合度清单
    S7 全部用户可见文案过 std-copy 四条红线;数字四件套齐;pnpm validate 零错 ✅ 档案里的指标名与口径说明为业务语言、无内部代号与异常原文、名词按 §1.4;脚本产出的中文提示同样;pnpm validate 零错

    本轮新发现(不属本单交付物,记录在案)

    # 现象 处置
    1 部门填报人员在「填报明细」记录页没有「编辑」入口(管理员有),而同一账号经 REST 写实际值是放行的;「行内编辑」网格本轮自动化未能驱动(管理员同样) 疑似平台控制台按钮可见性只看对象级 writeScope、未把记录级共享算进去。按「平台问题只上报不修复」,本单未改代码;建议维护者授权后向 objectstack-ai/objectstack 提上报单。详见测试报告 T17 与 §5
    2 方案详情的周期日期显示比库中值早一天(2026-07-01 显示为 Jun 30) 显示层问题,库中值与 API 读回值正确;记入测试报告 §6 平台侧观察
    3 已归档填报单再改明细的提示文案是「填报单已提交,数据已冻结」,不是「已归档」 应用侧文案可更精确,拦截行为正确;记入返回报告「遗留问题」,不在本单修
  6. baozhoutao commented on Sep 3, 2026

    @baozhoutao
    ContributorAuthor

    已提 PR:#26

    • 分支 issue-23-software-dataset,已合入 origin/main(含 zh-CN 翻译包),合入后 rm -rf dist 重启、空库重跑了 API 全流程与全部 UI 截图。
    • 测试报告与需求符合度清单见上面两条评论;35 张 UI 实测截图在孤儿分支 acceptance-evidence 的 commit f17e50058f4ef0086c9990f89ac24b23d21ac802,路径 issue-23/。
    • 状态已切「status:PR审查中」,交接验收侧:工作项创建人 @baozhoutao(已是本单处理人)。开发侧到此为止,不自行合并 PR。
    • 两处需要验收侧拍板的事项写在 PR 正文末尾与符合度清单里:① A16「销售相关下达的核对方为对应分公司」按 ⚠️ 交付(改成按下达路由核对方必须动本单禁触碰的状态机);② B2 第六类岗位 kpi_admin 沿用平台内置管理员账号、脚本未另建。
  7. added a commit that references this issue on Sep 3, 2026
  8. baozhoutao commented on Sep 3, 2026

    @baozhoutao
    ContributorAuthor

    合并记录(调度员,2026-09-03)

  9. baozhoutao commented on Sep 3, 2026

    @baozhoutao
    ContributorAuthor

    UI 实测与操作量统计(软件公司档案,2026-09-03)

    ① 结论

    以「软件公司」演示档案(8 个总公司部门 + 华东/华南/华北 3 家分公司,24 条指标、36 条指标下达)做了一轮分角色正式界面实测:全部业务动作都在浏览器里用各岗位本人账号点出来,接口只用于 GET 核对结果与最后统计。主流程从方案发布一路走到归档,全程走通——方案发布生成 11 张填报单,8 个部门各自填报提交,3 家分公司提交,30 条核对任务全部确认(含 1 次争议→数据调整→复核闭环),人力审核 11 张(含 1 次驳回返工),加减分 2 条与数据调整 2 条(源数据 1 条 + 结果 1 条)全部审批落地,分管领导审批 9 张,最终 3 张归档 + 8 张停在「已通过」,四个维度共生成 21 条考核结果。

    但**「走得通」不等于「好用」**。本轮实测发现的最重的三件事,都不在功能有没有上,而在活该谁干、要点多少下:

    1. 分公司主体没有填报人。 分公司核对人员三条真实录入路径(网格行内编辑 / 记录页编辑 / 列表导入)全部不通,最后只能由管理员代填 12 个实际值再由核对人提交。这不是平台缺陷,是角色与岗位的设计缺口。
    2. 核对任务口径过宽 + 没有批量。 每张填报单提交都给 3 家分公司各生成 1 条核对任务(共 30 条),每位核对人 10 条里有 8 条与本分公司毫无关系;「待我核对」视图连勾选框都没有,10 条要点 30 次。
    3. 操作按钮不按岗位收敛。 部门填报人员能在自己「已通过」的填报单上看到「归档」,人力审核能对「领导审批中」的单直接点「审核通过」并且真的生效(本轮就是靠这条绕行,才把没有分管领导的财务部/人力行政部两张单推到终态)。

    操作量上,最重的是分公司核对人员(单人 47~90 次点击,其中 30 次花在与自己无关的单子上),最容易迷路的是分管领导(「待领导审批」页签藏在「还有 4 个」溢出入口里,每审完一张被弹回列表都要重新展开一次)。

    数据全部保留,未删任何记录,未重置库,未运行 scripts/software-flow.mjs。


    ② 逐角色任务表

    计数口径:跳转 = 整页切换次数;点击 = 鼠标点击次数(含菜单展开、页签、行操作菜单、弹窗按钮);输入 = 填写的字段/单元格个数(含登录的邮箱+密码 2 次);拦截 = 必填/状态校验把操作挡下的次数;秒 = 自动化耗时,自动化时间不代表人工时间,只用于同类动作之间的相对比较。

    2.1 人力审核 · 马丽(hr.reviewer@kpi.demo)

    # 任务 跳转 点击 输入 拦截 找入口尝试 绕行 秒
    1 登录 + 查看方案配置(相关页签四张明细表) 3 5 2 0 1 次到位 无 14
    2 发布方案(完整性检查 → 生成 11 张填报单) 0 3 0 0 1 次到位 无 8
    3 进入「待人力审核」队列 2 4 2 0 1 次到位(页签直出) 无 12
    4 驳回 1 张(原因必填拦截 + 观察退回节点) 1 4 1 1 1 次到位 无 12
    5 登记加减分 2 条(加 3 分 / 扣 2 分) 2 11 5 0 1 次到位 新建后弹记录抽屉,须先「关闭」才能建下一条 24
    6 发起结果调整申请(计算结果/得分) 2 13 4 0 1 次到位 状态下拉给了「待审批」却被 hook 拒,须退回改「草稿」 28
    7 结果调整「提交审批」 2 5 2 0 1 次到位 无 13
    8 逐张「审核通过」11 张填报单 13 49 3 0 1 次到位 每通过 1 张就跳回详情页,要手动回列表 + 重选页签 166
    9 处置无分管领导的 2 张单(勘察) 3 6 2 0 — — 16
    10 绕行:代财务部/人力行政部做最终审批 6 13 4 0 — 人力审核越节点代批(见卡点 K-3) 41
    11 归档 3 张已通过填报单 8 12 2 0 1 次到位 无 48
    12 审计查询(审核记录 / 驳回记录)+ 结果看板 3 6 2 0 1 次到位 无 19
    合计(12 项) 45 131 29 1 401

    单位操作量:发布方案 = 3 击(发布方案 → 继续,含确认窗口);单张填报单人力审核 = 4 击 + 1 次页面跳转(回列表 → 选页签 → 打开单 → 审核通过 → 确认);单条加减分登记 = 约 5 击 + 4 输入;归档单张 = 4 击。

    方案版本列表
    图 1 马丽登录后的「方案版本」列表:2026 年第 3 季度考核,状态「草稿」,参与主体 11 / 下达指标 36 / 未关闭争议 0

    方案详情与发布方案按钮
    图 2 方案详情页,状态条停在「草稿」,右上角「发布方案」对人力审核岗位可见(不需要换管理员)。注意「周期开始 6月30日 / 周期结束 9月29日」——库里是 2026-07-01 / 2026-09-30,日期显示早一天(已知问题)

    发布确认窗口
    图 3 「发布方案」确认窗口:发布前将做完整性检查;通过后方案冻结,并为每个参与主体生成填报单

    发布成功
    图 4 发布成功:右下角提示「方案已发布,填报单已生成。」,状态条推进到「已发布」,发布人=马丽

    待人力审核队列
    图 5 「待人力审核」队列:11 张填报单全部到齐

    驳回原因必填拦截
    图 6 拦截证据:驳回原因不填点「确认」,红字「驳回原因(必填) 为必填项」

    驳回后退回节点
    图 7 驳回研发部后,状态回到「分公司核对中」(当前节点序号 2),不是「填报中」——一期口径,「最近驳回原因」已写入

    审核通过窗口
    图 8 「审核通过」窗口,审核意见选填

    结果调整被 hook 拦下
    图 9 拦截证据:新建数据调整时状态直接选「待审批」,被拦下——「调整申请只能按「草稿 → 待审批 → 已批准 / 已否决」推进。」下拉却把这三个非法值都列了出来

    归档确认窗口
    图 10 「归档」确认窗口:归档后将生成不可变快照,数据锁定不可再改

    归档快照列表
    图 11 归档后的「归档快照」列表:研发部 91.58 / 华东分公司 103.95 / 销售部 101.67,各带校验和

    审核记录
    图 12 审计查询「审核记录」:96 条全流程留痕。注意「新状态」列显示的是内部状态值(draft/branch_checking…),经办人列显示用户 id(已知问题)


    2.2 部门填报人员 · 8 人

    先说三条录入路径的实测结果(已知平台问题 objectstack-ai/objectui#10107 的现场核对):

    路径 部门填报人员(张伟等 8 人) 分公司核对人员(陈东等 3 人)
    ① 列表「行内编辑」网格 ✅ 通。点「实际值」单元格 → 就地出数字输入框 → 输入 → Enter → 工具条出现「全部保存 (n)」→ 保存 ❌ 不通。点单元格直接跳到记录页,不出输入框
    ② 记录页「编辑」按钮 ❌ 不通。填报明细记录页右上角只有「…」与刷新,没有「编辑」;「…」里只有「分享」 ❌ 不通。同左
    ③ 列表「导入」 ✅ 有「导入」按钮(本轮未走完导入向导) ❌ 不通。工具条上根本没有「导入」按钮

    一个坑:「行内编辑」是开关按钮,默认已开。第一次误以为要点它才能编辑,点下去反而关掉了,此后点单元格就变成跳记录页——排查掉这个误判花了 3 次尝试。

    # 角色 / 任务 跳转 点击 输入 拦截 秒
    1 张伟 · 找到本部门填报单 2 3 2 0 9
    2 张伟 · 逐行填实际值(先填 2 行) 1 4 2 0 9
    3 张伟 · 未填全提交被拦 3 6 2 1 17
    4 张伟 · 用「未填实际值」页签补齐 + 看计算说明 4 7 3 0 25
    5 张伟 · 补齐后提交成功 2 4 0 0 11
    6 王强 / 李娜 / 赵敏 / 孙磊 / 周雪 / 吴刚 / 郑洁 · 单人完整一遍(填 3 行 + 提交) 4 11 5 0 26
    7 赵敏 · 提交后数据冻结校验 2 3 3 1 16
    8 赵敏 · 发起数据调整申请(源数据 3600→3680) 2 14 4 1 33
    9 赵敏 · 数据调整「提交审批」 2 5 2 0 13
    10 赵敏 · 归档后不可改校验 2 5 3 1 16
    8 人本职填报合计(第 1~6 行) ~40 ~99 ~44 1 ~250

    单位操作量:单张 3 行填报单从登录到提交 = 11 次点击 + 5 次输入 + 4 次页面跳转(登录 2 输入 1 击;菜单 2 击到「填报明细」;3 行 × (1 击 + 1 输入);全部保存 1 击;菜单 1 击回「填报单」;打开单 1 击;提交填报 1 击;继续 1 击)。行内编辑本身很顺——每行只要 1 击 + 1 输入,保存后完成率/得分率/得分即时算出。

    样本设计(超额 / 未达 / 临界三类齐全):研发部 98%(超额)/ 故障 1 次(未达)/ 15 天(临界);产品部 93 / 90(未达)/ 60(临界);测试部 98(临界)/ 75(超额)/ 3(未达);销售部 68(超额)/ 3600(未达)/ 90(临界);市场部 1720(超额)/ 880(未达)/ 100(临界);客户成功部 97(超额)/ 88(未达)/ 90(临界);人力行政部 6(超额)/ 92(未达)/ 100(临界);财务部 55(超额)/ 4.5(未达)/ 100(临界)。

    填报明细填报前
    图 13 张伟的「填报明细」:研发部 3 行,实际值列全为「—」。列头全部中文(手册里写的 Actual / Completion (%) 英文列头在本版本已修复)

    保存后即时出分
    图 14 填入 98 / 1 保存后:完成率 103.16、得分率 103.16 即时算出;工具条「行内编辑」为默认开启态

    提交被拦
    图 15 拦截证据:还有 1 个指标未填就提交,右下角「KpiError: 提交失败:还有 1 个指标未填写实际值。请补齐后再提交。」——KpiError 前缀外露(已知问题)

    未填实际值页签
    图 16 用「未填实际值」队列页签精确筛出唯一未填的那一行

    计算说明
    图 17 填报明细记录页的「计算说明」。同时可见:记录页右上角没有「编辑」按钮,只有「…」与刷新

    提交成功
    图 18 补齐后提交成功,状态条推进到「分公司核对中」

    王强提交成功
    图 19 王强(产品部)提交成功,toast「填报单已提交,进入核对与审核流程。」。注意右上角:部门填报人员在自己的单上看到了「审核通过」「驳回」两个本该属于审核岗的按钮

    提交后冻结拦截
    图 20 拦截证据:赵敏在已提交的销售部单上把「新签客户数」改成 61 并保存,红字「保存失败: 修改填报明细失败:填报单已提交,数据已冻结。」;改动行留在网格里标红,需点「全部取消」才清掉

    归档后不可改
    图 21 拦截证据:销售部已归档后再改实际值,同样被拦(提示文案仍写「填报单已提交」,未区分「已归档」)

    新建数据调整窗口
    图 22 部门填报人员看到的「新建数据调整」窗口:除业务字段外,还暴露了「状态(可选已批准/已否决)」「审批人」「审批时间」「审批意见」「落地时间」等审批侧字段

    状态必填拦截
    图 23 拦截证据 / 卡点:业务字段全填好点「创建」被拦——「状态不能为空」。必填、无默认值,手册 §3.6 也没写要选;同时可见「调整前值」并没有像手册说的那样自动带出(保存后才由系统写入)


    2.3 分公司核对人员 · 陈东(华东)/ 林南(华南)/ 高北(华北)

    核对量的口径问题(照实计数):每张填报单一提交,就给 3 家分公司各生成 1 条核对任务。11 张单共生成 30 条核对任务(8 个部门 × 3 = 24,3 家分公司互核 3 × 2 = 6),每位核对人各 10 条。其中:

    核对人 队列条数 与本分公司明显无关(其他分公司的单) 全公司部门单(是否与本分公司相关取决于口径,一期未区分)
    陈东(华东) 10 2(华南、华北) 8
    林南(华南) 10 2(华东、华北) 8
    高北(华北) 10 2(华东、华南) 8
    # 角色 / 任务 跳转 点击 输入 拦截 找入口尝试 秒
    1 陈东 · 入口勘察(能否看到/填报本分公司填报单) 2 3 2 0 1 次到位 10
    2 陈东 · 路径① 网格行内编辑填华东实际值 2 4 2 0 不通 13
    3 陈东 · 路径② 记录页「编辑」/「…」菜单 3+3 5+5 2+2 0 不通(只有「分享」) 41
    4 陈东 · 路径③ 列表「导入」 1 1 0 0 不通(无此按钮) 4
    5 陈东 · 查看华东填报单可用操作 3 5 2 0 — 15
    6 陈东 / 林南 / 高北 · 提交本分公司填报单(实际值由管理员代填) 3 6 2 0 1 次到位 16~17
    7 陈东 · 找到「待我核对」队列 2 3 2 0 1 次到位 9
    8 林南 · 探查是否有批量「确认无误」 2 4 2 0 无勾选框,无批量 11
    9 陈东 · 提出争议(理由必填拦截 + 补填提交) 2 8 3 1 1 次到位 21
    10 陈东 · 逐条「确认无误」9 条 2 31 3 0 — 56
    11 林南 · 逐条「确认无误」10 条 2 34 3 0 — 61
    12 高北 · 逐条「确认无误」10 条 2 34 3 0 — 61
    13 陈东 · 争议解决后回队列确认 2 7 3 0 1 次到位(「有争议」页签) 19
    14 陈东 / 林南 / 高北 · 人力驳回后重新核对研发部(返工) 2 7 3 0 — 16
    三人合计 45 188 46 1 431
    其中:三条填报路径勘察(不通,纯消耗) 12 23 8 0 83

    单位操作量:单条核对 = 3 次点击(行「更多操作」→「确认无误」→ 弹窗「确认」),不填意见时无输入;单条争议 = 4 次点击 + 1 次输入;一位核对人清空 10 条队列 ≈ 34 次点击。人力驳回 1 张研发部,直接让三位核对人各返工 1 次(3 × 7 = 21 次点击),而被驳回的部门填报人员因数据已冻结根本改不了数。

    陈东能看到全部 11 张填报单
    图 24 陈东(分公司核对人员)在「填报单」里看到全部 11 张单,不止华东

    陈东点单元格跳记录页
    图 25 路径①失败:陈东点华东分公司「签约金额完成率」的实际值单元格,不出输入框,直接跳到记录页;记录页右上角没有「编辑」,实际值为空、计算说明写「实际 空 / 目标 1600」

    记录页更多操作只有分享
    图 26 路径②失败:记录页「…」菜单里只有「分享」,没有「编辑」

    无导入按钮
    图 27 路径③失败:陈东的「填报明细」工具条上没有「导入」按钮(对比图 13 张伟的列表右上角有「新建」「导入」)

    填报单相关页签的审核记录
    图 28 华东填报单「相关」页签:审核记录里「新状态」显示内部值 draft、「经办人」显示用户 id(已知问题)

    管理员代填前
    图 29 绕行证据:三条路径都不通后,由管理员(admin@objectos.ai)代填。代填前 3 家分公司 12 行实际值为空

    管理员代填后
    *图 30 绕行证据:管理员在网格里一次填入 12 个实际值并保存(16 击 / 14 输入)。这 12 个值是「代填」,不是分公司自己录的

    待我核对队列
    图 31 陈东的「待我核对」队列:10 条,其中「华南分公司 · 华东分公司 核对」「华北分公司 · 华东分公司 核对」两条与华东业务无关

    无批量选择
    图 32 林南的「待我核对」视图:整列没有勾选框,无法批量确认,10 条只能逐条点

    核对行操作菜单
    图 33 核对任务的行操作菜单:确认无误 / 提出争议

    争议内容必填拦截
    图 34 拦截证据:「提出争议」不填内容点确认,红字「争议内容(必填) 为必填项」(字段标签里已经带了「(必填)」,报错文案又拼了一次,读起来是「争议内容(必填) 为必填项」)

    确认无误窗口
    图 35 「确认无误」窗口,核对意见选填

    有争议队列
    图 36 「有争议」队列:销售部那条,核对意见完整保留了陈东写的差异说明与依据

    驳回后重新排队
    图 37 人力驳回研发部后,研发部的核对任务重新回到陈东的「待我核对」队列(三家都要重做一遍)


    2.4 人力负责人 · 何平(hr.head@kpi.demo)

    # 任务 跳转 点击 输入 拦截 找入口尝试 秒
    1 审批数据调整(源数据 3600→3680,批准并落地) 2 7 3 0 1 次到位 20
    2 审批加减分 2 条(加分 3 / 扣分 2) 2 8 2 0 1 次到位 24
    3 审批结果调整(测试部缺陷逃逸率得分 → 20.00) 1 5 1 0 1 次到位 13
    合计(3 项) 5 20 6 0 57

    单位操作量:单条加减分审批 = 3 击(更多操作 → 批准 → 无二次确认);单条数据调整审批 = 4 击 + 1 输入(更多操作 → 批准并落地 → 写审批意见 → 确认)。这是全部六个角色里操作最轻、路径最短的一个。

    数据调整待审批队列
    图 38 何平的数据调整「待审批」队列

    批准并落地窗口
    图 39 「批准并落地」窗口的审批意见

    加减分待审批队列
    图 40 加减分「待审批」队列:销售部加 3 分、市场部扣 2 分

    加减分行操作菜单
    图 41 加减分行操作菜单:批准 / 否决

    结果调整批准落地
    图 42 两条调整全部批准落地后的数据调整列表


    2.5 分管领导 · 徐涛(技术线)/ 冯薇(市场线)

    # 任务 跳转 点击 输入 找入口尝试 绕行 秒
    1 徐涛 · 找到「待领导审批」队列 2 5 2 2 次(页签栏里没有,要点「还有 4 个」溢出入口) 溢出菜单 14
    2 冯薇 · 同上 2 5 2 2 次 溢出菜单 14
    3 徐涛 · 逐张审批通过 3 张 8 18 3 — 每张审完弹回详情页,要回列表 + 重新展开溢出菜单 59
    4 冯薇 · 逐张审批通过 6 张 14 33 3 — 同上 101
    5 徐涛 · 查看分管范围考核结果 + 结果看板 3 4 2 1 次到位 无 15
    6 冯薇 · 同上 3 4 2 1 次到位 无 15
    两人合计 32 69 14 218

    单位操作量:单张领导审批 ≈ 5.5 击 + 1 次页面跳转(回列表 → 点「还有 4 个」→ 点「待领导审批」→ 打开单 → 审核通过 → 确认)。比人力审核的 4 击更重,多出来的 2 击全花在每次都要重新展开溢出菜单上。

    队列页签溢出入口
    图 43 「待领导审批」不在可见页签里,要先点「还有 4 个」展开

    徐涛只见技术线 3 张
    图 44 数据范围证据:徐涛的「待领导审批」队列只有测试部、产品部、研发部 3 张(技术线),看不到市场线与分公司

    冯薇只见市场线 6 张
    图 45 数据范围证据:冯薇的队列 6 张——销售部、市场部、客户成功部 + 华东/华南/华北 3 家分公司

    领导审批通过窗口
    图 46 领导审批的「审核通过」窗口

    徐涛的考核结果
    图 47 徐涛在「考核结果」里可见 4 条(3 个部门 + 本人分管领导维度)。页签只有「部门」「分公司」「到人」三个,没有手册 §6.3 写的「分管领导」页签

    徐涛的结果看板
    图 48 徐涛的结果看板:部门 3 条平均 92.20、分管领导 1 条 92.11。人员轴显示的是用户 id lBR6jz…,认不出是谁(已知问题)

    冯薇的结果看板
    图 49 冯薇的结果看板:分公司 3 条平均 100.73、部门 3 条平均 99.25、分管领导 1 条 100.29


    2.6 数据范围抽查

    抽查对象 期望 实测 结论
    赵敏(销售部填报) · 填报单 只见销售部 1 条记录,只有销售部 ✅
    陈东(华东核对) · 核对任务 只见华东相关 10 条,「核对分公司」全部是华东分公司(不含华东自己的单) ✅ 按分公司维度正确;但口径过宽,8 条是全公司部门单
    徐涛(技术线领导) · 待领导审批 只见技术线主体 3 条:测试部 / 产品部 / 研发部 ✅
    冯薇(市场线领导) · 待领导审批 只见市场线主体 6 条:销售 / 市场 / 客户成功 + 华东 / 华南 / 华北 ✅
    张伟(研发部填报) · 到人得分 只见本人 1 条,得分 121.37 ✅(但人员列显示用户 id,认不出是自己)
    陈东(华东核对) · 填报单 只见相关 全部 11 张都能看到 ⚠️ 范围过宽
    张伟(部门填报) · 左侧菜单 只见本岗位菜单 5 组 20+ 项全部可见,与人力审核一模一样 ❌ 菜单未按岗位裁剪
    张伟(部门填报) · 指标下达 / 方案版本 / 审核记录 无权或受限 指标下达 36 条、方案版本 1 条、审核记录 96 条全部可读 ❌ 配置类与审计类对象未做范围限制
    周雪(部门填报) · 已通过填报单 只应看到只读 右上角出现**「归档」**按钮 ❌ 按钮未按岗位收敛

    赵敏只见销售部
    图 50 数据范围证据:赵敏在「填报单」里只有销售部 1 张

    张伟只见本人到人得分
    图 51 数据范围证据:张伟在「到人得分」里只有 1 行(本人,121.37)。人员列显示用户 id

    张伟看到全量菜单
    图 52 越权证据:部门填报人员张伟展开左侧菜单——方案版本、指标下达、参与主体、到人分工、指标争议、指标库、归档快照、审计查询全都在,和人力审核看到的一样

    张伟能读全部指标下达
    图 53 越权证据:张伟打开「指标下达」,36 条(全部 11 个主体的目标值与权重)全部可读

    周雪看到归档按钮
    图 54 越权证据:部门填报人员周雪在自己「已通过」的填报单上看到「归档」按钮(手册 §2.12 归档是人力审核的动作)

    马丽代批无分管领导的单
    图 55 财务部与人力行政部在方案里没有配分管领导,两位领导的队列都看不到它们,卡在「领导审批中」;马丽(人力审核)却能看到并且有「审核通过」按钮

    马丽越节点代批成功
    图 56 越权证据(已生效):马丽点「审核通过」后人力行政部推进到「已通过」,最终审批人写的是马丽——hook 没有按当前节点的岗位拦下


    ③ 角色汇总与跨角色对比

    3.1 各角色总量

    角色 任务数 页面跳转 点击 输入 拦截 自动化秒 认知复杂度 打分依据(一句话)
    人力审核 · 马丽 12 45 131 29 1 401 4 入口都在一级菜单里一步可达,但驳回退回的节点与手册口径不一致、没有分管领导时要她越节点代批、加减分/数据调整表单直接暴露状态机与审批字段——要懂内部规则才填得对
    部门填报人员(8 人) 12 ~50 ~130 ~55 4 ~350 3 行内编辑一点即改、即时出分、拦截提示明确;扣分项是「行内编辑」开关误点后整个网格行为变样,以及数据调整表单必填「状态」无默认值、手册也没写
    分公司核对人员(3 人) 14 45 188 46 1 431 5 本分公司填报单三条录入路径全不通,只能等管理员代填;队列 10 条里 8 条与本分公司无关;没有批量确认,清空队列要 34 击;争议要等别的角色走完数据调整才能回来确认
    人力负责人 · 何平 3 5 20 6 0 57 2 两个队列 + 行菜单两个动作,一步到位,全程没有找不到入口的时候
    分管领导(2 人) 6 32 69 14 0 218 3 审批动作本身简单,但「待领导审批」藏在「还有 4 个」溢出入口里,每审完一张被弹回都要重新展开;看板人员轴显示用户 id 认不出人
    管理员(代填,本不该有) 1 2 16 14 0 29 2 网格里连填 12 格一次保存,操作本身不难——难的是「这活本来不该他干」
    合计 48 179 554 164 6 1486

    打分含义:1 = 一眼能找到入口且一步到位;5 = 需要跨多个页面 / 理解内部概念 / 依赖别人提示才能完成。

    3.2 单位动作操作量横比

    动作 点击 输入 页面跳转 备注
    部门填一张 3 行填报单并提交(含登录) 11 5 4 每多一行 +1 击 +1 输入
    分公司核对确认 1 条 3 0 0 ×10 条 = 30 击
    分公司提出争议 1 条 4 1 0 理由必填
    人力审核通过 1 张 4 0 1 每张都要回列表重选页签
    分管领导审批 1 张 5.5 0 1 每张都要重开「还有 4 个」
    人力负责人批 1 条加减分 3 0 0 最轻
    人力负责人批 1 条数据调整 4 1 0
    归档 1 张 4 0 1

    3.3 谁最重、谁最容易迷路

    • 操作最重:分公司核对人员。 单人 47~90 次点击,其中 30 次是逐条确认;三人合计 188 击里有 90 击(约一半)花在与本分公司业务无关的部门填报单上,另有 23 击白白消耗在三条走不通的录入路径上。
    • 第二重:人力审核。 131 击里 49 击是逐张审核 11 张单——因为每通过一张就跳回详情页,下一张必须重新「回列表 → 选页签 → 打开」。
    • 最容易迷路:分管领导。 唯一一个「按手册找不到入口」的角色:队列页签栏放不下,「待领导审批」被折进「还有 4 个」,每次回列表都要重新展开(找入口尝试 2 次 / 每张单多 2 击)。
    • 最顺:人力负责人。 3 个任务 20 击,零拦截、零绕行、零迷路。
    • 最尴尬:分公司核对人员在填报环节。 他们是分公司主体填报单的唯一候选人,却只有「提交填报」按钮、没有任何录入手段——按钮和能力对不上。

    ④ 卡点与绕行清单

    4.1 新发现(本轮实测发现,不在已知清单里)

    编号 卡点 现场 影响 绕行方式
    K-1 分公司主体没有填报人 分公司核对人员对「填报明细」三条路径全不通:行内编辑点单元格跳记录页、记录页无「编辑」(「…」里只有「分享」)、工具条无「导入」;但同一个人在分公司填报单上有「提交填报」按钮 3 家分公司 12 个实际值无人能录;能提交却不能填,按钮与能力对不上 由管理员 admin 代填 12 格(16 击/14 输入),再由核对人本人点提交。图 25~30
    K-2 参与主体可以没有分管领导就发布 财务部、人力行政部在方案里未配分管领导,发布前完整性检查未拦下 两张单走到「领导审批中」后,两位领导的队列都看不到,流程死在这里 由马丽(人力审核)越节点代批(见 K-3)。图 55
    K-3 填报单操作按钮只按状态显示,不按岗位收敛;且 hook 也不拦 马丽对「领导审批中」的单点「审核通过」真的生效,最终审批人写成马丽;周雪(部门填报)在自己「已通过」的单上看到「归档」;王强(部门填报)在「分公司核对中」的单上看到「审核通过」「驳回」 岗位边界形同虚设;本轮就是靠它绕过 K-2 记录为绕行,未再扩大测试(未点击部门填报人员看到的「归档」,避免污染演示数据)。图 19 / 54 / 56
    K-4 左侧菜单与配置/审计类对象未按岗位裁剪 部门填报人员张伟能看到并打开「方案版本」「指标下达」「参与主体」「到人分工」「指标争议」「指标库」「归档快照」「审核记录」;指标下达 36 条(全部主体的目标值与权重)、审核记录 96 条全部可读 与手册 §1.2「每个角色只看得到自己权限内的菜单」不符;各部门的目标值互相可见 无(只读,未造成数据变更)。图 52~53
    K-5 「待我核对」没有批量确认 视图整列没有勾选框,10 条只能逐条走「更多操作 → 确认无误 → 确认」 每人 30 击,三人 90 击;人力每驳回一张,三人再各返工一次 无。图 32
    K-6 数据调整必填「状态」无默认值,且下拉给出非法值 业务字段全填好点「创建」被拦「状态不能为空」;下拉列出「草稿/待审批/已批准/已否决」,选「待审批」又被 hook 拒「调整申请只能按草稿→待审批→已批准/已否决推进」 两次试错才能建出一条草稿;手册 §3.6 完全没写这一步 手动选「草稿」→ 创建 → 再走「提交审批」。图 23 / 9
    K-7 新建后弹出记录抽屉,挡住「新建」按钮 登记完第 1 条加减分,平台弹出该记录的侧边抽屉;不先点「关闭」就点不到列表的「新建」 连续登记 N 条时每条多 1~2 击 先关抽屉再新建
    K-8 逐张审批要反复回列表重选队列 人力审核每通过 1 张就停在该单详情页;分管领导还要额外重开「还有 4 个」溢出菜单 人力 11 张多花 11 次跳转;领导每张多 2 击 无
    K-9 「行内编辑」是开关,误点即关 默认已开(蓝色高亮),点一下反而关掉;关掉后点单元格变成跳记录页,看起来像「不能编辑」 极易被误判成「没有编辑权限」——本轮就误判了一次,换 3 条路径才排查清楚 不要动这个按钮,直接点单元格
    K-10 考核结果列表缺「分管领导」页签 页签只有「考核结果 / 部门 / 分公司 / 到人」四个 与手册 §6.3「四个页签」的描述对不上(数据本身有 leader 维度 2 条) 用默认「考核结果」全量视图看。图 47
    K-11 归档快照列表不显示归档人 列为 快照名称/考核方案/考核主体/最终得分/校验和/操作 与手册 §2.12「含…与归档人」对不上 无。图 11
    K-12 必填提示文案叠字 字段标签已是「争议内容(必填)」「驳回原因(必填)」,报错拼成「争议内容(必填) 为必填项」 文案观感 无。图 34 / 6
    K-13 归档后修改的拦截文案仍写「已提交」 已归档的销售部改实际值,提示「填报单已提交,数据已冻结」 用户分不清是「提交冻结」还是「归档锁定」 无。图 21

    4.2 已知问题(照实复核,不当新发现)

    已知项 本轮复核结果
    岗位账号记录页没有「编辑」、网格行内编辑点不动(objectstack-ai/objectui#10107) 部分复现。① 部门填报人员的「填报明细」行内编辑可用(点单元格→数字输入框→Enter→全部保存),这条不复现;② 填报明细记录页确实没有「编辑」按钮,「…」里只有「分享」,复现;③ 分公司核对人员三条路径全不通,复现
    子表按钮 Add line / Total 英文 未覆盖(本轮未进入方案/指标建档窗口,方案是既有草稿)
    日期显示早一天 复现。方案周期库值 2026-07-01 / 2026-09-30,界面显示「6月30日 / 9月29日」。图 2
    错误提示带 KpiError: 前缀 复现。图 15
    审核记录显示内部状态值 复现,「新状态」列显示 draft / branch_checking 等;经办人列显示用户 id。图 12 / 28
    核对任务确认后处理人未盖章 复现。30 条核对任务全部 confirmed,但 decided_by / decided_at 仍为空
    结果看板显示用户 id 复现,看板人员轴与「到人得分」报表都显示用户 id;但「考核结果」列表里的名称是正常中文(如「2026 年第 3 季度考核 · 张伟」)。图 48 / 51
    人力驳回只能退到「分公司核对中」 复现。研发部驳回后回到节点 2「分公司核对中」;部门填报人员此时数据已冻结改不了数,只能走数据调整;实际走法是三家分公司各重新「确认无误」一次,单据才继续。图 7 / 37
    界面列头英文(Actual / Completion (%)) 已修复,本轮所有列头为中文

    ⑤ 改进建议(5 条)

    应用侧可改

    1. 给分公司主体配置填报人(P1,对应 K-1)。 两种选法二选一:① 新增「分公司填报人员」岗位并绑定分公司主体;② 让「分公司核对人员」对本分公司主体的填报单具备录入权(对别家的单仍只读)。当前状态是「有提交按钮、无录入手段」,演示时一定会被问到。

    2. 核对任务按相关性收敛 + 加批量确认(P1,对应 K-5 与队列口径)。 ① 生成核对任务时按「该填报单是否含与本分公司相关的指标」过滤,而不是每单给每家都发一条(现在 30 条里至少 6 条是分公司互核,业务上说不通);② 「待我核对」视图开勾选列 + 批量「确认无误」,把清空队列的 30 击压到 3~4 击。

    3. 按当前节点岗位收敛操作按钮,并把校验落到 hook(P1,对应 K-3、K-2)。 「审核通过 / 驳回」只对当前节点的审核岗位显示且只对该岗位放行;「归档」只对人力审核显示;同时在方案发布的完整性检查里加一条——参与主体必须都配了分管领导,否则拦下(现在两张单能走到无人认领的死角)。

    4. 表单只暴露该角色该填的字段(P2,对应 K-6、K-7)。 数据调整 / 加减分的新建表单隐藏「状态、审批人、审批时间、审批意见、落地时间」,状态由 hook 置为「草稿」;「调整前值」在选完指标明细时就回填到表单上(现在是保存后才写);新建成功后不弹记录抽屉、直接回列表。顺带把「争议内容(必填)」这类标签里的「(必填)」去掉,交给 * 号和报错文案。

    平台行为(只上报,不在应用侧修)

    1. 五条平台侧观感问题,建议合并成一条 issue 报到 objectstack-ai/objectstack:① 左侧导航未按岗位裁剪(所有角色都看到 5 组 20+ 项,K-4 的菜单部分);② 队列页签放不下就折成「还有 N 个」,且每次回列表都重置(K-8);③ 看板/报表的人员维度显示用户 id 而非姓名(结果看板、到人得分);④ 日期字段显示早一天;⑤ 记录页详情区「行内编辑」开关的默认态与关闭后行为落差太大,易被误判为无权限(K-9)。其中 ③④ 与已上报的 [repo:objectui] Edit affordance is derived from the object-level writeScope only — a user holding a record-level edit share (sys_record_share) sees no Edit button while PATCH on the same record succeeds objectui#10107 相邻,可放在同一批里。

    另有一条边界待定,请维护者拍板口径,不属于建议:配置类与审计类对象(指标下达、方案版本、审核记录)对部门填报人员完全开放(K-4 的数据部分)。如果按「考核公开透明」办,现状即可;如果各部门目标值互相保密,需要按主体做行级过滤。


    ⑥ 测试后系统数据快照(2026-09-03 实测结束时)

    6.1 各对象记录数与状态分布

    对象 条数 状态 / 分布
    指标库 24 全部「启用」
    指标阶梯区间 11 —
    考核方案版本 1 已发布(2026 年第 3 季度考核)
    参与主体 11 8 个总公司部门 + 3 家分公司;其中财务部、人力行政部未配分管领导
    指标下达 36 —
    流程节点 4 部门填报 → 分公司核对 → 人力审核 → 领导审批
    到人分工 8 —
    个人承接项 8 —
    填报单 11 已通过 8 / 已归档 3(销售部、华东分公司、研发部)
    填报明细 36 实际值全部录入,全部已出分
    核对任务 30 已确认 30(争议 1 条已解决并转确认)
    指标争议(方案期) 0 本轮未使用方案期争议,争议走的是核对任务的「提出争议」
    加减分 2 已批准 2 —— 加分 1(销售部 +3)、扣分 1(市场部 −2)
    数据调整 2 已批准 2 —— 源数据 1(销售部签约金额 3600→3680)、计算结果 1(测试部缺陷逃逸率得分→20.00)
    审核记录 96 生成 11 / 提交 11 / 确认 33 / 争议 1 / 驳回 1 / 审核通过 34 / 数据调整 2 / 归档 3
    考核结果 21 部门 8 / 分公司 3 / 到人 8 / 分管领导 2
    归档快照 3 研发部 91.58、华东分公司 103.95、销售部 101.67(各带校验和)

    6.2 各主体最终得分

    主体 状态 指标得分 加减分 最终得分
    销售部 已归档 98.67 +3 101.67
    华东分公司 已归档 103.95 0 103.95
    研发部 已归档 91.58 0 91.58
    市场部 已通过 103.87 −2 101.87
    华南分公司 已通过 101.01 0 101.01
    产品部 已通过 100.02 0 100.02
    人力行政部 已通过 100.00 0 100.00
    华北分公司 已通过 97.22 0 97.22
    客户成功部 已通过 94.20 0 94.20
    财务部 已通过 91.06 0 91.06
    测试部 已通过 85.00 0 85.00

    到人维度 8 条:赵敏 158.80、孙磊 126.08、张伟 121.37、吴刚 120.00、周雪 119.20、王强 110.02、李娜 110.00、郑洁 106.51。
    分管领导维度 2 条:冯薇 100.29、徐涛 92.11(财务部、人力行政部无分管领导,不进任何领导维度)。

    6.3 维护者可以去看什么(页面 → 看什么)

    登录 http://localhost:3111/_console/ ,进入「KPI 考核管理」应用。

    用哪个账号 页面 看什么
    马丽 hr.reviewer 考核方案 → 方案版本 方案已发布,发布人=马丽;日期显示比库值早一天
    马丽 填报与审核 → 填报单 → 全部填报单 11 张单:8 张「已通过」+ 3 张「已归档」两种终态并存
    马丽 填报与审核 → 填报单 → 打开研发部 → 详情「更多详情」 「最近驳回原因」保留了那次驳回的原文
    马丽 审计查询 → 审核记录 96 条全流程留痕;切「驳回记录」页签看那唯一 1 条;切「时间线」看时序
    马丽 结果与归档 → 归档快照 3 条快照与校验和
    马丽 结果与归档 → 结果看板 四个维度汇总;人员轴显示的是用户 id(已知问题现场)
    马丽 填报与审核 → 数据调整 2 条:源数据 1 条(3600→3680)、计算结果 1 条,均已批准落地,带审批人与落地时间
    马丽 填报与审核 → 加减分 2 条已批准:销售部 +3、市场部 −2
    赵敏 sales.manager 填报与审核 → 填报单 只有销售部 1 张(数据范围现场)
    赵敏 填报与审核 → 填报明细 → 点「签约金额完成率」实际值单元格 已归档,改了保存会被拦(拦截现场)
    陈东 east.checker 填报与审核 → 分公司核对 → 全部核对任务 10 条已确认;其中 2 条是华南/华北的单(口径过宽现场)
    陈东 填报与审核 → 填报明细 → 点华东任一行 跳记录页、无「编辑」按钮(K-1 现场)
    徐涛 leader.tech 填报与审核 → 填报单 → 「还有 4 个」→ 已通过 只见测试/产品/研发 3 张(数据范围现场)
    徐涛 结果与归档 → 考核结果 4 条;页签只有 部门/分公司/到人,没有「分管领导」
    张伟 rd.engineer 考核方案 → 指标下达 36 条全可读(菜单未裁剪现场)
    周雪 cs.manager 填报与审核 → 填报单 → 打开客户成功部 右上角出现「归档」按钮(按钮未收敛现场)

    ⑦ 账号与环境

    • 被测实例:http://localhost:3111/_console/ ,API 根 http://localhost:3111/api/v1 ;代码目录 /Users/baozhoutao/GitHub/kpi-software-demo(main @ a760651,只读,未改任何代码);数据库 .objectstack/software.db,种子档案 software。实例全程未重启、未换库、未删记录、未运行 scripts/software-flow.mjs。
    • 测试方式:全局 Playwright 1.60.0 + Chromium,视口 1440×900,Accept-Language: zh-CN,无头模式。所有业务动作都是界面点击;接口只用于 GET 核对结果与本报告 ⑥ 的统计。
    • 账号(口令统一 Passw0rd!23;管理员 admin@objectos.ai / admin123):
      • 部门填报:张伟 rd.engineer / 王强 pd.manager / 李娜 qa.engineer / 赵敏 sales.manager / 孙磊 mkt.specialist / 周雪 cs.manager / 吴刚 hrbp / 郑洁 fin.specialist(均 @kpi.demo)
      • 分公司核对:陈东 east.checker / 林南 south.checker / 高北 north.checker
      • 人力审核:马丽 hr.reviewer;人力负责人:何平 hr.head
      • 分管领导:徐涛 leader.tech(研发/产品/测试)/ 冯薇 leader.gtm(销售/市场/客户成功 + 3 家分公司)
      • 管理员 admin@objectos.ai(仅用于代填 3 家分公司的 12 个实际值,已在报告中标注「代填」)
    • 证据:95 张真实界面截图,归档在孤儿分支 acceptance-evidence 的 issue-23-ui/ 目录,commit 2ce5f7eb9ec78fac12fb883757209726c6cbe76e。本报告中所有图链均指向该 SHA,已用 contents API 逐一核对存在。
    • 未完成项:① 子表按钮「Add line / Total」英文未复核——本轮沿用既有草稿方案,未进入方案/指标建档窗口;② 部门填报的「导入」向导只确认了按钮存在,未走完上传→字段映射→预览三步;③ 部门填报人员看到的「归档」按钮只记录了可见性,未实际点击(避免多出一张非计划归档的单,污染维护者要看的终态分布)。
  10. baozhoutao commented on Sep 3, 2026

    @baozhoutao
    ContributorAuthor

    调度员对 UI 实测发现 K-3 的成因核实(2026-09-03)

    现象:人力审核(马丽,仅持 kpi_hr_reviewer 岗位,组织成员角色 member)对处于「领导审批中」的两张填报单点「审核通过」真的生效,审核记录的经办人是马丽本人(记录 id JzgQ4yGWH0fHl_QS、nk380Ccs9ABAMyd9)。方案流程节点 4 的审核岗位是 kpi_exec_leader,src/hooks/sheet.hook.ts 的 requiredPositionFor 会算出该岗位,hasPosition 本应拒绝。

    成因:四个流程按钮(提交/审核通过/驳回/归档)是带 api.write 能力的 JS 动作体,用 ctx.api.object('kpi_entry_sheet').update({ pending_action }) 写入。平台 17.2.0 运行时对动作体的说明(buildActionEngineFacade,objectstack#2849)明确:动作体以「受信任」方式执行,不携带调用者的 ExecutionContext,安全中间件跳过 RLS / FLS / CRUD 检查;因此写入到达 hook 时 ctx.session.isSystem === true,hasPosition 第一行 if (isSystem(ctx) || !position) return true 直接放行,「非系统写入不得直改 status」等其它以 isSystem 为闸的规则同样失效。经办人仍能记成马丽,是因为 actorId(ctx) 从 ctx.user 取到了发起人。

    影响面:凡是通过这四个按钮发起的动作,状态机的岗位校验形同虚设——部门填报人员在自己单上看到的「归档」「审核通过」「驳回」按钮(K-3 另两处现场)点下去同样会生效。经 REST 直接 PATCH pending_action 的路径不受影响(hook 正常拦截,#23 全流程脚本的岗位断言就是这样过的)。

    修法方向(供立单时分级,不在本单修):

    • A(应用侧,推荐):hook 的岗位校验不再以 isSystem 免检,而是「只要 pending_action 由按钮/用户写入(ctx.user 存在)就按发起人校验岗位」,isSystem 免检仅保留给没有发起用户的纯系统写入(发布生成、重算);同时按钮的 visibleWhen 按当前节点岗位收敛。
    • B(平台侧):等 objectstack#2849 的动作级 runAs: 'user' 落地后把四个按钮改为以用户身份执行。平台方向已写在源码注释里,但无时间表,只上报不等待。

    K-2(未配分管领导也能发布)与 K-3 叠加,是本轮流程能「走通」的真正原因:两张无人审批的单是靠这个旁路代批的。建议两条一并立单,优先级 P1。

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