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

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions