Repository navigation
UI copy: indicator field label 「责任板块(考核部门)」 should be 「部门板块」 per requirements glossary §1.4 #13
Description
Activity
Claimed by dispatcher session
session_01VR2khJ3Me96btawVsfG6jb. Branch:issue-13-department-segment-label. Worktree../kpi-issue-13, baseline main @ 50ab3ac (contains #10), dev port 3113, database.objectstack/issue-13.db. Developer subagent dispatched; no parallel item in this batch.
Generated by Claude Code
Self-test report for #13 — indicator
owner_unitlabel 「责任板块(考核部门)」 → 「部门板块」#13 UI copy: indicator field label 「责任板块(考核部门)」 should be 「部门板块」 测试报告
第 1 页:结论
结论:✅ 通过
共 6 条用例:通过 6。静态门禁 3/3 绿(validate / typecheck / vitest 68 条),端到端回归 73/73 绿。
工作项两条验收标准均达成:① 指标表单与列表中该字段显示为「部门板块」;②
责任板块/所属板块全库检索零命中。降级声明:本轮为元数据 + 接口级真机验证 —— 从运行中的 dev 实例(:3113)的构建产物读回该字段的生效 label,并跑完整 e2e 驱动脚本;不是浏览器 UI 走查,没有截图。按 os-project-std-evidence,UI 呈现的最终证据留待有浏览器环境的验收轮次(pm-test)。本项为纯 label 文案改动,字段 label 是列表列标题与表单字段名的唯一来源,故元数据读回对「显示成什么」有直接证明力,但不替代 UI 走查。
关键观察(元数据 / 接口级,替代截图)
- 运行实例生效 label:
owner_unit = {"label":"部门板块","type":"lookup","required":true,...,"reference":"sys_business_unit",...} - 构建产物中
责任板块命中 0 次,部门板块命中 3 次(本字段 + 到人分工unit字段 label + 其 description)。 - 英文回退生效值:
"owner_unit":{"label":"Department Segment"};旧值Owning Unit已不存在于构建产物。 - 验收检索
grep -rn 责任板块|所属板块 src test scripts退出码 1(零命中)。
问题清单:无 ❌ 用例。
待细化清单:无。2. 测试环境与账号
项 值 被测版本 commit c172018367762ec996cca691f09790400281386c(分支issue-13-department-segment-label,基线 main @50ab3ac,已含 #10)。开测前三级核对:①http://localhost:3113/应答 302,e2e 全程连通;② 占用 3113 的进程 cwd =/home/user/kpi-issue-13(/proc/PID/cwd读取,父进程与子进程各核一次);③ 该 worktreegit rev-parse HEAD=c172018,git status --porcelain空。另核对构建产物新鲜度:dist/已在启动前rm -rf,重建后的dist/objectstack.json含新 label、不含旧 label平台 @objectstack/* 17.2.0,SqlDriver(better-sqlite3),单租户 环境 / 启动 OS_PORT=3113 OS_DATABASE_URL=file:./.objectstack/issue-13.db pnpm dev(空库启动,自动加载 46 行演示种子),地址http://localhost:3113。启动前rm -rf dist并删除该实例数据库文件端 元数据构建产物 + REST 接口(PC 端服务侧)。UI 未走查 —— 见首页降级声明 测试账号 管理员 admin@objectos.ai / admin123;其余岗位账号由scripts/e2e-flow.mjs当场创建(部门填报、分公司核对、分管领导、人力审核、人力负责人)前置数据 仅演示种子(组织单元 8、指标库 6 条、2026 年 8 月月度考核方案及其下达);其余由脚本按序创建,凭本表可从空库重建同等环境 驱动脚本 scripts/e2e-flow.mjs,KPI_BASE_URL=http://localhost:3113测试日期 2026-09-02 未覆盖 浏览器 UI 走查与截图;中文以外语言界面的实际渲染 3. 测试计划与结果总表
编号 标题 类型 端 角色 结果 证据 T13-01 指标对象 owner_unit字段的生效 label 为「部门板块」主流程 元数据 管理员 ✅ §6.3 元数据读回 T13-02 指标列表 / 表单引用该字段的列与项随之显示「部门板块」(单一 label 来源) 主流程 元数据 管理员 ✅ §6.3 + src/views/index.ts列集T13-03 全库 责任板块/所属板块检索零命中边界 源码 — ✅ §6.1 检索输出 T13-04 英文回退为 Department Segment,语义保持,旧值消失边界 元数据 管理员 ✅ §6.3 翻译包读回 T13-05 静态门禁回归:validate / typecheck / vitest 全绿 回归 构建 — ✅ §6.2 pnpm verifyT13-06 端到端回归:73 条用例全绿,改 label 未影响任何行为 主流程 REST 全部岗位 ✅ §6.4 pnpm e2e四类覆盖说明(缺类豁免理由):本项是纯 label 文案替换,不新增/删除字段、不改类型与校验、不触碰 hook 与权限模型,因此没有自身的异常路径与权限边界可测 —— 两类无对应用例,予以豁免。二者的回归风险由 T13-06 兜底:e2e 73 条中已含异常类(T16
T18、T20、T29T32、T34、T61 等拒绝路径)与权限类(T41、T42、T44、T46、T58~T70)用例,本轮全部保持通过。4. 逐用例明细
T13-01:指标对象
owner_unit字段的生效 label 为「部门板块」- 前置条件:按 §2 空库启动 dev 实例(:3113),启动前
rm -rf dist。 - 操作步骤:
- 启动 dev → 平台重建构建产物
dist/objectstack.json(即该运行实例加载的元数据); - 从该产物中定位
kpi_indicator对象 → 读取fields.owner_unit。
- 启动 dev → 平台重建构建产物
- 预期结果:
- 在
kpi_indicator.fields.owner_unit.label:看到「部门板块」; - 在整个产物中:看不到「责任板块」。
- 在
- 实际观察:
owner_unit = {"label":"部门板块","type":"lookup","required":true,"searchable":false,"multiple":false,"unique":false,"reference":"sys_business_unit","deleteBehavior":"set_null","hidden":false,"readonly":false,"sortable":true,"externalId":false}—— label 为「部门板块」,字段类型 / 引用目标 / 必填性均与改动前一致;grep -c 责任板块 dist/objectstack.json= 0。
- 结果:✅
- 截图:无(接口级,见降级声明)。
T13-02:引用该字段的列表列与表单项随之显示「部门板块」
- 前置条件:T13-01 通过。
- 操作步骤:
- 核对
src/views/index.ts中引用owner_unit的位置; - 确认这些位置只按字段名引用、不自带列标题覆盖。
- 核对
- 预期结果:
- 在指标列表视图列集、紧凑列集、表单「基本信息」分组:三处均以字段名
owner_unit引用,不存在独立的列标题字面量; - 因此三处显示名唯一来源 = 字段 label = 「部门板块」。
- 在指标列表视图列集、紧凑列集、表单「基本信息」分组:三处均以字段名
- 实际观察:
src/views/index.ts:13(列表列集)、:22(紧凑列集)、:32(表单基本信息分组)三处均为owner_unit字段名引用,无任何硬编码列标题;全仓检索确认视图层「板块」零命中;- 与 T13-01 合并即得:三处显示「部门板块」。
- 结果:✅
- 截图:无;UI 实际渲染留待 pm-test 轮次。
T13-03:全库
责任板块/所属板块检索零命中- 前置条件:无。
- 操作步骤:1. 在 worktree 根执行工作项校验规则给定的检索命令。
- 预期结果:1. 在命令输出:无任何命中行,退出码为 1。
- 实际观察:1. 输出为空,
echo $?= 1(grep 零命中即返回 1),见 §6.1。 - 结果:✅
T13-04:英文回退为
Department Segment- 前置条件:T13-01 的构建产物。
- 操作步骤:1. 从构建产物
translations段读取en.objects.kpi_indicator.fields.owner_unit。 - 预期结果:1. 在该键:看到
Department Segment(department segment,语义 = 部门板块);2. 在整个产物:看不到旧值Owning Unit。 - 实际观察:
"owner_unit":{"label":"Department Segment"},与同段其余字段(Code/Name/Category/Scoring Method/Status)并列,结构未变;Owning Unit present? false。
- 结果:✅
T13-05:静态门禁回归
- 前置条件:HEAD =
c172018,工作树干净。 - 操作步骤:1. 执行
pnpm verify(= validate + typecheck + vitest)。 - 预期结果:1. 在校验输出:Validation passed;2. 在 tsc:无类型错误;3. 在 vitest:全部用例通过。
- 实际观察:1.
✓ Validation passed (640ms),17 Objects / 184 Fields(与改动前一致);2. tsc 无输出即无错误;3.Test Files 6 passed (6)/Tests 68 passed (68)。退出码 0。 - 结果:✅
T13-06:端到端回归
- 前置条件:dev 实例按 §2 空库启动;三级核对通过。
- 操作步骤:1. 执行
KPI_BASE_URL=http://localhost:3113 node scripts/e2e-flow.mjs。 - 预期结果:1. 在脚本结尾统计:73 条通过、0 条失败 —— 与 Align code with confirmed design V1.0: bonus role segregation, one active plan per period, "adjusted" marker; refresh compliance checklist and self-test record #10 轮次基线条数一致,说明 label 改动未影响任何行为。
- 实际观察:1.
{"passed":73,"failed":0},退出码 0;含计分、状态机、共享规则、岗位权限、归档不可变等全部既有断言。 - 结果:✅
5. 问题记录
无。
补充一条非缺陷的观察(不构成本项问题,记录备查):GitHub 正文 sanitizer 会把提交上来的正文里的引号存成
"/'实体,代码块内亦然,故本评论与 PR #14 正文中命令行与 JSON 片段的引号可能显示为实体形式;内容完整、语义无损(本工作项正文本身也是同一形态)。已按纪律对 PR 正文与本评论做全文回读,确认无截断。6. 运行输出(当次真跑原样)
6.1 验收检索(工作项校验规则)
$ grep -rn "责任板块\|所属板块" src test scripts $ echo $? 1对照(证明检索本身有效、且新词已就位):
$ grep -rn "部门板块" src src/objects/indicator.object.ts:34: owner_unit: Field.lookup('sys_business_unit', { label: '部门板块', required: true }), src/objects/plan.object.ts:270:/** 到人分工(蓝图 B-M3-06):员工与部门板块的对应关系、权重与个人系数。 */ src/objects/plan.object.ts:276: description: '员工与部门板块的对应关系及其权重、个人系数。', src/objects/plan.object.ts:290: unit: Field.lookup('sys_business_unit', { label: '部门板块', required: true }), src/lib/aggregate.ts:6: * - 到人:个人得分 = Σ(部门板块得分 × 分工权重% × 个人系数)+ Σ(承接项得分率% × 承接权重%)6.2
pnpm verify(validate + typecheck + vitest)> @objectstack-ai/kpi@0.1.0 validate /home/user/kpi-issue-13 > objectstack validate ◆ Validate ✓ Validation passed (640ms) KPI 考核管理 v0.1.0 Data: 17 Objects 184 Fields UI: 1 Apps 17 Views 1 Pages 2 Dashboards 3 Reports 16 Actions Logic: 0 Flows Security: 6 Positions 6 Permissions > @objectstack-ai/kpi@0.1.0 typecheck > tsc --noEmit > @objectstack-ai/kpi@0.1.0 test > vitest run Test Files 6 passed (6) Tests 68 passed (68) Duration 1.12s退出码:
VERIFY EXIT=0 at c1720186.3 运行实例元数据读回(该字段生效 label)
$ ls -l --time-style=full-iso dist/objectstack.json -rw-r--r-- 1 root root 300328 2026-09-02 18:49:25 +0000 dist/objectstack.json $ node -e '...读 dist/objectstack.json 定位 kpi_indicator...' path: objects.6 owner_unit = {"label":"部门板块","type":"lookup","required":true,"searchable":false,"multiple":false,"unique":false,"reference":"sys_business_unit","deleteBehavior":"set_null","hidden":false,"readonly":false,"sortable":true,"externalId":false} $ grep -c '责任板块' dist/objectstack.json 0 $ grep -c '部门板块' dist/objectstack.json 3 $ node -e '...读 translations 段...' FOUND Department Segment context: "translations":[{"en":{"objects":{"kpi_indicator":{"label":"Indicator","pluralLabel":"Indicators","fields":{"code":{"label":"Code"},"name":{"label":"Name"},"category":{"label":"Category"},"owner_unit":{"label":"Department Segment"},"scoring_method":{... Owning Unit present? false6.4
pnpm e2e(KPI_BASE_URL=http://localhost:3113 node scripts/e2e-flow.mjs)结尾统计与抽样(全 73 条均为 PASS):
PASS T24 通过后生成考核结果(部门维度) — department:88#1 PASS T37 逆向指标:目标 12 实际 10 → 完成率 120%,封顶 110% → 得分 55(权重 50) — rate=120 score_rate=110 score=55 PASS T60 人力负责人岗位批准加减分成功,最终得分随之重算 — before=106 after=108 bonus_total=5 PASS T71 组织为空的已发布方案仍阻断同周期发布(租户判定不靠查询过滤) — seed_org=null seed_status=published dup=422 {"passed":73,"failed":0}退出码:
E2E EXIT=06.5 收尾
dev 实例已按 PID 停止(父进程 + 全部子进程,逐个按 PID 操作,未使用
pkill -f);停止后http://localhost:3113/无应答,worktree cwd 下无遗留进程。
Generated by Claude Code
- 运行实例生效 label:
Requirements compliance checklist for #13 — three-state, item by item
#13 需求符合度清单(逐条三态)
三态:✅ 符合 /
⚠️ 部分符合(附出口链接)/ ❌ 不符合(附出口链接)。
被测版本 commitc172018,PR #14(draft),测试报告见本工作项上一条评论。A. 输入与字段(工作项正文第 1~3 条)
# 工作项条款 三态 落地情况与证据 出口 A1 src/objects/indicator.object.ts字段owner_unit的 label「责任板块(考核部门)」改为「部门板块」;帮助文本(若有)同步✅ indicator.object.ts:34label 已为「部门板块」;运行实例元数据读回label = 部门板块,字段类型 / 引用目标 / 必填性未变。该字段本身没有 help text,故「帮助文本同步」无对应改动点(非遗漏)报告 T13-01 A2 全库检索 责任板块/所属板块(对象 label、视图列标题、翻译包zh-CN/en回退、种子数据名称、脚本与测试断言文案),逐处改为「部门板块」;英文回退保持语义(department segment)✅ 逐面核对:对象 label 1 处已改;视图列标题 src/views/index.ts三处均按字段名引用、无硬编码标题,随 label 自动生效;翻译包 en 回退Owning Unit→Department Segment(项目无zh-CN包 —— 中文即 label 本身,见src/translations/index.ts头注释);种子数据src/data/index.ts六条指标只存owner_unit外键值、不含该术语;脚本与测试断言test/、scripts/内「板块」零命中报告 T13-02 / T13-03 / T13-04 A3 汇总结果 / 报表中出现「板块」相关列标题一并核对 ✅ 已核对: src/reports/、src/dashboards/、src/datasets/内「板块」与owner_unit均零命中 —— 汇总结果与报表不引用该字段,无列标题需改。另src/lib/aggregate.ts:6汇总口径注释中的「所属板块得分」已同步为「部门板块得分」(注释,算法未动)PR #14 划界扫描 B. 校验规则(工作项正文)
# 工作项条款 三态 实测结果 出口 B1 grep -rn 责任板块|所属板块 src test scripts零命中✅ 输出为空,退出码 1(grep 零命中);同轮对照检索「部门板块」5 处命中,证明检索本身有效 报告 §6.1 B2 pnpm verify绿✅ VERIFY EXIT=0 at c172018;Validation passed、tsc 无错、vitest6 files / 68 tests全通过报告 §6.2 B3 pnpm e2e绿✅ E2E EXIT=0,{"passed":73,"failed":0}(:3113 空库实例),与 #10 轮次基线条数一致报告 §6.4 C. 验收标准
# 工作项条款 三态 判定依据 出口 C1 指标表单与列表中该字段显示为「部门板块」→ 通过 ✅ 证据层级 = 元数据 + 接口级(与 #10 轮次同档,按项目 CLAUDE.md H2「最低限度档」):从运行实例(:3113)构建产物读回该字段生效 label = 部门板块;列表列集、紧凑列集、表单基本信息分组三处均按字段名引用、无硬编码标题,故显示名唯一来源即该 label。⚠️ 浏览器 UI 目视与截图未做(本会话无浏览器环境),留待 pm-test 验收轮次报告 T13-01 / T13-02 + 首页降级声明 C2 上述检索零命中 → 通过 ✅ 同 B1 报告 §6.1 D. 依赖与边界
# 条款 三态 说明 D1 #10 合入后再做 ✅ 基线 main @ 50ab3ac已含 #10;src/objects/entry.object.ts、scripts/e2e-flow.mjs本 PR 均未触碰,无冲突面D2 docs/00~03、README、CLAUDE.md 不改✅ 均未改动。PR 改动面仅 3 个 src/文件(+3 / -3 行)D3 不要改任何与本术语无关的代码 ✅ 改动 3 处全部是术语 / 文案; src/objects/plan.object.ts中「部门板块」原本即正确,未动;src/hooks/plan.hook.ts:104注释「员工 · 板块」描述显示名格式、非术语实例,未动汇总
全部 11 条 ✅,无
⚠️ 、无 ❌。唯一需 PM 知悉的证据层级说明:C1 的判定基于元数据读回而非浏览器目视 —— 本会话无浏览器环境,按项目 CLAUDE.md H2 走「最低限度档」,与已验收的 #10 轮次同档;UI 截图留待 pm-test。
Generated by Claude Code
Dispatcher collection check for PR #14 (head c172018, base 50ab3ac): passed — 3 files / 3 lines (label, comment, English fallback);
grep -rn "责任板块\|所属板块" src test scriptszero hits;git merge-treeclean;pnpm verifyre-run: validation passed, typecheck clean, 68/68 tests; CI verify green; trailers present, no model identifiers. Next: independent review gate, then merge.
Generated by Claude Code
- added a commit that references this issue
on Sep 2, 2026 Merged PR #14 into main as bdc87ff (collection check passed; review gate MERGEABLE at c172018; CI verify green). Status → PM验收中; handed to the work-item creator for acceptance. The two reviewer notes (
assessor_unitlabel wording, missing English bundle entry for staff assignments) are filed as #15.
Generated by Claude Code
业务场景(需求 V1.3 §1.4 术语表;设计方案 V1.0 已统一为「部门板块」;os-project-std-copy 红线③)
设计方案 V1.0(#9)按需求 §1.4 把术语统一为「部门板块」,但界面文案仍用旧叫法,文档与系统名词不一致。
输入与字段
src/objects/indicator.object.ts字段owner_unit的 label「责任板块(考核部门)」改为「部门板块」;帮助文本(若有)同步;责任板块/所属板块(对象 label、视图列标题、翻译包zh-CN/en回退、种子数据名称、脚本与测试断言文案),逐处改为「部门板块」;英文回退保持语义(department segment);校验规则
grep -rn "责任板块\|所属板块" src test scripts零命中;pnpm verify绿;pnpm e2e绿。验收标准
指标表单与列表中该字段显示为「部门板块」→ 通过;上述检索零命中 → 通过。
依赖
#10 合入后再做(避免与其对
src/objects/entry.object.ts、scripts/e2e-flow.mjs的改动冲突)。