Skip to content

spec: agent.knowledge.indexes / sources reference a namespace with no definition site in a stack #3699

Description

@os-zhuang

#3583 的引用完整性工作中分出来的 spec 决策项(方案文档 §5 D1,见 docs/audits/2026-07-app-metadata-reference-integrity-assessment.md)。

现状

AgentSchema.knowledge 声明了两个引用形状的字段:

  • packages/spec/src/ai/agent.zod.ts:37indexes: z.array(z.string()).describe('Vector Store Indexes')(必填)
  • 同处 sources: z.array(z.string()).optional()

但这两个字段引用的命名空间在 stack 里没有任何定义位:

  • KnowledgeSourceSchema 确实存在(packages/spec/src/ai/knowledge-source.zod.ts:86),但 stack.zod.ts 从未引用它 —— 没有 knowledgeSources: [] 槽位。
  • 唯一「index」形状的声明是 VectorStoreSchema.collection(packages/spec/src/ai/embedding.zod.ts:71),只能从 KnowledgeSource 到达,而后者本身不可在 stack 中书写。

也就是说,作者写进 knowledge.indexes 的任何字符串,按构造就是不可解析的。

为什么这是决策而不是 bug

按 ADR-0049 / ADR-0078 的三分法,一个已解析的配置必须处于以下之一:强制校验、标注 [EXPERIMENTAL — not enforced]、或优雅降级的真可选。当前状态是被明确禁止的第四态:可解析、未标注、静默失效。

这也是为什么 #3583 的 AI 引用规则(方案里的 R7)没有写:给一个没有定义位的命名空间加校验,等于把这个缺口制度化。

两个出口

  1. 加定义位 —— 把 knowledgeSources 接入 stack.zod.ts,让 indexes/sources 能真正解析。之后 R7 可以连同 agent.skillsstack.skillsskill.toolsstack.tools 一起写。
  2. 标注为实验性 —— 在字段上加 [EXPERIMENTAL — not enforced],明确「现在写它是无操作」,作者就不会误以为有效。

出口 1 是 spec 变更,值得一个 ADR;出口 2 是一行 describe 改动。任一都行,现状不行。

关联

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions