Skip to content

AppContextSelectorSchema.persist 的三个取值消费侧只兑现了一部分:'none' 照样写两处、'session''query' 无差别 —— enforce-or-remove 待裁(objectui#3500 拆出) #5994

Description

@claude

分诊座位按跨座位转移协议自 objectui#3500 拆出(contract-first:spec 面先行)。⛔ 未指派。

Part of objectstack-ai/objectui#3500

事实(消费方实测,objectui origin/main)

packages/spec/src/ui/app.zod.tsAppContextSelectorSchema 声明 persist?: 'query' | 'session' | 'none'(默认 'query')。唯一消费方 objectui packages/app-shell/src/layout/ContextSelectors.tsx 对三个取值的实际区分是:

  • :162if (sel.persist === 'none') continue; 只跳过「从 sessionStorage 重新施加」那一个 effect;
  • setValue 无论取值如何,同时sessionStorage(objectui-ctx-${appName}-${sel.id})与 URL query 参数。

净结果:'none' 并没有「不持久化」(它照样写两处),'session''query' 之间没有任何行为差别。三值枚举里只有一值有部分效果。

为什么转到 spec 座位

这是 ADR-0049「声明了就得兑现」的 declared-but-unenforced 形状,两条出路的归属不同:

  • enforce:objectui 按声明兑现三个取值('none' 两处都不写、'session' 只写 sessionStorage、'query' 只写 URL);spec 侧不变,单纯是消费侧补齐 —— 这一半可留在 objectui。
  • remove:按 enforce-or-remove 把 persistAppContextSelectorSchema 收掉 —— 移除一个已发布的可作者化键,属 packages/spec 单一所有者面,并牵动 ADR-0087 登记与生成物基线(spec-property-retirement playbook)。

选哪条是维护者的裁决(是否真有作者需要「不持久化 / 只在会话内持久化」的作用域选择器),故本单进决策箱而非直接入队。

PM 倾向(供裁决,不构成裁决)

倾向 enforce:三个取值的语义直白、消费侧改动小(一个函数内的三分支),且「作用域选择器要不要进 URL」对可分享链接是真实的作者诉求。若维护者判定无人需要,则走 remove,由 spec 座位按退役流程做,objectui 侧同批删消费代码。

前置依赖

objectui#3500 的第一半(URL 作用域键硬编码为 'package'、按 sel.id 派生 + Studio ?package= 迁移)与本单同文件(ContextSelectors.tsx),已在 objectui 队列。裁决落地时须与它串行,先后顺序由两边座位按落地时点定。

参考


Generated by Claude Code

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions