fix(console): System Hub 的 Organizations 计数改查框架真名 sys_organization,Permissions 半只钉不修 (#3670) - #3680
Merged
Merged
Conversation
…3670) `sys_org` 在框架里不存在。缺失对象不是响亮的失败:后端答 404 OBJECT_NOT_FOUND,而 ObjectStackAdapter.find() 有意把它吸收成 { data: [], total: 0 }(资源记进 missingResources 后续短路),于是卡片 渲染出一个与「确实没有」不可分的 `0` —— 而单组织部署里 sys_organization 至少有一行。每个 find 上的 .catch 从来没看到过这个 404,它只覆盖非 404 的 reject。 另外三个计数对象名(sys_user / sys_position / sys_audit_log)已逐个 核对框架对象注册表,拼写正确,未改。 Permissions 卡片刻意不修,仍读 0:它查的 sys_permission 框架同样没有, 而框架把该面拆成 sys_capability(血缘)与 sys_permission_set(功能), 任选其一都会把卡片静默绑到维护者没有选过的面上 —— 该裁决开在 #3655。 这个缺口由测试里的 MEASUREMENT 用例钉住,而不是悄悄改指。 .catch 对非 404 失败(500/401/403/断网)同样折叠成 0,只测量记录, 已另立 #3679。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
Contributor
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
yinlianghui
marked this pull request as ready for review
August 7, 2026 20:23
This was referenced Aug 7, 2026
Closed
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes-part-of #3670(Organizations 半已交付;Permissions 半按有界授权停手,等维护者在 #3655 裁决 A/B/C 后另行落地 —— 详见下文「为什么 Permissions 留着不动」)
先复核:issue 的症状成立,机制归因需订正
issue 说「
.catch吞掉 404,所以计数落成 0」。症状完全成立,机制不是这样 —— 这条不是措辞挑剔,它决定了本 PR 该改哪一行、不该改哪一行:404+code: 'OBJECT_NOT_FOUND',而ObjectStackAdapter.find()自己先吃掉了它:packages/data-objectstack/src/index.ts里is404Error(err)命中后把资源记进missingResources(后续同名调用直接短路)并return { data: [], total: 0 }。这是有意设计,注释原话是 callers treat empty data as "feature unavailable"。.catch;它给的是 resolve 不是 reject。页面拿到一页空数据,data.length得 0,渲染出一个完全正常的徽章。结论不变而且更刺眼:错名的失败是静默的,不是被
.catch掩盖的,靠加错误处理也不会让它变响 —— 唯一的修法就是把名字改对。因此本 PR 只改名字,.catch一个字节没动(那是另一个类,见文末 #3679)。对象名核实表(逐个对框架源码核对,不是猜的)
框架侧 checkout
../objectstack@b4872a868;计数处五个名字全量列出,不只 issue 点名的两个:sys_userpackages/platform-objects/src/identity/sys-user.object.ts:17sys_orgsys_organization,packages/platform-objects/src/identity/sys-organization.object.ts:14sys_organizationsys_positionpackages/plugins/plugin-security/src/objects/sys-position.object.ts:16sys_permission_set)只命中sys-capability.object.ts:20的一句注释,无对象定义sys_audit_logpackages/plugins/plugin-audit/src/objects/sys-audit-log.object.ts:17没有第三个错名。issue 对
sys_user/sys_position正确的判断经核实成立,并把它没点名的sys_audit_log一并核过。Organizations 这一条的现实后果:单组织部署里
sys_organization至少有一行,所以那张卡片显示的0在任何部署上都是错的,而且长得和「还没建组织」一模一样。为什么 Permissions 留着不动
框架把这张卡片叫的东西拆成了两个对象,两边证据都硬(考证出自已合并的 PR #3673,本 PR 未推翻):
sys_capability—— 其 docblock 明写「Namedsys_capability(notsys_permissionas the ADR loosely floats)」,而sys_permission正是这里今天在用的名字。血缘指向它。sys_permission_set—— 权限文档称其为唯一的 capability 容器,是带管理员 CRUD 的授予容器,和卡片描述 "Manage permission rules and assignments" 对得上。功能指向它。任选其一,此后每一个看到这个数字的人都会以为平台确认了这就是「Permissions」——一个维护者没有做过的选择被一次改名静默定型。#3655 已把它挂上
needs-user-decision,三选一是 Asys_permission_set/ Bsys_capability/ C 连同这张 bespoke 卡片一起退场(SystemHubPage自己的 docblock 已标@deprecated)。裁决落地前,这张卡片继续读 0 —— 但这个缺口现在在测试里显式钉住,不再读起来像漏了一行。.catch行为矩阵(只测量,不修)同一个
0背后有三种语义完全不同的事,修前修后都不可分:.catch000第三行是这个
.catch实际覆盖的唯一一类,和 issue 的归因正相反。它没被本 PR 碰,只被测量并另立 #3679。顺带记录:fetchCounts外层那个catch { /* Keep nulls on failure */ }因为每个 promise 自带.catch已不可能被Promise.all触发,那条「保留 null 不显示徽章」的降级路径实际是死的 —— 而它恰好是唯一能把「不知道」和「0」区分开的形态。这一条也写进了 #3679。逆向验证(先预测,后运行)
预测:把对象名回退成
sys_org后,3 红 3 绿。红的应是——(1) Organizations 计数用例(查询发向sys_org,fixture 里没有这个对象,适配器 resolve 空 → 徽章回到0 organizations);(2) 对象名审计用例(调用清单第二项变成sys_org,「框架不认识的名字」从 1 个变 2 个);(3) 非 404 失败的 MEASUREMENT 用例 —— 它顺带断言了邻居卡片仍显示真实计数2 organizations,所以也会跟着红,这条要照实预测而不是假装它无关。绿的应是另外三条:三个正确名字的用例、Permissions 恒 0 的钉子、「空对象与不存在对象徽章相同」的钉子 —— 它们都不经过 Organizations 的计数。实测:
6 passed->3 failed | 3 passed,失败清单与预测逐条吻合,失败现场直接打印出修前的屏幕与调用清单:(把审计用例的等待锚从 Organizations 卡片换到 Users 卡片,就是为了让它红在调用清单的 diff 上,而不是红在别处的徽章上。)
测试
从仓库根跑,重活走共享 flock +
--max-old-space-size=4096+--maxWorkers=2:pnpm exec vitest run --project '@object-ui/console'-> 27 files / 242 tests passedpnpm --workspace-concurrency=2 --filter @object-ui/console type-check-> 通过(新树里先--filter '@object-ui/console^...' build建好依赖)pnpm --workspace-concurrency=2 --filter @object-ui/console lint-> 0 errors(190 warnings 全为既有no-explicit-any,与 PR fix(console): 把已退场的 system/{users,organizations,roles,positions} 四条 URL 声明为重定向,直达框架系统对象 (#3655) #3673 记录的数目一致;本次两个文件零告警)node scripts/check-control-bytes.mjs-> OK;node scripts/check-changeset-no-major.mjs-> OK消费半径清扫:
SystemHubPage只在apps/console内被引用(AppContent.tsx的路由声明 +pages/settings/SettingsHub.tsx),packages/**里对它的五处提及全是注释,无 import;全仓hub-card-*testid 的另一处产出者是DeveloperHubPage,与本文件无关。同目录既有的SystemHubPage.metadataCards.test.tsx(#3660 落的)不断言计数,已跑绿确认不受影响。文件面
apps/console/src/pages/system/SystemHubPage.tsx—— 一行对象名 + 一段说明为什么这里的错名是静默的、以及 Permissions 为什么留着apps/console/src/pages/system/__tests__/SystemHubPage.counts.test.tsx—— 新增(与既有的 metadataCards 测试同目录同形态:真组件 + 真@object-ui/components,只 mockuseAdapter/useIsWorkspaceAdmin)。适配器 stub 按真实契约建模:不存在的对象 resolve 空而不是 reject,所以测试跑在和缺陷同一种静默里.changeset/system-hub-org-count-3670.md—— patch⛔ 未触碰:卡片
href(#3668 刚落)、AppContent、.catch/ 错误处理、框架侧任何对象定义、以及同目录里 #3672 记录的孤儿文件systemObjects.ts(它内嵌的对象定义同样写着sys_org/sys_permission,但全仓零引用,属于那一单)。越界发现(只报不改,已单独立单、未认领)
.catch(() => ({ data: [] }))把 500 / 401 / 403 / 断网都渲染成一个确定的0(404 根本到不了它) #3679 —— 页面这一层的.catch(() => ({ data: [] }))把 500 / 401 / 403 / 断网都渲染成一个确定的0(而 404 根本到不了它);外层那个「保留 null」的降级 catch 实际是死路径。含上面那张行为矩阵与 console: System Hub 的 Organizations / Permissions 卡片计数永远显示 0 —— 查的是框架里不存在的对象sys_org/sys_permission#3670 正文机制归因的订正。🤖 Generated with Claude Code
https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt
Generated by Claude Code