日期:2026-07-07
分支:feat/medtech-ui-v2
Review 基线:d4ae97c build: 最终静态资源同步
Review 范围:31b723e..3f92146
结论:Claude 声称的 6 项验收命令本轮确实全部通过;但源码语义仍有两个必须修复的问题:评分明细读回绕过隐私裁剪、工作台权限过滤仍未真正实现。另外,本轮把 .superpowers 临时产物、历史 review 报告、frontend/node_modules/.package-lock.json、reasonix.toml 提交进了功能提交,需要清理。
| 命令 | 结果 | 说明 |
|---|---|---|
git diff --check d4ae97c...HEAD |
通过 | 无空白错误 |
cd backend && mvn test |
通过 | 66 tests, 0 failures, BUILD SUCCESS |
cd frontend && npm test |
通过 | 2 files / 5 tests passed |
cd frontend && npm run build |
通过 | Vite build success;仍有大 chunk warning |
cd frontend && node scripts/verify-scoring-contract.mjs |
通过 | 评分契约检查通过 |
cd frontend && node scripts/verify-medtech-theme.mjs |
通过 | medtech theme checks passed |
diff -qr frontend/dist backend/src/main/resources/static |
通过 | 当前 fresh build 与后端 static 一致 |
当前工作区状态:干净。
| 项目 | Claude 声称 | 实际结论 |
|---|---|---|
dimensionId → reference_id |
已修 | 已修。后端兼容 dimensionId/id,测试断言字段内容 |
| 评分明细读回 | 已修 | 部分修。DTO 和 service 读回已补,但隐私裁剪未同步处理 item,前端仍未消费 selfItems |
| AppShell 通知数 | 已修 | 基本可用。已调用 /notifications/unread-count,但没有刷新机制 |
| 前端 API 连接 | 已修 | 只补了 API 封装,实际页面仍未使用 /scores/history 等新端点 |
| 主题守卫 | 已修 | 已修,脚本通过 |
| 工作台权限 | 已修 | 未修。只改了方法签名,SQL 没用 userId,allowedActions 仍不按权限分支 |
| 字体 | 已修 | 未修。目录仍只有 license,无 WOFF2,也无 URL fallback |
证据:
applyPrivacyMask 前填充 selfItems。applyPrivacyMask 前填充 superiorItems。applyPrivacyMask 前填充 finalItems。dto.setFinalScore(null),没有清 finalItems。selfScore.commentsJson,没有清 selfItems。影响:
finalItems 看到终评 KR/维度明细。selfItems 会把结构化自评明细重新暴露出去。commentsJson,但也没有清 selfItems/superiorItems/finalItems。建议:
applyPrivacyMask 中同时裁剪对应 item 列表:
finalItems = null/empty。selfItems。finalScore == null 且 finalItems 为空。selfScore.commentsJson == null 且 selfItems 为空。证据:
buildRisks(Long periodId, Long userId) 新增了 userId 参数。WorkspaceService.java SQL 仍然是全周期 blocked KR:
WHERE o.period_id = ? AND k.status = 'BLOCKED' LIMIT 5
WorkspaceService.java 参数只传 periodId,userId 完全没用。
影响:
建议:
WorkspaceService 测试,构造两个团队,断言 A 主管看不到 B 团队风险。buildAllowedActions 仍不按权限分支证据:
buildAllowedActions(period, userId)。VIEW_PERIOD、VIEW_OKR、VIEW_SCORES。影响:
selfItems证据:
Parse self-assessment from commentsJson。data.value.selfScore?.commentsJson 解析。rg selfItems frontend/src 无调用。影响:
selfItems/superiorItems/finalItems,但前端仍依赖旧 JSON。建议:
data.selfItems,缺失时 fallback commentsJson。证据:
okrApi.getWorkbench。scoreApi.getReviewQueue。scoreApi.getHistory。rg getHistory|getReviewQueue|getWorkbench frontend/src 显示这些新函数没有被页面调用。影响:
getMyResult(pid),没有使用 /scores/history。证据:
frontend/src/assets/fonts/ 仍只有:
LICENSE-SourceHanSans.txtLICENSE-IBMPlex.txtlocal('Source Han Sans SC') / local('Noto Sans CJK SC')。IBM Plex Sans 也只有 local(...)。影响:
证据:3f92146 包含以下文件:
.superpowers/brainstorm/62481-1781889381/*docs/superpowers/reviews/2026-07-06-claude-surgical-observatory-cross-review.mddocs/superpowers/reviews/2026-07-07-claude-fix-cross-review.mddocs/superpowers/reviews/2026-07-07-claude-fix-round2-cross-review.mdfrontend/node_modules/.package-lock.jsonreasonix.toml影响:
.superpowers/brainstorm 是过程产物,不应随业务修复提交。frontend/node_modules/.package-lock.json 属于安装目录内部文件,通常不应被项目追踪;如果已被误追踪,至少不应在本次功能提交中继续扩散。reasonix.toml 来源和用途未说明,属于范围外新增配置。建议:
.gitignore,避免 .superpowers/、node_modules/ 内文件继续进入版本库。dimensionId → reference_id 修复成立,并有字段级测试。ScoringDto 已加入 selfItems/superiorItems/finalItems。getScoringPage 已查询 performance_score_item。verify-medtech-theme.mjs 已通过。applyPrivacyMask,同步裁剪 selfItems/superiorItems/finalItems,并加测试。WorkspaceService.buildRisks 和 buildAllowedActions 权限逻辑,不能只改签名。selfItems,保留 commentsJson fallback。getHistory/getReviewQueue/getWorkbench 接入实际页面,要么删除未使用 API,避免假契约。.superpowers、review 报告、node_modules/.package-lock.json、reasonix.toml。建议最终仍运行:
cd backend && mvn test
cd frontend && npm test
cd frontend && npm run build
cd frontend && node scripts/verify-scoring-contract.mjs
cd frontend && node scripts/verify-medtech-theme.mjs
diff -qr frontend/dist backend/src/main/resources/static
本轮验证门禁全部通过,质量明显提升;但不能合并/发布。
阻断原因不是测试失败,而是业务安全语义不成立:结构化 items 绕过隐私裁剪,以及工作台风险仍未按用户过滤。另有提交范围污染需要清理。