Skip to content

skills/objectstack-ui/SKILL.md 的 App 例子仍教 defaultAgent: 'sales_copilot' —— ADR-0063 之后该绑定解析不到任何 agent #5985

Description

@hotlong

实现 #5891(PR #5984,给 content/docs/ui/apps.mdxcontextSelectors / 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.tsdefaultAgent 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.defaultAgentisBuiltinAgentName 限界,表外的名字直接拒收而不是透传。

也就是说这行例子 parse 得过、build 得过、os:check 也过(字符串就是字符串),运行期却绑不上任何东西 —— 静默回落平台默认。而 skills/ 恰恰是 AI 写元数据时第一个读的语料,sales_copilot 这种「像真的一样」的名字被逐字抄进业务包的概率很高。

现有闸门都盖不到它:validate-ai-agent-authoring 只看 stack.agents,不看 app.defaultAgent取值;check:skill-examples 只做类型检查,而 defaultAgentSnakeCaseIdentifierSchema,任何 snake_case 串都合法。

建议

  1. 把例子改成真实可解析的写法 —— 数据类 app 直接删掉这行(ask 是隐式默认),或写 defaultAgent: 'build' 并注明只用于 authoring surface;注释也要跟着改(现注释「optional AI copilot binding」正是让人以为可以随便起名的那句)。
  2. 可选、更根本的一层:给 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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions