Repository navigation
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
Copy link
Copy link
Open
Labels
Description
业务场景(设计方案 docs/00 第 10 章第 6 / 10 / 13 / 14 项;第 5.6 / 5.7 / 8 章)
客户方 2026-09-02 确认《设计方案》全部口径(第 1~12 项同意产品默认,第 13 / 14 / 15 项选 A)。与当前 main(8cce30c)对照,三处代码尚未落实已确认口径,另有符合度清单与自测记录需按 os-project-dev-issue 步骤 4.5 与 os-project-dev-test 报告模板整改:
- 第 6 项「加减分:人力审核提出、人力负责人审批」——当前
src/hooks/bonus.hook.ts允许人力审核或人力负责人任一岗位审批,且未限制谁能登记; - 第 10 项「同一周期只有一个生效版本」——发布时未校验同周期是否已有已发布方案;
- 第 14 项「结果调整改某指标得分并标记「已调整」」——
kpi_entry_line有adjusted_score/last_adjustment,但没有用户可见的「已调整」标记,列表与汇总看不出哪一行被调过; - 第 13 项「分公司只核对相关指标、只能确认 / 提出争议不能改值」——实现已如此,本项只补一条权限反例用例证明;
- 第 8 章到人口径「Σ(部门板块得分 × 分工权重 × 个人系数)+ Σ(承接项得分率 × 承接权重)」——
src/lib/aggregate.ts实现一致,但注释仍写「疑点 Q-03 未拍板,按推断口径实现」; docs/04-需求符合度清单.md:Data scope via dynamic sharing rules; rescore results when a bonus is decided #4 态列为 ✅ 而统计行计为⚠️ (docs/04 compliance checklist: statistics line and exit paragraph disagree with row #4's verdict #7);⚠️ 条目缺出口链接;多处仍写「待拍板」;证据列引用 T39~T57 而docs/05只到 T37;docs/05-自测记录.md:单元测试数写 32(实际 55)、用例只到 T37(脚本实际 59 条);缺被测版本 commit、测试日期、用例类型 / 端 / 角色列、逐用例明细;问题记录缺复现步骤、必现 / 偶现、绕行办法、处置列。
触发操作
- 填报单「加减分」明细新建 / 保存(人力审核);
- 加减分「批准」「驳回」按钮(人力负责人);
- 方案「发布方案」按钮;
- 数据调整「批准」落地(调整类型 = 计算结果 或 源数据)。
输入与字段
kpi_bonus:新建(登记)要求当前用户持有岗位kpi_hr_reviewer(组织 owner / admin 视同管理员放行);审批动作(批准 / 驳回)要求岗位kpi_hr_head(管理员放行);人力审核不能审批自己登记的加减分,人力负责人不能登记。kpi_plan发布:同一考核周期 =period_type+year+period_no三者相同;若已存在另一条状态为「已发布」的方案,发布被拒绝;「已关闭 / 已归档」的不算生效版本,不阻断。kpi_entry_line新增字段is_adjusted(布尔,label「已调整」,readonly,默认 false)与adjust_type_applied(select,label「调整类型」,选项同kpi_adjustment.adjust_type,readonly,可空);调整批准落地时由 hook 以系统上下文写入(源数据调整与结果调整都标);「已调整」列加入填报明细的列表视图与填报单内嵌网格,结果对象的计算明细 JSON 中每条指标带is_adjusted。src/lib/aggregate.ts顶部注释改为「口径依据《设计方案》V1.0 第 8 章表 6」,删去「未拍板 / 推断」字样;算法不改。docs/04-需求符合度清单.md:头部改为对照《设计方案》V1.0(章节号引用设计方案而非疑点编号);Product close-out: record design decisions as product defaults, add CI #6 / 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 / docs: design baseline V1.0 and delivery-document conformance fixes; add CI #11 / Align code with confirmed design V1.0: bonus role segregation, one live plan per period, "adjusted" marker #12 的「偏差与出口」改为引用设计方案第 10 章对应项,态为 ✅ 无偏差;Align code with confirmed design V1.0: bonus role segregation, one live plan per period, "adjusted" marker #12 增加「提出 = 人力审核、审批 = 人力负责人(本工作项)」;新增行:「结果调整标记已调整(设计 5.7、第 14 项)」「同周期单一生效版本(设计 5.2、第 10 项)」「分公司核对不能改值(第 13 项)」;Data scope via dynamic sharing rules; rescore results when a bonus is decided #4 的态与统计行一致(态列 ✅ 且偏差列写二期候选并链接设计方案表 10;或态改⚠️ 并计入统计,二选一,全文一致);Session handover: project state, pending decisions, and 12 UI findings from the manual screenshots #22 改 ✅(自由公式不进系统已由第 16 项确认为范围边界);软件公司岗位 KPI 演示数据集(独立种子档案 + 岗位人员脚本)与全流程实测 #23 保持⚠️ ,出口写「升级:实施期真实数据量验证,见设计方案表 10 试运行阶段」;统计行按最终态列重新计数;证据列引用的每个 T 编号必须在docs/05总表中存在。docs/05-自测记录.md按 os-project-dev-testreport-template.md重写(最低限度档:同会话、REST 级证据,首段如实声明):首页「结论:✅ 通过 / ❌ 存在问题」+ 一行用例计数;§2 环境表含被测版本 commit SHA(本 PR head)、启动命令与端口、账号(含无权对照账号的获取方式)、前置数据、测试日期;§3 计划与结果总表列「编号 | 标题 | 类型(主流程 / 边界 / 异常 / 权限)| 端 | 角色 | 结果 | 证据」,覆盖scripts/e2e-flow.mjs全部用例(含本工作项新增);§4 逐用例明细至少覆盖本工作项新增 / 改动的用例(前置条件 / 操作步骤 / 预期 / 实际观察 / 结果);§5 问题记录列「# | 用例 | 现象 | 复现步骤(必现 / 偶现)| 原因分析 | 处理建议(含绕行)| 截图 | 处置」;静态门禁数字取当次真跑输出。
校验规则
- 非人力审核登记加减分 → 拒绝:「登记加减分失败:只有人力审核岗位可以登记加减分。请联系人力审核办理。」;
- 非人力负责人批准 / 驳回加减分 → 拒绝:「审批加减分失败:只有人力负责人岗位可以审批加减分。请转交人力负责人处理。」;
- 同周期已有已发布方案时发布 → 拒绝:「发布失败:该考核周期已有生效版本「<方案名>」。请先关闭该版本,或改用复制出的新版本替换。」(三段式:什么失败 + 原因 + 下一步);
- 调整批准落地后,对应明细行
is_adjusted = true、adjust_type_applied= 该调整的类型;未被调整的行保持 false; - 分公司核对人员账号直接修改填报明细实际值 → 被拒绝(权限反例);
- 全部报错文案过 os-project-std-copy 四条红线;新增字段数字四件套 / 标签中文;
pnpm validate、pnpm typecheck、pnpm test绿;scripts/e2e-flow.mjs全绿且新增用例编号连续。
输出 / 反馈
- 单元测试:加减分岗位判定、发布周期唯一性、调整标记各至少 1 条;
- e2e 新增用例:加减分登记 / 审批岗位反例各 1、同周期重复发布反例 1、调整落地后「已调整」标记 1、分公司核对人员改值反例 1;
- 结果对象计算明细 JSON 含
is_adjusted。
依赖
无(main 8cce30c 已含 #2)。禁触碰 docs/00~docs/03、README.md、CLAUDE.md、.github/(并行工作项负责)。
验收标准
- 以人力审核账号登记加减分成功,以同账号批准 → 拒绝并出现校验规则 2 的文案 → 通过;
- 以人力负责人账号批准 → 成功,填报单最终得分随之重算 → 通过;
- 同周期第二个草稿方案点发布 → 拒绝并出现校验规则 3 的文案(含已生效方案名)→ 通过;先关闭已发布方案再发布 → 成功 → 通过;
- 结果调整批准后,填报明细列表该行「已调整」= 是、「调整类型」= 计算结果;考核结果计算明细中该指标
is_adjusted: true→ 通过; docs/04统计行 = 态列实际计数;每个 T 引用在docs/05§3 存在 → 通过;docs/05首页结论与计数、§2 被测版本 SHA、§3 七列总表覆盖 e2e 全部用例 → 通过;pnpm verify与pnpm e2e输出块为当次真跑原样 → 通过。
Reactions are currently unavailable
Activity
baozhoutao commentedon Sep 2, 2026
Claimed by dispatcher session
session_01VR2khJ3Me96btawVsfG6jb. Branch:issue-10-align-confirmed-design. Worktree../kpi-issue-10, baseline main @ 8cce30c, dev port 3110, database.objectstack/issue-10.db. Developer subagent dispatched; parallel item #9 ownsdocs/00–docs/03,README.md,CLAUDE.md,.github/(do not touch).Generated by Claude Code
feat(kpi): align code with confirmed design V1.0 (bonus segregation, …
docs: refresh compliance checklist and self-test record for design V1.0
baozhoutao commentedon Sep 2, 2026
Self-test report for #10 — same content as
docs/05-自测记录.mdon branchissue-10-align-confirmed-design(commit92721a6; tested code commit79437b2). The report body is in the project's delivery language; §6 verbatim run output is kept in the file (it is long) and summarized here.KPI 考核管理系统 自测记录(开发侧)
第 1 页:结论
结论:❌ 存在问题
共 66 条用例:通过 66。静态门禁 3/3 绿(validate / typecheck / vitest 64 条)。
本工作项新增用例 7 条(T58~T64)全部通过;但工作项 #10 的验收标准 1、2 要求「以人力审核账号登记加减分」「以人力负责人账号批准」,这两步在当前数据范围设计下任何人力岗位账号都执行不了(问题记录 #1),因此结论按模板取「存在问题」。
问题清单
关键观察(接口级,替代截图)
{"error":"登记加减分失败:只有人力审核岗位可以登记加减分。请联系人力审核办理。","code":"VALIDATION_ERROR","declaredCode":"KPI_BONUS_REGISTER_POSITION","object":"kpi_bonus"}{"error":"发布失败:该考核周期已有生效版本「2026 年 11 月 月度考核」。请先关闭该版本,或改用复制出的新版本替换。","code":"VALIDATION_ERROR","declaredCode":"KPI_PLAN_PERIOD_CONFLICT","object":"kpi_plan"}{"plan_indicator":"1GLVXvVPxDO9xY2G","indicator_name":"客户满意度","score_rate":90,"score":12.5,"is_adjusted":true,"adjust_type_applied":"result"}2. 测试环境与账号
79437b2bfa0611237c4bd2e1c17e1eb3354f8bf5(分支issue-10-align-confirmed-design的代码提交)。核实方式(开测前三级核对):①/proc/net/tcp中处于 LISTEN 的端口含 3110,且无 3100 / 3111;② 占用 3110 的进程 pid 3441,/proc/3441/cwd=/home/user/kpi-issue-10;③ 该 worktreegit rev-parse HEAD= 79437b2,git status干净。文档提交92721a6叠在其上,不改任何被测代码OS_PORT=3110 OS_DATABASE_URL=file:./.objectstack/issue-10.db pnpm dev(空库启动,自动加载 46 行演示种子),地址http://localhost:3110admin@objectos.ai / admin123(组织 owner,等同考核系统管理员岗位)。无权对照账号由脚本当场创建:管理员经 RESTPOST /auth/sign-up/email建号 →sys_business_unit_member入单元 →sys_user_position分配岗位,口令统一Passw0rd!23;本轮建了部门填报人员(市场部)、分公司核对人员(华东)、分管领导(前任 / 新任)四个账号scripts/e2e-flow.mjs(目标地址取环境变量KPI_BASE_URL,本轮http://localhost:3110)3. 测试计划与结果总表
四类齐全:主流程 35、边界 3、异常 14、权限 14(合计 66)。全部 66 条 ✅ 通过。总表七列全文见
docs/05-自测记录.md§3;本工作项新增的 7 条摘录如下。4. 逐用例明细(本工作项新增 / 改动的用例)
T58:非人力审核岗位登记加减分被拒绝
kpi_dept_reporter;等待该方案的市场部填报单共享到 A 后再操作。POST /api/v1/data/kpi_bonus,body:{ sheet: <11 月市场部填报单>, title: '越权登记', bonus_type: 'add', points: 1, reason: '岗位反例' }。登记加减分失败:只有人力审核岗位可以登记加减分。请联系人力审核办理。(declaredCodeKPI_BONUS_REGISTER_POSITION)。T59:非人力负责人岗位批准加减分被拒绝
PATCH /api/v1/data/kpi_bonus/<id>:{ status: 'approved' }。KPI_BONUS_APPROVE_POSITION)。T60:人力负责人岗位批准加减分成功,最终得分随之重算
PATCH { status: 'approved' }→ 重读填报单。status=approved、approved_by非空;②bonus_total=5;③before=106 after=108。T61:同周期已有生效版本时发布被拒;关闭后可发布
发布失败:该考核周期已有生效版本「2026 年 11 月 月度考核」。请先关闭该版本,或改用复制出的新版本替换。;② 200,status=published。T62:结果调整落地后标记「已调整」
POST kpi_adjustment { adjust_type: 'result', new_value: 12.5 }→submitted→approved→ 重读被调整行与另一未调整行。is_adjusted=true type=result;②final=12.5;③ 未调整行is_adjusted=false、类型为空。T63:考核结果计算明细 JSON 逐指标带 is_adjusted
GET /api/v1/data/kpi_result?plan=<2026 年 10 月方案>,取部门维度、市场部那一行的breakdown。lines逐指标列出;② 被调整那条is_adjusted: true、adjust_type_applied: 'result';③ 未调整那条 false。lines=3;②{"plan_indicator":"1GLVXvVPxDO9xY2G","indicator_name":"客户满意度","score_rate":90,"score":12.5,"is_adjusted":true,"adjust_type_applied":"result"};③ 未调整行 false。T64:分公司核对人员改填报明细实际值被拒绝
kpi_branch_checker、属华东分公司(T45 已证明它能确认本分公司核对任务)。PATCH /api/v1/data/kpi_entry_line/<明细>:{ actual_value: 1 }→ 管理员重读该行。PERMISSION_DENIED;② 实际值与操作前一致。5. 问题记录
POST sys_user_position {position:'kpi_hr_reviewer'};② 以该账号登录;③GET /data/kpi_entry_sheet能读到 25 张;④POST /data/kpi_bonus {sheet:<任一已发布方案的填报单>,...}→ 403;⑤PATCH /data/kpi_entry_sheet/<同一张> {remark:'x'}→ 403。必现(本轮 3 次 3 次出现)[Security] Access denied: insert on 'kpi_bonus' requires edit access to its master record (master 'kpi_entry_sheet' not editable by this user (row-level security))kpi_dept_reporter_set的kpi_bonus.allowCreate仍为 true;本工作项只改业务规则,未动权限集(范围纪律)6. 运行输出(当次真跑原样)
完整原样输出在
docs/05-自测记录.md§6(pnpm verify与pnpm e2e各一段,逐条用例带接口返回摘要)。关键行:Generated by Claude Code
baozhoutao commentedon Sep 2, 2026
Requirement compliance checklist for #10 — same content as
docs/04-需求符合度清单.mdon branchissue-10-align-confirmed-design(commit92721a6). Three states only, no "basically implemented"; every non-✅ row carries its exit. Two rows are not ✅ and their exits are linked at the bottom.需求符合度清单(对照《设计方案》V1.0,客户 2026-09-02 确认第 10 章 17 项)
一、核心业务流程(需求 §3 / 设计第 4 章)
kpi_plan+ 五张主从明细,内联网格录入(设计 5.2);T1、T2PlanPublishHook逐条列出问题;T3src/lib/scoring.ts+ 单元测试 14 条;逆向完成率(第 4 项)、个人得分合成(第 5 项)、四种计分方式(第 12 项);aggregate.ts顶部注释已改引设计第 8 章表 6;T8、T9、T11、T37二、范围功能(需求 §1.3 / 设计第 5 章)
kpi_indicator+ 阶梯区间;历史跟踪;版本与替代版本PlanCloneHook(T35);同周期唯一生效版本见 #26kpi_plan_step数据化节点;两节点流程(T36)requiredBonusPosition;反例 T58、T59)kpi_review_record只增不改(T33、T34)+ 平台审计日志kpi_entry_line.is_adjusted/adjust_type_applied(只读,调整批准落地时由 hook 以系统上下文写入,源数据与结果调整都标);列入明细列表视图与填报单内嵌网格;结果计算明细 JSON 每条指标带is_adjusted;T62、T63period_type + year + period_no是否已有「已发布」方案,已关闭 / 已归档不阻断;拒绝文案点名生效版本;T61 + 单元测试 3 条三、角色与安全(需求 §2 / 设计第 9 章)
sys_user_position查询);加减分岗位分离已落地(T58、T59)四、非功能(需求 §4)
scoring.ts、汇总只在aggregate.ts(依据设计第 8 章表 6);明细冻结口径副本;快照不可变五、统计
Generated by Claude Code
baozhoutao commentedon Sep 2, 2026
Dispatcher decisions on the three items raised in the developer's report (PR #12 @ 92721a6):
kpi_hr_reviewerandkpi_hr_headedit on that plan's entry sheets (child bonus rows follow) and on its adjustments; same naming/condition/reconcile/close-to-read-only mechanics as the existing three rule kinds. This is in scope of design item 6 ("HR reviewer proposes, HR head approves") — the feature is not usable by those positions without it. The T39 rule-count assertion is updated accordingly.Also folded in:
kpi_dept_reporter_setno longer declares create onkpi_bonus(declaration now matches the rule).Required re-verification with real position accounts (not admin): HR reviewer registers a bonus and is refused approval; HR head approves and the sheet total is rescored; HR reviewer advances the HR review node; a closed plan drops HR to read-only. Returned to the developer on the same branch.
Generated by Claude Code
feat(kpi): grant the HR positions record-level write scope on their o…
docs: second round — HR positions verified with their own accounts
baozhoutao commentedon Sep 2, 2026
Review round 1 — self-test report update for #10. Same content as
docs/05-自测记录.mdon branchissue-10-align-confirmed-design(commita92c9d9; tested code commit98cf887). Supersedes the earlier report comment: the verdict changes to a pass, and problem records 1 and 2 are closed as fixed-and-retested. Report body in the project's delivery language; §6 verbatim output stays in the file.第 1 页:结论
结论:✅ 通过
共 72 条用例:通过 72。静态门禁 3/3 绿(validate / typecheck / vitest 67 条)。
工作项 #10 的七条验收标准全部达成 —— 其中验收标准 1、2(以人力审核账号登记、以人力负责人账号批准)在第一轮受数据范围所限无法演示,第二轮按调度员 2026-09-02 的裁定(选项 A)补上人力岗位共享规则后,由真实岗位账号取证通过(T65、T66、T67)。
关键观察(接口级,替代截图)
share=true register=201,加减分落库状态「待审批」{"error":"审批加减分失败:只有人力负责人岗位可以审批加减分。请转交人力负责人处理。","code":"VALIDATION_ERROR","declaredCode":"KPI_BONUS_APPROVE_POSITION","object":"kpi_bonus"}approved_by= 该账号本人,填报单最终得分before=103 after=105reject=200→draft approve=200→approvedread,该账号读填报单 200、写加减分 4032. 测试环境(变化部分)
98cf887450737d4375dd6eacfacae140c3afb1d4(第二轮代码提交;第一轮为79437b2)。三级核对:① LISTEN 端口含 3110、无 3100 / 3111;② 占 3110 的进程 pid 5428,cwd =/home/user/kpi-issue-10;③ worktree HEAD = 98cf887 且工作树干净OS_PORT=3110 OS_DATABASE_URL=file:./.objectstack/issue-10.db pnpm dev。改元数据 / 服务后必须先rm -rf dist再重启,否则 dev 会沿用上一次的构建产物(问题记录 #3)sys_user_position),本轮的岗位验证一律用它们,不用管理员3. 总表(新增部分)
四类齐全:主流程 38、边界 3、异常 14、权限 17(合计 72),全部 ✅ 通过。第二轮新增 6 条:
第一轮用例 T58 的判定同步更新:部门填报人员登记加减分现在被权限集挡下(该权限集不再声明加减分新建权限),业务规则本身的文案由单元测试
requiredBonusPosition取证。4. 逐用例明细(第二轮新增)
T65:人力审核账号登记加减分成功
kpi_hr_reviewer,不属于任何考核主体单元、也不是分管领导。sys_record_share,等岗位共享规则求值出该账号对该填报单的edit行;② 以该账号POST /api/v1/data/kpi_bonus(加分 2);③ 重读该加减分。share=true;② 登记成功 / HTTP 201;③ 状态「待审批」/status=draft。T66:人力审核账号批准自己登记的加减分被拒绝
PATCH /api/v1/data/kpi_bonus/<id>:{ status: 'approved' }。declaredCode=KPI_BONUS_APPROVE_POSITION。T67:人力负责人账号批准加减分成功,最终得分随之重算
PATCH { status: 'approved' }→ 管理员重读填报单与加减分。approved_by相符;③ 加减分合计 +2 /bonus_total=2;④ 最终得分 103 → 105 /before=103 after=105。T68:人力负责人账号登记加减分被拒绝
POST /api/v1/data/kpi_bonus(同一张填报单)。kpi_hr_head_set不声明新建权限)—— 与「登记 = 人力审核」一致,拒绝早于业务规则。T69:人力审核账号在人力审核节点驳回与审核通过
kpi_hr_reviewer。{ pending_action: 'reject', action_reason: '数据口径请复核' };② 管理员重新提交;③ 该账号{ pending_action: 'approve' }。reject=200 → draft,last_reject_reason相符;② 审核通过、两节点流程下直接「已通过」/approve=200 → approved。T70:方案关闭后人力岗位对该方案填报单降为只读
read;② 该账号GET填报单;③ 该账号POST加减分。read/ 相符;② 读得到 / 200;③ 写被拒 / 403。5. 问题记录(处置更新)
position),授予本方案全部填报单与数据调整edit;加减分作为主从子记录随之可写98cf887,证据 T65~T70kpi_dept_reporter_set.kpi_bonus.allowCreate = trueallowCreate: false;kpi_hr_head_set保持不可新建98cf887,证据 T58、T68objectstack dev沿用了dist/里上一轮的构建产物,新源码没进运行实例;grep _pos_ dist/*.mjs= 0 命中rm -rf dist(项目 CLAUDE.md D3),重启后确认新产物含新代码再开测dist/后同一份脚本 72/72 通过6. 运行输出
完整原样输出在
docs/05-自测记录.md§6。关键行:需求符合度清单同步更新:#17「六类角色职责」由⚠️ 改 ✅,统计行改为 ✅ 26、⚠️ 1(#23 未压测)、❌ 0 —— 全文见
docs/04-需求符合度清单.md(commita92c9d9)。Generated by Claude Code
baozhoutao commentedon Sep 2, 2026
Dispatcher collection check for PR #12 (head a92c9d9, base now fbf64da): passed.
src/,test/,scripts/,docs/04,docs/05); none ofdocs/00–03, README, CLAUDE.md,.github; no binaries.git merge-tree --write-tree origin/main HEADagainst the advanced main: clean.pnpm verifyre-run by the dispatcher: validation passed (17 objects, 184 fields, 6 positions, 6 permission sets), typecheck clean, 67/67 unit tests.Next: independent review gate, then merge.
Generated by Claude Code
baozhoutao commentedon Sep 2, 2026
Review gate (independent reviewer, PR #12 @ a92c9d9): NOT MERGEABLE — 0 blocking, 1 should-fix, 8 notes. Returned to the developer on the same branch.
Should-fix: the explicit
inlineColumnsadded to the entry-sheet inline grid (src/objects/entry.object.ts) replaces the platform-derived column set, silently dropping six existing columns (plan_indicator— required —,indicator,direction,scoring_method,calc_trace,last_adjustment). Fix: list them back, folding the verbose ones withdefaultHidden: true.Folded in (small, same files): organization filter on the "one live plan per period" lookup so other tenants' plans cannot collide; JSDoc placement in the sharing service.
Recorded, not acted on: publish race window between two drafts (no platform unique constraint available); bonus register-position message no longer reachable by a real account after the permission-set tightening (permission set refuses first); personal-item score stays rate-based while flagged adjusted (matches design table 6); HR edit on sheets extends to lines only while the sheet is still in draft.
Degradation reconciliation: all 27 checklist rows verified against code; the single⚠️ (#23 load test) has a legitimate exit.
Generated by Claude Code
fix(kpi): keep the whole derived column set in the entry-sheet inline…
docs: record the inline-grid column regression and its fix
baozhoutao commentedon Sep 2, 2026
Review round 2 — gate findings fixed on branch
issue-10-align-confirmed-design(code commit6ba334f, docs commit783fa80). PR #12 stays draft, status label unchanged. Report body in the project's delivery language; full report and verbatim output live indocs/05-自测记录.md.结论:✅ 通过 — 72 条 e2e 用例全部通过,静态门禁 3/3 绿(validate / typecheck / vitest 68 条)。
本轮改动
kpi_entry_line除主从字段外的全部字段),顺序沿用字段定义顺序、新增的「已调整 / 调整类型」排最后;计算说明、最近调整、指标三列用平台原生defaultHidden折叠而非删除dist/objectstack.json:19 列、3 列默认隐藏;pnpm validate绿organization_id等值条件(组织从落库的方案行上取,不从ctx.previous取);纯函数findPublishedConflict同步比较租户,两边都有组织才比,缺组织时退回只按周期判定(缺字段不得变成静默放行)planSharingIntents的 JSDoc,常量移到 JSDoc 之上,注释与函数签名之间不再有代码未动的 🔵(并发发布窗口、承接项得分与「已调整」标记的关系)按指示只记录、不改。
问题记录(新增 #4,已闭环)
inlineColumns会整体替换平台从子对象派生的列集,而新列表只写了 13 列defaultHidden折叠6ba334f,构建产物核对 19 列(3 列默认隐藏),pnpm validate绿、e2e 72/72问题记录 #1(人力岗位写范围)、#2(部门填报人员权限声明)仍为「已修复并重测(
98cf887)」;#3(dev 沿用旧dist/构建产物)已解决,本轮开测前照此先rm -rf dist并核对新产物含本轮代码。原样命令输出
被测版本⚠️ 1(#23 未压测)/ ❌ 0。
6ba334fab01a02da5ce60cb6e556ae718fa1eea8;开测前三级核对:LISTEN 端口含 3110 且无 3100 / 3111 · 占用进程 pid 7077 的 cwd 为任务 worktree · worktree HEAD = 被测提交且工作树干净。需求符合度清单 #25 已注明网格列为显式声明且派生列一列未少;统计行仍为 ✅ 26 /Generated by Claude Code
baozhoutao commentedon Sep 2, 2026
Review gate round 2 (PR #12 @ 783fa80): the inline-grid column set and the JSDoc placement are closed. One new should-fix was introduced by the tenant-filter change: the "one live plan per period" lookup filters
organization_idby equality in the query, which excludes published plans whose organization is empty (seeded/imported rows, e.g. the demo plan published in T4) before the fail-closed tenant check can see them. Dispatcher decision: one more targeted commit on the same branch (drop the query-side organization filter, keep the function-side check, add a case proving an organization-less published plan still blocks), then a focused re-check — not an escalation, since the fix is deterministic and two lines.Generated by Claude Code
fix(kpi): let a published plan with no organization still block its p…
docs: record the tenant-filter blind spot and its ablation evidence
baozhoutao commentedon Sep 2, 2026
Review round 3 — 🟡-2 fixed on branch
issue-10-align-confirmed-design(code commit69a33c6, docs commit0252185). PR #12 stays draft, status label unchanged. Report body in the project's delivery language; full report and verbatim output live indocs/05-自测记录.md.结论:✅ 通过 — 73 条 e2e 用例全部通过(新增 T71),静态门禁 3/3 绿(validate / typecheck / vitest 68 条)。
本轮改动
where.organization_id,候选只按status: 'published'取;租户判定完全留在纯函数sameTenant(两边都有组织才比,任一边缺失退回只按周期判定)为什么是漏判:等值条件不匹配 NULL,而种子 / 导入写进来的方案行组织就是空的(docs/05 里 T4 发布的种子方案
organization_id: null),于是这类已发布方案在进入判定之前就被查询滤掉,sameTenant()的兜底永远轮不到它 —— 同周期唯一性变成「看数据从哪来」。第三轮之前没有这个问题。反向验证(消融),T71 不是一条恒绿的断言
where.organization_id过滤加回去 → 证明改动落盘(注入命中 3、原文本命中 0、blob 哈希变化)→rm -rf dist重建 → 确认变异进入构建产物(命中 3)→ 重跑 e2edup=200(重复发布成功);T61(两条方案都有组织)保持绿;汇总{"passed":72,"failed":1}git checkout HEAD -- src/hooks/plan.hook.ts→git diff HEAD空、blob 哈希 =HEAD:版本(dae1c9f8…)→rm -rf dist重建 → 确认变异标记从产物消失(命中 0)→ 重跑{"passed":73,"failed":0}方向与评审判断完全吻合:只在「候选组织为空」这一条数据路径上失效,带组织的用例照常拦截。
问题记录(新增 #5,已闭环)
69a33c6,证据 T71 + 上表消融对照#1、#2(
98cf887)、#4(6ba334f)仍为「已修复并重测」;#3(dev 沿用旧dist/)已解决,本轮开测前照例先rm -rf dist重建。本轮新增一条经验并写进报告环境章节:打包器会剥离注释,所以「grep 注释串」不是有效的新鲜度探针 —— 只有行为(消融对照)才是。原样命令输出
被测版本⚠️ 1(#23 未压测)/ ❌ 0。
69a33c6f1bafc57254862d89b8b355235edc78ce;三级核对:LISTEN 端口含 3110 且无 3100 / 3111 · 监听进程 cwd 为任务 worktree · HEAD = 被测提交、工作树干净且被改文件 blob 与HEAD:一致。需求符合度清单 #26 已注明「候选只按状态取、租户判定在纯函数里做」并引用 T71;统计行仍 ✅ 26 /Generated by Claude Code
Merge pull request #12: align code with confirmed design V1.0 (bonus …
baozhoutao commentedon Sep 2, 2026
Merged PR #12 into main as 50ab3ac (collection check passed at every round; review gate MERGEABLE at 0252185; CI verify green). Status → PM验收中; handed to the work-item creator for acceptance. Evidence for this item is REST-level (declared in docs/05); UI walkthrough and screenshots remain for the pm-test round. Reviewer notes left open for later items: concurrent-publish window on the period check, personal-item score vs. the adjusted marker, and the demo fixture in
src/data/align-demo-units.tsto be removed once objectstack-ai/objectstack#14547 lands.Generated by Claude Code