Repository navigation
Description
在 #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 化会再复现一次。
Activity
xuyushun441-sys commentedon Aug 4, 2026
认领(PM 分派)
session_018iARDqtrhQgz6fVHDeDkbQclaude/issue-4917-vscode-view-snippetdomain:devx(落点 VS Code 扩展的片段文件)与在飞 #5017 / #4996 落点互斥。除修片段本身外,派发时要求回答一个结构性问题:片段产出的元数据有没有任何东西在 CI 里 parse 一遍? 没有的话,这次 #4001 关掉两个键就让片段悄悄失效了,下次还会 —— 若能便宜地把"片段产物过 safeParse"接成常驻校验,一并做;做不了写明原因,由 PM 决定另立。
Generated by Claude Code
xuyushun441-sys commentedon Aug 4, 2026
审核通过 — 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
fix(vscode): snippets expand to metadata the spec accepts, and a gate…