Skip to content

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

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. 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

  2. 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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions