Skip to content

fix(metadata-protocol): inherit view identity onto runtime overlays - #2558

Merged
os-zhuang merged 1 commit into
mainfrom
fix/runtime-view-save-loses-identity
Jul 4, 2026
Merged

fix(metadata-protocol): inherit view identity onto runtime overlays#2558
os-zhuang merged 1 commit into
mainfrom
fix/runtime-view-save-loses-identity

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Closes#2555

问题(3777 实测复现)

用户在 console 网格上点一次列排序,该视图从视图切换器永久消失:

  1. 写路径:console PUT 回写的是 raw view config(带 sort:[…]),没有顶层 viewKind/object;normalizeViewMetadata 只补 name,saveMetaItem 原样落 sys_metadata
  2. 读路径:getMetaItems 把 overlay 行按 name 整条替换注册表的展平条目 —— 展平条目上的 viewKind: 'list'object 就此丢失。
  3. 消费端:切换器端点(rest-server.ts)过滤 v.viewKind && v.object === obj,缺身份字段的行被滤掉。GET /meta/view?object=showcase_task 从 17 项掉到 15 项。

修复(双保险)

  • 写路径(治本):saveMetaItem 把 registry 中将被遮蔽的同名条目作为 baseline 传入 normalizeViewMetadata,非容器 body 缺 viewKind/object/label 时继承后再持久化。overlay 自己的字段永远优先;defineView 容器 body 不动(身份在展平时派生);registry 无 getItem 的部分 mock 下降级为原行为。
  • 读路径(治已污染数据):getMetaItems 合并循环里,type=view 的 DB 行缺身份字段时从被遮蔽条目继承 —— 已被 pre-fix 保存污染的库(如 3777 环境的 2 行)读取即恢复,无需手工清库。

两处共用同一个 viewIdentityPatch helper。

测试

  • 新增 protocol-view-identity-overlay.test.ts:写路径继承、读路径治愈、overlay 字段优先、无 baseline 时保持原行为(4 例,stub engine 端到端,payload 取自 3777 实测 sys_metadata 行)。
  • normalize-view-metadata.test.ts 新增 4 个纯函数用例(含容器 body 不动、引用语义不变)。
  • 全量:@objectstack/metadata-protocol 8 pass;@objectstack/objectql 745 pass(60 files)。

Co-Authored-By: Claude noreply@anthropic.com

@vercel

vercelBot commented Jul 4, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
specReadyReadyPreview, CommentJul 4, 2026 3:20am

Request Review

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation tests tooling size/m labels Jul 4, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/metadata-protocol, @objectstack/objectql.

14 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/concepts/core/services.mdx(via @objectstack/objectql)
  • content/docs/concepts/implementation-status.mdx(via @objectstack/objectql)
  • content/docs/concepts/metadata-lifecycle.mdx(via @objectstack/objectql)
  • content/docs/concepts/packages.mdx(via @objectstack/objectql)
  • content/docs/guides/authentication.mdx(via @objectstack/objectql)
  • content/docs/guides/deployment-vercel.mdx(via @objectstack/objectql)
  • content/docs/guides/formula.mdx(via packages/objectql)
  • content/docs/guides/kernel-services.mdx(via @objectstack/objectql)
  • content/docs/guides/objectql-migration.mdx(via @objectstack/objectql)
  • content/docs/guides/packages.mdx(via @objectstack/objectql)
  • content/docs/guides/plugins.mdx(via @objectstack/objectql)
  • content/docs/protocol/objectos/index.mdx(via @objectstack/objectql)
  • content/docs/protocol/objectql/state-machine.mdx(via @objectstack/objectql)
  • content/docs/releases/v9.mdx(via @objectstack/objectql)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@os-zhuang
os-zhuang merged commit 806a40a into mainJul 4, 2026
16 checks passed
@os-zhuang
os-zhuang deleted the fix/runtime-view-save-loses-identity branch July 4, 2026 12:01
A console personalization PUT (grid sort, inline edit) sends only the
raw view config with no top-level viewKind/object. saveMetaItem
persisted it verbatim, and getMetaItems replaced the flattened package
entry with the overlay row wholesale — stripping the identity fields
the view-switcher endpoint filters on (viewKind && object). One sort
click made the view vanish from the switcher until the sys_metadata
row was deleted.
- write path: saveMetaItem passes the shadowed registry entry into
normalizeViewMetadata, which inherits missing viewKind/object/label
onto non-container bodies (overlay's own fields always win).
- read path: getMetaItems heals identity-less rows already persisted
by pre-fix saves the same way, so polluted DBs recover on read.
- tests: 4 new e2e cases (stubbed engine) + 4 pure-function cases.
Closes#2555
Co-Authored-By: Claude <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mteststooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Runtime view overlay drops viewKind/object — one grid sort permanently removes the view from the switcher

2 participants

@baozhoutao@os-zhuang