发现于 #4793 的实施,回传立单。未认领。observation-class:今天没有用户会撞上,因为真正渲染 logo 的是另一条路径(见下),所以打 finding 标、不挂 pm:queue,严重度交 PM 分诊。
事实(基线 d44279598 实测)
packages/layout/src/AppShell.tsx:12-23 声明:
exportinterfaceAppShellBranding{primaryColor?: string;accentColor?: string;favicon?: string;/** Logo URL — passed to sidebar/navbar via context */logo?: string;title?: string;}useAppShellBranding(:122-231)是唯一消费 AppShellBranding 的地方,它实际读的只有 primaryColor / accentColor / favicon / title —— 连 effect 的依赖数组(:230)都写成 [branding?.primaryColor, branding?.accentColor, branding?.favicon, title],logo 不在其中。AppShell 本体(:233-265)也没有任何 context provider,所以注释里那句 「passed to sidebar/navbar via context」在代码里不存在。
且已经有调用方在喂它:apps/console/src/hooks/useBranding.ts:27 明确传了 logo: app.branding.logo 进 useAppShellBranding —— 那个值今天被静默丢弃。
为什么说「今天没人撞上」
侧栏里那个 logo 确实会显示,但它走的是另一条完全独立的路:packages/app-shell/src/layout/AppSidebar.tsx:194 直接从 app schema 读 activeApp?.branding?.logo,不经过 AppShellBranding。所以现象上「logo 正常」,坏掉的只是 AppShellBranding.logo 这个声明面和它的注释 —— 典型的 declared-but-unenforced 漂移。
可选修法(不预设,两条都不是本单要做的)
- 删(ADR-0049 enforce-or-remove 的 remove 侧):
AppShellBranding 去掉 logo,顺带清掉 useBranding.ts:27 那行喂值;真实入口是 app schema 的 branding.logo。 - 兑现:给 AppShell 真加一个 branding context,让
sidebar/navbar 插槽能读到 —— 那是产品增强,得单独判。
无论走哪条,那行注释都必须跟着改:它现在描述的是一个不存在的机制,比缺注释更坏。
参考
Generated by Claude Code
发现于 #4793 的实施,回传立单。未认领。observation-class:今天没有用户会撞上,因为真正渲染 logo 的是另一条路径(见下),所以打
finding标、不挂pm:queue,严重度交 PM 分诊。事实(基线
d44279598实测)packages/layout/src/AppShell.tsx:12-23声明:useAppShellBranding(:122-231)是唯一消费AppShellBranding的地方,它实际读的只有primaryColor/accentColor/favicon/title—— 连 effect 的依赖数组(:230)都写成[branding?.primaryColor, branding?.accentColor, branding?.favicon, title],logo不在其中。AppShell本体(:233-265)也没有任何 context provider,所以注释里那句 「passed to sidebar/navbar via context」在代码里不存在。且已经有调用方在喂它:
apps/console/src/hooks/useBranding.ts:27明确传了logo: app.branding.logo进useAppShellBranding—— 那个值今天被静默丢弃。为什么说「今天没人撞上」
侧栏里那个 logo 确实会显示,但它走的是另一条完全独立的路:
packages/app-shell/src/layout/AppSidebar.tsx:194直接从 app schema 读activeApp?.branding?.logo,不经过AppShellBranding。所以现象上「logo 正常」,坏掉的只是AppShellBranding.logo这个声明面和它的注释 —— 典型的 declared-but-unenforced 漂移。可选修法(不预设,两条都不是本单要做的)
AppShellBranding去掉logo,顺带清掉useBranding.ts:27那行喂值;真实入口是 app schema 的branding.logo。sidebar/navbar插槽能读到 —— 那是产品增强,得单独判。无论走哪条,那行注释都必须跟着改:它现在描述的是一个不存在的机制,比缺注释更坏。
参考
packages/layout/src/AppShell.tsx:12-23(声明)、:122-231(唯一消费方)、:230(依赖数组)、:233-265(无 provider)apps/console/src/hooks/useBranding.ts:27(喂值的调用方)packages/app-shell/src/layout/AppSidebar.tsx:194(真正渲染 logo 的那条路)branding、rightRail/ADR-0057 P3a),读者从文档看不到它们存在 #4808 / packages/layout/README.md 的 AppShell 示例传了一个headerprop,而AppShellProps没有它 —— 照抄示例头部区永不渲染 #4817(同族的 AppShell 声明面漂移)Generated by Claude Code