You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
requiredPermissions / requiresService on a navigation ITEM are stripped server-side
from the app's top-levelnavigation tree and re-checked in the shell. Items nested
under areas[] are gated in the shell only — the server does not walk areas — so
anything that must never reach the browser belongs in the top-level tree, or in its own app.
这段话是作者写错 area 级键时唯一能读到的处方(strict schema 的 unknown-key 报错正文),
现在它把一个已经关闭的缺口描述成仍然存在。方向上是「过度保守」而非不安全(它劝作者把
敏感项挪到顶层树,这仍然可行),但它是错的,而且是说给作者听的那一份。
// The honest caveat: the server does not walk areas, so an item gate
// INSIDE an area is shell-side only.
expect(msg).toMatch(/shell only|does not walk/is);
从 #4722 的实现中记录的越界发现(未认领)。
现象
#4722 让服务端权威闸门
filterAppForUser走areas[].navigation,area 内导航项的requiredPermissions/requiresService现在由服务端剥离。但packages/spec里两处仍然陈述改前的事实:
packages/spec/src/ui/app.zod.ts:662(AREA_REQUIRED_PERMISSIONS_RETIRED处方正文):这段话是作者写错 area 级键时唯一能读到的处方(strict schema 的 unknown-key 报错正文),
现在它把一个已经关闭的缺口描述成仍然存在。方向上是「过度保守」而非不安全(它劝作者把
敏感项挪到顶层树,这仍然可行),但它是错的,而且是说给作者听的那一份。
packages/spec/src/ui/app.test.ts:1374有一条断言把这个措辞钉死:所以改处方正文必须同时改这条 pin —— 两者是一个耦合改动。
为什么没在 #4722 里顺手改
#4722 的派发约束是
packages/spec/**零改动(单文件例外只开给packages/spec/liveness/app.json的账本 note,已按预案改写)。处方正文是.describe级别的用户可见字符串,改它要连带 pin 与 spec 生成物(
gen:schema/gen:docs)一起动,正是发布窗口里该避开的涟漪。故按 Prime Directive #10 独立记录。
建议的修法(一次改完)
AREA_REQUIRED_PERMISSIONS_RETIRED正文:项级requiredPermissions/requiresService在两棵树(顶层
navigation与areas[].navigation)都由服务端剥离(filterAppForUser 只走 app 顶层 navigation —— areas[] 里的 nav 项权限过滤仅客户端生效(#4651 移除假闸门后剩下的真缺口) #4722);仍然只在客户端求值的是
visible(CEL)与requiresObject—— 必须永不到达浏览器的东西写requiredPermissions,不要写visible。app.test.ts那条断言(改成钉新的正确措辞,别只是删掉)。pnpm --filter @objectstack/spec check:generated,按它报的 stale 项重新生成。AREA_VISIBLE_RETIRED正文:它指向项级visible,那一层依然只在客户端求值,所以那段大概率不用改 —— 确认一下即可。
区分清楚:退役的 area 级键(
areas[].visible/areas[].requiredPermissions)不复活,本单只是把处方里关于 area 内部项级闸门的那句事实改对。
参考:#4722(实现)、#4651(退役裁决)、
packages/spec/liveness/app.json的areas.navigationnote(已在 #4722 里改写,可作为正确措辞的蓝本)。