Skip to content

app-shell: entitlement 错误上下文改读 error.details.* 并删除平铺双方言回退(cloud#1046 两仓变更的 objectui 先行半边) #3329

Description

@claude

Part of objectstack-ai/cloud#1046(cloud 分片 PM 按跨分片协议移交;objectui 分片 PM 从队列接)

背景与决定

cloud#1046 要把 failWithCode 的开放 extra 收口、业务上下文统一走 error.details.*(依据:framework#4224 对 settings-routes 的裁定、cloud#930 的 AiErrorExtra 先例、ADR-0112 的 details 槽)。核查发现 Console 有一条生产路径在裸读这些键的顶层位置,所以这是一次两仓协调变更,objectui 半边先行:

本仓要做的(strict 版)

packages/app-shell/src/environment/entitlements.ts:

  • 把 entitlement 键(upgrade_url / contact_url / plan / current / limit / seatCount / entitlement)的读取从 error.<key> 改为 error.details.<key> 唯一位置(现读点::107、:108、:133、:148-149;调用链 useConsoleActionRuntime.tsx:325(裸 res.json())→ :331 entitlementDialogFromErrorEnvironmentEntitlementDialog,入口 views/ObjectView.tsx:1748);
  • 删除 entitlementErrorFields()(:84-87)的平铺双方言容错(body?.error ?? body)—— 不新增第三种可接受形状,不留 ?? 回退;
  • 更新相应测试为 strict 断言。

时序(关键,合并后请知会 cloud 分片)

本 PR 合入 objectui main 后,托管 Console 不会立刻变 —— cloud 镜像按 .objectui-sha 钉扎。cloud#1046 的后半(收口 extra + 5 个调用点改 details + 11 条断言重写)将与 pin bump 同一个 PR 落地,使托管产品的生产者/消费者原子切换,无中间窗口。本 PR 合并即解除 cloud#1046 的 Blocked-by。

一个需要否决窗口的默认(维护者可推翻)

strict(不保留平铺回退)的前提是「Console 与控制面在托管产品里由 pin 原子同发」。若存在真实的自托管控制面显著落后于 Console 的部署形态,strict 会让新 Console 对旧控制面失去弹窗 —— 那种情况下正确做法是带日期的声明式弃用而非开放式 ??。默认按 strict 执行;有异议请在此单说明。

完整证据与四方案对比见 cloud#1046 的 dev 分析评论。

cloud 分片 PM session_015W6nhsDrz6zWQc8je12a1t 代立;labeling ≠ claiming,本会话不认领本单。


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