越界发现,记录于 #3609 / PR #3630 (把 /home 的 Administration 组改由 NavigationRenderer 渲染)期间。按纪律只报不改 ,单独立单,未认领 。
观察类(observation-class):今天没有用户会碰到 ,是休眠代码 + 一处不可达兜底。标 finding,不入队,留给 PM 分诊定级。
实测基线:origin/main @ 8d5418e59。
观察
packages/app-shell/src/layout/UnifiedSidebar.tsx:
const activeApp = matchAppBySegment(apps.filter(a => a.active !== false), activeAppName || currentAppName) || activeApps[0];
…
const { applyOrder, handleReorder } = useNavOrder(activeApp?.name || 'home');
useNavOrder(appName) 把顺序存进 objectui-nav-order-${appName}。两点:
|| 'home' 这个兜底不可达(对结果的消费者而言)。 applyOrder/applyPins 的产物只经 processedNavigation 流向 app 分支 的 NavigationRenderer。而 app 分支的渲染条件正是 context === 'app' && activeApp —— activeApp 为空时这条分支根本不渲染。所以凡是用到 排序结果的时刻,activeApp?.name 必然有值,字面量 'home' 永远不会成为存储键。它读起来像「home 上下文有自己的一套排序」,其实没有。
真要用起来,键是错的。 home 上下文里 activeApp 会解析成 activeApps[0] —— 部署里第一个 app,而不是 home。所以一旦有人给 home 分支接上 enablePinning / enableReorder(PR fix(app-shell): /home 的 Administration 组改由 NavigationRenderer 渲染,9 个系统管理入口恢复可达 (#3609) #3630 特意没有 接,理由写在调用点注释里),home 导航就会去吃那个 app 存下的 __root__ 根排序;换个 app 排到第一位,home 侧栏的顺序跟着变。
换句话说:当前是「不可达的兜底」,接通之后是「跨上下文串键」。两种状态都不对,只是前者没有症状。
为什么现在只记录
/home 的导航是内建的固定簇(Home / Documentation + 管理员的 9 项 Administration 组),不是用户可编排的元数据;要不要让它可拖排、可 pin,是独立的产品决定,不属于 #3609 「把组展开」的范围。#3630 因此维持现状并把理由写进注释,避免下一个人以为是遗漏而顺手接上。
可能的方向(留给分诊)
若结论是 home 导航不该 可排序/可 pin:把 useNavOrder(...) 的调用挪进只有 app 分支才求值的位置,删掉误导性的 || 'home',让「app 专属」在代码里显形;
若结论是该 可排序:存储键必须按上下文取(context === 'app' ? activeApp?.name : 'home'),而不是按 activeApp,否则就是上面第 2 条。
关联
已就关键词(useNavOrder / objectui-nav-order / UnifiedSidebar + storage key / sidebar nav order pin)搜过本仓开放 issue 与 PR,无同源单。
Generated by Claude Code
越界发现,记录于 #3609 / PR #3630(把
/home的 Administration 组改由NavigationRenderer渲染)期间。按纪律只报不改,单独立单,未认领。观察类(observation-class):今天没有用户会碰到,是休眠代码 + 一处不可达兜底。标
finding,不入队,留给 PM 分诊定级。实测基线:
origin/main@8d5418e59。观察
packages/app-shell/src/layout/UnifiedSidebar.tsx:useNavOrder(appName)把顺序存进objectui-nav-order-${appName}。两点:|| 'home'这个兜底不可达(对结果的消费者而言)。applyOrder/applyPins的产物只经processedNavigation流向 app 分支的NavigationRenderer。而 app 分支的渲染条件正是context === 'app' && activeApp——activeApp为空时这条分支根本不渲染。所以凡是用到排序结果的时刻,activeApp?.name必然有值,字面量'home'永远不会成为存储键。它读起来像「home 上下文有自己的一套排序」,其实没有。真要用起来,键是错的。 home 上下文里
activeApp会解析成activeApps[0]—— 部署里第一个 app,而不是 home。所以一旦有人给 home 分支接上enablePinning/enableReorder(PR fix(app-shell): /home 的 Administration 组改由 NavigationRenderer 渲染,9 个系统管理入口恢复可达 (#3609) #3630 特意没有接,理由写在调用点注释里),home 导航就会去吃那个 app 存下的__root__根排序;换个 app 排到第一位,home 侧栏的顺序跟着变。换句话说:当前是「不可达的兜底」,接通之后是「跨上下文串键」。两种状态都不对,只是前者没有症状。
为什么现在只记录
/home的导航是内建的固定簇(Home / Documentation + 管理员的 9 项 Administration 组),不是用户可编排的元数据;要不要让它可拖排、可 pin,是独立的产品决定,不属于 #3609「把组展开」的范围。#3630 因此维持现状并把理由写进注释,避免下一个人以为是遗漏而顺手接上。可能的方向(留给分诊)
useNavOrder(...)的调用挪进只有 app 分支才求值的位置,删掉误导性的|| 'home',让「app 专属」在代码里显形;context === 'app' ? activeApp?.name : 'home'),而不是按activeApp,否则就是上面第 2 条。关联
已就关键词(
useNavOrder/objectui-nav-order/ UnifiedSidebar + storage key / sidebar nav order pin)搜过本仓开放 issue 与 PR,无同源单。Generated by Claude Code