Skip to content

VS Code 扩展的 os-view-grid 片段生成的 view 现在 parse 不过:list.defaultSort / list.pageSize 已被 #4001 关掉 #4917

Closed

Description

@xuyushun441-sys

在 #4721 做 ADR-0087 载荷扫描时发现的旁支,与该单无关,单独记录(Prime Directive #10),未认领。

现象

packages/vscode-objectstack/snippets/objectstack.json 的 os-view-grid(「ObjectStack: Grid List View」)片段展开出来的 view 是这样的:

const myObjectListView: UI.View = {
  name: 'my_object_list',
  label: 'My Object List',
  type: 'list',
  objectName: 'my_object',
  list: {
    type: 'grid',
    columns: [{ field: 'name', width: 200 }],
    defaultSort: { field: 'name', direction: 'asc' },
    pageSize: 25,
  },
};

对着当前 origin/main(89d2a4e)的 ViewSchema 实测:

vscode os-view-grid snippet parses? false
Unrecognized key(s) on this list view: `defaultSort`, `pageSize`. Until #4001 closed
these shapes an unknown key was dropped silently — the view still rendered, without
whatever the key was meant to configure.

即:扩展交给作者的脚手架,一展开就是一份 validate 不过的 metadata。#4001 把 ListViewSchema 收紧成 strict 之后,这两个键从「静默丢弃」变成了硬拒绝,而片段没跟着改。list.defaultSort 在 ListViewSchema 上从来没有声明过(FormView.defaultSort 是另一个键,已在 #3896 收尾里立碑退休);list.pageSize 同理。

为什么值得单开

这是 #4001 战役的一类「下游未跟随」缺口,而且落在最不该落的地方:strict 化的价值在于把错误提前到写的那一刻,但这里写的那一刻的模板本身就是错的——作者(人或 AI)按 IDE 提示写出来的第一份 view 就被拒绝,而拒绝信息说的是「#4001 关掉了这些形状」,读起来像平台坏了,不像片段过期了。

需要决定的部分

defaultSort / pageSize 表达的意图(列表默认排序、分页大小)在 ListViewSchema 上是否有对应的活键,得先查一遍再改片段:

  • 有 → 片段改成正确拼写;
  • 没有 → 片段直接删掉这两行,并判断这两个能力是不是本来就该有(那是另一单)。

不要为了让片段能跑而给 schema 加回键——ADR-0049 / Prime Directive #12。

建议顺手做的一件事

整个 snippets/objectstack.json 有 8 个片段(os-object / os-field-text / os-field-select / os-field-lookup / os-view-grid / os-flow / os-stack / os-agent),本单只实测了 os-view-grid。既然 #4001 在按批次关 strict,片段文件会反复以同样方式过期。真正的修法是给它加一条 gate:把每个片段展开后(去掉 ${n:…} 占位)对着对应 schema parse 一次,parse 不过就红。否则这单关掉之后,下一批 strict 化会再复现一次。

关联:#4001、#3896、ADR-0049。发现于 #4721 的实现过程。

Activity

  1. added
    domain:devxDomain lane — seat card indexed by label:pm:seat
    on Aug 3, 2026
  2. added
    toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    on Aug 3, 2026
  3. xuyushun441-sys commented on Aug 4, 2026

    @xuyushun441-sys
    CollaboratorAuthor

    认领(PM 分派)

    • session:session_018iARDqtrhQgz6fVHDeDkbQ
    • 分支:claude/issue-4917-vscode-view-snippet
    • 车道:domain:devx(落点 VS Code 扩展的片段文件)

    与在飞 #5017 / #4996 落点互斥。除修片段本身外,派发时要求回答一个结构性问题:片段产出的元数据有没有任何东西在 CI 里 parse 一遍? 没有的话,这次 #4001 关掉两个键就让片段悄悄失效了,下次还会 —— 若能便宜地把"片段产物过 safeParse"接成常驻校验,一并做;做不了写明原因,由 PM 决定另立。


    Generated by Claude Code

  4. xuyushun441-sys commented on Aug 4, 2026

    @xuyushun441-sys
    CollaboratorAuthor

    审核通过 — PR #5031 已取消草稿并挂上 auto-merge(SQUASH)

    议题报一个坏片段,审计出六个 —— 且其中两个(os-flow / os-stack)缺必填键,即它们在 protocol 17 下从来就没合法过,不只是被 #4001 追赶上。更大的一层:五个模块片段的第一行 import { Data } from '@objectstack/spec' 都解析不到(根命名空间 re-export 早因不可摇树被删)—— 对任何运行时检查不可见,因为 Data 是类型命名空间。修在同 PR 内正当:同文件、同"下游没跟上"缺陷类,一个第一行就报错的"已修"片段不是交付物。

    常驻 gate 回答了派发的结构性问题,且四条腿都硬:全仓此前没有任何东西 parse 过片段体(这正是 #4001 能无声打坏它们的原因)。新 gate:占位符展开(${n:default} / 选择列表 / $0 逐一建模,表外形态抛错而非静默展开)→ transpile → 绑真 spec 求值 → recording proxy 取回字面量 → 同一 schema safeParse;第四条腿读入口 .d.ts 断言每个具名 import 仍存在 —— 运行时检查做不到的那一半。外加两条结构守卫:新片段无 PLANS 条目即红、engines.protocol 与 spec 当前 major 锁步。三个判红对照是常驻测试而非一次性演示。零共享文件(turbo 自动收新 test script)。

    CI 唯一红(Validate Package Dependencies)是 main 上先存在的新 OSV 公告(fast-uri / hono / undici,见下条),与本 diff 无关(lockfile 增量仅本包 devDeps importer 块),另一无关 PR #5027 同红为证。修复落地后本 PR 随队列自动转绿。

    #5028(扩展声明的 jsonValidation 指向不存在且无人生成的 schema 文件,README 还在宣传它)—— 同 declared≠enforced 类但需产品决定(打包 JSON Schema / 删声明 / 动态注册),立案不猜,对。已加入待维护者决策清单。


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

domain:devxDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatchpm:queueReady for the PM dispatch looptoolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions