实现 #5891(PR #5984,给 content/docs/ui/apps.mdx 补 contextSelectors / defaultAgent 两键散文)时核对 defaultAgent 语义,顺带发现的越界项。未在该 PR 内修。
现象
skills/objectstack-ui/SKILL.md:478(带 os:check 标记的 App 例子内):
defaultAgent: 'sales_copilot', // optional AI copilot binding
为什么是缺陷,不是风格问题
ADR-0063 §2 撤回了租户 / 应用包级自定义 agent,app.defaultAgent 的可解析集合收窄到两个平台 agent(ask / build,别名可解析)。仓内三处独立佐证:
packages/spec/src/ui/app.zod.ts 的 defaultAgent JSDoc:「the resolvable values are the two platform agents…a name that is not a platform agent will not resolve at chat time」;
packages/lint/src/validate-ai-agent-authoring.ts 头注释:「a stack-authored agent 404s on chat and cannot be pinned via app.defaultAgent」(cloud#904);
- objectui
packages/app-shell/src/hooks/surfaceAgent.ts:app.defaultAgent 被 isBuiltinAgentName 限界,表外的名字直接拒收而不是透传。
也就是说这行例子 parse 得过、build 得过、os:check 也过(字符串就是字符串),运行期却绑不上任何东西 —— 静默回落平台默认。而 skills/ 恰恰是 AI 写元数据时第一个读的语料,sales_copilot 这种「像真的一样」的名字被逐字抄进业务包的概率很高。
现有闸门都盖不到它:validate-ai-agent-authoring 只看 stack.agents,不看 app.defaultAgent 的取值;check:skill-examples 只做类型检查,而 defaultAgent 是 SnakeCaseIdentifierSchema,任何 snake_case 串都合法。
建议
- 把例子改成真实可解析的写法 —— 数据类 app 直接删掉这行(
ask 是隐式默认),或写 defaultAgent: 'build' 并注明只用于 authoring surface;注释也要跟着改(现注释「optional AI copilot binding」正是让人以为可以随便起名的那句)。
- 可选、更根本的一层:给
defaultAgent 的取值加一条 lint(平台 agent 名单之外即 warning),把「声明得过 / 运行期无效」这一对从消费侧宽容改成生产侧响亮 —— ADR-0078 的形状。是否值得建这条规则请 PM 判;单独第 1 条就已经把语料的错纠正了。
同页 hidden: true 那条注释(「ADR-0045 — drop from the App Switcher but keep routable」)也踩在 #4829 正在争议的语义上,但那条已由 #4829 跟踪,不重复开单。
参考:#5891 / PR #5984(本发现的来源)、ADR-0063、#4829(hidden 语义争议)。
Generated by Claude Code
实现 #5891(PR #5984,给
content/docs/ui/apps.mdx补contextSelectors/defaultAgent两键散文)时核对defaultAgent语义,顺带发现的越界项。未在该 PR 内修。现象
skills/objectstack-ui/SKILL.md:478(带os:check标记的 App 例子内):为什么是缺陷,不是风格问题
ADR-0063 §2 撤回了租户 / 应用包级自定义 agent,
app.defaultAgent的可解析集合收窄到两个平台 agent(ask/build,别名可解析)。仓内三处独立佐证:packages/spec/src/ui/app.zod.ts的defaultAgentJSDoc:「the resolvable values are the two platform agents…a name that is not a platform agent will not resolve at chat time」;packages/lint/src/validate-ai-agent-authoring.ts头注释:「a stack-authored agent 404s on chat and cannot be pinned viaapp.defaultAgent」(cloud#904);packages/app-shell/src/hooks/surfaceAgent.ts:app.defaultAgent被isBuiltinAgentName限界,表外的名字直接拒收而不是透传。也就是说这行例子 parse 得过、build 得过、
os:check也过(字符串就是字符串),运行期却绑不上任何东西 —— 静默回落平台默认。而skills/恰恰是 AI 写元数据时第一个读的语料,sales_copilot这种「像真的一样」的名字被逐字抄进业务包的概率很高。现有闸门都盖不到它:
validate-ai-agent-authoring只看stack.agents,不看app.defaultAgent的取值;check:skill-examples只做类型检查,而defaultAgent是SnakeCaseIdentifierSchema,任何 snake_case 串都合法。建议
ask是隐式默认),或写defaultAgent: 'build'并注明只用于 authoring surface;注释也要跟着改(现注释「optional AI copilot binding」正是让人以为可以随便起名的那句)。defaultAgent的取值加一条 lint(平台 agent 名单之外即 warning),把「声明得过 / 运行期无效」这一对从消费侧宽容改成生产侧响亮 —— ADR-0078 的形状。是否值得建这条规则请 PM 判;单独第 1 条就已经把语料的错纠正了。同页
hidden: true那条注释(「ADR-0045 — drop from the App Switcher but keep routable」)也踩在 #4829 正在争议的语义上,但那条已由 #4829 跟踪,不重复开单。参考:#5891 / PR #5984(本发现的来源)、ADR-0063、#4829(
hidden语义争议)。Generated by Claude Code