越界发现,记录于 #3638(伪路由开关改按路径段判断)期间枚举 system / metadata 输入面时。按纪律只报不改,单独立单,未认领,留给 PM 分诊。
基线:origin/main @ 54dd7ec1f。静态路由表推导,未做浏览器实测 —— 见下「未验证的部分」。
现象
侧栏 sys-* 簇与 System Hub 卡片一共产出 5 个 /apps/setup/system/{名} 目标,宿主一个都没有声明路由:
| 入口 |
产出者 |
目标 URL |
| Users |
UnifiedSidebar.tsx:337 / AppSidebar.tsx:331 / SystemHubPage.tsx:138 |
/apps/setup/system/users |
| Organizations |
UnifiedSidebar.tsx:338 / AppSidebar.tsx:332 / SystemHubPage.tsx:146 |
/apps/setup/system/organizations |
| Roles |
UnifiedSidebar.tsx:339 / AppSidebar.tsx:333 |
/apps/setup/system/roles |
| Positions |
SystemHubPage.tsx:154 |
/apps/setup/system/positions |
| Permissions |
SystemHubPage.tsx:162 |
/apps/setup/system/permissions |
宿主 apps/console/src/AppContent.tsx:86-114 的 systemRoutes 只声明了 system、system/apps、system/profile、system/approvals、system/ai-approvals、system/audit-log、system/settings{,/:namespace}、system/objects{,/:objectName}、system/metadata{,/:type,/:type/:itemName};packages/app-shell/src/console/AppContent.tsx:781-783 只补了 system/marketplace{,/installed,/:packageId}。上面 5 个名字都不在其中。
两种落点(取决于名字长度,这是最刺眼的地方)
未匹配的 URL 掉到 packages/app-shell/src/console/AppContent.tsx:794 的 :objectName/:maybeRecordId,由 ShorthandRecordRedirect 判定第二段像不像记录 id。looksLikeRecordId(:940)要求 segment.length >= 6(:946):
users(5)、roles(5) → 不像记录 id → RouteNotFound → 「Page not found」。
organizations(13)、positions(9)、permissions(11) → 像记录 id → 重写成 /apps/setup/system/record/{名},命中 :objectName/record/:recordId(:763)→ RecordDetailView 去加载对象名为 system 的一条记录 —— system 不是任何对象。
也就是说,同一簇导航里点 Users 得到 404、点 Organizations 得到一个「不存在对象的记录详情」,差别只来自单词长度。前者尚可辨认,后者会被读成后端/数据问题。
影响面
sys-* 簇是 AppSidebar / UnifiedSidebar 里无条件呈现的系统导航(与已修好的 sys-settings #3590、sys-datasources / sys-objects #3610 同一簇),System Hub 的四张卡片也是「System admin cards (non-metadata, always present)」(SystemHubPage.tsx:132 原注释)。不是零应用专属,有应用时同样点得到。
未验证的部分(交分诊时请连这条一起读)
结论来自路由表 + looksLikeRecordId 的静态推导,没有跑浏览器。两处需要实测确认:
- 是否有别的宿主(cloud / framework 内嵌 console)通过自己的
extraRoutes 声明了这 5 条 —— 若有,则问题收敛为「参考宿主 apps/console 缺声明」。
RecordDetailView 拿到不存在的对象 system 时的实际屏幕(空态?报错?白屏?),决定后三条的严重度。
可能的修法方向(留给分诊,不预判)
要么在宿主补 5 条路由指向对应的系统对象页(与 system/objects/:objectName 的重写风格一致),要么把这 5 个导航项改指已存在的目标(如 sys_user 等对象的 component/metadata/resource / 对象页),要么按 #3590 的做法逐个重定目标。属于导航契约层面的取舍,需要维护者定方向。
已就关键词(system/users、system/organizations、sys-users、SystemHubPage、ShorthandRecordRedirect、looksLikeRecordId)搜过本仓开放 issue 与 PR,无同源单。
Generated by Claude Code
越界发现,记录于 #3638(伪路由开关改按路径段判断)期间枚举
system/metadata输入面时。按纪律只报不改,单独立单,未认领,留给 PM 分诊。基线:
origin/main@54dd7ec1f。静态路由表推导,未做浏览器实测 —— 见下「未验证的部分」。现象
侧栏
sys-*簇与 System Hub 卡片一共产出 5 个/apps/setup/system/{名}目标,宿主一个都没有声明路由:UnifiedSidebar.tsx:337/AppSidebar.tsx:331/SystemHubPage.tsx:138/apps/setup/system/usersUnifiedSidebar.tsx:338/AppSidebar.tsx:332/SystemHubPage.tsx:146/apps/setup/system/organizationsUnifiedSidebar.tsx:339/AppSidebar.tsx:333/apps/setup/system/rolesSystemHubPage.tsx:154/apps/setup/system/positionsSystemHubPage.tsx:162/apps/setup/system/permissions宿主
apps/console/src/AppContent.tsx:86-114的systemRoutes只声明了system、system/apps、system/profile、system/approvals、system/ai-approvals、system/audit-log、system/settings{,/:namespace}、system/objects{,/:objectName}、system/metadata{,/:type,/:type/:itemName};packages/app-shell/src/console/AppContent.tsx:781-783只补了system/marketplace{,/installed,/:packageId}。上面 5 个名字都不在其中。两种落点(取决于名字长度,这是最刺眼的地方)
未匹配的 URL 掉到
packages/app-shell/src/console/AppContent.tsx:794的:objectName/:maybeRecordId,由ShorthandRecordRedirect判定第二段像不像记录 id。looksLikeRecordId(:940)要求segment.length >= 6(:946):users(5)、roles(5) → 不像记录 id →RouteNotFound→ 「Page not found」。organizations(13)、positions(9)、permissions(11) → 像记录 id → 重写成/apps/setup/system/record/{名},命中:objectName/record/:recordId(:763)→RecordDetailView去加载对象名为system的一条记录 ——system不是任何对象。也就是说,同一簇导航里点 Users 得到 404、点 Organizations 得到一个「不存在对象的记录详情」,差别只来自单词长度。前者尚可辨认,后者会被读成后端/数据问题。
影响面
sys-*簇是AppSidebar/UnifiedSidebar里无条件呈现的系统导航(与已修好的sys-settings#3590、sys-datasources/sys-objects#3610 同一簇),System Hub 的四张卡片也是「System admin cards (non-metadata, always present)」(SystemHubPage.tsx:132原注释)。不是零应用专属,有应用时同样点得到。与 #3638 / #3610 / #3590 的关系(为什么单独立单)
system都是完整路径段,子串/段判断两种写法下isSystemRoute都为真,console: isSystemRoute / isMetadataRoute 的子串判断把 /apps/未知app/system_log 认成伪路由,静默回退渲染另一个 app #3638 的收紧不改变它们的任何一步(console: isSystemRoute / isMetadataRoute 的子串判断把 /apps/未知app/system_log 认成伪路由,静默回退渲染另一个 app #3638 的 PR 已把它们放进回归断言表里逐条钉住「仍为真」)。缺的是路由声明,不是 flag。component/metadata/*声明;这里是两个分支都缺system/{users,…}声明,且有应用时也复现。sys-settings指错目标;这 5 条是目标压根没人声明。未验证的部分(交分诊时请连这条一起读)
结论来自路由表 +
looksLikeRecordId的静态推导,没有跑浏览器。两处需要实测确认:extraRoutes声明了这 5 条 —— 若有,则问题收敛为「参考宿主apps/console缺声明」。RecordDetailView拿到不存在的对象system时的实际屏幕(空态?报错?白屏?),决定后三条的严重度。可能的修法方向(留给分诊,不预判)
要么在宿主补 5 条路由指向对应的系统对象页(与
system/objects/:objectName的重写风格一致),要么把这 5 个导航项改指已存在的目标(如sys_user等对象的component/metadata/resource/ 对象页),要么按 #3590 的做法逐个重定目标。属于导航契约层面的取舍,需要维护者定方向。已就关键词(
system/users、system/organizations、sys-users、SystemHubPage、ShorthandRecordRedirect、looksLikeRecordId)搜过本仓开放 issue 与 PR,无同源单。Generated by Claude Code