在做 objectui#3257(清 tool 样例的三个已退役键)时,按派发要求逐个核对了 apps/console/src/preview-samples.ts 里全部 20 个样例 。结论:tool 远不是唯一一个,11 个样例当前过不了 spec 的 .parse() ,其中 4 个带的是和 #3257 完全同型的已退役键 。
#3257 已落地一条机器守卫(apps/console/src/__tests__/preview-samples-spec-valid.test.ts),把每个样例塞进整个 stack 交给 ObjectStackSchema.safeParse() 校验。本单列的 11 个当时没有 一并修,而是进了该测试里的 KNOWN_STALE 台账 —— 台账带反向断言 (某个样例一旦开始通过就报红,要求把它提升到 SPEC_CLEAN),所以这个列表只会缩短,不会烂掉。本单就是把它清空。
核对结论(spec 17.0.0-rc.1,本仓 lockfile 里装着的版本) 校验方式:ObjectStackSchema.safeParse({ tools: [SAMPLES.tool] }) 之类,即「作者把这份样例发布进真实 stack 会怎样」。
✅ 合法(6,已被守卫钉住) view、job、tool(#3257 修完后)、permission、position、email_template
❌ 过不了(11,本单范围) 样例 问题 是否含已退役键 actionbulkEnabled 已退役;type: 'server' / variant: 'default' / locations: ['record','list'] 都不在 17 的枚举里✅ objectstack#3896 agenttools 已退役(改用 skills)、knowledge 已退役✅ objectstack#3894 / #3896 skilltriggerPhrases 已退役;triggerConditions 需要 field/operator/value✅ objectstack#3896 flowwaitEventConfig.onTimeout 已退役;type: 'scheduled' 不在枚举;variables[].description 不认;13 条 edge 都缺 id✅ objectstack#4158 objectfields 是数组,ObjectSchema 要 record(见下方注意)— pageregion 里的 component 带 props,PageComponentSchema 拒收(ADR-0089 D3a) — reportcolumns 是对象数组,ReportSchema 要列名字符串— dashboardwidget 缺 dataset/values,带不认的 value/format;chart 不是合法 widget type — appnavigation 各项缺 type 判别键;landing 已被 objectstack#4001 移除 — datasourcetype/isDefault 拒收;ssl 要对象不要布尔;capabilities 要对象;healthCheck.interval → intervalMs— validationevents 用的是 17 之前的 beforeInsert/beforeUpdate,枚举现在是 insert/update—
⚪ spec 里没有对应 schema(2,守卫豁免) workflow(没有 workflows 集合,也没有 WorkflowSchema)、approval(只有 ApprovalNodeConfigSchema,那是 flow 节点配置,不是审批流程元数据)
⚠️ 映射本身存疑(1)translation:ObjectStackSchema.translations 是 Array< Record< locale, TranslationData > >,而 console 这份样例是 { name, label, locale, language, description, data } 的元数据记录 形态。也就是说这里更可能是映射选错了 ,而不是样例过期。修之前需要先定这个样例到底对应哪个契约。
为什么没在 #3257 里一起修 不是懒 —— 其中几项不是机械替换 ,动之前需要判断:
object.fields 的数组形态是被 app-shell 有意支持的 ,不是笔误。packages/app-shell/src/views/metadata-admin/previews/object-fields-io.ts 的 readFields() 显式分支 shape: 'array' | 'record' 并原样保留。把样例改成 record 会让画廊不再覆盖 array 那条分支 。真正的问题其实更深:设计器编辑的是一个 spec 会拒收的形态(AGENTS.md #0.1 的典型场景),该先裁决 readFields 的双形态要不要留,而不是先改样例。改 dashboard / app / flow 样例会改变画廊渲染出来的东西 ,而预览画廊是本仓共用的浏览器验证台(verify skill),并行 agent 正拿它验证别的改动。console preview-samples 的 tool 样例仍带三个已退役的 ToolSchema 键(category / active / requiresConfirmation) #3257 的 scope fence 是「tool 样例 + 审计 + 守卫」,PD#3 要求越界发现另立单。建议做法 附带观察(spec 侧,不在本仓) 守卫的强度取决于 spec 的严格度:tools/apps/flows/permissions/positions/datasources 的元素 schema 是 .strict(),而 views/jobs/emailTemplates不是 —— 后者会把未知键悄悄剥掉而不是报错。也就是说这三类样例即便哪天混进一个已退役的键,守卫也照样绿。这是 spec 仓的事(objectstack#4001 / #3896 同一条线),记在这里备查。
相关
在做 objectui#3257(清
tool样例的三个已退役键)时,按派发要求逐个核对了apps/console/src/preview-samples.ts里全部 20 个样例。结论:tool远不是唯一一个,11 个样例当前过不了 spec 的.parse(),其中 4 个带的是和 #3257 完全同型的已退役键。#3257 已落地一条机器守卫(
apps/console/src/__tests__/preview-samples-spec-valid.test.ts),把每个样例塞进整个 stack 交给ObjectStackSchema.safeParse()校验。本单列的 11 个当时没有一并修,而是进了该测试里的KNOWN_STALE台账 —— 台账带反向断言(某个样例一旦开始通过就报红,要求把它提升到SPEC_CLEAN),所以这个列表只会缩短,不会烂掉。本单就是把它清空。核对结论(spec 17.0.0-rc.1,本仓 lockfile 里装着的版本)
校验方式:
ObjectStackSchema.safeParse({ tools: [SAMPLES.tool] })之类,即「作者把这份样例发布进真实 stack 会怎样」。✅ 合法(6,已被守卫钉住)
view、job、tool(#3257 修完后)、permission、position、email_template❌ 过不了(11,本单范围)
actionbulkEnabled已退役;type: 'server'/variant: 'default'/locations: ['record','list']都不在 17 的枚举里agenttools已退役(改用skills)、knowledge已退役skilltriggerPhrases已退役;triggerConditions需要 field/operator/valueflowwaitEventConfig.onTimeout已退役;type: 'scheduled'不在枚举;variables[].description不认;13 条 edge 都缺idobjectfields是数组,ObjectSchema要 record(见下方注意)pageprops,PageComponentSchema拒收(ADR-0089 D3a)reportcolumns是对象数组,ReportSchema要列名字符串dashboarddataset/values,带不认的value/format;chart不是合法 widget typeapptype判别键;landing已被 objectstack#4001 移除datasourcetype/isDefault拒收;ssl要对象不要布尔;capabilities要对象;healthCheck.interval→intervalMsvalidationevents用的是 17 之前的beforeInsert/beforeUpdate,枚举现在是insert/update⚪ spec 里没有对应 schema(2,守卫豁免)
workflow(没有workflows集合,也没有 WorkflowSchema)、approval(只有ApprovalNodeConfigSchema,那是 flow 节点配置,不是审批流程元数据)translation:ObjectStackSchema.translations是Array< Record< locale, TranslationData > >,而 console 这份样例是{ name, label, locale, language, description, data }的元数据记录形态。也就是说这里更可能是映射选错了,而不是样例过期。修之前需要先定这个样例到底对应哪个契约。为什么没在 #3257 里一起修
不是懒 —— 其中几项不是机械替换,动之前需要判断:
object.fields的数组形态是被 app-shell 有意支持的,不是笔误。packages/app-shell/src/views/metadata-admin/previews/object-fields-io.ts的readFields()显式分支shape: 'array' | 'record'并原样保留。把样例改成 record 会让画廊不再覆盖 array 那条分支。真正的问题其实更深:设计器编辑的是一个 spec 会拒收的形态(AGENTS.md #0.1 的典型场景),该先裁决readFields的双形态要不要留,而不是先改样例。dashboard/app/flow样例会改变画廊渲染出来的东西,而预览画廊是本仓共用的浏览器验证台(verifyskill),并行 agent 正拿它验证别的改动。tool样例 + 审计 + 守卫」,PD#3 要求越界发现另立单。建议做法
action/agent/skill/flow)可以先删键,和 console preview-samples 的 tool 样例仍带三个已退役的 ToolSchema 键(category / active / requiresConfirmation) #3257 同一性质、同一裁决依据,风险最低;agent只有这两个问题,删完即可提升进SPEC_CLEAN。report/validation/datasource/app基本是机械改写。object/page/dashboard/translation建议单独裁决后再动。KNOWN_STALE移进SPEC_CLEAN—— 反向断言会强制你这么做(样例一开始通过,那条「仍然如实失败」的用例就会报红)。附带观察(spec 侧,不在本仓)
守卫的强度取决于 spec 的严格度:
tools/apps/flows/permissions/positions/datasources的元素 schema 是.strict(),而views/jobs/emailTemplates不是 —— 后者会把未知键悄悄剥掉而不是报错。也就是说这三类样例即便哪天混进一个已退役的键,守卫也照样绿。这是 spec 仓的事(objectstack#4001 / #3896 同一条线),记在这里备查。相关
tool样例 + 守卫)ToolPreview不再渲染这三个徽标)