Skip to content

文案与盖章小批:审核记录状态中文、归档提示、看板人员姓名、归档拒绝节点名、必填叠字、禁止手工新建填报单、得分合计两位小数(#38) - #43

Merged
baozhoutao merged 9 commits into
mainfrom
issue-38-copy-and-stamps
Sep 6, 2026

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

关联工作项 #38(文案与盖章小批,P3)。逐条独立提交,9 条一并交付。

改了什么

改动 落点
1 审核记录的原状态 / 新状态写中文标签(留痕唯一写入口转换,4 个调用点一次覆盖);历史记录不迁移(试运行前无正式数据,开发库每轮空库重建) lib/workflow.ts(新增 statusLabel())、hooks/util.ts
2 无代码改动 —— 复测确认基线(#28 把系统免检收窄到无发起人的写入)已修复盖章,UI 实测核对人 / 核对时间均已落库,据实结案
3 填报明细冻结提示按填报单状态分岔:已归档不再指向走不通的数据调整申请 hooks/entry-line.hook.ts
4 人员维度改用结果记录名称(含姓名)展示;组织单元图加 dimension ∈ {部门, 分公司} 固定过滤,消除「(未指定)」柱 datasets/dashboards/reports/
5 归档被拒的提示取人力审核节点名,不再报流程最后一个节点(只改文案取值,规则未动) hooks/sheet.hook.ts
6 5 处必填参数 label 去掉「(必填)」后缀,必填交给平台标记 actions/index.ts
7 新建保护取消管理员例外;权限集关掉填报单 allowCreate,列表「新建」收掉 hooks/sheet.hook.tssecurity/index.ts
8 汇总字段写入时按两位小数取整(复用 lib/scoring.tsround2,不另立口径) hooks/sheet.hook.ts
9 工作台顶部注释按实测更正「待人力审核」的可见性口径 pages/index.ts

翻译包由 pnpm i18n:extract 重新生成,未手改词条。

验证

评审要看的三处

  1. 第 4 条有偏差(平台受限):人员轴显示「方案名 · 姓名」,不是纯姓名。根因是平台数据集维度解析只认 lookup 字段、Field.user 维度返回原始用户 id(抓包证据在平台单里),已按纪律只上报不修复:analytics: 数据集维度只解析 lookup 字段,user 字段维度返回原始用户 id —— 以人为轴的图表/报表标签是一串 id objectstack#16390;平台补上后把维度换回 person,回退路径写在代码注释里。
  2. 第 7 条有偏差:「列表无新建」对领 KPI 权限集的账号成立(人力审核已为 0),对平台内置管理员(组织 owner)不成立 —— 平台按设计让 owner 绕过权限集;但数据层一律 422,建不出残缺单。未做任何绕行。
  3. 两处越出派发允许清单的改动,均已在工作项上报备:hooks/util.ts(第 1 条留痕的唯一写入口,改别处会碰禁触碰文件)与 actions/index.ts(第 6 条 5 个 label,该文件被派发单列为禁触碰而正文把本条列为必做)。第 6 条单独成一个只含 5 个字符串的 commit 790af52,可整段取舍。

禁触碰清单(lib/scoring.tsadjustment.hook.tsbonus.hook.tsviews/index.ts 的三段、services/apps/src/data/scripts/docs/)零改动。

🤖 Generated with Claude Code

@baozhoutao

Copy link
Copy Markdown
Contributor Author

代码评审报告(os-project-dev-review)

档位:全量档(依据:9 条小改合批但触及审核状态机唯一真值 src/hooks/sheet.hook.ts(+51/−9)与留痕唯一写入口 src/hooks/util.ts;12 文件 / 9 提交,含权限集与数据集改动)
评审对象:head 8b86f7b ← base c197bf46;评审子 agent 冷启动,输入仅三样(工作项 #38 全文含两条追加评论、PR diff、需求符合度清单原文),未读开发方测试报告 / 开工方案 / 交接评论。

结论:可合并


通用质量(/code-review 高档)

4 项发现,全部低严重度,均落在 ⚪ 记录级(逐条见下方发现清单)。明确排查无问题的高风险面:statusLabel() 写入侧转换无任何代码消费方拿 from_status/to_status 与内部值比较(读取面只有列表列、表单字段、快照 pick),字段 maxLength: 30 容得下中文标签;roundSummaryFields 对 null / 空串 / NaN / 负数处理正确,且排在归档锁的「input↔prev 差异」判定之前,不会自触发归档锁;gateLabel?? 链在 label: null 时收敛正确;除方案发布外无任何路径新建 kpi_entry_sheet;hooks/util.ts → lib/workflow.ts 未引入循环依赖。

专属核查(四条逐条)

1 改动面越界:✅ 无越界(两处报备核实属实,无第三处)

12 个文件逐个对照允许面:sheet.hook.ts(仅新建保护 / 归档拒绝文案取值 / 汇总取整三处)、entry-line.hook.tsworkflow.ts(仅新增导出 statusLabel,STATUS_LABEL/STEP_LABEL/requiredPositionFor/transition 一行未动)、security/index.ts(仅填报单 allowCreate)、dashboards / reports / datasetspages/index.ts(纯注释)、翻译包 —— 全部在允许面内。
报备两处核实属实:① hooks/util.ts 只改 writeReview 的两行取值 + 一段注释;② actions/index.ts 只有 5 行 label 去后缀,单独成 commit 790af52,required: true 与报错文案未动。
禁区实测 diff 为空(git diff c197bf46..8b86f7b -- 指定路径):src/lib/scoring.tsadjustment.hook.tsbonus.hook.tssrc/views/(本 PR 确未列出、确未改)、src/services/src/apps/src/data/src/objects/scripts/docs/package.jsonpnpm-lock.yaml —— 全部零字节改动。
test/position-guard.test.ts 仅 1 行断言 + 1 行注释,是第 1 条实现改动的必要同步(全库仅此一处断言留痕状态取值),非放宽。
翻译包对账:在评审实例重跑 objectstack i18n extract(同 pnpm i18n:extract 参数),git status 为空 —— 提交的翻译包与元数据逐字节一致,pnpm i18n:extract:check 亦通过(531 key)。

2 降级对账:✅ 清单与代码 / 实测相符,未发现静默降级

3116 独立实例(software 档案 + review-43.db,rm -rf dist 后启)全流程实跑,并在基线 c197bf46 另起一份同档案实例做改前对照:

# 代码位置 基线实测 head 实测
1 util.ts:169-170 + workflow.ts statusLabel draft / branch_checking / hr_reviewing / leader_approving / approved / archived 填报中 / 分公司核对中 / 人力审核中 / 领导审批中 / 已通过 / 已归档(94 条记录全中文)✅
1b 不迁移不回填 与清单一致;历史记录留内部值(见 ⚪-4)
2 本单未改代码 30/30 已决核对任务 decided_by/decided_at 均已盖章 同样 30/30 全盖章 ✅ —— 「基线已修复」属实,不是降级
3 entry-line.hook.ts lockedMessage 归档单改明细提示「已提交,数据已冻结」 「填报单已归档,数据已锁定不可再改。归档数据不能更正,如有疑问请联系人力审核。」;改 / 删两处均分岔;非归档单仍走原文案 ✅
4a datasets person_label person 维度返回原始用户 id person_label 返回「2026 年第 3 季度考核 · 冯薇」等 —— 姓名出现、带方案名前缀,与清单 ⚠️objectstack-ai/objectstack#16390 描述一致;同次查询 person 维度仍出 id,平台侧根因坐实
4b dashboards bar_unit 固定过滤 不过滤时 unit: null 行(avg 119.83)在轴上 dimension IN (department, branch) 后该行消失(响应 SQL 带 WHERE)✅;已核实 Console 把看板部件的 filter 映射为数据集 runtimeFilter,故该验证等价于看板渲染路径
5 sheet.hook.ts gateLabel 分管领导归档被拒:「当前节点「领导审批」…」 「当前节点「人力审核」…」✅;requiredPositionFor 对 archive 固定 kpi_hr_reviewer 一行未动,岗位规则零改动(非归档动作的拒绝文案仍取 atStepDef)
6 actions/index.ts 5 处 src/ 内已无「(必填)」残留(翻译包 0 处),required: true 保留
7a SheetInsertGuardHook 管理员 REST 建单 400(缺必填字段——说明 hook 放行了管理员) 422 KPI_SHEET_MANUAL_INSERT
7b security/index.ts ⚠️ 与清单一致(见 ⚪-2);另核实 allowCreate 在平台 schema 为 default(false),分公司核对 / 分管领导 / 部门填报三个权限集对填报单本就无新建权,收窄无遗漏
8 roundSummaryFields 华南分公司 indicator_score = 91.75999999999999 91.76;11 张填报单的 indicator_score/bonus_total/weight_total 无一超两位小数 ✅
9 pages/index.ts 注释 已改为「按数据范围显示、不按岗位」并指向 objectstack-ai/objectstack#15135

脚本与门禁(本评审实例复跑,非采信自述):software-flow 55/55 PASS、默认档案 e2e-flow 74/74 PASS(换档案前 rm -rf dist、另起库)、pnpm verify 四项全绿(validate / typecheck / 139 tests / i18n check)。
合并后状态:当前 main 已前进 2 个提交(b94a4a6,触及 adjustment.hook.ts / bonus.hook.ts / views/index.ts / 翻译包)。本地模拟合并无冲突,合并结果上 pnpm verify 仍全绿、翻译包重生成零差异(530 key)—— 与主干的共享文件(生成式翻译包)无语义冲突。

3 三禁痕迹:✅ 无
diff 路径无 node_modules/ / patches/,package.jsonpnpm-lock.yaml 零改动;新增代码无 TODO / FIXME / XXX / HACK;无临时夹具、无环境闸门开关。第 4 条的平台缺口按纪律只上报未修复(objectstack-ai/objectstack#16390),应用侧换列不是绕平台机制;第 8 条的取整走 lib/scoring.tsround2,未另立舍入口径,得分算法零改动(scoring.ts diff 为空,software-flow 全部手算断言不变)。

4 硬拍板落地:✅

  • 数字字段四件套:本单未新增也未修改任何字段定义(src/objects/ diff 为空),无四件套义务。取整目标两位与同对象 total_score(scale: 2)、kpi_entry_line.final_score(scale: 2)一致;三个 summary 字段自身仍未声明 scale(平台默认),属既有欠账,已在代码注释与工作项记录、超本单范围(⚪-3)。
  • std-copy 四条红线:新增 / 改动文案逐条过 —— 冻结与归档提示、归档拒绝提示、状态中文标签、图表标题、数据集维度 label,均无内部代号(draft/archived 等内部值恰是本单要消灭的)、无异常原文、术语取需求 §1.4(人力审核 / 部门填报 / 分公司核对 / 领导审批 / 已归档 / 已通过),两条新错误提示均为三段式(什么失败 → 为什么 → 怎么办)。「(必填)」去后缀后必填交平台标记,报错文案未动。

调用面抽查(被改共享函数 / 字段的下游)

writeReview() —— 全库 5 处调用(check-task.hook.ts:46sheet.hook.ts:231:233adjustment.hook.ts:80plan.hook.ts:285,分布 4 个 hook 文件;清单称「4 个调用点」指 4 个文件,口径一致)。5 处传入的都是内部状态值(fromStatus/toStatus'branch_checking' 字面量、sheet?.status'draft'),经同一处 statusLabel() 转换,无一处传入已中文化的值(不会双重转换),null 原样保留、未知值不吞值。写入侧唯一入口成立:全库仅 util.ts:165 一处 insert('kpi_review_record')
读取面 4 处(审核记录列表列 / 表单字段 / 驳回记录视图按 action 过滤 / snapshot-service 的字段 pick)—— 无任何一处按 from_status/to_status 做逻辑判断或过滤,改中文不改行为;归档快照 payload 随之写中文,属留痕展示口径一致的预期结果。
test/position-guard.test.ts 是全库唯一断言该字段取值的测试,1 行同步为 '已归档',无其他测试被改。
round2 调用面:scoring.ts 内 8 处 + 本单新增 1 处引用,函数体未动,software-flow 的全部手算得分断言(含阶梯 / 区间插值 / 到人 / 分管领导公式)55 条全过 —— 取整只加在填报单汇总字段的写入闸上,不进计分链路。
security 收窄的调用面:6 个权限集逐个核对填报单条目,仅 Admin / HrReviewer 两处原有 allowCreate: true,均已收掉;取消管理员例外后发布方案生成填报单(系统写入)正常 —— 两个流程脚本各自从发布跑到归档全绿,SheetInsertGuardHookisSystem 免检未动。

发现清单

级别 位置 问题 处置出口
⚪ 记录 src/dashboards/index.ts:45src/reports/index.ts:26 人员维度换 person_label(= kpi_result.name)除清单已披露的「方案名前缀」外,还改变了聚合粒度:name方案名 · 姓名 拼成,多方案并存时同一个人会拆成每方案一根柱 / 一行(原 person 维度按人合并跨方案)。当前看板无方案筛选器,历史方案累积后柱数按方案倍增。数值本身正确,且这是所披露折中的直接推论 objectstack-ai/objectstack#16390 的回退一并解决(平台补上 user 维度解析后换回 person 即自动恢复);建议把这一条补进该平台单的影响描述
⚪ 记录 src/hooks/sheet.hook.ts:80 + src/security/index.ts 平台组织 owner 绕过权限集,「新建」按钮仍在但必得 422 —— 一个永远点不成的可见控件。应用侧两层(权限集声明 + 数据层 hook)都已按要求收紧,这是平台 owner 判定所致,与清单 7b 的 ⚠️ 自述一致,非绕行 交验收侧判断是否另立平台上报;不影响本单合并
⚪ 记录 src/objects/entry.object.ts 的三个 Field.summary weight_total / indicator_score / bonus_total 自身仍未声明 scale(以及数字四件套的其余三件),本单用 hook 写入闸取整顶着。本 PR 未改字段定义,不构成四件套违规,但欠账仍在 已在代码注释与工作项记录;需要时另立单补字段定义
⚪ 记录 src/hooks/sheet.hook.ts:142 归档拒绝文案取方案的 hr_review 节点名,而 requiredPositionFor 对 archive 固定kpi_hr_reviewer;若某方案把人力审核节点的审核岗位配成「人力负责人」,持该岗位的人归档被拒时会看到「当前节点「人力审核」…你没有该岗位」。属既有规则与节点配置的不一致(本单明文「只改文案取值、不改规则」),且相对基线的「领导审批」是净改善 记录;规则层面的对齐若要做,归独立工作项
⚪ 记录 src/dashboards/index.ts:42 bar_unitfilterBindings: { dimension: false } 后,看板全局「汇总维度」筛选器只剩四个指标卡片响应,三个图表 / 表格均不响应(bar_persontbl_dim 在基线即已解绑)。本次解绑是消除「(未指定)」柱的必要手段,标题已注明范围 记录;全局筛选器与部件的绑定口径若要统一,归独立工作项

🔴 阻塞: 🟡 应修:


评审实例:临时 clone + 独立端口 3116 + 独立库,software 与默认两档案各跑一遍并另起基线实例对照;评审结束已停进程、删临时目录。评审子 agent 只读,未改任何代码 / 标签 / 处理人。

@baozhoutao
baozhoutao merged commit e209da8 into main Sep 6, 2026
1 check passed
@baozhoutao
baozhoutao deleted the issue-38-copy-and-stamps branch September 6, 2026 17:33
baozhoutao and others added 9 commits September 6, 2026 12:39
留痕的唯一写入口 writeReview() 按 lib/workflow.ts 的 STATUS_LABEL 把内部值转成
中文;转换放在写入侧,列表、表单、导出、归档快照 payload 四个读取面一次覆盖。
未知取值原样返回,不吞值。历史记录不迁移、不回填(试运行前无正式数据,开发库
每轮空库重建),已在工作项上记录。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
已归档的单再改明细,原提示写「填报单已提交……请发起数据调整申请」——而归档后
数据调整同样被拒,等于把人支去一条走不通的路。按填报单状态分岔出两条三段式提示,
修改与删除两处共用。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
归档不落在任何流程节点上(requiredPositionFor 对它固定要 kpi_hr_reviewer),原文案
取 transition 给的 atStepDef —— 那是流程的最后一个节点,通常是「领导审批」,跟这次
拒绝无关。只改文案取值:archive 时取 hr_review 节点的名称,方案没配则回落到「人力
审核」;岗位规则一行未动。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
新建保护取消 kpi_admin 例外:填报单的唯一来源是方案发布,手工建出来的单没有方案、
没有主体、没有明细,页头一渲染就崩(平台 objectstack-ai/objectstack#14888),没有
任何合法用途。权限集里管理员与人力审核的 kpi_entry_sheet 关掉 allowCreate,列表与
相关页签的「新建」随之消失(声明与执行一致,口径同 kpi_entry_line)。发布路径是
hook 内的系统上下文写入,不过权限集,不受影响。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
指标得分合计 / 加减分合计 / 权重合计是平台 summary 字段(对明细求和),浮点相加出来
就是 91.75999999999999,而同一行声明了 scale: 2 的「最终得分」显示 91.76 —— 两个数
并排,用户看到的是「系统算错了」。取整拦在写入闸上,列表、表单、导出、快照读到的是
同一个值;舍入规则复用 lib/scoring.ts 的 round2,不另立口径,计分逻辑一行未动。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
看板「人员得分」与「到人得分」报表的人员轴出的是原始用户 id:抓包核实,同一次数据集
查询里 unit(Field.lookup)返回名称、person(Field.user)返回 id —— 维度解析只认
lookup 字段。平台侧能力缺口按纪律只上报、不绕行;应用侧换用结果记录的名称列
(汇总时已写成「方案名 · 姓名」)作展示维度,残留偏差是带方案名前缀,已在符合度清单
按有偏差记录。

「各组织单元平均得分」加固定过滤 dimension ∈ {部门, 分公司}:到人 / 分管领导的结果行
没有组织单元,原来被兜成一根「(未指定)」柱;范围写进标题。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
原注释写「部门填报人员在『待人力审核』里本来就一行都读不到」,与实测相反:本部门单
进入人力审核中时该区块对填报人员显示 1 行,动作被 hook 的岗位闸以 422 拒绝。改成事实
表述——区块按数据范围显示、不按岗位显隐,读得到不等于动得了;入口噪音的根治依赖平台
能力 objectstack-ai/objectstack#15135。只动注释。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
对话框里原来是「争议内容(必填) *」——「(必填)」与平台自己的必填标记叠字,校验没
说错但读起来像口吃。5 处必填参数(驳回原因 / 争议内容 / 否决原因 / 处理结论 ×2)统一
只留名词,required: true 不动,校验与报错文案一字未改。

注:落点在 src/actions/index.ts,该文件在本次派发单里被列为禁触碰,而工作项正文把本条
列入必做范围;按同因同域单独成一个只含这 5 个字符串的 commit,便于评审侧整段取舍,
已在工作项上留痕报备。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
pnpm i18n:extract 产物,未手改词条:动作参数的必填后缀(第 6 条)与看板标题的范围
说明(第 4 条)。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant